Operator · a macOS app for Claude Code
You run the agents.
Every tool call, diff, and delegation on one board. Every task in its own git worktree. Nothing leaves your machine.
A personal project, built for the way I run Claude Code all day. Public in case that resembles your setup.
Navigating
Pick up any project, mid-flight
the gallery
Every repo you work in, with the ones running agents right now saying so. Active
projects are cards, shelved ones are rows, and shelving writes
archivedAt the moment you decide it. Nothing files itself away on a
timer.
Keep every agent in peripheral view
the left listEvery active project stays on screen, and the one you are in unfolds its agents beneath it. An agent appears exactly once, so there are never two lists to reconcile. Collapse it to 60px and the same list becomes tiles.
Watching
Watch the call tree as it happens
nothing to installNested tool calls, subagent delegations, durations ticking as they run, and what is queued behind them. Rebuilt from Claude Code's own transcript files, so there is nothing to instrument. The tailer polls once a second: you watch phases, not keystrokes.
Read what the agent did, not just what it said
transcript and planrefresh(), then adjust the suite.auth/session.test.tsTool runs are first-class blocks, and consecutive ones of a kind coalesce, so a two-hundred-turn session stays readable. The status line says what is happening rather than which tool is running, send becomes Stop while it works, and the agent's own plan ticks off beside it.
Take the keyboard back mid-task
a real ptyEvery session is a real pty you can type into, not a re-render of one. Run a command yourself, then hand it back. Sessions run concurrently, each with its own reserved dev port, and the preview tab probes that port and the usual defaults to render whichever server answers.
Directing
Staff the project once, then work the board
project homeEach lane pins a model, an effort level, and permissions, so launching a correctly configured session is one click instead of a setup ritual. Work moves on the board: 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, because nobody saw the work finish.
Hand work between agents, on the record
the dispatch logdev/briefs/tray.md.dev/briefs/reply-impl.md.
One agent can route 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. Results come back through
operator__report and arrive on the board as a diff, not as chat.
Pick the model where you define the agent
your .claude/agents
Haiku for extraction, Sonnet for the everyday, Opus where it earns its keep, chosen
at the point where you say what the agent is for. It edits the
.claude/agents files you already have and writes back to the same
markdown, so your agents keep working in the terminal with Operator closed.
Landing
Run agents in parallel without collisions
one worktree per taskOne 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.
Review the diff and land it in place
local onlyWork comes back as a diff you read in place, then commit, merge, or discard without leaving the window. Usage is tokens per model, split into input, output, and cache reads. No dollar figures anywhere: what a token costs depends on your plan.
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.
| Behaviour | Status | Why |
|---|---|---|
| Stop an agent mid-run | does | Send becomes Stop. That is Claude Code's own interrupt, not a kill: the session survives and hands the turn back. |
| Push a message into a busy lane | leaves 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 forever | leaves alone | A reply chain with no human in it hits a hop limit, and a pair sending too fast is suspended. |
| Host or proxy the model | leaves alone | It runs the CLI you already have. Your Claude Code auth, your account, your session. |
| Send anything to a server | leaves alone | Transcripts are read from disk and rendered locally. No upload, no telemetry, no account. The code is public, so this row is checkable. |
| Estimate what a session cost | leaves alone | Tokens are measurable. Dollars depend on your plan. |
Why it exists
I run several Claude Code sessions at once, across a few repos. I wanted one window where I could see what each was doing, stop the one that had gone wrong, and read the diff before it reached my working tree. Operator is that window. Every panel above exists because I needed it, in the order I needed it.
It is not a product. No roadmap, no support queue, no telemetry, no account. I use it every day, which is the only guarantee it comes with. The source is MIT, so if it is close but not quite right for you, it is yours to change.
Operator, standing by.
Free, about 10 MB. It reads the Claude Code sessions you already run.