Are you the author? Sign in to claim
A mobile vibe-coding cockpit — built on tmux: drive your live session, Claude Code / Codex — anything a terminal can run

🌐 English · 🇨🇳 中文
One phone, a whole mobile vibe-coding cockpit. Built on tmux — one command on your computer, scan a QR, and your live session, Claude Code, Codex, git, previews and docs are all in your hand, creativity ready wherever you are.
handmux is more than a terminal on your phone. It puts the same live tmux session running on your computer into your phone's browser (real panes, not a read-only mirror), then builds a whole mobile vibe-coding cockpit around it: Claude Code / Codex push you the moment a pane needs a decision — approve with your thumb, or fire off a new instruction by voice; browse a full-screen colored git diff; preview a running site in one tap; hear a doc read aloud line by line; move files both ways. Nothing to install on the phone — open a link and you're in; "Add to Home Screen" and it runs full-screen as a PWA, basically a native app. Curl up on the couch or squeeze onto the train — the vibe coding never stops, your creativity stays in hand.
Real phone browser, real panes — say what you need and Claude Code writes it, then tap a filename to preview (left); a push pings you when needed, and you review the git repo & each agent's usage (right).
📖 Docs · 📝 Changelog · 📦 npm
Your computer needs tmux and Node ≥ 18; the phone just needs a browser. Pick one:
Homebrew — macOS (recommended) · installs Node + tmux for you:
brew install handmux/tap/handmux
npm — any platform · if you already have Node:
npm i -g handmux
Then run it:
handmux start # local / same-wifi, nothing exposed
start prints a QR code (plus a URL and token). Scan it with your phone — the token rides in the code, so you're signed in on first open. You'll see your real tmux session; tap one and start driving.
Want to reach it from anywhere? Add one flag for a free public HTTPS link:
handmux start --tunnel cloudflare # instant public URL (cloudflared auto-installed)
Tunnel types, self-hosting, Windows/WSL2, and the full command & flag reference → see the docs.
handmux start, one scan, done — no sign-up, no App Store, no app to sideload; just a link. "Add to Home Screen" and it's a full-screen PWA, as smooth as a native app.Shift+Enter or click the draft field to enter draft mode with shortcuts, upload, history, voice and multiline editing intact. Enter sends and stays in draft mode, Shift+Enter inserts a newline, and IME Enter only confirms composition; press Esc or click the terminal to return to direct input. Drag to select terminal text, then copy/paste with Cmd+C / Cmd+V on macOS or Ctrl+Shift+C / Ctrl+V (or Ctrl+Shift+V) on Windows/Linux; Ctrl+C remains the terminal interrupt. Settings → Keyboard mode can auto-detect or force Mobile/Desktop for this browser only. Echo still follows Handmux’s terminal snapshots rather than a real-time PTY. Browser-reserved shortcuts such as Cmd+W/T/L/R stay with the browser.Ctrl+C. handmux shortcuts configures shared key/text items; each phone's ⚙ editor shows the effective quick-bar order, interleaves shared and local items, and can remove a shared item from that device only with immediate undo. Adding a phone-local item confirms success and returns directly to the list. Server changes apply live and phones reload them on foreground—no restart or polling required.handmux push; target all devices, a named session, or a specific device.handmux restore; existing sessions are never replaced.handmux setup.handmux continuously maintains two redundant copies of the latest workspace metadata. They are not browsing history: ordinary changes and deletions handmux can confirm simply update the current state. A selectable checkpoint is archived only when the computer or tmux environment changes. If the final tmux session disappears outside handmux, tmux cannot distinguish an intentional deletion from a crash, so handmux retains the last state and can offer recovery immediately, without waiting for a new tmux server or session. Every checkpoint from the latest 24 hours is kept; older history is then trimmed to the newest 10, while the latest valid checkpoint never expires just because of age.
After such a restart, the phone shows Restore last workspace for one hour when a checkpoint has work left to restore; if tmux has no sessions it opens the confirmation directly. Choosing Ignore this backup suppresses that checkpoint only on that phone; an ordinary close does not. When recovery finishes, the phone reports the actual sessions, windows, and panes restored, but does not automatically open or bind them; choose Bind restored sessions if you want them on that phone. The CLI remains available after the phone prompt expires:
handmux restore --dry-run # preview the latest plan
handmux restore # restore; TTY picker, otherwise latest
handmux restore --list # list retained checkpoints
handmux restore --checkpoint <id> --session api # select history / restore one session
Restore is additive and idempotent. It never stops, renames, replaces, or changes the topology of a current session; a name collision becomes name-restored, then name-restored-2. Windows, panes, working directories and layouts are rebuilt where safe. Only verified Claude Code/Codex sessions are resumed from their persisted session IDs; ordinary panes reopen as shells in their saved directories, without replaying commands or scrollback. Metadata lives under ~/.handmux/workspaces/; it can include paths, tmux names/layout and agent session IDs, but not pane output.
Send a push notification to your phone from any script, CI step, or build hook:
handmux push "Build done" "Took 3m12s"
Runs on your computer against the already-running handmux server (loopback + local server token — no config, no remote endpoint). Web Push must be enabled first (handmux setup).
Syntax
handmux push <title> <body> [options]
| Flag | Description |
|---|---|
--session <name> | Target all devices subscribed to this tmux session (repeatable; comma-separated values OK) |
--device <key> | Target a specific device by its key (repeatable; comma-separated values OK) |
--tag <T> | Notification tag (collapses duplicates) |
--url <U> | HTTP(S) URL or same-origin relative path to open when the notification is tapped |
Scopes — pick at most one:
--session — only devices subscribed to the named session(s)--device — only the specified device(s) by key--session and --device are mutually exclusive.
The device key is shown in the phone app under Settings → Script push. It is an addressing identifier, not a secret — the security boundary is the local server token.
Reliability: Web Push is best-effort. For delivery-critical alerts use a dedicated messaging app (WeChat, Slack, etc.).
No tunnel by default — the phone connects straight to your own computer, nothing exposed and no middleman. To reach it from outside, just ask: does your machine already have a public address?
cloudflare (zero-config, up in seconds, but its public edge can be slow or unreliable in some regions) · cloudflare-named (your own domain, steadier) · natapp / cpolar (domestic providers that stay reachable inside mainland China) · ssh self-hosted (through your own server).Tunnel config, server-side reverse proxy, autostart, voice/push credentials, and port previews → see the docs.
Once autostart is installed, handmux start / stop / restart coordinate with that same launchd/systemd service (including after an upgrade). A lifecycle lock prevents concurrent launches; status shows the running version and warns with PIDs if stale/duplicate supervisors exist, while stop reaps every copy.
Your computer needs Node ≥ 18 and tmux ≥ 3.0; the phone just needs a browser. On Windows, run it inside WSL2 (a real Linux kernel + real tmux) — see the docs.
Hit a bug, or wish handmux did something? Open an issue — that's the channel that actually gets tracked (Chinese or English both welcome). Users in China can also join the WeChat user group.
📖 Docs · 📝 Changelog · 🔒 Security · License AGPL-3.0
Found a security issue? Please report it privately (see SECURITY.md), not via a public issue.
Design enforcement with memory — keeps your UI consistent across a project
Create animation-rich HTML presentations using a coding agent's frontend skills
1000+ skills curated from Anthropic, Vercel, Stripe, and other engineering teams
Detects 37 AI writing patterns and rewrites text with human rhythm across 5 voice profiles