Setup
A working bus is an install and one setup command away โ after that, every session you start joins on its own. The rest of this page walks the three steps, then the layers behind them: how the ๐ฌ badge lands on your tmux tab, what the session hooks actually do, and the three ways an agent comes to notice its mail.
setup
curl -fsSL https://muster.tools/install.sh | sh
muster setupmuster setup
Add --tmux to also render the ๐ฌ mailbox badge on your tmux tab, --dry-run to preview every change first, or --no-hooks to register the MCP server only.
muster setup installs hooks that will join the session to the bus: SessionStart registers every new session on the bus, and Stop drains its inbox at the end of each turn. A session can also call its own register_agent tool:
โบ register on the muster bus
Either way, that's a working bus โ your agents can message each other, hand off tasks, and share state.
tmux & the mailbox
When you have unread mail, muster sets a tmux option on your session โ @muster_inbox, holding the count โ and your tab renders it as a ๐ฌ badge. muster setup --tmux installs the render lines for you; these are the lines it adds:
# terminal/tab title: "๐ฌ2 mysession" while unread mail is pending
set -g set-titles on
set -g set-titles-string '#{?@muster_inbox,๐ฌ#{@muster_inbox} ,}#S'
# status bar: a ๐ฌ segment appended to status-left
set -ga status-left '#{?@muster_inbox,#[fg=colour0#,bg=colour6#,bold] ๐ฌ#{@muster_inbox} #[default] ,}'
Then reload with tmux source ~/.tmux.conf. If you keep a hand-tuned ~/.tmux.conf, merge the #{?@muster_inbox,โฆ} conditional into your own set-titles-string / status-left instead โ it renders nothing when there is no mail.
The badge persists until the agent reads its inbox, and switching to the tab does not clear it. muster only sets a tmux option here โ it never types into your pane.
hooks
Setup installed the hooks and step 3 said what they do โ SessionStart joins, Stop drains. What's worth knowing beyond that is their manners: a hook is a no-op for a session that isn't a registered agent, and it never blocks a session from starting.
One Codex quirk worth knowing: Codex fires SessionStart on the session's first turn, not at launch โ a freshly opened Codex session isn't on the bus until you say something to it, so give it any first message ("hi" is enough) before addressing mail to it. Codex also shows a one-time "Hooks need review" prompt on its first launch after setup โ choose Trust.
Set MUSTER_HOOK_DISABLE in the environment to turn the hooks into a no-op โ the guard for nested harness subprocesses, so an agent spawned inside another agent's session doesn't register itself or fire the Stop check.
channel
muster setup already registered the channel carrier, muster channel, beside the MCP server. Claude Code loads it only when the session is launched naming it:
claude --dangerously-load-development-channels server:muster-channel
With the flag, new mail is pushed into the session the moment it lands โ an envelope of sender, intent, and subject, never the body โ and an idle agent wakes without anyone typing. Without it, pushes are dropped silently and the badge and Stop hook deliver instead.
With pi, the same carrier connects through channels.tools: install the extension (pi install npm:channels.tools), add muster channel to your channels.json, and there is no launch flag โ the session spawns its channel servers itself.
wake
muster hook Stop entry from the hooks section above installed, an agent that finishes a turn with unread mail reads its inbox and replies on its own.