Skip to content

Install

Roy Padina edited this page Aug 29, 2026 · 6 revisions

Install

macOS and Linux. There is no Windows build — see Home.

Prerequisites

Required. Without one of these nothing runs:

what why check
node ≥ 22 the daemon and both clients node --version
tmux the host's session is a tmux session tmux -V
claude on PATH the actual Claude Code CLI claude --version

Optional, each unlocking one thing:

what unlocks without it
ttyd --view, the read-only browser view the flag refuses at startup, with the reason
cloudflared --tunnel the flag refuses at startup, with the reason
tailscale --funnel (and the printed join line uses your tailnet IP) the flag refuses; LAN addresses are printed instead
git /diff /diff says the cwd is not a git repository; /files still works
pngpaste /paste is faster macOS falls back to osascript, which is built in

A guest needs node, tmux is not required for them, and the claude CLI is not required either — a guest only runs the client.

Homebrew

brew install roypadina/tap/claude-jam

That installs two commands: claude-jam (the real one) and jam (a deprecated alias of it, kept so anything you already typed still works). Nothing in the tool prints jam.

Upgrading:

brew update && brew upgrade claude-jam

From source

git clone https://github.com/roypadina/claude-jam
cd claude-jam
npm install
./claude-jam --help

There is no build step. npm install pulls five runtime dependencies (ws, ink, react, @inkjs/ui and ink-text-input) and nothing else. Run it as ./claude-jam … from the checkout, or npm link to put both commands on your PATH.

Verify

claude-jam --help

Expected: a usage block whose first line is

usage: claude-jam                  (no arguments) the launcher menu: host, join,

and which lists claude-jam host, join, invite, invites, sessions, ls, end, kill, clean and remote. It should never print a bare jam command — that is a lint in the test suite.

claude-jam sessions

Expected on a machine with no jam running:

no jams — `claude-jam host` starts one, and this list only ever shows claude-jam's own sessions

That command is read-only and safe to run at any time; it enumerates only claude-jam's own state directories ($TMPDIR/claude-jam-<port>), never tmux list-sessions.

The alias, if you want to confirm it:

jam --help      # same output — it execs claude-jam

What it writes on your machine

path what when it goes
$TMPDIR/claude-jam-<port>/ the state dir, mode 0700: session.json, token.json, roster.json, the generated settings.json, system-prompt.txt, the outbox when the jam ends, or claude-jam clean
~/.config/claude-jam/history your own last 50 submissions per client (mode 0600) never automatically — delete it yourself
<cwd>/jam-uploads/ files guests uploaded (host side) never automatically
./jam-downloads/ files you took with /get (guest side) never automatically
./jam-session-<id>.jsonl a transcript you took with /export never automatically

$XDG_CONFIG_HOME is honoured for the history file when it is set to an absolute path.

Nothing global is touched: the Claude Code hooks live in a generated settings.json passed with --settings, and the tmux key binding lives on claude-jam's own tmux server (socket claude-jam-<port>), not yours.

Next

Clone this wiki locally