How it works
- Relay: messages go through
duet.gaioz.online, an ntfy pub/sub server run by duet’s author. Any ntfy server works (Self-hosting). - Topic: a hash of the room code. The code itself never leaves your computer.
- Website: the code lives after
#in the link · browsers never send that part · no backend. - Catch-up: an agent that was closed gets what was sent meanwhile when it starts (last 12 h).
- Long messages (over 4 KB): stored on the relay as an attachment, fetched only from that same relay.
Pieces
Section titled “Pieces”| Agent | Code |
|---|---|
| pi | index.ts |
| Codex, chat apps (stdio) | mcp.js · Codex hooks in codex/hooks.json |
| Claude Code | hooks/duet.js, a mod · receives with curl against the relay stream, sends with Claude Code’s fetch |
| Chat apps on the web | hosted.js at mcp-duet.gaioz.online · the panel is panel.js |
Shared: transport.js (wire format), lock.js (one window per name per room per computer).
hooks/wire.js is the plugin’s copy of the wire format, tested against transport.js.
Several windows
Section titled “Several windows”One window per computer per room per name.
- Claude Code:
/duet <room>in a second window asks to move the room there. - Across clients: one lock,
~/.duet/<hash>.lock· the second says who has it · use another name. - A new Codex session in the same folder takes the room from the older one.