Skip to main content

paircode

Multi-LLM peer review for your code, with file-traces on disk. One primary LLM (alpha, usually Claude Code) + any number of peer LLMs (Codex, Gemini, Ollama, …) running research / plan / execute / ask cycles with structured cross-review rounds stored entirely as Markdown on disk.

Born from 31 iterations of dual-LLM silent-agreement hunting on a real ML project. See diary/001-step-a-architecture.md for the origin story and diary/003-arch-b-pivot-grappling.md for the current (v0.11) team-lead architecture.

Install

pipx install paircode       # or: pip install --user paircode
paircode install            # registers /paircode in every detected LLM CLI

paircode install deploys /paircode into each LLM CLI it finds on your PATH:

CLI How it's installed What you get
Claude Code file-drop ~/.claude/commands/paircode.md /paircode slash command
Codex CLI codex plugin marketplace add starshipagentic/paircode-codex then codex plugin add paircode@paircode /paircode slash command
Gemini CLI gemini extensions install github.com/starshipagentic/paircode-gemini --consent /paircode slash command

In Gemini you may need /commands reload the first time. In Codex the marketplace fetches on first use.

paircode delegates LLM subprocess invocation to cliworker — that's where speed flags, MCP strip tricks, skip-cache, and subscription-first fallback live. paircode adds the peer-review orchestration on top (file-traces, stages, rosters, convergence).

Use it

Inside any LLM CLI that has /paircode installed, just type:

/paircode "build a KISS PHQ-9 depression risk engine"

or

/paircode "review my auth middleware approach at src/auth/"
/paircode "plan the refactor" --peers codex,gemini
/paircode "get a second opinion on this PR" --peer gemini

The slash command's team-lead prompt (the LLM you're inside) reads your prompt, picks a stage (research | plan | execute | ask), fires peers, collects their markdown, iterates through review rounds until convergence, and writes consensus.md at the end. Everything lands under .paircode/ in your current project.

What ends up on disk

your-project/
  .paircode/
    JOURNEY.md                    # fleet log
    peers.yaml                    # roster: who's on the team
    sandbox/
      peer-a-codex/               # codex's persistent sandbox (code goes here)
      peer-b-gemini/              # gemini's persistent sandbox
    focus-01-<slug>/
      FOCUS.md                    # this focus's prompt + metadata
      research/
        alpha-v1.md ... alpha-vN.md
        peer-a-codex-v1.md ...
        reviews/round-01-peer-a-codex-critiques-alpha.md
        alpha-FINAL.md
        peer-a-codex-FINAL.md
        consensus.md              # team-lead synthesis (last thing written)
      plan/         (same shape)
      execute/      (same shape)
      ask/          (same shape)
    focus-02-<slug>/
      ...

Code vs. reports. Files inside focus-*/ are markdown reports (opinions, plans, critiques, summaries of work). Actual code lives elsewhere:

  • Peers code in their sandboxed workspaces at .paircode/sandbox/<peer-id>/ — persistent across focuses.
  • Alpha codes directly in the project root (the real repo) — alpha is the project.

Stages

Stage is picked by the team-lead LLM based on the prompt:

Stage When Typical prompt
research Explore new ground "build X", "find the right Y", "how should we approach Z"
plan Concrete implementation plan from prior research "plan the refactor based on focus-02"
execute Do the work from an existing plan "execute the plan at focus-02"
ask Get opinions on existing work "what does codex think of this PR", "review my approach at

The team lead can chain stages in one invocation: research → plan → execute → done. No hard round cap — the team lead converges when peers stop surfacing new signal.

Commands (the helper CLI)

Most users will only ever type paircode install and then use /paircode inside their LLM CLI. The binary's other commands are helpers the team-lead slash command calls on your behalf:

paircode                         print current .paircode/ state
paircode install                 register /paircode in every detected LLM CLI
paircode uninstall               remove /paircode from LLM CLIs (idempotent)
paircode ensure-scaffold         idempotent .paircode/ init + handshake (silent)
paircode focus new <slug>        create a new focus dir, print its path
paircode focus active            print the active focus path
paircode roster [--alpha <cli>] [--peer <id>] [--peers <id,id>]
                                 print peer ids, best-effort, never errors
paircode invoke <peer-id> "<prompt>" --out <path>
                                 fire one peer, write file-trace to --out
paircode converge <stage>        copy each participant's latest vN to *-FINAL.md

Model compatibility

CLI /paircode slash command Peer invocation Parallel peers? Status
Claude Code (claude) ✓ file-drop at ~/.claude/commands/paircode.md ✓ claude -p <prompt> ✓ via Agent tool + run_in_background=true stable
Codex (codex) ✓ via Codex plugin marketplace + install ✓ codex exec <prompt> ✗ serial-only (codex constraint) stable
Gemini (gemini) ✓ via gemini extensions install ✓ gemini -p <prompt> ✗ serial-only (gemini constraint) stable
Ollama (ollama) — (local models, no slash-cmd host) ✓ ollama run <model> <prompt> n/a peer-only
Aider / others — best-effort, PRs welcome — planned

Peer roster is auto-detected at first install via paircode handshake (silent, called by ensure-scaffold). Edit .paircode/peers.yaml to customize.

Why this exists

See diary/001-step-a-architecture.md. Short version: running two LLMs adversarially surfaces silent-agreement bug classes that neither engine alone catches — cross-engine agreement is not the same as correctness when both engines share a blind spot.

See diary/003-arch-b-pivot-grappling.md for why v0.11 moved orchestration out of a Python driver and into the slash-command's team-lead LLM.

License

MIT. See LICENSE.

Metadata

Release files for paircode 0.14.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for paircode 0.14.2
File Size Uploaded
paircode-0.14.2.tar.gz 60.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for paircode 0.14.2
File Interpreter ABI Platform
paircode-0.14.2-py3-none-any.whl Python 3 none any Details

Total release size: 129.7 kB

Release files / paircode-0.14.2.tar.gz

Download URL paircode-0.14.2.tar.gz
Size 60.8 kB
Tags Source
SHA-256 checksum
How to use checksums
4303fa7bdcc9995912c2b570246b6df0ef6b6078409dbd3dac47ef24d8e4bd26
BLAKE2b-256 checksum
How to use checksums
dc14ffaaa6d0e1fd5581f1f3789d32e9c1004c32c83758a300ddba23be4edbde
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Release files / paircode-0.14.2-py3-none-any.whl

Download URL paircode-0.14.2-py3-none-any.whl
Size 68.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2d196857139901fa0c1e26727daada53a3901a7100f291ad8d8bc081ed1a5dff
BLAKE2b-256 checksum
How to use checksums
626409ee19af0aa3a9f2ed406aa237e9e8a2dcf540aaacffba23a5a6be2b5443
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.7

Release history Release notifications | RSS feed

0.14.3

2 release files

This release

0.14.2 This release

2 release files

0.14.0

2 release files

0.13.2

2 release files

0.13.1

2 release files

0.12.4

2 release files

0.12.3

2 release files

0.12.1

2 release files

0.11.7

2 release files

0.11.5

2 release files

0.11.3

2 release files

0.11.1

2 release files

0.10.1

2 release files

0.9.1

2 release files

0.8.1

2 release files

0.7.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page