Open source · self-hosted · no account

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.

Try the live demo
$pipx install muxtower

The real app on made-up sessions. Click anything.

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.

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.
pm@macbookworker@serverreviewer@serverAn online store
  1. you pm

    Customers keep asking for Apple Pay. Can we have it by Friday?

  2. pm worker

    Add Apple Pay to checkout behind the apple_pay flag. Card flow unchanged. Tests for both.

  3. worker reviewer

    Done on branch apple-pay: 14 files, 212 tests pass.

  4. reviewer worker

    One fix: the flag is read once at start; read it per request.

  5. 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.

PushReplyVoiceTerminal keysEven Realities G2

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.

Claude desktopCodex apptmux
One list on your phone

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/sessions
POST /v1/sessions/{id}/approve
WS /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

MachineCPU 1 minCPU 10 minMemoryRound
nas1.8%2.1%46 MB4 ms
server0.9%1.2%38 MB3 ms
vps1.1%1.0%41 MB3 ms
macbook24.6%9.8%52 MB230 ms
pc1.4%1.6%44 MB5 ms

macbook: tick 230 ms (limit 200): slowest: rule tool-permission on shop-research, 190 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
on the machine your agents run on
$ 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

Questions

Every agent, on every machine, in your pocket.

Try the live demo
$pipx install muxtower

muxtower

A control tower for the coding agents on your machines.

Early: version 0.1. Interfaces may change. Apache-2.0.