3 agents working

Offload the work.
Keep the judgment.

The open-source control plane for autonomous coding agents. Budgets, audit, approval and the kill switch live outside the runner, so they hold across every agent, cloud or local.

fleet
$ kew run --loop --workers 3
agent/issue-1083sonnet▒▒▒▒▒▒▒▒▒▒step 0/12$0.00running
agent/issue-1068deepseek▒▒▒▒▒▒▒▒▒▒step 0/12$0.00running
agent/issue-1059qwen3-30b▒▒▒▒▒▒▒▒▒▒step 0/12$0.00running
daily cap $0.00 / $40.00

How it works

Six stages. You own two of them.

kew runs the loop from a scoped issue to a merged pull request. The machine does the work; the decisions that cost money or change main stay with you. Scroll the stages and the console follows. Everything in it is live; touch anything.

Stage 01

You

You scope the work.

Nothing dispatches until a person says it is well-formed. Label an issue ready and it enters the queue. That label is the whole contract.

Try it: label #1101 ready and watch a p0 take the front of the queue.

What makes an issue dispatchable

The queue is ordered by priority label (p0-critical through p3-low), then by complexity (simple / medium / complex) which sets the step budget.

An issue carrying blocked stalls the driver rather than dispatching. Dependencies are declared by kew itself, never by the agent.

Stage 02

kew

It dispatches into isolation.

Every agent gets its own git worktree and its own branch. Nothing touches your working tree, and two agents can never collide in the same checkout.

The isolation boundary

Worktree per issue, branch agent/issue-N, and optionally a container with an egress allowlist. A stale branch with no unique commits is auto-cleaned on re-dispatch.

Budget caps, the audit log and the kill switch live outside the runner, so they hold identically whether the agent is Claude Code, OpenCode, pi or a local model.

Stage 03

kew

It works under a hard cap.

Spend is metered per issue, per day and per week. Cross a cap and the circuit breaker trips. The fleet halts rather than quietly burning your budget.

Try it: drag the cap below the spend.

How the breaker behaves

The breaker halts dispatch; it never kills mid-flight work silently. Issues estimated at or above the approval threshold are held with needs-approval instead of running.

Cost is API-equivalent list price, so a local model shows $0.00 and still reports the work it did.

Stage 04

kew

A second agent attacks the first one's work.

The reviewer is a fresh context with no memory of writing the code, so it has nothing to defend. What it reviews is bound to what merges.

Why the SHA binding matters

The reviewed commit and the merged commit are asserted equal. Without that, a review is a statement about code that no longer exists.

Findings come back as review comments; kew review <pr> dispatches an agent to address them, and the verdict is re-run against the new head.

Stage 05

You

You keep the judgment.

What arrives is a pull request, not a merge. Small enough to actually read. The gate is the point. This is the step that separates offloading from surrender.

Try it: approve or deny.

Where approval is enforced

From the TUI, the web inbox, or kew approve. The fleet kill switch is always live. It sits in the console header on this page too, at every stage.

Denial returns the issue to the queue with the reason attached, so the next dispatch starts from your objection rather than from scratch.

Stage 06

kew

Every decision is attested.

Each event is hash-chained to the one before it. Change any record after the fact and every link downstream stops verifying.

Try it: tamper with an event. These are real SHA-256 chains, computed in your browser.

What the chain covers

Dispatches, approvals, denials, spend, policy decisions and merges. Anchors are published periodically so the chain cannot be silently rebuilt from scratch.

kew audit verify --anchors checks the whole chain and exits non-zero on a break. An evidence pack exports it as one self-contained file.

queue
$ gh issue list --label ready

queue · ordered by priority

→ 1 p1 #1083 auto-clean stale agent branch on re-dispatch

backlog · not dispatchable

p2 #1095 centralize TUI colour into one palette module
p2 #1096 re-theme and re-record VHS demos
p0 #1101 investigate flaky reservation test
1 ready · next dispatch: #1083 (p1)

Runners

Swap the agent.
The governance doesn’t move.

Governance that lives inside one vendor’s console governs one vendor. kew keeps budgets, audit, approval and the kill switch outside the runner, so they hold across every agent, cloud or local.

kew

worktreebudgetbreakerapprovalkill switchaudit

drives runners claude-code

which reach

claude-code
$ kew dispatch 1083 --runner claude-code

The default. Deepest tool use and the most reliable long-horizon runs.

executesthe claude CLI
providersAnthropic
credentialANTHROPIC_API_KEY or a Claude Code OAuth token
costreported per turn by the CLI
routesclaude-*

unchanged, whichever you pick

worktreeisolated per issue
budgetper-issue, daily, weekly caps
breakerhalts the fleet on breach
approvalheld above threshold
kill switchkew stop, always live
audithash-chained + anchored
same caps · same gate · same chain docs →

What that actually cost, on kew’s own repo, 1 Jul 2026 to 26 Jul 2026

ModelRunnerRunsMergedMerge rateSpendPer merged PR
claude-opus-4-8claude-code299159100%$1128.32$7.10
claude-sonnet-4-6claude-code5452100%$110.89$2.13
Qwen3-Coder-30B (local)lemonade11788%$0.00$0.00

A frontier model merged 159 pull requests at $7.10 each. Sonnet merged 52 at $2.13. A local 30B merged 7 at nothing at all, and opened fewer of the runs it started. That is the honest trade, and all three ran under the same caps, the same approval gate and the same chain.

1853 events · chain verified · 13/13 anchors matched · exported by kew report export

Integrations

Your work already
lives somewhere.

kew does not ask you to move it. The tracker is a port with two implementations, so an epic is a label convention in one and a native Project in the other, and the driver above them cannot tell the difference.

GitHub

default

complete

epic
an epic:<name> label across issues
edges
kew:depends markers, written by kew and never by the agent
signal
polling, plus the run store
credential
the gh CLI, already authenticated
work itemsissues, labelled ready to enter the queue
priorityp0-critical through p3-low
sizingsimple, medium, complex sets the step budget
outputa pull request on agent/issue-N
reviewPR review comments, addressed by kew review
ciActions runs, repaired by kew ci-fix
docs →

Linear

partial

read surface complete, writes are a deliberate slice

epic
a Linear Project
edges
native blocks relations, not a naming convention
signal
webhooks to kew ingest serve, with polling as reconcile
credential
LINEAR_API_KEY, env only, redacted on every error path
work itemsissues in the project
statusesDONE, BLOCKED, IN_REVIEW, TODO, provider-derived only
archivedincluded; a completed archived dependency is satisfied
cancelledmaps to BLOCKED, so it can never read as satisfied
delegationassign to kew, then kew delegate watch claims it
writes todaylist ready, claim, comment, close
docs →

True on either, because neither owns the control plane

the DAGsame driver, same ready frontier, same blast radius
budgetsper issue, per day, per week
approvalheld above threshold, wherever the issue lives
kill switchkew stop halts the fleet either way
auditone hash-chained log, one anchor file
reportingone evidence pack, whichever tracker fed it

Linear’s read surface is complete: projects, native relations, statuses and webhooks all drive the graph. Its write vertical is intentionally narrow for now, and it is marked that way above rather than rounded up to parity.

Surfaces

You are either working, watching,
deciding, or reporting.

Four ways into the same control plane, not four skins on one screen. Each matches a different mode of attention, and the state behind them is the same state.

$ kew status

Thirty commands, every one scriptable. The whole control plane is reachable without a UI, which is what makes it usable from CI and from a machine you have only SSH’d into.

reach for it when You are already in the terminal and want an answer without changing context.

docs →
$ kew status
[dispatch] Repo: thossullivan/kew | Timeout: 120m
Queue status for thossullivan/kew:
ready0
in-progress0
agent-failed1
pr-pending-review0
needs-approval0
Workers configured: 3
Recent runs:
#927success4m$1.04
#1059success10m$2.97
#1087success18m$6.23
#1026success10m$1.69

Command index

58 commands.
None of them hidden.

Everything the dashboard and the web inbox can do, the terminal can do, because they are the same control plane. All of it scripts, which is what makes kew usable from CI and from a machine you have only SSH’d into.

press / to filter

Built with itself

65.5% of this repo
was merged by agents.

kew is not demonstrated on a toy project. It is the tool that built itself, under its own budgets, its own approval gates and its own audit chain. Every figure below comes from the repository you are being asked to install.

592pull requests merged
388of them opened by an agent
502issues closed
2026-03first merge

thossullivan/kew · captured 2026-07-27 · agent PRs identified by kew’s agent/issue-N branch convention

One of those epics

epic:sandboxed-dispatch

Eight issues, nine dependencies, resolved by kew rather than by a person holding the order in their head. Watch it run. It will stop on its own when a node costs enough to need you.

S1#520sandbox config blockS6#521kew-agent imageS2#522runtime detectionS3#523launch, stream, killS4#524brokered push and PRS5#525container watchdogS7#526containment testsS8#527security posture docs
tick 0 merged 0 running 0 ready 2 $0.00

Receipts

Numbers you can check,
and the ones you cannot.

Every engagement ends with one self-contained file: what ran, what it cost, what merged, and a cryptographic attestation that the record was not edited afterwards. Below is a real one, covering the 25 days to 26 Jul 2026.

220PRs merged
$6.42per merged PR
$1412.67total spend
43epics, 304 items

Where the money went

Run kindRunsSuccessCost
dispatch30486%$1103.66
review5986%$151.59
adversarial_review6274%$91.96
review_remediation10100%$50.89
planning12100%$14.57

Which model earned it

ModelRunsMergedPer PR
claude-opus-4-8299159$7.10
claude-opus-5431$169.51
claude-sonnet-4-65452$2.13
claude-opus-4-620n/a
deepseek-v4-flash31$0.17
Qwen3-Coder-30B (local)117$0.00
unknown350n/a

35 runs carry no recorded model. They are in the totals rather than dropped from them, so the cost per merged PR is not flattered by hiding them.

Verify it here

These are kew’s real anchor records. Your browser just recomputed each one with the same algorithm kew uses, and checked that every prev binds the entire previous record. Alter a single value and watch the chain break.

chain intact 0 links verified

Anchors are committed to git daily, out of band. Rewriting the audit log would mean rewriting that history too, which is what makes a silent re-chain detectable rather than merely unlikely.

What you can check from this page

  • Recompute every anchor hash from the record shown, with the same algorithm kew uses.
  • Check that each anchor’s prev binds the whole previous anchor record.
  • Watch a single altered character break every link downstream of it.
  • Cross-foot the pack’s arithmetic: spend against cost per merged PR, per-epic totals against their items.

What you cannot

  • Recompute the chain head from this page. The pack ships the head hash and the event count, not the events, so there is no preimage here.
  • Independently corroborate the costs or merge states. They come from kew’s own run store.
  • Open the pull requests. The repository is private until launch.

kew’s record is tamper-evident for whoever holds the database, not verifiable by a stranger from a summary. That distinction is the whole point of publishing the algorithm and the anchors rather than only the verdict.

pip install kew-cli

Python 3.12+ · requires git, gh and at least one runner

Licence

kew is released under the Apache License 2.0. You may use it commercially, modify it, distribute it and run it privately, with a patent grant and no obligation to publish your changes.

Budgets, the audit chain, approval gates and the kill switch are in the licensed source. They are the product, not an upsell. Governance you cannot inspect is not governance.