Run a team of coding agents. Know exactly what each one did, and what it cost.
Plenty of things run agents in parallel. Tade is the one that keeps the books — and nothing is remembered, so nothing drifts.
A queue, not a pile — Every piece says what it waits on, and holds when that fails rather than running anyway.
Checks against a commit — What ran, on which commit, and unknown where nothing did — never a blank that reads as green.
Money that is not guessed at — A quoted price and an estimate are never added together, and a subscription is never totalled as dollars.
A finding somebody answers for — The agent says it fixed it or why it is not real. You rule. Both are kept.
Node ≥ 22.19 · git · MIT
The window
Agents left, the one you are watching in the middle, the orchestrator below. One terminal, no browser, no daemon.
│ ● Upgrading stripe to v15. The webhook signature API changed, ▕│ so src/webhooks.ts needs the new constructEvent signature. ▕│▕│ ▸ Read src/webhooks.ts ▕│ ▸ Edit src/webhooks.ts +12 −4 ▕│ ▸ bash npm i stripe@15 │╭─ wants approval ─────────────────────────────────────────────╮││bash npm i stripe@15 │││ Allow once Deny ││╰──────────────────────────────────────────────────────────────╯│█
An orchestrator you talk to
Every tool as it runs — including the ones that fail, with the reason.
❯run the webhook tests and tell me what broke▕✓status▕2 agents, 1 waiting▕✗terminal run · tests · "pnpm test src/webhooks"▕no terminal called tests is open in checkout: open one first, or name another▕⠸terminal open · checkout · tests▕◆ Opening a tests terminal first, then▍▕
Every agent gets a lane
Working, idle, waiting on you, failed, finished — read back from git, never remembered.
▾ AGENTS 7 H X + ⠋ Agent spend in… $5.73working▌●Update notes panel t… ▌idle · waiting for y… ! stripe-v15 × ≡ wants you to approve… ✕ reload agent exited with co… ✓ refunds finished · Refunds c… ○ queue not started‖ later
Approvals, on your terms
Off by default, and every command an agent runs is written down either way.
│││ ● Upgrading stripe to v15. The webhook signature API changed, │ so src/webhooks.ts needs the new constructEvent signature. ││ ▸ Read src/webhooks.ts │ ▸ Edit src/webhooks.ts +12 −4 │ ▸ bash npm i stripe@15 │╭─ wants approval ───────────────────────────────────────────││bash npm i stripe@15 ││ Allow once Deny │╰────────────────────────────────────────────────────────────
Voice, first
Hold ctrl+space and talk. Speech stays on your machine.
▁▂▂▄▆▇█▇▅▃▂▂▂▄▅▆▇▆▅▃▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ ◉ speak — Tade hears you until you let go──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Extensions Settings Mute claude-opus-5 ▾ │ high ▾ │ 1.9M tok │ 2h 5m │ $2.66today ▾
What it won't do
Not limitations somebody is working on. The design.
Nothing merges anything — unless you asked for exactly that. merge is never by default.
A judge answers, it never decides — It may only ever add caution — never approves, merges, closes, unholds or shortens anything.
There is no tool that deletes a branch, a worktree or a folder — and asking explicitly does not produce one: that is a person with git in a terminal.
Closing Tade never stops your agents — Closing the window and stopping the work are two different acts.
There is no daemon — Schedules run only while a window is open. What came due while it was closed is caught up once, or skipped.
No server, no browser, no build step — One terminal. git pull is the upgrade.
Being there is not being on — An extension in the folder is listed and never imported until somebody turns it on.
Nothing installs anything behind your back — The exact command is on the page before it runs.
Tade reports its own trouble, never your work — What you said, what an agent wrote, task titles, prompts and notes are never in its telemetry. Paths are scrubbed to ~.
Tade never holds your sign-in — Claude Code signs in as itself. A key you do paste is written to ~/.tade/config.yaml, and any agent you run can read it — agents run as you, and nothing sandboxes them. Export its variable instead and it is never written down.
Status is a query, not a memory
Tade owns no state of its own, which is why closing it is harmless.
━ orchestrator + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ⤢ ▾ ━▕▕❯brief me▕● Morning. stripe-v15 is blocked on npm i stripe@15, 1 still working and Sentry has 3 new issues in checkout. ▕? Sentry has 3 new issues in checkout ask ▕───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Ask Tade anythingtype, or hold ctrl + space
Ask for five things at once
What can run now runs. Looking at queued work is never starting it.
▕│checkout › client◌ waiting Start now ‖ Pause × ▕│─────────────────────────────────────────────────────────────────────────────────────────▕│▕│◌ Waits on api. ▕│▕│THE CHAIN IT IS IN▕│FIRSTTHENTHISONEAFTERIT▕│╭──────────────╮╭──────────────╮┏━━━━━━━━━━━━━━┓╭──────────────╮▕││⠋ schema │───▶│◌ api │───▶┃◌ client ┃───▶│◌ docs │▕││working││◆afters…│┃◆aftera…┃│◆afterc…│▕│╰──────────────╯╰──────────────╯┗━━━━━━━━━━━━━━┛╰──────────────╯▕│▕│▕│WHY IT WAITS▕│⠋ schema ▕│╰─◌ api after schema▕│ │the endpoints follow the tables▕│ ╰─◌clientafter api▕│ │it calls what the endpoints return▕│ ╰─◌ docs after client▕│it screenshots the dashboard▕│▕│WILL BE TOLD▕││ Call the new refunds endpoints from the dashboard. ▕│
The whole plan, before any of it starts
A column per step, an arrow for every wait, and the reason under it.
checkout › plan4 tasks · 1 working · 2 waiting to start─────────────────────────────────────────────────────────────────────────────────────────FIRSTTHENTHEN╭──────────────────────╮╭──────────────────────╮╭──────────────────────╮│✕ fix-charge │─────▶│! add-refunds held│─┬───▶│◌ refund-emails ││testsfailedtwice││◆fix-chargefail…│││◆afteradd-refun…│╰──────────────────────╯╰──────────────────────╯│╰──────────────────────╯│╭──────────────────────╮││⠋ bump-mailer │───────────────────────────────╯│working│╰──────────────────────╯WHY THIS ORDER✕ fix-charge ╰─! add-refunds after fix-charge │both change src/charge.ts ╰─◌ refund-emails after add-refundsit emails what refund() returnsalso after bump-mailerthe mailer’s send() changes in v4
The checks, before anybody else sees them
A push with nothing green behind it is held, with what is missing.
│█│tade/stripe-v153 ahead of main█│#418 stripe v15 draft✗ checks█│█│THIS AGENT’S COMMITS────────────────────────────────────────────────────2 +172 −66█│●a1b2c3d move to the stripe v15 payment intents API 6 files+148−6212m ago█│●9f0e1d2 keep the old webhook shape working for a release 2 files+24−41h ago█│◌3 files not committedshared checkout — nobody’s to attribute█│█│CHECKS─────────────────────────────────────────────────red at a1b2c3d Run all █│✓ format passed 2.1s13m ago493 files checked · 0 errors█│pnpm exec biome ci .█│✓ types passed 6.4s13m ago█│pnpm exec tsc --noEmit█│✗ tests failed 1m 04s12m ago4 failed · 2072 passed · 3 skipped█│pnpm vitest run (after types) ▾ what it printed ▕│packages/app/test/screens.test.ts:37:5what-an-agent-has-done▕│and 3 more▕│▕
“Every Monday, update our dependencies”
A rule, an instruction, and a record of every run.
▾ AGENTS 2 + ▕│checkout › deps weekly↻ every Monday at 09:00 Run now ‖ Pause ≡ × ▕│─────────────────────────────────────────────────────────────────────────────────────────✕ fix-charge ▕│tests failed twice▕│Every Monday at 09:00, it starts an agent.▕│⠋ bump-mailer ▕│TELLS ITS AGENTworking▕││ Update dependencies within their major versions, run the tests, and commit what ▕││ changed. ▾ SMART QUEUE 8 plan ▕│ all next timed ▕│NEXT Mon 14 Sep 09:00 · Mon 21 Sep 09:00 · Mon 28 Sep 09:00▕│IF MISSED runs once when Tade opens◷ release-notes 18:00▕│FROM you · “every monday morning update our dependencies”❯ waits for its time▕│▕│RUNS↻ morning brief 08:45▕│Mon 7 Sep 09:00 deps-weekly-0907◆ every weekday at 0… ▕│Mon 31 Aug 09:00 deps-weekly-08312 missed before it▕│▌↻deps weekly09:00▕│▌❯ every Monday at 09… ▕│▕│‖perf nightlypaused▕│❯ every day at 02:00▕│▕│
A watch looks before it acts
A cheap check, and an agent on each new finding. It never starts, steers or stops one on its own.
█│checkout › New Sentry err… ◎ every hour Run now ‖ Pause ≡ × █│─────────────────────────────────────────────────────────────────────────────────────────█│█│Every hour, it looks with sentry.new-errors, and starts work on what it finds.█│█│NEXT Mon 14 Sep 10:00 · Mon 14 Sep 11:00 · Mon 14 Sep 12:00█│IF MISSED runs once when Tade opens█│AT MOST 2 agents a look█│FROM sentry · turned on by you█│█│FOUND█│Mon 14 Sep 09:00 could not start · CHECKOUT-3F: Error: card_declined is not handled█│Sentry answered 502: Bad Gateway█│Mon 14 Sep 09:00 ⠋ fix-checkout-3e · CHECKOUT-3E: TypeError: Cannot read properties… █│Sun 13 Sep 16:00 fix-checkout-3a · CHECKOUT-3A: RangeError: Invalid currency code█│█│LOOKS█│Mon 14 Sep 09:00 found 3, 3 new, 1 waits for the next look█│Mon 14 Sep 08:00 found 1, nothing new█│Mon 14 Sep 07:00 could not look: Sentry is rate limiting these requests (429): try … █│
ctrl+k finds anything
Agents, files in every worktree, and the lines inside them. file:42 goes straight to a line.
Its tools, its watches and its settings. Being there is not being on.
╭─ Extensions ─────────────────────────────────────────────────────────────────────────────────────────────│ search extensions │Jev built-inre││9 tools · 3 watches · 5 settings│● Checks ▕││● Dependencies ▕│ Asks a judge bounded questions about diffs, logs, requests, plans and queues: │▌●Jev▕│ probabilities to act on, never verdicts and never prose. │◐ Sentry !▕││✗ standup !▕│ Settings… What Jev flagged Review the latest commits Turn off │● GitHub ▕││○release-notes▕│HOW IT IS USED│· Written by Tade 1▕│· Reads branches that go quiet against the review pack, once its watch is on. │· MCP servers 4▕│· Hands what it flagged to the agent that wrote it, which answers with │· Harnesses' own 2▕│ jev_account. │▕│· Sweeps what nobody answered to the orchestrator, which writes the verdict │▕│ (jev_verdict). │▕│· Judges anything in front of you (jev_ask): a diff, a log, something pasted. │▕│· Reads things back before somebody guesses: a request, a plan, a queue order. │▕│· Answers a sentence typed into search that matched no letters. │▕│· Reads a command the approval rules do not name — only ever asking for more. │▕│· May only add caution: never approves, merges, unholds or shortens a review. │▕││▕│TOOLS│▕│jev_ask Judge anything against questions you write│▕│jev_grep Grep that reads│▕│jev_review Read a change against the review pack and say what it flag│▕││▕│tab moves · ↑↓ reads · enter presses Don╰───────────────────────────────────────────────────────────────────────────────────────────────────────────
Every MCP server in one place
Turning one on hands its tools to every agent — your key never leaves this machine.
╭─ Extensions ─────────────────────────────────────────────────────────────────────────────────────────────│ search extensions │MCP servers││4 servers nobody has turned on│● Checks ▕││● Dependencies ▕│Tool servers Tade knows about, none of them on. Turning one on is yours.│● Jev ▕││◐ Sentry !▕│○Postgres postgres Install… Turn o│✗ standup !▕│Read a database's schema and query it.│● GitHub ▕│mcp-server-postgres ${project}│○release-notes▕│postgres needs a credential: paste one│· Written by Tade 1▕│install: npm install --global @modelcontextprotocol/server-postgres│▌·MCP servers4▕│Its credential is a connection string, kept where credentials are kept.│· Harnesses' own 2▕││▕│○GitHub github Turn o│▕│Issues, pull requests and code search on GitHub.│▕│https://api.githubcopilot.com/mcp/│▕│github needs a credential: paste one│▕│Reviews, checks and merges are the Forge port’s, not this server’s.│▕││▕│○Sentry (MCP) sentry Turn o│▕│Errors, traces and releases in Sentry, as its own server answers them.│▕│https://mcp.sentry.dev/mcp│▕│sentry needs a credential: paste one│▕│Not the Sentry extension: that one is `sentry`, this is `mcp-sentry`.│▕││▕││▕│tab moves · ↑↓ reads · enter presses Don╰───────────────────────────────────────────────────────────────────────────────────────────────────────────
Every file an agent touches
Marked the way git marks it, with the diff a click away.
╭─ src/webhooks.ts · stripe-v15 ───────────────────────────────────────────────────+3−1│@@ -38,5 +38,7 @@ export async function handle(req, res) {│38 const sig = req.headers['stripe-signature'] │39- const event = stripe.webhooks.constructEvent(body, sig, key)│39+ const event = await stripe.webhooks.constructEventAsync(│40+ body, sig, key, undefined, cryptoProvider,│41+ )│42 if (event.type === 'charge.refunded') { │43 await refund(event) ││ Open in editor Ask the agent about this ‹ 2/3 ›↑↓ scroll · ←→ ╰─────────────────────────────────────────────────────────────────────────────────────────oks.ts ▕│ │ bash npm i stripe@15 │ ▕│ │ Allow once Deny │ .json ▕│ ╰──────────────────────────────────────────────────────────────╯
The one thing Tade is told rather than derives
Kept word for word, in a file you own.
╭─ Note ───────────────────────────────────────────────────────── e││Refunds via the ledger│About checkout/refunds│Said by the orchestrator · Thu 3 Sep 09:00││NOTE│ refunds go through the ledger service, never the gateway▏ ││ Forget Copy Headline… Cancel Save note ╰────────────────────────────────────────────────────────────────── ▕│ ╭─ wants approval ─────────────────────────────────────────────╮ ▕│ │ bash npm i stripe@15 │ ▕│ │ Allow once Deny │r ▕│ ╰──────────────────────────────────────────────────────────────╯
pi, Claude Code and Codex, side by side
One harness per agent. Claude Code signs in as itself.
╭─ Settings ─────────────────────────────────────────────────────────────── ~/.tade/config.yaml · │ search settings │Accounts│││ Agents │pi│ Models │▸ its own sign-in ● anthropic, openrouter · 1 agent│ Orchestrator │ Sign in again… │ Approvals bypass│pi keeps one set of sign-ins, in ~/.pi: its providers are its account│ Checks │and you sign in to them inside pi.│ Voice ││ Window │Claude Code│ Projects 3 │▸ its own sign-in ● you@example.com · max · 34% of 5h · 2 agents│ Checks per project │ Sign in again… Sign out │ Budgets ● 1│work ○ not signed in yet│ Telemetry │ Sign in… Use for new agents Remove │ Shortcuts ││▌Accounts● 2│ Add an account… Add an API-key account… │ Updates │││││││││││││││││││● Saved as you change it.││ Open config.yaml Do╰─────────────────────────────────────────────────────────────────────────────────────────────────
A judge for what nobody has time to read
Bounded questions, a probability, no paragraph.
╭─ Jev ────────────────────────────────────────────────────────────────────────────────────────────────│This week││ 2 looks · 3 changes read · 4 flagged · $0.01 ││Waiting on a verdict││ 2 of 4 finding(s) have no verdict, 1 of them with an agent's account already. The oldest has waited 6h││ Nothing here becomes a false positive by getting old: jev_verdict is the only thing that closes one, i│ never an agent’s to give about its own change, and its sentence has to cite what in the change decided││By question││ ┌─────────────────┬───────┬───────────┬────────────────┐ │ │ question │ fired │ confirmed │ false positive │ │ ├─────────────────┼───────┼───────────┼────────────────┤ │ │ test_missing │ 2 │ 0 │ 0 │ │ ├─────────────────┼───────┼───────────┼────────────────┤ │ │ error_swallowed │ 1 │ 1 │ 0 │ │ ├─────────────────┼───────┼───────────┼────────────────┤ │ │ kind_fixture │ 1 │ 0 │ 1 │ │ └─────────────────┴───────┴───────────┴────────────────┘ ││Calibration││ ┌─────────────┬─────────┬───────────┐ │ │ probability │ flagged │ confirmed │ │ ├─────────────┼─────────┼───────────┤ │ │ 0.6–0.7 │ 2 │ 0 │ │ ├─────────────┼─────────┼───────────┤ │ │ 0.7–0.8 │ 1 │ 1 │ │ ├─────────────┼─────────┼───────────┤ │ │ 0.8–0.9 │ 1 │ 0 │ │ └─────────────┴─────────┴───────────┘ ││What it found││- checkout/stripe-v15:error_swallowed — Does this change catch an error and carry on without reporting│ anywhere?
Every agent, every token, every dollar
A subscription is not money, and is never totalled with it.
▾ AGENTS 2 │$2.661.9M tokens2h 5m Today This window 7 days │ high ▾ × ││────────────────── ▌ ! stripe-v15 │by Agent Project Model Harness Sign-in Provider │ ▌ wants you to │││AGENT MODEL TOKENSSHARE RUNTIME COST│ ⠋ refunds │◆ orchestrator claude-opus-5 412k ██░░░░░░ — $0.58│ working │! stripe-v15 claude-opus-5 880k ████░░░░ 55m ~$1.26││⠋ refunds claude-opus-5 460k ██░░░░░░ 40m $0.62│ ▸ SMART QUEUE │✓ search/pagination claude-sonnet-5 148k █░░░░░░░ 30m $0.20│ ▾ CHANGES 3 ││ M package.json │PLAN│ A …/webhooks.tes│ claude-code 5h ████████░░ 78%resets in 1h 22m said 6m ago│ M src/webhooks.t│7d ███░░░░░░░ 31%resets in 3d ││ claude-code @rev… 5h █░░░░░░░░░ 12%resets in 2h said 41m ago│ ▾ FILES │ pi cannot tell — is never told what a plan has left; it prices│ ▾ src/ │each turn instead│ webhooks.te││ webhooks.ts│PRODUCED│ ▸ test/ │ 4 commits +357−5816 files1 unattributed│ package.json │ tests 2 runs 1 failed 45.5s│ README.md │ types 2 runs all green 20.6s│━ orchestrator ││━━━━ ⤢ ▾ ━│BUDGETS││ checkout $1.88 of $5.00 a day █████░░░░░░░38%│ ▕│ search $0.20 no budget — set one│ ▕││ ▕
Tade has to be light, and proves it
What Tade and everything it runs is using. Tade has to be light, and proves it.
╭─ Resources ──────────────────────────────────────────────────────────────────────────────────────────│Tade is using 91% CPU and 783 MB of memory, across 7 processes. ││By project││ CPU memory│ checkout ████████░░77%█████░░░░░369 MB│ Tade itself ██░░░░░░░░15%█████░░░░░414 MB││By kind││ CPU memory│ agents ████████░░76%█████░░░░░361 MB│ the orchestrator █░░░░░░░░░12%████░░░░░░293 MB│ the window ░░░░░░░░░░2.5%█░░░░░░░░░117 MB│ terminals ░░░░░░░░░░0.5%░░░░░░░░░░8 MB│ helpers (git, ps, …) ░░░░░░░░░░0.1%░░░░░░░░░░4 MB││By agent and terminal││ CPU memory│ refunds ████████░░76%█████░░░░░361 MB│ the orchestrator █░░░░░░░░░12%████░░░░░░293 MB│ the window ░░░░░░░░░░2.5%█░░░░░░░░░117 MB│ terminal 1 ░░░░░░░░░░0.5%░░░░░░░░░░8 MB│ helpers ░░░░░░░░░░0.1%░░░░░░░░░░4 MB││↑↓ scrolls · 1–26 of 43 · kept current while open Clo╰───────────────────────────────────────────────────────────────────────────────────────────────────────
Install
One command, then tade.
Node≥ 22.19
gitany
tmuxoptional — agents that outlive the window
whisper.cpp, ffmpegoptional — speech
ghoptional — pull request state
ctrl+spacetalk
ctrl+ksearch
tabnext agent
ctrl+nnew agent
ctrl+tterminal
ctrl+/orchestrator
❯ how do I install it
npm i -g tade-sh
tade
◆ That is the whole of it. There is no build step, so git pull is the upgrade.
ctrl+k for the rest
GitHubnpmMITNode ≥ 22.19 · git│pi · Claude Code · Codex│every answer here is written down · $0.00 today