Same build.ninja format
rninja parses the exact build.ninja your generator emits — CMake, GN, Meson, or hand-written. It does not regenerate the file; it executes it, preserving phony, restat, pools, and depfiles.
Home / Features
rninja keeps the format and the CLI and closes the gaps in the executor: a content-addressed cache, an async scheduler, and optional cross-machine sharing. Here is the full breakdown.
rninja is ninja where ninja works. Same format, same flags, nothing to migrate.
rninja parses the exact build.ninja your generator emits — CMake, GN, Meson, or hand-written. It does not regenerate the file; it executes it, preserving phony, restat, pools, and depfiles.
The flags you already type work: -C, -f, -j, -k, -l, -n, -t, -v, -d. NINJA_STATUS is honored and exit codes match, so scripts and CI do not move.
clean, compdb, graph, deps, and query behave like ninja. rninja adds -t config for inspecting or generating an rninja.toml and a stats view for cache hit rate.
Hash every action over its real inputs. A hit is a guaranteed-equivalent artifact.
Every action is hashed over its inputs, command line, and observed environment. Identical inputs produce identical hashes, so repeat builds skip the toolchain entirely.
The cache index is backed by sled, so an interrupted build cannot corrupt the store. Restart and pick up where you left off.
A miss falls through to the original ninja action; a hit only happens when inputs, command, and environment all match. Caching never changes what a build produces.
Keep every core busy where stock ninja stalls on single-threaded bookkeeping.
The scheduler moves bookkeeping off the hot path and keeps cores saturated, so the misses you do have to build finish sooner.
The ready queue accounts for IO contention, not just raw job count, so a graph that is disk-bound in places does not thrash the CPU.
Optional. Share content-addressed artifacts across laptops and CI runners.
The optional remote cache streams blobs between machines over async-nng. One small endpoint can serve a whole team.
First builds on a new laptop or a clean CI runner become mostly cached builds once a peer has seeded the store with identical inputs.
Enabled via RNINJA_REMOTE_URL and RNINJA_CACHE_MODE. Leave it off and rninja is a purely local cache plus scheduler — the local store always front-runs the remote.
No daemon to register, no service to run. Sensible defaults out of the box.
Ships on crates.io (cargo install rninja), npm (rninja-cli), PyPI (rninja-cli), and Homebrew. Prebuilt binaries are on GitHub Releases.
The cache lives under $XDG_CACHE_HOME/rninja. No daemon to install. RNINJA_* env vars exist for power users; everyone else gets the speedup for free.
A memory-safe Rust implementation, MIT licensed, built by Neul Labs.
Read how it works, follow the quickstart, or check the comparisons.