Run every agent.Know which oneis working.needs you.is done.
A Mac app that runs Claude Code, Codex, Gemini and the rest of your agents side by side, and taps you on the shoulder only when one needs you.
Download for macOS
$brew install --cask gettori/tap/tori
Drives the agents you already pay for
Claude Code
Codex
Gemini
OpenCode
Copilot
Kimi
Pi
+any ACP agent
Eleven terminals.
One tree.
Four agents, three repos, a handful of worktrees. Which one is waiting on you?
Every session rolls up to its branch, project and space. The rose mark is the one that needs you.
work· Spaces
⏺ Update(test/sign.test.ts)
⎿ Updated with 52 additions
Bash command
pnpm test webhooks
Do you want to proceed?
❯ 1. Yes
2. Yes, and don't ask again
⏺ Update(test/sign.test.ts)
⎿ Updated with 52 additions
Bash command
pnpm test webhooks
Do you want to proceed?
❯ 1. Yes
2. Yes, and don't ask again
$ git status
On branch feat/webhooks
2 files changed
$ pnpm lint
0 problems
$ git status
On branch feat/webhooks
2 files changed
$ pnpm lint
0 problems
> apply_patch src/limiter.ts
+ if (bucket.count >= limit) {
exec pnpm test limiter
18 passed
thinking
> read src/limiter.test.ts
> apply_patch src/limiter.ts
+ if (bucket.count >= limit) {
exec pnpm test limiter
18 passed
thinking
> read src/limiter.test.ts
⏺ Reading src/webhooks/deliver.ts
⏺ Bash(pnpm lint)
⎿ 0 problems
✻ Pondering…
⏺ Update(src/webhooks/deliver.ts)
⏺ Reading src/webhooks/deliver.ts
⏺ Bash(pnpm lint)
⎿ 0 problems
✻ Pondering…
⏺ Update(src/webhooks/deliver.ts)
✦ Searching for "useQuery"
Found 14 matches
✦ WriteFile src/Results.tsx
✦ Shell pnpm typecheck
ok
✦ Searching for "useQuery"
Found 14 matches
✦ WriteFile src/Results.tsx
✦ Shell pnpm typecheck
ok
⏺ Reading test/search.test.ts
⏺ Bash(pnpm test search)
⎿ 31 passed
✻ Musing…
⏺ Reading test/search.test.ts
⏺ Bash(pnpm test search)
⎿ 31 passed
✻ Musing…
$ pnpm dev
VITE v7 ready in 412 ms
hmr update /src/Search.tsx
hmr update /src/Results.tsx
$ pnpm dev
VITE v7 ready in 412 ms
hmr update /src/Search.tsx
hmr update /src/Results.tsx
• edit tokens.css
• edit theme.ts
• bash pnpm build
built in 3.2s
• edit Button.tsx
• edit tokens.css
• edit theme.ts
• bash pnpm build
built in 3.2s
• edit Button.tsx
⏺ Update(src/Card.tsx)
⎿ Updated with 12 additions
✻ Thinking…
⏺ Update(src/Card.tsx)
⎿ Updated with 12 additions
✻ Thinking…
● Bump provider versions
aws 5.62 -> 5.70
● Run terraform validate
Success!
● Done
● Bump provider versions
aws 5.62 -> 5.70
● Run terraform validate
Success!
● Done
$ terraform plan
Refreshing state...
Plan: 0 to add, 1 to change
$ git status
nothing to commit
$ terraform plan
Refreshing state...
Plan: 0 to add, 1 to change
$ git status
nothing to commit
scroll to sort v
One status. Six places.
Sidebar, tabs, menu bar, Dock, notifications and your phone read the same status, composed once by the app. Flip it and watch them agree.
Menu bar
Dock
api2
web2
Sidebar, rolled up
Tabs
No notification. Nothing needs you.
Sign webhook payloadsapi needs you
nowNotifications, only when needed
Work · Spaces
api2 worktrees · 2 sessions2
Phone
Try it
Be the captain for a minute.
Eight agents are working. When one needs you it turns rose. Click Allow and it goes back to work.
0unblocked
1waiting now
0.0slongest wait
Sign webhooks
api/feat/webhooks
working
Rate limiter
api/fix/rate-limit
working
Search page
web/feat/search
Approve the plan?
Dark mode
web/dark-mode
working
Provider bump
infra/main
working
Retry queue
api/feat/retry
done
SDK types
sdk/feat/topics
working
Docs pass
docs/main
working
Everything a crew needs.
Bring your own agent
Claude, Codex, OpenCode, Gemini, Copilot, Kimi and Pi come bundled. Anything that speaks ACP is a four line TOML file, and any other CLI runs in a terminal tab with the same status dot.
Steer mid-turn
Type while it works. The message lands at the agent's next step instead of waiting for the turn to end.
Steeralso cover the retry path
Working 38s
also cover the retry path
Steer this turn, picked up in 1.5-5.4s
In your pocket
Pair the phone app with a QR code, over your own network or Tailscale. Answer, steer or stop a turn from anywhere.
‹
Sign webhook payloadsNeeds you · api › feat/webhooks
run the webhook tests
Signed payloads with the endpoint secret. Running the webhook tests now.
Allow Bash?
pnpm test webhooksDenyAllow once
Back to work.
Steer the running turn
One branch, many repos
A Topic is one branch with a worktree in each repo you pick. Files, search and changes cover all of them.
Scriptable
A
tori CLI in every shell Tori opens, plus an MCP server, so scripts and agents can drive Tori too. tori ask puts a question in the chat that called it and waits for you.$ tori sessions --live
ID AGENT ACCOUNT STATE BRANCH FOLDER TITLE
7c1e9a2f-4b0d-4e2a-9f61-3d8c2b7a5e14 claude work needs you feat/webhooks ~/work/api-webhooks Sign webhook payloads
d4b80c13-9e7f-4a55-8c02-61f0e3a9b7d2 codex default working fix/rate-limit ~/work/api-rate-limit Cap the rate limiter
a92f6e07-3c1b-47d8-b5e6-0f4d9a2c8e31 gemini default idle feat/search ~/work/web-search Search results page
$ tori ask "Deploy to staging?"
yes
$ tori spawn --agent codex --new-worktree fix/retry --prompt "retry 5xx deliveries"
0f3b7d5e-8c2a-4b1e-9d6f-2a7c4e1b9f30
$ tori steer 0f3b7d5e-8c2a-4b1e-9d6f-2a7c4e1b9f30 "also cover 429s"
steer: 0f3b7d5e-8c2a-4b1e-9d6f-2a7c4e1b9f30
Private by construction
No telemetry. Your agent talks to its vendor on your subscription, exactly as in a terminal. Tori proxies nothing.
Your crew is waiting.
A cockpit for the coding agents you already run.
Download for macOS
$brew install --cask gettori/tap/tori