dirtywork.run · v0.13 beta · MIT

dirtywork.

Frontier models do the thinking. Local models do the dirty work.

$ pipx install dirtywork

Python 3.9+, stdlib only · macOS/Linux (developed on Apple Silicon; Windows unsupported) · needs LM Studio (or any OpenAI-compatible server) · then set up Claude Code as the orchestrator with a tool-calling model — or the Anthropic API via --provider anthropic · Docker Desktop / dockerd for the default sandbox (--sandbox none to run on the host)

Most of the ecosystem is racing to replace frontier models with local ones. dirtywork keeps the frontier model — but only where judgment lives, as planner and auditor. The grunt work goes to the models already running for free on your own machine, and nothing merges without review.

How a run works

1 · you/ai $ dirtywork run --repo ~/code/app "Add unit tests for parser.ts"
2 · local explores the repo, edits, runs the tests — inside a
 locked-down Docker container over an isolated worktree (.worktrees/dw-…),
 validated export, full JSONL transcript, no auto-commit — for $0;
 ends the run with finish(summary=…), is stopped when it stalls, and any run
 can be picked up again with dirtywork resume;
 the model can be LM Studio's local server, or the Anthropic API (--provider anthropic)
3 · you/ai audit the transcript, review the diff, re-run the gates,
 commit only what survives
4 · you/ai afterwards, dirtywork runs list|show|clean inspects and
 cleans up runs; dirtywork bench scores models on fixture repos

frontier / you — spends judgment local worker — spends electricity

0.13 is a beta. It works on my setup — LM Studio serving qwen3-coder or Devstral Small, driven by Claude Code as the orchestrator — and it is young everywhere else. Flags and output may shift. If it breaks on yours, tell me what happened.