Your terminal, from anywhere
I run a lot of long-lived terminal sessions on machines I am not sitting at. Agents working through a backlog, a build that takes twenty minutes, a log tail I want to glance at while listening to the sweet sweet sounds of my Keurig. Cool thing is, tmux already keeps those sessions alive. What it does not do is let me look at them from an iPad while sitting on my back porch watching my dogs run around chasing squirrels. I don’t have to worry about an SSH client, and a reconnection dance every time I inevitably end up on the other side of the yard, too far away from my router.
So I built muxdeck: one Go binary that serves a web app over your tmux sessions. Install it, open a browser, and every session on that machine is a tab you can read, type into, split, rename, and switch between with a command palette. It is open source and the whole frontend is embedded in the binary, so deploying it is copying one file.
What it does
A real terminal. xterm.js attached to a tmux session over a WebSocket. Several viewers can attach to the same session, exactly like several tmux attach clients. On wide screens two sessions sit side by side, and the URL hash carries both so a bookmark reopens the pair.
Sessions you can tell apart. A sidebar of twelve sessions all named bash is useless. Each row shows the working directory, the command running there, the git branch (marked when the tree is dirty), and any TCP ports its processes are listening on. A column of agents reads at a glance.
The clipboard works. Selecting copies on release. tmux copy-mode yanks reach the system clipboard through OSC 52. Touch devices get a paste key, because software keyboards do not have one.
It survives phones. Mobile browsers background tabs constantly and kill sockets without a close frame. Dropped connections reconnect with backoff; the session was never gone, only the viewer was.
It is also a CLI. The same binary talks to the running daemon over its HTTP API: muxdeck ls, muxdeck send, muxdeck notify. A script on one box can type into a session on another, or post progress into it.
Secure by default. Bound to loopback it is open. Bound to anything wider it generates a six-character access code at startup unless you set a token or explicitly opt out. There is optional built-in TLS, and a relay mode that gives a daemon a public HTTPS name with no inbound ports at all: the daemon dials out, you claim it with a code on the account page, and the relay’s gate does the authenticating.
An installable PWA. Add it to the home screen on an iPad or phone and you get a touch key bar for the keys software keyboards lack: escape, tab, a sticky control, arrows, paste.
What it is not
It is not a terminal emulator you would use all day on a desktop; a native terminal is better at that. It is not a session manager for a fleet; it manages one machine, and the relay lets you reach several. And it is not trying to replace tmux. tmux owns the sessions. muxdeck is a window onto them that happens to fit in a pocket.
Why a single binary
Every tool I actually keep running has the same shape: one static binary, no runtime, embedded assets, a service file it can write for itself. muxdeck service install writes a launchd agent or a systemd user unit that runs this binary on loopback and claims it with the relay. Upgrades are muxdeck update. When something is that cheap to install, it ends up on every machine, and then it is useful.
Where it is going
The next layer is already in: muxdeck can start and watch agent runs, not just shells. If you live in terminal window, try it: the installer is one line in the README, and it will tell you what it is about to do before it does it.