v0.1.1 — install via Homebrew
 ██████╗ ██████╗███╗   ███╗██╗   ██╗██╗  ██╗
██╔════╝██╔════╝████╗ ████║██║   ██║╚██╗██╔╝
██║     ██║     ██╔████╔██║██║   ██║ ╚███╔╝ 
██║     ██║     ██║╚██╔╝██║██║   ██║ ██╔██╗ 
╚██████╗╚██████╗██║ ╚═╝ ██║╚██████╔╝██╔╝ ██╗
 ╚═════╝ ╚═════╝╚═╝     ╚═╝ ╚═════╝ ╚═╝  ╚═╝

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.

terminal
$ brew install skzv/tap/ccmux
$ ccmux setup
$ ccmux

Homebrew updated just now

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

ccmux — dashboard tour
ccmux dashboard tour: 5 parallel agent sessions across 4 projects, color-coded by state. Attach to Claude Code, then tour Conversations, Notes, Agents, Settings, Network screens.

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.

ccmux running inside the Moshi app on an iPhone: a live ccmux session, the status line reading 'reachable via Moshi', and Moshi's on-screen key bar at the bottom.

ccmux in the Moshi app, on a phone

On your phone you connect through the Moshi app — a push when an agent needs you, then a tap to attach. Or wire up Telegram and just reply approve — from the watch too. Building your own client? ccmuxd exposes an HTTP API.

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

ccmux — new project on any device
ccmux new-project flow: open the Projects tab, press n, pick a host and agent, submit — ccmux creates the directory and attaches you to the new session.

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

ccmux — resume a conversation
ccmux Conversations screen showing past Claude threads sorted by recency. Selecting one and pressing Enter resumes the agent with the correct session ID.

// keybindings

No commands. No names to remember.

Everything is discoverable. Hit ? on any screen for the keymap.

you don't type

tmux attach -t c-auth-redesign
claude --resume 8f3a-91bc-...
ssh user@mac-mini -t tmux a -t c-foo

you hit

Enter on the session you want
2 to see past conversations
? to see the keymap

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.

ccmux — pick agent
Creating a new project in ccmux, cycling through the available coding agents with arrow keys, then submitting to boot the selected one.
Claude Code
claude
Codex
codex
Antigravity
agy
Cursor
cursor-agent
Pi
pi
Grok
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.

~/.claude/settings.json
{
  "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.

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