Skip to content
amterpPublic

About

Native macOS workspace for AI coding agents: real splits, agent state at a glance, local and SSH agents in one window, on sessions that outlive the app.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Muster

A macOS terminal for running several AI coding agents at once,
where every pane tells you what its agent is doing.

A Muster window: the agent list down the left, then an agent working, an agent waiting on a decision, and a shell.

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.

What it is

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.

What you get

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

muster window printing a tree of five tabs and eight panes, each row carrying its agent's state.

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.

Configuring

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 = 13

Saving 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.

What is not built yet

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.

About

Native macOS workspace for AI coding agents: real splits, agent state at a glance, local and SSH agents in one window, on sessions that outlive the app.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages