ccmux: a cross-device tmux manager for AI coding agents

I kept starting Claude Code on one machine and losing track of it. So a couple of friends and I built a way to run all of them from anywhere, including my phone.

On a normal day I have three or four coding agents running across my machines, each stuck on the one where I started it, with no clean way to check on one from my phone or resume it on the laptop. tmux keeps the sessions alive, so the sessions were never the problem. What lived only in my head was which machine each one was on.

So Daniel Mandragona, Mike Choi, and I built ccmux, a cross-device tmux session manager for coding agents. It shows every session running on every machine you own and lets you drop into the one that needs you from any device, with no commands to remember: no claude --resume <hash>, no SSH-then-attach.

ccmux hero tour

One dashboard, five agent sessions across four projects, color-coded by state. Attach to one, then tour the rest.

The loop

It’s 11pm. My phone buzzes: the Mac mini session has a question. I answer from bed and hit Ctrl-b d. Next morning on the train I type ccmux on the laptop and the session is right there.

The dashboard

ccmux dashboard

Sessions color-coded by state: active, idle, needs your input. The Devices panel lists every other machine on the tailnet. The usage panel tracks Claude's 5-hour quota.

How it works

tmux provides the session persistence and ccmux is the view over it; Tailscale gives the machines a network anywhere, and Charm makes the TUI. ccmux reads the other machines’ daemons directly, and attaching is a real attach, SSH from the laptop or Mosh from the phone.

When a session prints a prompt and goes quiet, the daemon rings the terminal bell, and iOS terminals turn that into a push notification, no cloud in between.

attach and detach

Press Enter on a row to attach to the agent running inside tmux. Ctrl-b d to drop back to the dashboard.

Claude Code is the default, but Codex, Cursor, Antigravity, and more work too. Install with Homebrew plus a setup step:

brew install skzv/tap/ccmux
ccmux setup

Running it from the phone

ccmux on a phone-width terminal

The same TUI, same keys, in a 430-pixel-wide terminal. Attaches over Mosh.

Running it from my phone started all of this. Plain SSH drops when the phone switches networks or locks; Mosh survives that, so I detach on the train and reattach two stops later, same prompt.

ccmux running in the Moshi app on iPhone

ccmux in a real iPhone terminal, watching a release go out.

A native app

A TUI in a phone terminal works for power users. For everyone else, including me at 7am, we built a native iOS app on the same daemon and tailnet.

ccmux iOS app dashboard ccmux iOS app terminal

The iOS app: a live dashboard, and a real interactive terminal attached to the tmux session over a WebSocket bridge.

Raw to Chat mode toggle on iOS

Raw mode for driving the agent, Chat mode for writing to it.

Where it landed

I ran ccmux as my daily driver for months, and it picked up some installs and stars. Then a wave of agent-orchestration tools showed up, some YC- or VC-backed with dozens of contributors, shipping features by the day. A three-person side project couldn’t keep that pace, so we’re moving on.

ccmux.ai stays up as a monument to a fun experiment, the source with it under FSL-1.1-MIT, for anyone who wants a lightweight agent TUI. If you run more than one coding agent and you’ve lost one, it still works.