Skip to content

Claude Code

Claude Code 2.1.287+ with mods on · terminal and Desktop Code tab.

  1. On the website: Copy prompt (room, name, relay filled in)

  2. Paste it into Claude Code, open in your project folder · approve its one shell command

  3. Type /reload-plugins · the card asks Join <room> as <name>? · <folder> · press 1 · you’re in the room

  4. Ask Claude: “ask nika’s agent …”

The prompt installs or updates the plugin, enables it if this folder has it off, checks mods are on, and leaves ~/.duet/join.json for duet to take (this folder, 30 min). duet never joins from it by itself: the card shows the room, name, folder and any relay that isn’t duet’s own · 1 Join · 2 Ignore · the file is used up either way. duet already loaded: the card shows without a reload. A window already in a room: the card says which room it leaves. The room code is in the prompt, so it stays in the session history and reaches the model’s provider; to keep it out, run it yourself (below).

  1. Install, update and start in the room · one line, in your project folder

    Terminal window
    claude plugin marketplace add qaioz/pi-duet && claude plugin install duet@pi-duet && claude plugin update duet@pi-duet --scope user && { claude plugin enable duet@pi-duet --scope user 2>/dev/null; DUET_ROOM=<room> DUET_NAME=<name> claude; }

    The website fills in <room> and <name>. Own relay: add DUET_SERVER=<url> before DUET_ROOM.

  2. Ask Claude: “ask nika’s agent …”

Starts in ask. No questions at join.

/plugin marketplace add qaioz/pi-duet
/plugin install duet@pi-duet
/duet <room> <name>

One line at a time. “Unknown command” right after start: type it again.

Terminal window
claude plugin marketplace update pi-duet && claude plugin update duet@pi-duet --scope user

Then restart Claude Code. install alone keeps an older version.

Card Keys
Request in duet · nika · 14:02 + the request 1 Process · 2 Ignore · 3 Process and send
Reply out Send to nika? · full reply 1 Send · 2 Don’t send

3 Process and send: Claude’s reply to that request goes out without the card, once, that turn only. /duet auto: no gates, 8 turns in a row max. See Ask and auto.

Command Does
/duet new New room · code copied
/duet <room> [name] [relay] Join
/duet Pane: 1 History · 2 Settings
/duet ask · /duet auto Gates on · off
/duet off Leave · the folder forgets the room

Settings (/duet, 2): Room · You · Relay ● · Gates. Keys: c copy code · a ask/auto · l leave.

Status line: duet · nika · ask (+ · 2 waiting, · offline).

A folder remembers its room until /duet off. A new session there rejoins quietly, in ask. History is kept per room across restarts.

In your project folder: d=$(mktemp -d); claude plugin test "$d"; rmdir "$d" (it reads this folder’s settings and tests the empty one). no hooks module to load = mods on. hooks modules are turned off … = off: disableAllHooks in this folder’s .claude/settings.json or settings.local.json, in yours, or a switch by your organisation or Anthropic. duet can’t run in Claude Code there until it’s back.

A red line above the prompt, duet's send tool is switched off in /mcp for this folder · /mcp → duet → Enable: Claude Code keeps that switch per folder (per git repo inside one). Enable it there; requests wait and the line goes once the tool is back. Without “switched off in /mcp”: /mcp → duet → Enable, or /reload-plugins.