Operator
A telephone operator connecting calls at a switchboard
Generated image

Operator · a macOS app for Claude Code

You run the agents.

Work a project by deciding what its agents do. Tune each lane's model and effort so the plan runs close to its limit and never past it.

Free · MIT · Apple Silicon

A living tool: built for the way I run Claude Code all day, changed whenever that changes. Public in case it resembles your setup.

Orchestrating01 – 03

01

Staff the project once, then work the board

project home
team · operator 2 running
orchestrator fable running
code opus running
design sonnet your turn
Ready · 3
research sonnet idle
review opus idle
qa haiku idle
The coordinator carries the only filled badge.
board · operator project home
Backlog · 1
Write release notes for 0.18 unassigned
Running · 1
Refactor the auth module coderunning
Waiting · 1
Implement the reply sentinel held · needs you
Done · 2
Fix the tray icon in dark mode design+14 −3 · pass
Port the theme system abandoned
The card is the task. The agent is a chip on it.

Each lane pins a model, an effort level, and permissions, so a correctly configured session is one click. The card is the task, the agent is a chip on it, and Waiting is the column that needs you. Finishing runs the project's check command, so done can read done and green. A task whose lane vanished reads abandoned: nobody saw the work finish.

02

Hand work between agents, on the record

the comms log
comms · operator 1 needs approval
Today
Operator → Code18:54 delivered
Fix the tray icon in dark mode. Brief in dev/briefs/tray.md.
Research → Code19:14 held · needs your approval
Implement the reply sentinel per dev/briefs/reply-impl.md.
Approve & sendDecline
Review → Design19:22 held · pair sending too fast
Same finding, third message in a minute. The brake suspends the pair, not the lanes.
Code → Research19:26 not delivered · lane wasn't running
Where does the dispatch parser live now?
Nothing here retries on its own. Every chip says why.

One agent routes a task to another and every hop lands here with its outcome on a chip. A dispatch from a lane that is not the coordinator is held until you approve it, chains brake themselves, and nothing retries. It is a record, not a mailbox: you open it when something looks wrong.

03

Run agents in parallel without collisions

one worktree per task
worktrees 3 active
auth-refactor opus running +142 −38
docs-pass haiku ready +9 −2
flaky-tests sonnet merged → main
Branches never collide with main.
fan-out · fix the flaky test 4 agents
retry-fix-1 1/4 running +21 −9
retry-fix-2 2/4 your turn +14 −3
retry-fix-3 3/4 running +47 −18
retry-fix-4 4/4 queued +0 −0
One prompt, four attempts. Keep the best diff.

One git worktree per task, so parallel agents never share a checkout and nothing touches your working tree until you say so. Fan-out sends the same prompt to N of them at once; you read the diffs side by side and keep one.

Tuning04 – 06

04

Set the model and the effort per agent

your .claude/agents
agents 5 defined
extract-types haikulowproject
write-tests sonnetmediumproject
security-review opusxhighuser
plan-architect opusplanhighproject
docs-writer haikulowuser
Effort travels as a flag at launch. settings.json never sees it.

Haiku for extraction, Sonnet for the everyday, Opus where it earns its keep, and effort from low to max beside it. These two knobs decide what a lane spends, set where you say what the agent is for. Hover a lane and the card shows the model and effort it is actually running beside the ones you asked for.

05

Run close to the limit, never past it

the reading
plan · max read 2m ago
Session62% resets 4:40 pm
Week48% resets Tue
Opus · week81% resets Tue
API billingno data absent is not zero
Amber past 75, red past 90. The rail shows the ring; this is the reading.

Session, week, and the model with its own cap, each with when it resets. Amber means tune the lanes down; headroom means turn one up. A timed-out read says no data, never 0%.

06

Review the diff and land it in place

local only
review · auth/session.ts +3 −1
@@ -18,7 +18,9 @@ export async function refresh(token)
export async function refresh(token: string) {
- const res = await fetch('/api/refresh')
+ const res = await fetch('/api/refresh', {
+ headers: { authorization: `Bearer ${token}` },
+ })
if (!res.ok) throw new AuthError(res.status)
return res.json()
}
2 of 5 files reviewed commit, merge, or discard

What the tokens bought comes back as a diff you read in place, then commit, merge, or discard without leaving the window.

Scope

Operator hosts Claude Code's own CLI over a pty and reads the transcripts it writes. Everything above follows from that, including the parts it will not do.

BehaviourStatusWhy
Stop an agent mid-rundoes Send becomes Stop. That is Claude Code's own interrupt, not a kill: the session survives and hands the turn back.
Set a lane's effortdoes Passed as --effort at launch, all five levels. settings.json keeps four and drops the fifth without a word, so Operator never writes it there.
Push a message into a busy laneleaves alone One submit queue per terminal. A mid-turn message rides the lane's own queue and is read at the turn boundary.
Let two agents talk foreverleaves alone A reply chain with no human in it hits a hop limit, and a pair sending too fast is suspended.
Host the model, or send anything to a serverleaves alone It runs the CLI you already have, on your auth, and reads the transcripts it writes. No upload, no telemetry, no account. The code is public, so this row is checkable.
Estimate what a session costleaves alone Tokens are measurable. Dollars depend on your plan.

Why it exists

I use Operator to work on projects. I decide what the agents do, hand work between them, and read the diff before it lands. Most of all I tune the model and the effort of every lane so the plan runs close to its limits without reaching them: cheap models where the work is mechanical, high effort only where it pays.

It is a living tool, not a product. It changes whenever the way I work changes: no roadmap, no support queue, no telemetry, no account. The source is MIT, so if it is close but not quite right for you, it is yours to change.

Operator, standing by.

Free. A living tool for the Claude Code sessions you already run.