-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Share one real, interactive Claude Code session with other humans on other machines.
The host keeps the native claude TUI — their own plugins, skills, MCP servers, CLAUDE.md,
hooks and account. Everyone, host included, joins from a terminal client whose default view is
that TUI, streamed live. The agent is told the session is shared and sees who wrote each
message. Humans also get a side channel the agent never sees.
Roy (host) Dana Eli
client ─────┐ client ────┐ client ────┐
└──────── WS ───────┴─────────────┘
│
host.mjs daemon ── types into ──▶ the real `claude` TUI
└── capture-pane ──▶ the live view everyone watches
brew install roypadina/tap/claude-jam
# host: start a jam in this directory
claude-jam host --name Roy --cwd .
# host: mint a link for one person, and send it to them privately
claude-jam invite Dana
# Dana, on her machine: the link is her whole command
claude-jam join cjam1_eyJ2IjoxLCJqYW0i…claude-jam with no arguments opens a launcher menu instead: Host a jam · Join a jam ·
My jams · End a jam. It prints the exact command line before it runs it, so the menu teaches
the CLI rather than replacing it.
The command is claude-jam. jam is still installed as a deprecated alias of it.
| page | what it answers |
|---|---|
| Install | brew and from-source, what has to be on PATH, and how to check the install worked |
| Agent-Install | point an agent here. Numbered, non-interactive commands, what to verify after each, what needs a human, what must never be done, and a self-test |
| Hosting a Jam | starting one, every flag, letting people in, ending it |
| Joining a Jam | the guest's whole world: joining, the two views, every command, the keys |
| Remote Access | LAN, Tailscale, --tunnel, --funnel, and what breaks over a long session |
| Files and Export |
/send, /paste, /get, /export, and resuming a transcript on your own machine |
| Security Model | which gates are real, which are only instructions to the model, and what to assume |
| Peer Tasks | the host's agent dispatching work to a guest's own Claude Code: the two switches, what a guest is agreeing to, how to say no, and the open compliance question |
| Architecture | tmux + WebSocket + JSONL tail, the frame pipeline, the approval ladders, the hooks |
| Troubleshooting | the failures people actually hit |
If a page here does not describe something, assume it is not there:
-
Windows. Hosting is macOS and Linux only (through WSL2 on Windows). The platform seam
exists —
platform.mjsis the one module allowed to spawn a platform binary, and a test enforces that — and since v0.32 W1 the Windows client is implemented and CI-tested, though no human has run it. -
Linux is built, and thinly proven — but less thinly than it was. A
ubuntu-latestCI leg runs the unit suite and three real-entry-point checks on every push, including the state-directory privacy gate that only Linux can actually attack — and all of it has been run on real Linux (2026-08-30), green, with the takeover attempted as two genuinely different user accounts and correctly refused. What is still unproven there: hosting — the tmux,claudeand terminal half got one attempt and reached about a third of it, so nobody has pressed F3 or watched claude's screen mirror on Linux — and whether the join/knock sounds are audibly distinguishable, since the choice of player and file is tested but nobody has heard one. -
LAN discovery is macOS-only, and that is a decision rather than a gap. It needs Apple's
dns-sd, which ships in/usr/binon macOS and is not packaged for Linux or Windows. Do not installavahi-utilsexpecting it to help: measured 2026-08-30, it providesavahi-browseandavahi-publish-serviceand nodns-sd. The avahi-native path was deliberately not built (different output format, and no avahi anywhere on this project to verify a parser against), and Bonjour-for-Windows was deliberately not wired up (cheap to add, but it would be a claim nobody has ever seen work). Off macOS, hosting is unaffected — the jam simply does not announce — andclaude-jam findrefuses with the reason instead of reporting an empty network. Ask the host for an invite link, or join theirws://address directly.
Five things that used to be on this list have since shipped, and each has a page: LAN discovery
and named jams (claude-jam find, --jam-name), join/knock sounds (--no-sound, /sound),
/nudge, auto-allowing uploads from an already-admitted guest (--uploads auto), and guest-side
scrollback past the replayed history (PgUp, against the host's real pane).
https://github.com/roypadina/claude-jam — README.md is the tour, MANUAL.md is what claude
itself is given, AGENTS.md is for an agent changing the code, SPEC.md is the design record.