Package Exports
- lobby-cli
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (lobby-cli) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
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