lobby-cli
v0.4.3
Published
A multiplayer lobby for your Claude Code session — open a lobby, friends join from any laptop, everyone shares the live TUI. tmux + SSH, no daemon.
Downloads
1,134
Maintainers
Readme
lobby
A multiplayer lobby for your Claude Code session. You open a lobby and send a six-character code; a friend joins from any laptop and lands in the same live Claude Code TUI — prompting the same agent, on your fully-configured machine. Like a game lobby, for AI pair programming.
No custom client, no daemon: tmux + tmate + SSH do the sharing. Full-trust by design — the host is present, and joiners are people you'd hand the keyboard to.
Prefer the browser? Lobby has a web version too — same room, joined from a tab: https://claudemultiplayer.com. This package is the terminal client.
Product rationale and journey live in the knowledge graph: knowledge/tech-pod/lobby/.
Install
npm install -g lobby-cli # then: lobby open
# zero-install: npx lobby-cli open
# from source: npm install && npm run build && npm linkHosts need tmux/tmate (auto-installed via Homebrew if missing). Friends need only SSH — or npx lobby-cli join <code> with nothing installed.
Usage
lobby open # fresh lobby + fresh Claude; dials out to the relay and
# prints a 6-char code friends join from ANY network
lobby open --local # keep the lobby on this machine (LAN / Tailscale), no relay
lobby join K7F2QX # join a lobby by its 6-char code
lobby join ming@host # join a --local lobby over LAN / Tailscale SSH
lobby invite # reprint the join command full-width + copy it
lobby who # who's in the lobby right now
lobby status # list running lobbies + collaborator counts
lobby close # end a lobby (occupied lobbies need --force)
lobby close --all # sweep every lobby you have runningEvery open starts a fresh lobby (lobby, lobby-2, …) running a fresh claude — resume a past conversation with /resume inside the session. --name <lobby> rejoins a specific lobby; --cmd "<command>" overrides what runs; --no-panel / --no-attach / --no-install are for scripting.
Sending a code (the default)
lobby open runs the session on tmate — both laptops dial out to Lobby's relay (relay.sharewithlobby.dev), so it works behind any NAT: no port-forwarding, no Remote Login, no key exchange. It registers a short code with the control-plane and copies it to your clipboard:
lobby join K7F2QX # your friend, from any laptop
https://sharewithlobby.com/j/K7F2QX # …or a clickable link to paste in Slack / DMThe code is the credential — treat it like a secret; lobby close invalidates it (codes also expire on their own). Plain SSH works too for friends without the CLI — the join link shows the exact command. Add --read-only when joining to spectate.
The presence pane
open splits a narrow sidebar: live collaborator count, joiner names (each lobby join self-registers via the control-plane presence layer), the shared grid size, and the invite hint. Pure tmux, no daemon. --no-panel to disable; lobby who is the on-demand roster.
How it works
| Piece | Mechanism |
|-------|-----------|
| Shared view + input | one tmux session, multiple attached clients |
| Cross-network reach (default) | tmate relay — both sides dial out, works behind NAT |
| Short codes | a control-plane maps a 6-char code → the relay target |
| LAN / Tailscale (--local) | direct SSH to the host's tmux |
| Read-only | tmux attach -r / tmate's ro-… token |
Layout
src/
cli.ts entry: parse argv + dispatch
commands/ one file per verb: open, join, close, status, invite, who, panel
lib/ proc, args, config, controlplane, cpstate, deps, tmux, tmate,
roster, termsize, clipboardDevelop
npm run dev -- open --no-attach # run from source via tsx
npm test # unit tests
npm run typecheck