Every machine. Every agent. One list.
muxtower lists the Claude Code and Codex sessions on all your computers on one hub you host. When one needs you, your phone says so, and you answer from there.
The real app on made-up sessions. Click anything.
nas · Linux · always on
infra
nas · infra · muxtower
Backups verified: 14 of 14 restored cleanly.
server · Linux
shop
worker · server · shop · muxtower
Fixed and merged as PR 212: refunds add up again.
vps · Linux · cloud
api
vps · api · tmux
Writing migrations/0042_add_retry_columns.sql
macbook · macOS
shop-research
research · macbook · shop · muxtower
Plan: retry a charge 3 times with backoff, the order id as its idempotency key.
Release notes 2.4
macbook · shop · Desktop app
Release notes for 2.4 are drafted, grouped by New and Fixed.
pc · Windows
web
pc · web · Desktop app
Rebuilding the usage chart against /v2/usage
shop-research
research · Claude Code · macbook · ~/code/shop · muxtower
About 1 in 200 charges fail with a gateway timeout. Find out why, then plan a fix.
Grep "timeout" in src/payments
14 matches in 4 files
Read src/payments/client.ts
212 lines
The client gives up after one 10 s timeout and never retries. The gateway takes an idempotency key, so a retry can never charge twice.
Plan it. Keep it small, and have the worker do it.
Plan: retry a charge 3 times with backoff (200, 400, 800 ms), the order id as its idempotency key, and a test for each path.
Message the agent
9:41
Tuesday, November 3
Five machines joined to one hub. Claude Code and Codex on each, four projects, one list.
Hub
One hub. Every machine dials in.
A daemon on each computer joins the one that is always on. Your phone only needs the hub.
- No open ports
- Machines dial out to the hub. A laptop needs no address.
- HTTPS, not SSH
- Tailscale or your own domain. Nothing else to expose.
- Hub down? Keep going
- The app talks to each machine directly until the hub is back.
macbook
pc
server
vps
nashub
phone
browser
Teams
Agents that work as a team.
Give sessions a role. Each one sees who else works on its project, across machines, and hands them work over MCP.
- A role is plain text: pm, worker, reviewer.
- A project is its git remote, on any machine.
- A task waits while its receiver waits on you.
you pm
Customers keep asking for Apple Pay. Can we have it by Friday?
pm worker
Add Apple Pay to checkout behind the apple_pay flag. Card flow unchanged. Tests for both.
worker reviewer
Done on branch apple-pay: 14 files, 212 tests pass.
reviewer worker
One fix: the flag is read once at start; read it per request.
pm you
Apple Pay is ready behind the flag, reviewed. Turn it on for 10% of checkouts?
Features
Everything else you need from your phone.
shopnow
Approve Bash: npm test -- payments
server · ~/code/shop
Retries with backoff, 3 attempts
Make it 5, and log each one.
Push, reply, approve
A notification when an agent needs you or is done. Quote the line you answer; approve with the exact command.
Anything waiting on me?
One: shop on the server wants to run npm test. api finished its migration.
One assistant over all of them
Ask one session on the hub instead of each. It reads, sums up and answers for you.
Start at your desk
Claude desktop and Codex app sessions are listed too, with their whole conversation.
nas · hub0.1.47
server 0.1.47
vps 0.1.47
macbook 0.1.47
pc 0.1.47
Update the hub only
Machines joined to it follow. A daemon restart never stops a running agent.
GET /v1/sessionsPOST /v1/sessions/{id}/approveWS /v1/stream
Build your own client
A typed HTTP and WebSocket API. A desk key, an e-ink frame, Home Assistant.
Performance
Built to cost little.
It runs all day on every machine, so it stays light.
- 111 B
- per terminal update, not the whole 8.9 KB screen.
- 5 s
- between reads of an idle pane nobody watches.
- 0
- outside commands run to measure itself.
- 30 s
- at most to reconnect when your phone switches networks.
- 20%
- of a core is its limit. Past it, the app tells you.
Daemons · usage
| Machine | CPU 1 min | CPU 10 min | Memory | Round |
|---|---|---|---|---|
| nas | 1.8% | 2.1% | 46 MB | 4 ms |
| server | 0.9% | 1.2% | 38 MB | 3 ms |
| vps | 1.1% | 1.0% | 41 MB | 3 ms |
| macbook | 24.6% | 9.8% | 52 MB | 230 ms |
| pc | 1.4% | 1.6% | 44 MB | 5 ms |
Security
Safe on the open internet.
Its own lock, and it fits behind whatever you already run.
A token per device
Every phone, browser and machine has its own, revoked on its own.
One-time pairing codes
Single use, five minutes, rate-limited. A new phone is one QR code.
Bans the guessers
Only a wrong credential answers 401 or 403, so fail2ban can act on it.
Your sign-in in front
Cloudflare Access, an SSO proxy or a password gate covers it all.
No muxtower cloud
The daemon is yours, and so is your code. This site never sees a token.
Install
Running in two minutes.
Python 3.11+ and tmux. The daemon serves the app itself.
Or use the hosted app
Pair it with your daemon’s HTTPS address. Your daemon serves the same app itself.
Open the app$ pipx install muxtower$ muxtower run claude$ muxtower expose tailscale$ muxtower pair
No domain and no open port: only devices on your tailnet reach the daemon.
FAQ