Pigeon
Pigeon // self-hosting MCP kanban
A kanban board that carries context
between AI coding sessions.
Self-hosting MCP integration, real-time SSE board updates, audit-grade attribution. You see a board. The agent reads and writes the same board over MCP. Nothing leaves your machine.
- Storage
- SQLite, on disk
- Updates
- Real-time SSE
- Surface
- MCP + Web UI
- License
- MIT, open source
saveHandoff, carried in flight,
recovered at briefMe. The next agent starts in-context.
- 01 saveHandoff writes a handoff record from session N.
- 02 The handoff persists on disk — a SQLite row. No network.
- 03 briefMe hydrates session N+1 with the same context.
§01 The problem
Context evaporates at the end of every chat.
You open a new session and re-explain what was planned, what's done, what was decided, what's stuck. Pigeon catches that context for you — and hands it to the next agent.
-
You see a board, live
Cards, columns, priorities, checklists, comments, activity. Drag-and-drop in your browser. Real-time SSE updates — everything the agent does shows up live, no refresh.
-
The agent sees structure
10 essential MCP tools always on. 65+ extended tools discoverable on demand via getTools / runTool. Context footprint stays small.
-
Sessions hand off cleanly
saveHandoff writes a structured handoff at the end of one chat — type /handoff in Claude Code to trigger it. The next chat calls briefMe and resumes exactly where the last one stopped.
-
Audit-grade attribution
The Attribution Engine picks one card per session via a 5-tier heuristic. Every TokenUsageEvent row carries the signal that produced its cardId — see exactly why a session was attributed.
§02 Surface
The board, annotated.
Columns mark state; cards are units of work; priority rides as a colored stripe; tags filter; numbers stay stable across sessions.
- Columns = state Backlog, In Progress, Review (optional), Done, Parking Lot. The agent moves cards across columns instead of inventing new statuses. Top 3 of Backlog are pinned — the human-priority queue.
- Card = unit of work One concern per card. Title, priority stripe, tags, stable #N number. Everything the agent reasons over has an id.
- Priority stripe Color-coded left edge. Critical, high, medium, low. Quick visual ranking without opening the card.
- Tags + counters Tags filter the board (tutorial, mcp, advanced). Comment and checklist counters surface card depth at a glance.
- Stable #N Card numbers never change, even after deletion. Agents reference cards by #12 across sessions and the link still resolves.
- Description = scope What, why it matters, try-it instructions. The agent reads this on briefMe; the human edits it during planning.
- Checklist = sub-state Lightweight subtasks. Crossing items off is a legitimate end-of-session save point — no need to split a card.
- Comments = guidance Human nudges and agent observations. Surfaced to the next session via getCardContext. The audit trail makes clear who said what.
§03 The metaphor
The pigeon carries the message.
saveHandoff releases a handoff at the end of one chat. The wire is your local disk, not a network. briefMe catches the same payload at the next session — fully in-context, in seconds.
A handoff is a SQLite row. A row knows the project, the active card, the
recent decisions, the open threads. It does not know your network — there
isn’t one to know. The next session’s first move is briefMe; what comes
back is the handoff plus the current board pulse plus any open blockers.
Built for two readers. A human who wants a board. An agent that wants structure. The same SQLite file serves both, all the time, with no sync layer between them.
§04 Continue
What to read next.
Two paths in. Surface readers go to the quickstart. Depth readers go to the rationale.