One interface for Claude Code, Codex, OpenCode, and more —
already running in your tmux.
You run coding agents — Oh My OpenAgent, Gajae Code, Claude Code, Codex, Cursor CLI, OpenCode, Oh My Pi — inside tmux, like always. ChatMux finds them by itself and shows every session in one browser page, from your desktop or your phone.
- Zero registration: Agents already running in tmux just appear in the sidebar. Nothing to wrap, wire, or restart.
- Multi-provider: Every provider in a single drag-sortable list, with
RUN,READY, andERRORbadges for live state. - Chat or terminal: Recognized transcripts read as conversations; everything else is a real attached terminal. Input only ever reaches a pane whose identity ChatMux has verified.
- Phone-ready: Installable PWA over Tailscale or a LAN password — the full roster, conversations, and the real TUI with a key bar.
- tmux stays the boss: Restart or remove ChatMux any time; your tmux sessions keep running untouched.
ChatMux does not bundle any AI subscription. Install and log in to each agent CLI as the same OS user that runs ChatMux.
curl -fsSL https://github.com/devswha/chatmux/releases/latest/download/install.sh | bashRequires Linux x86_64 (glibc 2.35+) with tmux, user-level systemd, and curl/tar/sha256sum.
The installer downloads the canonical release archive, verifies its SHA-256, starts a user-level service, and prints your addresses — plus a QR code for the phone. chatmux status shows them again any time.
Pinned versions, access modes, updates, rollback, and recovery are covered in the installation guide.
Open the printed Local address — running tmux agents appear in the sidebar by themselves. Sessions with a recognized transcript render as a structured conversation with a composer:
The CLI output tab of the same session is the real TUI running inside tmux, rendered in the browser — answer menu prompts, watch raw output, or take over with real keystrokes:
Turn on Tailscale on the phone, scan the QR code from the install output, and use the in-app Install app button to keep ChatMux as a PWA:
For link discovery, browser-only use, Android/iOS installation, notifications, and troubleshooting, see the mobile usage guide (한국어).
![]() The full session roster |
![]() Conversation view |
![]() Real TUI with a key bar |
All listed agents are discovered automatically, accept direct input, and can be launched from ChatMux. Indexed histories render as conversations; live CLI output is always available.
| Agent | Chat view |
|---|---|
| Claude Code | After history is indexed |
| Codex CLI | After history is indexed |
| Cursor CLI | After history is indexed |
| OpenCode | After history is indexed |
Oh My OpenAgent (omo) |
After history is indexed |
| Oh My Pi | After history is indexed |
| Gajae Code (GJC) | Native |
SSH tmux and local shells are also supported as terminal-only connections.
Cursor sessions use the documented agent command; the legacy cursor-agent alias remains supported for older installations.
With Tailscale logged in, the installer configures Tailscale Serve automatically: approved tailnet accounts use the private HTTPS address with no separate password, and everyone else is denied. Without Tailscale, installation enables password access on the LAN with a one-time owner password:
chatmux access password # rotate/recover (signs out all sessions)
chatmux access enable tailscale # switch modes after Tailscale is availableUser allowlists, longer sessions, VPN mode, SSH tunnels, and public TLS options are covered in the remote access guide.
One ChatMux installation can be the hub for as many as nine other full ChatMux installations (ten PCs total). Open the hub in your browser to see the hub and enrolled peers together; each peer still owns its tmux sessions, database, keys, updater, and direct browser UI.
Enrollment is owner-only in Settings → Hosts. Generate a single-use, 10-minute pairing code on the peer, then add it from the hub. Use the peer's Tailscale Serve endpoint as wss://<peer-host>.ts.net:<serve-port>/fleet-ws by default. ChatMux has no cloud relay and never falls back to plaintext. The only supported plaintext exception is an owner-created SSH local forward saved as ws://127.0.0.1:<local-port>/fleet-ws or ws://[::1]:<local-port>/fleet-ws.
Remote hosts can show Offline or Syncing. Syncing suspends remote writes until a fresh snapshot completes; Offline never redirects an action to the hub or another peer. Open that PC's own ChatMux address for direct recovery. See multi-PC setup and recovery.
The chatmux command manages the installed service:
chatmux status # version, addresses, data locations
chatmux access users # allowed Tailscale accounts
chatmux access allow user@example.com
chatmux sandbox ~/my-project # run inside a Docker sandbox
chatmux fleet identity # public installation ID and fingerprint
chatmux fleet diagnose # redacted peer reachability- ChatMux links tmux process ancestry to native transcript identifiers. A matching working directory alone is never enough to authorize a destructive action, and the tmux session identifier is rechecked before relay or termination.
- The backend binds to loopback. Tailscale mode trusts Serve identity headers only from loopback on the expected HTTPS origin; the installer never enables Funnel or a public listener, and unapproved users fail closed.
- Password mode uses
HttpOnly,SameSite=Strictcookies with persistent logout revocation. - State and indexes live below
~/.chatmux. Back up~/.chatmux/databefore migration or upgrade. Multi-PC federation does not replicate or cloud-sync that data.
git clone https://github.com/devswha/chatmux.git
cd chatmux
npm ci
npm run devOpen http://127.0.0.1:5173. Development requires Node.js 22.22.2+ on the 22.x line or 24.15.0+ on the 24.x line, npm, Git, tmux, and Rust 1.85+. npm run verify runs the full release gate: audit, typecheck, Rust checks, tests, lint, identity checks, and a production build.
- Production installation
- Mobile usage (한국어)
- Remote access
- Self-hosted operations
- Product scope and roadmap
- Upstream provenance
- Contributing
- Issue tracker
AGPL-3.0 · built for people who live in tmux





