Peer-to-peer terminal multiplexer for macOS and Linux. Every pane is a real shell on the machine of whoever opened it: their toolchain, their env, their AI subscription. Hop into a teammate's pane and you get a shell on their machine without holding their keys.
userB joins with the ten-character code, opens a pane of their own, then takes control of userA's pane and runs a command in it. Both windows are real clients; the pane titles say who hosts what.
curl -fsSL https://p2pmux.com/install.sh | sh
p2pmux # you host; Ctrl+S shows the line to send
p2pmux join 4KP7Q-M2XRW # them, on their own machineCtrl+S copies that second line so you can paste it into a chat. A Mac and a Linux box work in the same session.
The join code is a password. Anyone who has it can take a real shell on every pane they control. Read the trust model before you send it.
curl -fsSL https://p2pmux.com/install.sh | shmacOS and Linux, x86_64 and arm64. The script fetches a binary and its SHA256 from GitHub Releases and checks the hash before installing. You can read the script first. Binaries come from GitHub, not from p2pmux.com.
Homebrew:
brew tap pelazas/tap
brew trust pelazas/tap
brew install p2pmuxHomebrew 6 will not load a formula from a third-party tap until you trust it. On Homebrew 5, skip brew trust.
From source (Rust 1.91 or newer):
cargo install p2pmux --lockedLinux builds need glibc 2.35 or newer (Ubuntu 22.04, Debian 12, Fedora 36 and up). A musl system has to build from source. Windows is not supported.
Update the same way you installed. On the inbox, click the update line (or arrow onto it and press Enter) to copy that command, paste it in a shell, then quit and start again. p2pmux --version prints what you are running. A session already running keeps the binary it started with.
Two terminals on this machine:
p2pmux create # terminal 1; Ctrl+S copies the join line
p2pmux join 4KP7Q-M2XRW # terminal 2Two machines you own: p2pmux pair on the new one, then p2pmux pair <code> on this one. After that, p2pmux rejoins on either without a code.
| Command | What it does |
|---|---|
p2pmux |
Start or rejoin a session |
p2pmux join <code> |
Join someone else's session |
p2pmux attach [name] |
Attach to a session already running here |
p2pmux pair |
Pair a machine you own |
p2pmux list |
List live sessions on this machine |
p2pmux kill <name> |
Stop a session |
p2pmux setup |
Install agent hooks and the ctl skill |
p2pmux doctor |
Check the install |
The join code lasts six hours. If rendezvous is down, Ctrl+S offers a ticket that contacts no service at all.
If this is useful, star pelazas/p2pmux on GitHub.
- Every pane is a PTY on its owner's machine. Host and guest are per pane, not per person.
- Type into a free pane to take control. Active typing is protected. Nobody can take the keyboard while you are typing.
- Shared tabs, panes, and nested splits. Up to 8 members, 9 tabs, 8 panes per tab.
- End-to-end encrypted peer-to-peer streaming, over an iroh relay when NAT requires it. The tab bar shows
direct 55msorrelayed 120ms. - If the coordinator's laptop closes, panes on every other machine keep running. Layout changes and new joins pause. After five minutes the earliest-joined survivor takes over.
Ctrl+Olists every detected coding agent on every machine in the session, sorted by which one is blocking you, and a grid of every pane beside that list. Press Enter or click a window to type in that terminal.
| Key | Action |
|---|---|
Ctrl+ arrows |
Focus a neighboring pane |
Ctrl+P |
Pane mode (split, close, lock, zoom) |
Ctrl+T |
Tab mode |
Ctrl+S |
Copy the join line |
Ctrl+O |
Inbox |
Ctrl+Q |
d detaches; closing the window ends the session |
Keys, mouse, scrollback, pairing, agent hooks, and config: USAGE.md.
A p2pmux session is a fully trusted shared shell. Anyone with the join code or ticket can see every pane and can obtain interactive control of the terminals in it: run commands, read output, touch any file that user account can touch.
Processes and credential files stay on the pane host's machine and are never uploaded to peers. That is a real boundary. It is not a sandbox: a controller can still use your credentials, or print one to the screen, through the shell you handed them.
Treat the code like a password. Share it only with people you would hand an unlocked laptop to. For anyone else, use a separate low-privilege account and keep production credentials out of shared panes.
The longer version is at p2pmux.com/trust.
On first run, p2pmux asks whether it may send one anonymous line a day. Enter means yes. p2pmux sends nothing until you answer, and nothing if you say no. p2pmux telemetry off stops it. DO_NOT_TRACK=1 and CI skip the prompt and send nothing. A machine with no terminal to ask in, such as a droplet running p2pmux daemon, is never asked and never sends.
Early, but real. Sessions run between machines on different networks, on macOS and Linux. Peers must share a protocol pin; CHANGELOG.md lists which releases can join each other.
Found a rough edge? Open an issue with p2pmux --version on both machines and whether the tab bar said direct or relayed.
MIT.