rbs is one binary that covers the whole lifecycle, and everything in it speaks the same language.
One self-contained binary
rbs is a single self-contained binary. Its built-in rules are embedded in the binary itself; there is no runtime to install first, no plugin marketplace to assemble, and no bootstrap step that downloads hundreds of megabytes before your first build.
rbs needs rbs.
Managed, hermetic toolchains
Rules declare the toolchain they need, and rbs downloads it — pinned by version, verified, and cached in a store shared by every workspace on your machine. No system Go, Node, Python, JDK, or .NET SDK is required, and two developers building the same target use bit-identical tools.npm install, no pip install — and records resolutions in a committed rbs.lock so repeat builds skip resolution entirely.
One shared cache
Every build action’s result lands in a user-global, content-addressed store shared across all your workspaces. Check out the same repository twice, or work across ten services that share a library, and cached results carry over.rbs cache stats shows what the store holds; rbs cache gc keeps it bounded.
Teams can point builds at a shared remote cache as well:
One language for builds, tests, CI, and infrastructure
Everything is the RBS language — a small, deterministic, Python-like language. The same file style that defines a binary also defines a test with an enforced coverage floor, a CI workflow, and cloud infrastructure:rbs ci run — the pipeline you debug on your laptop is the pipeline that runs on the server. Infrastructure declared with the infra SDK is planned and applied with rbs infra plan and rbs infra apply, with state kept alongside the code rather than in a separate tool’s silo.
Batteries built in
Capabilities that are external tools elsewhere are subcommands here, and they all share the same dependency graph:- Watch mode —
rbs build,rbs run, andrbs testall take--watchfor rebuild-on-change and TDD loops. No external file-watcher wrapper. - Coverage gates — test rules accept minimum-coverage attributes, and
rbs coveragefails targets that drop below them. - Environments — layered
.envfiles validated against a schema written in the build language, selected per-invocation with-e(see Core concepts). - Scaffolding —
rbs scaffoldgenerates code from templates with variable substitution, like Nx generators but defined in the same build language. - Stacked branches —
rbs stackmanages chains of small, dependent branches: create, restack, sync, and submit them as a stack. - Graph queries —
rbs querylists targets without building;rbs graphexports the unified build/infra/CI/dependency graph as JSON, DOT, or Mermaid;rbs atlasbuilds a symbol-level knowledge graph you can query instead of grepping. - A coding agent —
rbs agentruns interactively or headless, with permission modes, git-worktree isolation, and workspace checkpoints (rbs checkpoint) to revert its changes. - An editor backend —
rbs serverexposes file APIs, search, terminals, build-graph-aware language servers, and streaming AI assistance; it is what the ReasonOS editor connects to.
Extensible without plugins
Custom rules are ordinary.rbs code, defined in the same files that use them — no separate rules repository, no npm package, no plugin API:
rbs rules test and rbs rules integration), and rule packages can be shared across repositories with rbs ext, pinned to commits through the lockfile so a moved tag can never silently change your build.
Where Bazel or Nx may still fit
ReasonOS is opinionated, and honesty helps you choose. If you have years of investment in Bazel rules and remote-execution infrastructure at very large scale, or your world is exclusively JavaScript and you want Nx’s framework-specific generators, those ecosystems are mature. ReasonOS is the better fit when you want hermetic builds, managed toolchains, CI, infrastructure, and AI agents as one system — without assembling and maintaining the glue yourself.