A macOS terminal for running several AI coding agents at once,
where every pane tells you what its agent is doing.
brew install amterp/tap/muster
Apple Silicon, macOS 14 or newer. One command brings the app and the muster command, because they
are one artifact - the CLI is a file inside the bundle, built from the same commit and carrying the
same signature.
To upgrade, choose Upgrade muster in the app menu or run muster upgrade. Homebrew upgrades Muster
in a pane of its own, your agents keep running, and the app opens again when it is done.
Split a window into panes, put a coding agent in each, and read the whole lot at a glance. Every agent's state - working, blocked on you, waiting on its own build, stuck, done, idle - sits on its row in the agent list down the side, and a pane whose agent wants noticing carries it on its own edge too. Fifteen agents is something you read rather than something you click through.
It is a real terminal underneath: every pane is a
libghostty surface, the same engine Ghostty renders with,
and the keybindings are the platform's own - cmd+d splits, cmd+t opens a tab, cmd+f searches.
No prefix key, so nothing you type has to get past Muster before the agent sees it.
Your agents do not live in the app. A session daemon owns the terminals, so quitting Muster, closing the lid or dropping the VPN costs you nothing: the agents keep working and every pane comes back. When you are finished for the day and want them to stop too, the app menu has a second way out that says what it would end before it ends it.
A chord to every agent. cmd+2 goes to the second tab, and 3 pressed with cmd still down
goes on to that tab's third pane. Every row in the list shows the chord that reaches it, so an agent
is a glance and two keystrokes away whether or not a split is showing it. The mouse's back button
takes you to the pane you were on before, in whatever tab, and forward undoes it.
A notification when an agent needs you, and one click back to it. An agent that starts waiting
on you, or that finishes while nobody is looking, says so - and activating the notification takes
you to that pane, including one no split is showing. cmd+shift+a goes there without the
click, to whichever agent has waited longest, the blocked ones first, in whichever window it is. A pane you
are already looking at stays quiet; that is what its border is for. Both are switchable, and one
line in your config mutes the lot, which silences the notifications and leaves cmd+shift+a.
A pane can also be made quiet on its own, and hidden from every window with its agent still
running, which suits the helpers an agent runs and talks to itself: a Hidden list in the sidebar
shows what they are doing and brings any of them back.
Names you write, and titles you don't. Name a pane and the name sticks, emoji and all, because
the daemon writes it down rather than the app. An agent that sets a terminal title gets a second
line under that, so a row reads payments spike over chasing a flaky test. Drag one row onto
another and the two panes trade places; drop it on a row in a different tab and the agent moves
there. Grab a pane by the handle at the top of it and drop it on another pane's edge to put it
on that side, as in Ghostty, which is also how a side by side pair becomes one above the other.
Right-click a pane, a tab's caption or an agent's row to split, rename, move or close it, or to
copy the ID muster takes for it.
More than one window, and cmd+n to make one. Every window is a window of one app, so
cmd+q quits them all - and the next launch brings every one of them back onto its own tabs,
after a crash as well as a quit. Launching Muster again, from the Dock or with open -n, brings
the running app forward rather than starting a second one. cmd+shift+w or muster window close <name> closes one window, which keeps its tabs; Reopen Closed Window, the Reopen submenu
beside it, or muster window reopen <name> brings it back. Every tab belongs to one window,
and each window lists only its own; drag a tab's row, or any row of a window holding one tab,
into another window, or use Move Tab to Window, and its agents go with it still running. Any
muster command reaches any tab from any window, and --window names the window one is about.
Local and remote in one window. Name an SSH host in your config and its agents appear in the
same list as the ones on your laptop. cmd+shift+] and cmd+shift+[ step between a laptop tab and a
devenv tab the way they do in Ghostty, and one tab can hold both at once - drag a devenv agent's
row onto a laptop tab's caption and they sit side by side, or right-click a laptop pane and split
it onto the devenv.
A CLI that drives the window. muster reports what every agent is doing, draws where every
pane sits and how big it is, waits for one to finish, reads back what any pane has printed, makes
panes and tabs, moves and resizes them, names them, types into them, moves the keyboard and zooms. Every pane Muster opens on your laptop can reach
it, and it talks to the window that pane is drawn in - the address is in the pane's environment, so nothing
has to be told which window it belongs to.
muster window
muster window --layout
muster pane new --down --run claude --name "🤖 reviewer"
muster pane send --pane p1w3r07bsd "read AGENTS.md and wait" --enter
muster pane wait --pane p1w3r07bsd --until idle,blocked
muster pane read --pane p1w3r07bsd
muster pane move --pane p1w3r0ab2n --onto p1w3r07bsd
So an agent told "split two panes below you and start an agent in each" can do it, and read back
what happened. muster docs is the reference, and it ships inside the binary.
One file, ~/.muster/config.toml, every line of it optional:
option_as_alt = "left" # so opt+t reaches an agent instead of typing †
[notifications]
done = false # tell me about agents waiting on me, not ones that finished
[keymap]
split_right = "cmd+d" # the default; Ghostty's, wherever Ghostty has one
close_pane = "" # unbound - the action stays, the shortcut goes
[font]
family = "Fira Code"
size = 13Saving is enough: colours, fonts and the keymap reach panes that are already open. A file that will
not parse changes nothing and says why at the foot of the agent list, naming the value and what to
write instead. docs/configuration.md is every key.
Muster is young, and these are the gaps worth knowing about before you install rather than after:
- A pane sits beside another machine's panes only as that machine's part of the tab, to their left or right: a laptop pane cannot go above a devenv one. And a pane dropped on a tab's caption lands where Muster puts it; to choose, drop it on a pane's edge once that tab is on screen.
- Two windows cannot show the same tab. Muster's daemon draws each pane in one window at a time, so a tab is in exactly one window and moves between them rather than being shown in both.
- A pane on its own cannot be dragged to another window; it goes with its tab.
Muster is not a multiplexer, an agent framework, or a workflow: it gives you panes, states, sessions
and a scriptable surface, and has no opinion about how you run your agents. AGENTS.md is the
project's own account of itself, and what to read before contributing.

