Run a crew of pi agents in tmux.
See which one needs you, on any machine.
Keep long jobs off your SSH session.
Keep the crew's builds from eating the machine.
Keep every session they ever ran.
| Tool | What it does |
|---|---|
| mu | Plans the work and hands it out: task DAG, per-agent workspaces, audit log |
| murmur | Shows which agent, on which host, is waiting on you, and jumps you there |
| mule | Runs the long build on a remote host without holding your SSH session |
| muzzle | Queues heavy commands from all your agents on each machine, and sizes them from what they really used |
| museum | Backs up every pi session from every machine to one store your agents can search |
| tsesh | Picks or creates a tmux session, with each session's agent state |
| dotfiles | Wires them into tmux: agent state in tabs and borders, a status pill, keys |
npm i -g \
@mu-crew/mu \
@mu-crew/murmur \
@mu-crew/mule \
@mu-crew/muzzle
pi install npm:@mu-crew/mu # mu's extension, skill and recipe prompts
murmur init # this node's murmur identity
pi install npm:@mu-crew/murmur # murmur's extension (state across machines, tmux badges)
pi install npm:@mu-crew/muzzle # muzzle's extension and skill: wraps heavy bash callsEach tool works alone. Start with mu: it knows exactly what each pi agent is doing (working, waiting on you, done), locally and on peered hosts over the agent's own SSH. Add murmur for the cross-machine "who needs me" view, tmux badges and jump, and state for CLIs other than pi. Add mule when a remote host caps SSH sessions or a command must survive a dropped connection. Add muzzle when several agents' builds and tests share one machine. Add museum when your sessions are worth keeping.
The tools share no code and no database. They meet in environment variables and tmux options:
- mu sets
MU_AGENT_NAMEandMU_WORKSTREAMin every pane it spawns. murmur marks those agents as crew and shows them only when they need you. - mu's pi extension serves a per-agent control socket at a path mu derives
from workstream and agent (
MU_CTL_SOCK); murmur's extension publishes@murmur_*tmux options. Both load in the same pi and do not depend on each other. - mule runs each job as
mule-<id>, so a remote job shows up in murmur too. - museum copies each machine's pi session files into its own folder in one store, over plain rsync, started by a pi extension as agents work. Agents read the store with a skill.
- muzzle needs nothing from mu, but uses what mu sets. A build you start in
your own shell goes ahead of builds queued by mu's workers, and
muzzle statusshows which agent holds each slot. - murmur publishes agent state as
@murmur_*tmux options. The dotfiles and tsesh read them, and so can anything else.
- Stay out of the model's way. The tools coordinate; the model decides.
- No daemons, no complicated setup. State is SQLite and files on each machine.
- Standalone tools that compose. Each is useful alone.
Built on tmux and pi, with narrower support for herdr, Codex, Cursor and opencode. The full stance is in STANCE.md and the design rules in ZEN.md.
AI coding agents wrote most of this code, running on this stack, with a human reviewing what ships. The CLIs print next steps and use distinct exit codes so an agent can drive them too.
Published as-is. Issues are welcome; open one before a pull request.
