Pair Desk

Free and open source For game developers and their coding agents

You play the game. Your agents write the code. This is the table between you.

Pair Desk is a local playtest desk, backlog and handoff. Agents file checks with the command that takes you to the exact spot; one click teleports your running game there, and you answer Passed or Still broken. Their next prompt already knows.

Works with Claude Code, Codex, opencode, Google Antigravity and Meta Muse Code. Any engine.

One check, start to finish

claude · ~/mygame

# Pair Desk (MyGame): 1 new report, 0 failed checks, …

$ git commit -m "Round the lava flow tips"

[main 5ea28d6] Round the lava flow tips

create_issue MG-1 "Lava flows end in rounded tips"

  commands: /goto 1240 -380 42.5 yaw 90; /time 17:30

set_status MG-1 to_check ✓

Pair Desk (MyGame): owner activity since this session last looked:
- MG-1 owner: STILL BROKEN (just now): "the east flow is still square"

set_plan MG-1 4 steps, + "Taper the east flow" ✓

$ git commit -m "Taper the east flow as well"

[main 8c21f0a] Taper the east flow as well

progress MG-1 step 4 done 8c21f0a ✓

set_status MG-1 to_check ✓

set_status MG-1 passed refused: only the owner gives that verdict

$

Pair Desk · 127.0.0.1:8765
To check Failed Passed MG-1 P1

Lava flows end in rounded tips

Plan 3/33/44/4
/goto 1240 -380 42.5 yaw 90; /time 17:30
Copy Send to game Picked up by mygame · just now
owner STILL BROKEN

the east flow is still square

owner PASSED

all three are round now

✓ Passed ✕ Still broken
MyGame · dev console on

polling the desk… nothing queued

> /goto 1240 -380 42.5 yaw 90; /time 17:30

The agent finishes a fix and files a check: what changed, what correct looks like, and the game's own command that takes you there. You press Send to game. The game polls the desk, runs the command, and you are standing at the flow at 17:30. The east flow still ends square. You answer Still broken and paste a screenshot. The agent's next prompt starts with that line. The fix lands, the plan step is ticked, the check goes back to you. Agents can't mark anything passed. Only you can.

An illustration. The desk card, tool calls and hook lines use Pair Desk's real wording; the game is a sketch.

Everything is on one desk, and it's live

Checks, reports, plans, the backlog and the handoff live in one place for every game you work on. A comment, verdict, plan tick or game report shows up in every open tab within a second.

The triage list with a check waiting for the owner; the open check shows its fields, description and a finished plan.
Triage: what waits for you comes first. The open check carries its plan, ticked as commits landed.

Real captures of Pair Desk 1.13.0 with its sample desk (scripts/demo-desk.py), taken headless at 1360 × 820.

Made for the way agents actually work

Agents forget everything between sessions. The desk remembers: what you reported, what failed, where work stopped and what not to try again.

Checks with a place
Every check carries the game's own console commands, one place each, with a label. Copy or Send to game per command; the desk shows when the game picked it up.
Plans before code
Agents write the plan on the issue before they start and tick each step as its commit lands. A check can't reach you while steps are still open.
A handoff that survives
One versioned document per project: state, where work stopped, what was verified, the next step and the traps. Every save is kept and diffable.
Backlog with sizes
Open work sorted by priority, then size, then area, in collapsible groups. Replaces the TODO file nobody keeps up to date.
Agents check first
auto_check is the agent's queue: screenshots, logs, tests and builds. Only what needs your eyes moves to To check.
Builds stamped on checks
A build script publishes the current build; every waiting check records which build it was handed over in, with Open folder and Run.
Merge and group
Duplicate reports merge into one issue with their history; related work groups under a parent with child progress. The desk proposes groups, you decide.
Search that ranks
Full-text search over titles, details, bodies and comments with stemming and phrases, falling back to substrings for code names like WorldStore.
Keyboard first
j k to move, s to send to the game, p passed, f still broken. After Passed the next check opens, so a queue goes fast.
Copy as prompt
Copy an issue with its context as Markdown and paste it into any coding agent, desk integration or not.
Backup and transfer
One-zip backup while the desk runs, verified restore, and export of selected topics with their full history and attachments.
Share across PCs
Optional: synchronize chosen projects through a data branch in their own Git repository. Each PC works offline; code branches are never touched.

Agents hear you on their next prompt

At session start the agent gets one line for the project linked to its folder, plus the handoff's next step and traps. Before every prompt it gets what you did since it last looked: comments, verdicts, new reports and status changes, at most twelve lines, newest first.

In Claude Code the desk can also push straight into a running session through a channel, so an idle agent sees your verdict right away.

When several agents share a folder, one of them should answer you. Name a lead client per project, and delegated subagents work from their brief instead of reacting to the owner.

# at session start
Pair Desk (MyGame): 3 new reports, 2 failed checks,
14 waiting for the owner, 1 auto_check waiting for
agent verification (screenshots, logs, tests)
Pair Desk handoff v12 (claude, 2026-11-04 09:12 UTC):
- Next step: damp the harbor docking spring in rain
- Traps: buoyancy runs at 50 Hz; never test at 144

# before the next prompt
Pair Desk (MyGame): owner activity since this session
last looked, newest first:
- MG-4 owner: STILL BROKEN (2 min ago): "the east
  flow is still square"
- MG-9 new report from game (5 min ago): Stuck in the
  rock near the harbor
- MG-2 owner: PASSED (12 min ago)
# F12 in the game: file a report with the spot
POST /api/projects/mygame/issues
{ "title": "Stuck in the rock near the harbor",
  "source": "game",
  "location": { "command": "/goto 1240 12 -380 yaw 90" },
  "attachments": [{ "data_base64": "iVBORw0…" }] }

# every 2 s while the dev console is on
GET /api/projects/mygame/commands/next?client=mygame
200 { "command": "/goto 1240 -380 42.5 yaw 90" }
204   nothing queued

Your game, any engine

Pair Desk knows nothing about engines. A location is just your game's own console command: a teleport, the time of day, the weather, a seed for generated worlds.

Teach the game two small calls and the loop closes. A key press files a bug with a screenshot and the exact spot. While the dev console is on, the game polls for queued commands and runs them as if you typed them. Commands are delivered once and expire after ten minutes, so a later start never replays an old teleport.

When the desk isn't running, the requests just fail to connect; the game backs off quietly and never blocks play.

One install for every agent you use

The installer finds the tools on your PATH, shows the exact steps for each, and asks before it runs them. It only touches its own entries, backs up every config file first, and uninstall removes exactly what it added.

Local by default

One Python 3.11+ standard-library server that listens on 127.0.0.1 only. Requests from other machines, other Host names or other web pages get 403, which also stops DNS rebinding.

No build, no CDN, no telemetry

A plain HTML and JavaScript UI under a strict Content Security Policy. No account, nothing phones home. Git sharing stays off until you configure it.

One folder is your desk

A SQLite file and your screenshots in one data folder. Upgrades migrate in place and never rewrite or remove anything; older versions keep working on a migrated file.

Get Pair Desk

You need Python 3.11 or newer.

One command

uvx --from git+https://github.com/rennerdo30/pair-desk pair-desk install
pipx run --spec git+https://github.com/rennerdo30/pair-desk pair-desk install
curl -fsSL https://raw.githubusercontent.com/rennerdo30/pair-desk/main/install.sh | sh
irm https://raw.githubusercontent.com/rennerdo30/pair-desk/main/install.ps1 | iex

Add --dry-run to only see the steps, or name tools to limit it: install claude codex. The same command with update or uninstall does what it says. Read the scripts before you pipe them into a shell: install.sh, install.ps1.

Then start the desk

# the installer offers to link the repo you are in,
# then prints this command with its full path:
pair-desk serve --open
# the desk opens at http://127.0.0.1:8765/

# in Claude Code
/agent-pair-programming:serve

Create a project for your game with New project… in the desk (its issues become MG-1, MG-2, …), and your agents find it from the linked repository.

Want to look around first? python scripts/demo-desk.py --data <empty folder> writes a desk with sample data.

Read the guide Changelog