One cache for every machine.
Share the store between laptops and CI through a directory or Cairn. A developer with an empty store restores a whole workspace in under a second.
- to restore Rune's own 182 units from a cache server — building them takes about 30 s
- 0.65 s
- added to a CI build for publishing its results, in the background
- ~1%
- units compiled by a clean checkout that imported its CI bundle
- 0
A CI cache that doesn't grow.
rune cas export saves exactly the store entries a run needs — artifacts, build-script results, replayed warnings — and nothing else. Unlike a cached target/, it never grows with every run: Rune's own is 219 entries, 231 MiB gzipped.
rune cas import ci.tar.gz || true # restore; a missing file is finerune build && rune test --retries 2 --junit report.xmlrune cas export -o ci.tar.gz --for build --for test # exactly what this run needs
Import treats the file as untrusted: every artifact is checked against its recorded hash, and an entry the store already has is kept.
Whatever one machine built, every machine has.
Point cas.remote at a directory — a network share, a CI cache volume — or at Cairn, Rune's companion cache server: one small binary with tokens, integrity checks, eviction, metrics and several servers at once. A build checks it before compiling and publishes to it after.
export RUNE_CAS_REMOTE=http://cairn.example:7070 # or a directoryexport RUNE_CAS_REMOTE_TOKEN=<token> # keep it out of Rune.tomlrune build # CI: compiles, publishes in the backgroundRUNE_CAS_REMOTE_WRITE=false rune build # a developer: read-onlyexport RUNE_CAS_REMOTE=http://a:7070,http://b:7070 # sharded across serversexport RUNE_CAS_REMOTE_REPLICAS=2 # survives losing one
With two replicated servers and one of them killed, Rune's workspace still restores in 0.65 s.
Built for many writers.
Any number of laptops and CI runners can read and write one store at once, and none of them can break a build for the others.
Immutable entries
Written slot by slot with the marker file last, so a half-copied entry is invisible; checked against its manifest when pulled. The first publisher wins, so any number of machines can write at once.
A miss, never a failure
A missing or unreachable store is just a miss. A server that cannot be reached is skipped for 30 s — one attempt, not one per unit — and a refused token is reported once.
Paths don't matter
Keys do not contain the checkout path, so different paths, users and RUNE_HOMEs share. Build-script output, generated files and executables come back as they were.
Trust, made explicit
A key says what went into an artifact, not what came out: share a store only between machines you would run each other's binaries on, and give laptops read-only access.
Test what a change can reach.
rune affected lists the workspace packages a diff can influence — those owning changed files and everything that depends on them — and splits them between machines the same way on each. A change to Cargo.lock or the toolchain affects everything.
rune affected --since origin/main # the packages a diff can influencerune test $(rune affected --since origin/main --format args)rune affected --since origin/main --partition 1/4 # this machine's share of fourrune watch -x test # locally: re-run on every change
Try it on your project.
Nothing to migrate and nothing to undo: your project keeps working with plain cargo.
$ curl -fsSL https://www.runepm.com/install.sh | sh