██████╗ ██████╗███╗ ███╗██╗ ██╗██╗ ██╗ ██╔════╝██╔════╝████╗ ████║██║ ██║╚██╗██╔╝ ██║ ██║ ██╔████╔██║██║ ██║ ╚███╔╝ ██║ ██║ ██║╚██╔╝██║██║ ██║ ██╔██╗ ╚██████╗╚██████╗██║ ╚═╝ ██║╚██████╔╝██╔╝ ██╗ ╚═════╝ ╚═════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝
ccmux — a cross-device tmux session manager for AI coding agents: run Claude Code, Codex, Cursor and more from any device, even your phone
a cross-device tmux session manager for AI coding agents
Run your coding agents from any device —
even your phone.
One TUI for every coding-agent session you're running — Claude Code, Codex, Cursor, and more. tmux keeps each one alive; ccmux is the single dashboard over all of them, on every device you own.
// dashboard
One view. Every session, every project, every device.
Five agents running in parallel across four projects, color-coded by state — active, idle, needs your input. The dashboard updates live as each session moves, and the Devices panel shows every other ccmux-running machine on your tailnet right next to it.
cross-device
Start on your Mac, answer from your phone, resume on your laptop — the same session, nothing typed in between.
every agent
Claude Code, Codex, Cursor, and more — each project picks one and the whole TUI follows.
no names, no commands
Press Enter on the session you want. No tmux names, no --resume <hash>, no SSH-then-attach.
one-command setup
brew install, then ccmux setup. Runs over your tailnet via SSH or Mosh.
// hand-off
Start on your Mac. Continue on your phone. Resume on your laptop.
Same session. No commands typed in between.
It's 11pm. The session you started this morning on your Mac is still running — your laptop's lid has been closed for hours, but the daemon held a caffeinate lock and Claude kept thinking.
Your phone vibrates: Claude is asking a question. You tap the notification, you're attached. You answer, hit Ctrl-b d, lock the phone.
Tomorrow morning on the train, you open your laptop, type ccmux — the same session is right there, exactly where you left it. Three device transitions. Zero CLI commands.
// spawn
Spawn from anywhere.
Phone in the kitchen — kick off a new agent session on the Mac at your desk. Open the Projects tab on any device, press n, and pick the host — your local machine or any peer running ccmuxd on your tailnet. The remote daemon creates the directory and starts the agent; ccmux SSH-attaches you in. You never typed ssh.
// conversations
Every conversation. One tap.
ccmux remembers your past Claude / Codex / Antigravity / Cursor / pi / Grok threads — sorted by recency, ready to resume. Press 2 for the Conversations screen, Enter on the one you want. The daemon resumes the agent with the right session ID. You don't type claude --resume <hash> ever again.
// keybindings
No commands. No names to remember.
Everything is discoverable. Hit ? on any screen for the keymap.
you don't type
you hit
tmux is still the session store underneath — durable, scriptable, exactly what you'd expect. You just stop having to touch it.
// agents
Every agent. One workflow.
Each project picks its own agent and remembers it. The dashboard, daemon, and dispatch all follow.
claude codex agy cursor-agent pi grok
Stored per-project in .ccmux/agent. Default: Claude. Set a different default in config.toml.
// mcp
Your agent can call ccmux as a tool.
ccmux ships an MCP server. Wire it into Claude Code, Codex, Cursor, or anything else MCP-aware, and the agent gets a clean tool surface for every session, project, conversation, and machine on your tailnet.
read
- list_sessions
- read_pane
- list_projects
- list_conversations
- get_usage
- list_machines
- read_note · search_notes
act (opt-in)
- spawn_session
- spawn_bare_session
- send_keys
- kill_session
Hidden from tools/list until you pass --allow-mutate.
{
"mcpServers": {
"ccmux": { "command": "ccmux-mcp" }
}
}
An agent on your laptop can read what its sibling on the Mac mini is doing, kick off a helper in another project, pull a result back, and clean up — without you SSH-ing in. Point it at a tailnet peer with CCMUX_HOST=mini:7474.
// dev server
Dev server on the mini, viewed from anywhere.
The agent on your Mac mini runs npm run dev. You open http://mini:3000 on your phone, on your laptop on the train, on the iPad on the couch. Anywhere on your tailnet — which, with Tailscale, is anywhere you are.
on the mini
npm run dev
→ :3000
on your phone
Safari
http://mini:3000
on the laptop
curl mini:3000
→ 200 OK
ccmux didn't invent this — Tailscale + a machine you own did. ccmux just makes "leave an agent running, check its work from anywhere" the default workflow. Storybook, Postgres, the agent's own server, anything that binds a port.
// more
And a few more things ccmux quietly handles.
Reactive features that show up when you need them and stay out of the way when you don't.
moshi-hook. 02 Lid-close-proof Daemon holds a caffeinate lock while sessions are alive. Close the lid; the agent keeps thinking. 03 Auto-discovered Install ccmux on a new device and it shows up on every other device on your tailnet within seconds — no host config. 04 Terminal-native notes Every .md file in the project tree, grouped by folder, rendered in pane. Ripgrep search. No sync service. 05 Attaches over SSH or Mosh Reach any machine on your tailnet over plain ssh, or pin a host with mosh so the connection survives roaming and lid-close. Auto-detected per host. 06 One-command setup ccmux setup is an interactive wizard that checks tmux / mosh / tailscale and offers to install whatever's missing. ccmux doctor verifies it. // never stop shipping.
Try it on your machine
v0.1.1 is live on Homebrew. macOS, Linux (Linuxbrew), or Windows via WSL2 — brew install skzv/tap/ccmux and you're in.