mtmux — your tmux sessions in any browser, with agent notifications
v0.9.4 agent hooks are live →

Your tmux,
in your pocket.

One command turns the tmux server you already run into a browser session you can open anywhere. Real panes. Real prefix key. Truecolor. And a push notification the second your agent finishes — or quietly gets stuck.

$ npm i -g mtmux
2-minute quickstart
no SSH keys on your phone· e2e encrypted· works on cellular· self-host in one flag
9:41 LTE▮▮▮
m.mtmux.com/work
claude ~/repos/atlas
✻ Refactoring auth middleware…
· read src/auth/session.ts
· edit src/auth/guard.ts +41 -12
· run pnpm test auth
✓ done in 3m 12s · 14 files
~/repos/atlas · vitest
PASS auth/guard.test.ts (18)
PASS auth/session.test.ts (9)
Tests 27 passed
 
work0:nvim1:claude*2:test- mbp 9:41
⌃b esc tab ctl /
MTMUXnow
claude finished in work:1
14 files changed · 27 tests passed · awaiting your review
!MTMUX6m
codex is waiting on you
“Apply patch to migrations/? (y/n)” in api:0
attaches to what you already run
tmux 3.3a+neovimclaude codecodex cligemini cliaiderlazygithtopk9s
// how it works

Three lines, then close the laptop.

The daemon lives next to your tmux server. Nothing is copied, nothing is synced — your browser is just another client attaching to the same session.

01
Start the daemon

It discovers every running tmux server on the box, no config file required.

$ mtmux up
02
Pair a device

A one-time code exchanges keys. The phone never holds an SSH credential.

$ mtmux pair 9F4-2KD
03
Watch your agents

Point mtmux at the panes running agents and it learns their finish and stall signatures.

$ mtmux watch --agents
mbp — mtmux up
$ mtmux up
▚ mtmux 0.9.4 · daemon started (pid 4821)
tmux server /tmp/tmux-501/default
discovered 3 sessions · 7 windows · 12 panes
relay wss://relay.mtmux.com (x25519 · e2e)
agents claude in work:1 · codex in api:0
pair code 9F4-2KD expires in 5m
open https://m.mtmux.com/9F4-2KD
// fidelity

Real tmux. Not a screenshot of one.

Every keystroke goes to the same pty your laptop talks to. Your config, your plugins, your keybinds — untouched.

all features →
A prefix key you can actually press

A sticky modifier row puts ⌃b, esc, tab, alt and the arrows one thumb away — remappable to your own leader.

Panes that fit the screen you have

Reflow mode stacks a 3-pane layout vertically on a phone and restores it when you reattach on desktop.

Truecolor, ligatures, sixel

24-bit color, powerline glyphs, box drawing and inline images render exactly as they do in your terminal emulator.

Scrollback with real search

Pinch to zoom out of 10k lines of history, then / to search it. Copy-mode selections land in your device clipboard.

Survives the tunnel

Frames are buffered and replayed on reconnect, so a dead spot in the subway costs you scroll position, not output.

Fast enough to type in

Diff-based cell updates over a single WebSocket — typically 20–40 ms of added latency on the same continent.

// agents

Know the moment it stalls.

Long agent runs have two failure modes: finishing while you're away, and silently waiting for a keypress. mtmux reads the pane, not just the exit code — so you hear about both.

~/.mtmux/agents.toml
[agent.claude]
match = "claude"
done_when = "idle_prompt"
block_when = ["approve?", "(y/n)"]
stall_after = "5m" # no new output
notify = ["push", "slack"]

mtmux ships a preset for Claude Code: it recognises the idle prompt, tool-approval questions and permission dialogs, and includes the last diff summary in the push body.

~/.mtmux/agents.toml
[agent.codex]
match = "codex"
done_when = "exit_code"
block_when = ["Apply patch", "continue?"]
on_block = "push:high"
reply_from_notification = true

Patch-approval prompts arrive as a high-priority push with y / n actions, so you can unblock a run from the lock screen without opening the session.

wrap any command
$ mtmux run --label deploy -- ./scripts/ship.sh
# or from inside a script
$ mtmux notify --level ok "migration complete"
# or as a tmux hook
set-hook -g pane-died 'run "mtmux notify --level err"'

Anything that writes to a pane can be watched: aider, gemini-cli, make, terraform, a 40-minute test suite, a stuck rsync.

DONE2m ago
claude · work:1 finished
Refactored auth middleware · 14 files · 27 tests passed
BLOCKED6m ago
codex · api:0 needs an answer
“Apply patch to migrations/0042_add_index.sql? (y/n)”
y n open pane
STALLED11m ago
no output for 9m in web:2
Last line: ▸ compiling @app/ui (7.2s)
FAILED23m ago
deploy exited 1
./scripts/ship.sh · fly deploy · image push timeout
delivered toiOS & Android pushSlackDiscordntfywebhook
// security

Your code never leaves the machine it's on.

The relay forwards sealed frames it cannot read. Keys are generated on your box and on each device, and pairing is a one-time exchange you can revoke in a keystroke.

Read the threat model →
End-to-end encrypted
x25519 key agreement, ChaCha20-Poly1305 frames. The relay sees ciphertext and byte counts.
No inbound ports
The daemon dials out. Nothing to expose, nothing to port-forward, no VPN required.
Per-device revocation
mtmux devices revoke ipad kills the session mid-frame.
Self-host the relay
One binary, one flag: --relay wss://relay.internal. Air-gapped LAN mode too.
// pricing

Free for one machine. Forever.

Pay when you have more boxes than hands.

Solo
$0
1 machine · 2 devices
Unlimited sessionsAgent notificationsPublic relay
POPULAR
Pro
$8/mo
Unlimited machines & devices
Priority push deliverySlack & webhook routing90-day notification history
Team
$14/seat
Self-hosted relay included
SSO & SCIMShared read-only sessionsAudit log
full comparison →
// faq

Questions people actually ask.

No. It attaches to the tmux server you already run, the same way tmux attach does. Uninstall mtmux and every session keeps running.

No. The client is a PWA — open the URL, add to home screen if you want the native push prompt and fullscreen keyboard handling. iOS Safari, Chrome, Firefox and Edge are supported.

Three signals, combined: pattern matches on the last screen (approval prompts, y/n questions), the process tree state, and an output-silence timer you set per agent. Presets ship for Claude Code, Codex, Gemini CLI and aider.

Yes — that's what the modifier row is for. Esc, ⌃, alt, tab and arrows are always reachable, chords like ⌃b % are two taps, and you can bind your own macro strip for the commands you repeat.

It can't be. Session keys are established between daemon and device; the relay only forwards sealed frames. If you'd rather not trust it at all, run your own with one flag or use LAN mode.

tmux is first-class today. Zellij support is in beta behind --mux zellij, and any bare pty can be served with mtmux run -- $SHELL.

30 more answers →

Leave the desk.
Keep the session.

Install in a minute, pair in ten seconds, and let your agents tell you when they need you.

$npm i -g mtmux
Read the docs