ChatMux is a self-hosted web interface for discovering, reading, and controlling
coding-agent sessions running in tmux — from your desktop or your phone.
Install · Browser · Mobile · Agent support · Remote access · Docs
You run coding agents — 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:
|
No registration Agents already running in tmux just appear in the sidebar. Nothing to wrap, wire, or restart. |
One ordered sidebar Every provider in a single drag-sortable list, with RUN, READY, and ERROR badges 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. |
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.
Linux x86_64 (glibc 2.35+) with tmux, user-level systemd, and
curl/tar/sha256sum:
curl -fsSL https://github.com/devswha/chatmux/releases/latest/download/install.sh | bash
One command: verified download, a user-level service, your addresses, and a QR for the phone.
The installer downloads the canonical release archive, verifies its SHA-256,
starts a user-level service, and prints your addresses. chatmux status shows
them again any time. Pinned versions, access modes, updates, rollback, and
recovery are covered in the installation guide; source
development is covered in Development.
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 conversation view: cross-provider sidebar on the left, structured transcript and composer on the right.
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:
The same session as a real terminal — because sometimes you need the actual TUI.
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:
![]() The full session roster |
![]() Conversation view |
![]() Real TUI with a key bar |
"Chat view" below means the session renders as a readable conversation with a composer; otherwise ChatMux gives you an attached terminal. Both views can type into the real pane.
| Agent | Found automatically | Chat view | Send input | Start new session |
|---|---|---|---|---|
| Gajae Code (GJC) | Yes | Yes | Prompts and / commands |
Yes |
| Codex CLI | Yes | After its history is indexed | Prompts and $ skills |
Yes |
| Claude Code | Yes | After its history is indexed | Prompts and / skills |
Yes |
| Cursor CLI | Yes | After its history is indexed | Prompts and / skills |
Yes |
| OpenCode | Yes | After its history is indexed | Prompts and / skills |
Yes |
| Oh My Pi | Yes | After its history is indexed | Prompts and /skill: skills |
Yes |
| SSH tmux | Yes | No — terminal only | Terminal keystrokes | No |
| Local shell | Yes | No — terminal only | Terminal keystrokes | No |
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 and the installation guide.
flowchart LR
subgraph Host[Self-hosted machine]
TMUX[tmux sessions]
AGENTS[GJC · Claude · Codex · Cursor · OpenCode · Oh My Pi]
SSH[Remote SSH panes]
INDEX[Session discovery + transcript index]
API[ChatMux API]
TMUX --> AGENTS
TMUX --> SSH
AGENTS --> INDEX
INDEX --> API
end
API --> WEB[Web / PWA]
WEB -->|spawn · relay · resume · kill| API
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.
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.1.
npm run verify runs the full release gate: audit, typecheck, Rust checks,
tests, lint, identity checks, and a production build.
- 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.
- Production installation
- Remote access
- Self-hosted operations
- Product scope and roadmap
- Upstream provenance
- Contributing
- Issue tracker
GNU AGPL v3 · built for people who live in tmux


