________________________________
< cowsay goes ai agents and tmux >
--------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
A TUI for managing Claude Code agent sessions across git worktrees. Replaces the create / resume / delete workflow of tools like claude-squad, using tmux as the session backend and your terminal for tab/window management.
Single Go binary. No daemon, no network, no background process.
┌─────────────────────────────────────────────────────────────────────────────┐
│ ^__^ │
│ (oo)\ moomux project1 project2 │
│ (__)\ │
├─────────────────────────┬───────────────────────────────────────────────────┤
│ SESSIONS │ DETAIL │
│ │ │
│ test-session ⬤ park │ status: ⬤ parked │
│ moomux-work-4 ⬤ work │ name: test-session │
│ moomux-work-3 ⬤ wait │ branch: test-session │
│ moomux-work-2 ⬤ wait │ worktree: ~/.local/share/moomux/worktrees/… │
│ moomux-work ⬤ park │ tmux: moomux-test-session │
│ │ created: 6 min ago │
│ │ │
│ │ _____________________________________ │
│ │ / this is my very first prompt of the \ │
│ │ \ session. just say hello world pls / │
│ │ ------------------------------------- │
│ │ \ ^__^ │
│ │ \ (oo)\________ │
│ │ (__)\ )\/\ │
│ │ ||----w | │
│ │ || || │
│ │ │
├─────────────────────────┴───────────────────────────────────────────────────┤
│ n:new enter:open x:kill d:delete tab:switch r:refresh q:quit │
│ P:+project D:-project │
└─────────────────────────────────────────────────────────────────────────────┘
Screen.Recording.2026-05-29.at.12.34.38-3.mov
For each session, moomux:
- Creates a git worktree on a new branch off your base branch
- Starts a detached tmux session in that worktree
- Launches
claudeinside it - Opens an iTerm2 tab attached to the tmux session
Status is detected by polling ~/.claude/sessions/*.json every 2 seconds and matching the session's cwd to known worktree paths.
- macOS or Linux
- Go 1.22+
tmuxgitclaudeCLI on$PATH(orcodex/opencode, depending on your project config)
git clone https://github.com/erickgnclvs/moomux
cd moomux
make install # builds and installs to ~/.local/bin/moomuxMake sure ~/.local/bin is on your $PATH.
First run creates ~/.config/moomux/config.toml. Edit it directly, or press P inside the TUI to add a project and D to remove one.
[projects.project1]
repo = "~/Development/project1"
branch_prefix = "erick" # optional — prepended to the branch name
base_branch = "main"
agent = "claude" # optional — "claude" (default), "codex", or "opencode"
[projects.other_repo]
repo = "~/Development/other_repo"
base_branch = "main"Each project key becomes a tab in the TUI.
moomux| Key | Action |
|---|---|
↑ / k |
Move selection up |
↓ / j |
Move selection down |
enter |
Open session in a new terminal tab |
n |
New session |
x |
Kill session (keep worktree) |
d |
Delete session (confirmation) |
r |
Force refresh |
tab |
Cycle through projects |
P |
Add a new project |
D |
Remove current project |
q / ctrl+c |
Quit |
| Indicator | Label | Meaning |
|---|---|---|
⬤ green |
working | Claude is actively running in the worktree |
⬤ amber |
waiting | Claude is attached but idle, waiting on you |
⬤ dim |
parked | Worktree exists, no tmux session — resume via enter |
make test # go test ./... -race
make build # produces ./moomux
make run # build + runContributions are welcome and encouraged.
I built moomux around my own workflow — iTerm2 on macOS, opening each agent in a new tab. That's the path I know best and the one that gets the most polish. If you use a different terminal or OS and want to improve the experience there, please go for it. The terminal-opener logic lives in internal/iterm/ and the detection logic in internal/app/, so that's a good place to start.
Open an issue or a PR — both are appreciated.
MIT