All projects

FleetDeck

When several AI coding sessions work the same repositories at once, the hard part is not running them. It is knowing what is true.

Role
Design · Engineering · Developer Tooling
Duration
2026 · In daily use
Platform
Local web app · Node.js · Developer tooling
Team
Independent · Design & Engineering
Users
Me, and the coding sessions that need to pick up where another left off
Focus
Developer Tools · Dashboard · AI Workflow

I designed and built all of it: the operating rules, the data model for tasks and reviews, the dashboard, and the daemon behind it.

Seven Projects, One Observe-Only Control Room

Overview

FleetDeck reads what coding sessions, Git and GitHub already produce, projects it onto one board, and refuses to act on any of it.

Internal tool for my own products (GSDAQ, Sweetspot, Strollable, Daydream, this portfolio). Running since September 2026; it is the first thing I open in the morning.

7
Projects on the board
42
PRs merged in FleetDeck's own repo
0
Automatic merges
2
Macs reporting in

Problem

The Status Docs Had Twelve Versions

By late summer I had five products in flight and several coding sessions working on each, often in parallel worktrees. Every session kept its own handoff notes inside the repository, and the notes forked with the worktrees: one project's handoff file existed in twelve versions, another's launch tracker in thirty-one. Nobody, human or model, could say which one was current.

The failure was not effort. It was that the record of truth lived inside the thing being changed.

  1. State written inside the repo diverges as soon as a second worktree exists
  2. A session that inherits work re-reads tens of kilobytes to find the current SHA and the next step
  3. "Ready to merge" meant different things in different documents

Core decision

Observe Everything. Execute Nothing.

The daemon is observe-only. It reads sessions, Git, task records and cached pull-request state, writes only a derived cache, and never starts an agent, runs a gate, or merges. Work happens in sessions a person opened, following one written procedure. The board shows where each task is in that procedure and what evidence exists for it.

Merging is always a person, with a head-commit match against the SHA that was reviewed and verified.

Principles

  1. Truth moves outside the repo: one ops directory per project with tracker, task records, reviews and evidence
  2. A task record names its owner session, branch, PR, recorded HEAD and next action
  3. Reviews are per SHA; a finding keeps its ID across rounds and is closed by the reviewer who opened it
  4. Gate definitions stay in each repo; FleetDeck only calls them and stores the logs with hashes
FleetDeck workflow board: four project lanes, each with six stage nodes from Waiting to Merged, task chips under the nodes, and tracker progress on the left
  1. Findings loop back into the same PRThe dashed connector above stages three and four is the only loop on the board. Review findings are fixed in the same pull request and re-reviewed at the new SHA. Nothing is re-opened somewhere else.
  2. Progress comes from the tracker111 of 208 done is read from the project's ops tracker, not from Git. The board never counts commits as progress.
  3. Work without a stage stays visibleTracker items with no stage record are listed under the lane as "No stage" instead of being hidden. The board does not guess which stage they are in.
  4. "Ready to merge" is derivedA node lights up here only when gate evidence, the required independent reviews and a clean HEAD all exist for the latest SHA. It is a label, not a button; a person still merges.
  5. A stage is what the record saysThis node reflects the phase written in the task record. Connectors show the procedure, not proof that an earlier stage was verified.

Hover or focus a number to locate it on the screen

System

One Board, Six Stages, Two Machines

Each project is a lane with six stages: waiting, implementation, PR and review, revision, ready to merge, merged. A node is what the task record says, not a guess from Git. The sessions view lists open coding sessions with the project and model they are working on, and the resource column shows remaining quota per account so I can choose which model to spend on which task.

A second Mac reports into the same board: heartbeat, verification requests, results. The dashboard is server-rendered HTML with a small client script and server-sent events. No framework and no build step; it is fast on the machine it runs on and simple enough to change in an afternoon. On a phone the same HTML collapses to Flow and Sessions tabs and the resource column folds away.

A note on the screenshots: I keep my task records in Korean, so the titles in them are translated to English here. The board, the data and the numbers are what it was showing.

FleetDeck workflow view: sidebar with seven projects and their progress, remaining quota by account, and summary counts

01 / 02 · Workflow

Workflow is the home.

Projects and progress in the sidebar, remaining quota per account up top, then the lanes. Everything on screen is a stored measurement; loading the page makes no model call.

Keyboard: ← → to switch surfaces

The loop as a diagram. Findings are fixed in the same PR and re-reviewed at the new SHA; the daemon never touches any of it.

Evidence

The Reviewer Was Chosen by a Study, Not a Preference

The first mockup had one vendor's model write code and the other's review it, on instinct. A cross-vendor study of 116 review pairs showed the opposite pairing: one direction improved outcomes by about eighteen points while the reverse made them worse by about nine. The roles flipped before the first real run.

The same habit applies to the process itself. Pull-request size is a planning input, not a gate met after the fact: the plan lists PRs with expected line counts, and anything over the limit is split at a risk boundary before code is written. That rule exists because one late split introduced a real defect and another had to be re-cut into four pull requests.

  1. Planner: Claude in plan mode · Worker: Codex · Reviewer: Claude (arXiv:2607.21656, n=116)
  2. One to three independent reviews on the latest SHA, set per project, before a person merges
  3. Every gate log stored under the task and SHA with a checksum

Current state

Daily Use, Deliberately Manual

The autonomous loop the tool was designed for stays off. What runs today is the observe-only board plus the written manual procedure, and in FleetDeck's own repository alone that combination has carried forty-two pull requests to merge; the product repos run the same loop with their own counts. Automation returns one guarded step at a time, each behind a checkpoint I approve.

7
Projects
42
FleetDeck PRs merged
1–3
Independent reviews per PR, set per project
Off
Autonomous mode

Reflection

Key Learnings

  1. 01

    Put the Record Where the Work Isn't

    Status that lives inside a repository forks with the repository. One ops directory per project ended the twelve-version problem in a day.

  2. 02

    A Board Should Refuse to Act

    Making the daemon unable to execute anything removed a whole class of accidents and made every green label mean exactly one thing: evidence exists.

  3. 03

    Size Is a Design Input

    Deciding PR boundaries before writing code produced smaller, reviewable changes and fewer defects than splitting afterwards.