Conduct a fleet of AI coding agents

Maestro is a terminal of engineers, by engineers, for engineers — a native macOS terminal multiplexer built because running a pile of Claude Code and Codex sessions in parallel meant losing track of half of them. You see every agent's status at a glance and dispatch new work in plain language, without ever getting blocked waiting on one. Spend your time building, not managing terminals.

curl -fsSL https://maestroterminal.com/install.sh | sh

One command installs the app + CLI — signed, notarized, no Gatekeeper dialog. macOS · Apple Silicon · free

Maestro conducting a fleet of AI coding agents — a sidebar of live status cards for Claude, Codex, and other agent sessions grouped by project, alongside a focused Claude session applying a live code edit and running its test suite.

Sound familiar?

Running a fleet of AI agents shouldn't feel like this.

You quit the terminal — or it crashed, or auto-updated, or the machine rebooted — and every running Claude and Codex session vanishes. Now it's a stressful scramble to track them all down and pick up where you left off.

A dozen agents across five projects, and you can't remember which one is doing what — or which tab it's buried in.

Still working? Wedged? Finished ten minutes ago? You're clicking tab to tab just to find out each one's status.

One agent has been waiting on your answer the whole time — and you never noticed, so it sat idle instead of shipping.

Maestro solves all of it. Sessions survive any restart and truly resume, every agent's status is one glance away, and the ones that need you come find you. Stop babysitting terminals — focus on the important work, run more tasks in parallel, and get the most out of your AI.

Continuity

Quit without fear. It keeps going.

Relaunch and everything is back: windows, the session tree, scrollback, and true Claude/Codex resume. Better still, agents carry on by themselves — with auto-continue, an interrupted session resumes and keeps working after a restart, no prompt needed. Even usage limits don't stop you: Maestro flags a rate-limited agent, counts down to its reset, and continues the instant your quota is back — so long-running work finishes while you're away. ⌘⇧T reopens closed tabs, and the terminal keeps up with WebGL rendering, ⌘F find, ⌘P palette, font zoom, split panes, and light/dark themes — signed, notarized, and self-updating.

refactor billing
rate limit · resumes in 2:14:00
limited2:14:00opus 4.8 · 71k
migrate schema
claude · master · paused
paused1:20sonnet 5 · 38k
write integration tests
codex · master · working
working0:12gpt-5 · 22k
↩ auto-continues on restart & at limit reset
Shelves

Put work aside — bring it right back.

Not every session needs to be in your face. Stash the ones you're pausing onto a visible shelf; archive the finished ones into closed history to clear the sidebar. Bring any of them back — with the agent, resumed — in one click or a single CLI verb. Closing a tab archives it by default behind an undo countdown, and fuzzy search finds anything you've shelved.

Stashed
spike: websocket transportunstash ↩
old migration attemptunstash ↩
Archived · closed history
fix flaky ci test ✓restore ↩
bump deps to latest ✓restore ↩
Situational awareness

Every agent, one glance.

Projects group sessions into a lineage tree of status cards, each with a live timer — and every state has a color, so one glance at a card's pill tells you exactly what an agent is doing and whether it needs you. When an agent needs an answer (prompt) or has work ready to check (review), the card flips state, an unread dot lights up, a live terminal popup appears, and a native macOS notification takes you straight to the right tab. Cards show the model and context size at a glance, plus job and state badges you name yourself — call the work whatever it actually is, and each name keeps its own stable color — and any links you pin to a card, like a branch, a ticket, or a preview URL. Lost track of one? Quick-open finds a session by name, model, account, status, job, state, link, or agent kind.

fix flaky ci test
claude · master · working
working2:14opus 4.8 · 82k
refactor auth
Approve the schema migration?
prompt0:47opus 4.8 · 61k
migration plan
Ready for you to review
review1:05sonnet 5 · 44k
docs sweep
Finished its turn
done0:32gpt-5 · 18k
workingactively building
backgroundrunning a background task
compactingcondensing its context
promptneeds your answer
reviewready for you to check
donefinished its turn
pausedinterrupted — resumes on demand
limitedusage limit; counting down
errorthe run failed — take a look
needs you to sign in
idlequiet — nothing running
shella plain shell, no agent
exitedthe process ended
Multi-account

All your agent accounts, one fleet.

Claude, Codex, and Kimi all run side by side — sign in to every account you have, work, personal, the spare Max plan, each with isolated credentials and a live usage meter. New sessions pick an account by strategy: spread work evenly, grab the most headroom, rotate, or always ask. When an account hits its usage limit mid-run, the session fails over to a fresh one and keeps going — and you can swap any session's account mid-conversation from the card, the context menu, or maestro swap --account. When a login goes stale the row flags revoked or expired — click the badge to re-authenticate in place, no session lost — and each row shows its plan's renewal date. Even a claude you hand-type into a shell binds to an account automatically.

Adding an agent doesn't mean waiting on us, either: Kimi ships as a built-in extension, so a provider brings its own accounts, credentials, and models to the same fleet.

Maestro's Accounts panel: two Claude and two Codex accounts, each with its own credentials, plan, and live usage meters, plus a session-assignment strategy and auto-failover toggle.
⇄ swap accounts mid-session · auto-failover when one hits its limit
Notifications

The ones that need you come find you.

The instant an agent wants your input or finishes, Maestro fires a native macOS notification — click it and you land on the exact tab. A live terminal popup mirrors the session so you can answer without hunting for it. Nothing slips through: a built-in notification center keeps the full history with one-click restore and mark-as-read, unread tabs light up in the sidebar, and ⌘U jumps to the next thing waiting on you. Choose exactly which states notify you in settings.

MAESTRO · now
refactor auth
Agent needs your answer · prompt
MAESTRO · 1m ago
fix flaky ci test
Run finished · done ✓
🔔 notification center keeps the history · ⌘U next unread
Built-in editor

Read and edit right beside the agent.

Every session carries a side panel with its own tabs, so you can open a file in a built-in editor without leaving Maestro. Click a path in the terminal or hit ⌘P to jump straight to it. It reads like an editor should: -click a symbol or an import to jump to its definition, and ⌘[ / ⌘] walk back and forward through everywhere you've been. A dirty-diff gutter marks exactly what changed since the last commit — click any hunk to peek the original — and the same edit markers ride along in the scrollbar overview ruler and the minimap, so every change an agent made is one glance (and one click) away. Markdown opens with a live reading preview and ⌘F find; images and editable SVGs get a zoom/pan viewer; extensions can even contribute editors of their own. ⌘⇧T reopens the last tab you closed, panel tabs included.

terminal billing.ts README.md
16export function priceRun(run: Run): number {
17 const rate = RATES[run.model] ?? DEFAULT_RATE
18 return run.tokens * rate
19}
20
21 // leverage = agent work ÷ your active time
22 const leverage = agentMs / Math.max(activeMs, 1)
23 return { cost, leverage }
▎ dirty-diff gutter · ⌘F in preview · zoom/pan image & SVG viewer
Timeline

Watch the whole week play back.

Every session becomes a block on a real time axis, colored second by second by what it was doing — working, waiting on you, blocked at a usage limit, idle. Blocks survive quits and restarts, so a run that spanned three days reads as one bar. The strip along the top marks when you were actually at the keyboard, which is what makes the rest honest: tell Maestro which states count as being away and it trims those stretches out of every number below. Scrub Day, Week, Month, or Year, watch the playhead track live as agents work, and hit Analyze my usage with an agent to open a session that reads the whole picture and tells you what to fix.

Maestro's Timeline window: a week of agent sessions as colored blocks on a time axis with an activity band showing when the user was at the keyboard, above a dashboard of agent-work, active time, leverage and cost, an agent-work vs active-time chart, and a 'Where the time went' status breakdown.
▬ 38.8h of agent work against 2.2h of yours · 17.6× leverage · median 44s until you acted
Analytics

See how much your fleet actually ships.

Maestro logs every session's activity, so you get real numbers instead of a hunch. A GitHub-style heatmap shows a rolling year of work at a glance, and per-day and per-range dashboards break down agent work time, tokens, model split, and how many agents ran at once. A leverage ratio weighs agent work against your own active time, and a self-priced cost estimate puts a dollar figure on the run. A bottleneck view shows where the time actually went — waiting on you, blocked on usage limits, or grinding on the machine — with median and p90 figures for how long each agent sat waiting before you got to it.

3.4×
Leverage
6h 12m
Agent work
1.9M
Tokens
7
Peak parallel
working needs you limited idle
▦ a rolling year of activity · inactivity excluded
Orchestration

Say it in plain English. It just happens.

An always-on natural-language field sits at the bottom of every window — and it drives everything. Ask for it however you'd say it, and the orchestrator carries it out: spin up sessions, dispatch a task to any tab, type a command into a shell, change a setting, even swap this session's agent for a different AI. Anything you could do by hand — and anything the CLI can do — you can just say. Each query fires a non-blocking run to a warm-pooled agent, so the field is ready again the instant you hit Enter; runs stream live status chips and report back when they finish.

And a dispatched message never lands on top of you. If you're halfway through typing a prompt when one arrives, it parks instead of merging into your text, then goes out the moment you submit — or release it yourself from the card. Force one through and Maestro banks your half-written draft in the agent's own kill ring and hands it straight back.

⌘ maestro ›run the tests in the billing tab and fix what breaks…
⌘ maestro ›swap this session to codex and keep going
⌘ maestro ›open a shell in ~/dev/web and start the dev server
⌘ maestro ›bump the terminal font size to 15
run #7 · working 0m48 run #6 · done
Task structure

Big tasks become trees, not tab soup.

Every session can have children: spawn a child agent for a subtask, a sibling for parallel work — ⌘T and ⌥⌘T from the keyboard, or --child and --sibling from the CLI. The explorer shows the whole lineage per project, and closing a parent can cascade through its finished subtree in one stroke. Agents structure their own work the same way: a session fans its subtasks out into child sessions and reports back up the tree.

Maestro's sidebar for one project: six session cards with colored status pills and live timers — 'add rate limit headers' waiting on permission to edit rate-limit.ts, 'fix flaky ci test' working, 'refactor billing' done, and 'build auth feature' working with its nested children 'write integration tests' and 'api docs' ready for review — each showing its agent, model, context size, and account usage, above collapsed Orchestrators and Stashed sections.
One control plane

The UI, the CLI, and the agents share one language.

A single maestro binary over a unix socket drives everything from the terminal — open, focus, move, split, stash, and close sessions, swap an agent's model, even read and change settings. No reaching for the mouse. Everything the app can do, a script can do — and the agents can too: they spawn siblings, fan out subtasks, and manage their own sessions.

maestro list                                # every session as JSON
SID=$(maestro open --kind claude --child)   # nest an agent under this one
maestro send "$SID" "npm test"              # type it and submit
maestro wait "$SID" --until idle            # block until it's done
maestro swap "$SID" --to codex              # switch the agent, keep the tab

Read the CLI docs →

Get Maestro

macOS on Apple Silicon · v0.2.27

curl -fsSL https://maestroterminal.com/install.sh | sh
Download Maestro-arm64.dmg

Signed & notarized — launches straight from the dmg, no Gatekeeper prompt, and auto-updates itself after that. all releases