A run leaves nothing behind.
hardened off before it goes out.
coldframe is the bench where a change's tests run before it goes out, on your own Mac. It keeps the runners there healthy and small, bounds the load they put on the machine, and checks that each test run leaves nothing behind. One binary, no server, no daemon, and nothing spent.
$ coldframe status runners 31 online · 3 busy · 28 idle disk 30.6 GB in runner folders · 0.2 GB due for prune slots 7 of 12 weight in use · 0 jobs waiting machine awake · logged in prune today 04:00 · 412 MB moved to the Trash survey monday 09:00 · 2 findings healthy
coldframe 0.1.0, as it stands · commit 09dc195 · 5 nov 2026
- tests
- 21
- dependencies
- 0
- rules CI checks
- 10
- rules written, not yet checked
- 9
why
Every project was building the same bench.
Running CI on your own Mac keeps paid minutes near zero, and then each project rebuilds the same machinery around it. On one such Mac, 31 runners for 17 repositories held 39 GB, and 8.5 GB of that was old logs and runner versions that nothing removed. Heavy jobs queued for about 10 minutes, then waited up to 19 more for a quiet machine, to run 3 to 6 minutes of tests. Six projects each had their own way to leave nothing behind. coldframe is that bench, written once, for the whole machine.
what it never does
- restart a busy runner
- call GitHub from a job hook
- run a self-hosted runner on a public repository
- spend money
- delete what a runner or a run did not make
- mark its own work as passed
the commands
Six commands, one binary
coldframe status
says whether CI on this Mac is healthy: every runner online, busy or idle, its disk use, and the last prune. It exits non-zero when not.
coldframe prune
moves old runner logs, superseded runner versions and update leftovers to the Trash, one idle runner at a time.
coldframe runner adopt
points every runner's job hooks at coldframe, restarting each one only while it is idle.
coldframe measure
draws the job timeline per repository and for the whole machine: time queued against time running.
coldframe run
runs a test tier in its own temporary folder, then reports any file, process or container it left behind.
coldframe survey
reads every repository's workflows and runners for known traps, and the month's paid minutes. It changes nothing.
exit codes
- exit 0done, or healthy
- exit 1unhealthy, or a run left something behind
- exit 2a usage error, and nothing is written
- exit 3coldframe could not read what it needs
A failure to read is never reported as healthy.
Install
From source, on macOS. The repository names its Rust version, and rustup installs it on the first build. There is little to install yet.
git clone https://github.com/jahala/coldframe cd coldframe cargo install --locked --path .
Then coldframe --version
where it sits
- 11weeder judges the diff, and coldframe runs the tests that remainthe shed · the judge
- 06a tend verify script reads its exit code and its leak reportbuild · plan and verify
- every runner's job hookshook started · hook completed
- a daily and weekly schedule on your Macprune daily · survey weekly