cook is an open-source build system that puts Cargo, CMake, pnpm, codegen and the scripts/ directory into one dependency graph with one content-addressed cache. Cook Cloud shares that cache with your whole team and CI, and explains every miss.
curl -fsSL https://getcook.sh | sh$ cook ship ✓ @cap/env#build hit team cache · 12ms ✓ @cap/web#build hit team cache · 31ms ✓ rust-bins hit team cache · 48ms ● sprite-sheet run images/enemy.svg changed ✓ sprite-sheet done 1.1s · pushed to team cache 4 units · 3 restored · 1 rebuilt · 1.2s total $ cook why rust-bins key 7f3a…c91e hit rust:sources 1,204 files unchanged seal compiler rustc 1.93.0 unchanged built by ci-runner-04 · 2h ago · restored for 11 teammates
Receipts
We added a Cookfile to two large open-source projects. Every number here is reproduced by a script in the public repo. Run it yourself.
| Edit | Turborepo | cook |
|---|---|---|
| Add a comment | 7 of 11 tasks, ~47s | 1 task, ~1s |
| Add a real export | same 7 tasks, ~47s | 2 tasks, ~30s |
Turbo dirties every downstream task when a package's inputs change. cook keys downstream work on what it actually consumes. A comment that compiles away produces the same artifact, so everything downstream is a cache hit.
How it works
cook keeps the recipe ergonomics of just and the dependency graph of make, swaps macro-heavy configuration for a Lua-backed DSL, and runs exactly the work required by what changed.
Each cook step declares a target. A per-input placeholder fans out, one unit per file, in parallel; a static target gathers. You never write the loop or the join.
recipe sprite-sheet gather "images/*.svg" cook "build/$<in.stem>.png" { rsvg-convert $<in> -o $<out> } cook "build/spritesheet.png" { magick montage $<in> -tile x1 $<out> }
cook never quietly folds your machine, locale or toolchain into the cache key. Keys are reusable across machines by default. Need the compiler in the key? Say so.
tools compiler cc recipe app gather "src/*.c" seal compiler cook "build/$<in.stem>.o" { cc -c $<in> -o $<out> }
Local cache and shared store use the same key. Start with a directory on a NAS. When you outgrow it, flip one flag and the same client talks to Cook Cloud.
# .cook/cloud.toml [cloud] enabled = true project = "cap" endpoint = "https://api.usecook.com" # token comes from the environment, never the repo export COOK_CLOUD_API_KEY=…
Cook Cloud
The client ships in every cook binary today. Cook Cloud is the hosted store behind it: content-addressed artifacts, verified on every download, and the cook why story extended across your whole team.
Content-addressed, deduplicated across projects, every artifact verified against its hash as it streams down. CI restores what a laptop built this morning, and vice versa.
cook whyOn a miss, see exactly which declared determinant differs between your key and the artifact a teammate cached. No more "works on my machine" archaeology.
Per project, per recipe, per person. Know which recipes never hit and which determinant is the usual culprit. Fix the Cookfile, watch the number move.
Per-project tokens, read-only tokens for forks and PR builds, revocable instantly. Secrets live in the environment, never in the Cookfile.
cook_cc, cook_pnpm and cook_dotnet put native, JavaScript and .NET builds in one DAG. Cargo stays Cargo. Your codegen and asset pipelines join the same cache.
The wire protocol is open and already in the client. Enterprise plans run the same store on your infrastructure, speaking the same five endpoints.
Pricing
The full build system, plus a small hosted cache for one project.
Share one cache across every laptop and runner. Stop paying for builds twice.
Run the store yourself, keep artifacts in your account, and let us write the first Cookfile.
Early access
Tell us what you build with today. We onboard teams in the order they sign up, and we will reach out before anything is ever billed.