Operator logo

Operator

Mission control for AI coding agents

A Mac app I'm building for the way I actually work. I want to run two or three Claude Code sessions at once, sometimes on the same repo, without them tripping over each other's changes, and decide on permission prompts without window-tagging between terminals.

The idea

Operator is the place I launch sessions from. Each one runs in its own embedded terminal, grouped by project. When an agent needs a decision, the prompt floats over whatever app I'm in. I say yes or no without breaking stride.

Running in parallel against the same repo means agents can trip over each other's changes. Operator gives each session its own git worktree, so the work stays isolated until I'm ready to review it, then I can merge it back from the in-app diff viewer.

Features

  • Launch from one window: Pick a folder, configure the agent (effort, permission mode, MCP), start. Each session lives in its own embedded terminal grouped by project
  • Isolated worktrees: Toggle worktree on and the session gets its own git worktree, so parallel agents on the same repo never collide
  • Notification pill: Floats over whatever app you're in when an agent needs a decision. Approve or deny without context-switching
  • Auto-approve rules: One click on "Always" turns a permission decision into a standing rule. All editable from the rules view
  • In-app diff review: See each session's changes in a built-in diff viewer, then Commit, Merge back to base, or Discard without leaving the app
  • Dashboard + audit trail: Live status for every session (running, waiting, compacting, idle) plus a local log of every action approved or denied
  • Command palette + themes: Cmd+K for the palette, native macOS notifications, light and dark

Keyboard

  • Cmd+K: Command palette
  • Cmd+N: New session
  • Cmd+W: Close active session
  • Cmd+19: Switch session

How it works

Operator ──spawns──▶ embedded terminal ──▶ claude
                                              │
                  (OPERATOR_TERMINAL_ID set in the pty env)
                                              │
                              Agent wants to run a tool
                                              │
                              Hook fires → POST localhost:47821/hook
                                              │
                              Operator holds the connection
                                              │
                  Notification pill / Inline prompt → You decide
                                              │
                              Decision sent back → Agent continues or stops

Operator wires Claude Code's hooks on launch, but the hook only acts on sessions Operator itself started — it identifies them by the OPERATOR_TERMINAL_ID env var injected into each terminal's environment. A claude you run yourself in iTerm or VS Code hits the hook but exits immediately, so Operator stays a session manager, not a machine-wide gateway. If Operator isn't running, the hook fails open and Claude Code works normally.

Stack

Electron + React + Vite + Tailwind on the front. Express, better-sqlite3, and node-pty behind it.

Status

In active build, June 2026. Private repo for now.