Join a shared rig
rig join — accept an invite into an empty or existing directory.
You received an invite URL. Now:
rig login # one-time, if not already signed in
mkdir my-shared-rig && cd my-shared-rig
rig join <invite-url>rig join is self-authorizing — the URL is the consent — so it works even if
your local rig has [sync] enabled = false. You can also join from an
existing directory, but it must be empty or be a checkout of the same rig —
see Joining a non-empty directory.
Pure-capability invites (the owner minted them with --ops, no role)
work without a Hub account:
rig join <invite-url> --anonymousWhat it does
- Validate the invite against the relay. Refused if expired, revoked, exceeded uses, or scoped to a different email.
- Consume the invite (decrements
--max-uses). - Provision a device for your machine. Writes
.rig/tap-binding.local.jsonwith your secret. Mode 0600. Never commit. - Initial sync — fetch every shared file from the relay and write it locally.
- Start the daemon —
tapdruns in the background, applying further changes as they arrive.
After join, you can:
rig status # confirm
rig install # set up env, dirs, etc. (the rig.toml just synced in is now active)
claude # start workingFlags
| Flag | What |
|---|---|
<invite-url> | The URL the owner gave you. Required. |
--anonymous | Accept a pure-capability invite without signing in to Rig Hub. Only works for invites minted with --ops (role-less). |
--device-label <str> | Friendly label for this device (defaults to hostname). |
--plain | Plain output. |
--json | Machine-readable summary. |
Prerequisites
You need three things:
@rigxyz/tapdinstalled on your machine:npm install -g @rigxyz/tapd.@rigxyz/cliinstalled:npm install -g @rigxyz/cli.- A signed-in Rig Hub account — run
rig loginonce per machine. (You can skip this for pure-capability invites; pass--anonymous.)
rig join will fail with a clear error if tapd isn't on PATH
or if you're not signed in (and the invite requires identity).
What you get
After join, your directory contains:
rig.toml— the rig's manifest.- All shared files from
[package].include. .claude/— skills, settings, etc..rig/tap-binding.local.json— your device's binding state..rig/instance.toml— install metadata.
What you don't get:
- The owner's
.env(env vars are never synced). - Contents of
[local].dirs(those folders are created but empty). - Anything in the default-excluded paths.
Joining a non-empty directory
If you're rejoining (e.g. you rig disconnected previously), rig join
recognises an existing checkout and reconciles — re-establishing the
binding without re-downloading everything. Files in your local copy that
differ from the relay state count as edits and will be sent on the next
sync.
If you're joining into a non-empty directory that isn't the same rig,
rig join refuses. Start from a clean directory instead.
After join
- Your edits to shared files propagate to the rest of the team.
- Their edits show up in your filesystem in near-real-time.
- Files outside
[package].includestay strictly local.
Troubleshooting
| Symptom | Likely cause |
|---|---|
Not signed in to Rig Hub | Run rig login first. Or, if the invite is pure-capability, retry with --anonymous. |
Invite invalid | Expired, revoked, or --max-uses exhausted. Ask the owner to re-issue. |
tapd not on PATH | npm install -g @rigxyz/tapd. |
Email mismatch | The invite is scoped to a different email. Either sign in to Rig as that email, or ask the owner to re-issue. |
| Files don't appear | Run rig status; check .rig/tap/daemon.log. |
See Daemon for daemon-level troubleshooting.