coldframe
under construction

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.

preview · coldframe status · exit 0
$ 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

  1. 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.

  2. coldframe prune

    moves old runner logs, superseded runner versions and update leftovers to the Trash, one idle runner at a time.

  3. coldframe runner adopt

    points every runner's job hooks at coldframe, restarting each one only while it is idle.

  4. coldframe measure

    draws the job timeline per repository and for the whole machine: time queued against time running.

  5. coldframe run

    runs a test tier in its own temporary folder, then reports any file, process or container it left behind.

  6. 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