AI News HubLIVE
In-site rewrite6 min read

Show HN: Fleet Deck – see every Claude Code session on your machine in one board

Fleet Deck is a local dashboard that monitors and manages all running Claude Code sessions. It displays session status, conflict alerts, pending requests, and enables task assignment, remote control, session recovery, and batch spawning. The core makes zero model calls, relying on hook events and deterministic logic for safety and efficiency.

SourceHacker News AIAuthor: lacion

Uh oh!

There was an error while loading. Please reload this page.

Notifications You must be signed in to change notification settings

Fork 0

Star 11

BranchesTags

Open more actions menu

Folders and files

NameName

Last commit message

Last commit date

Latest commit

History

48 Commits

48 Commits

.claude-plugin

.claude-plugin

.github

.github

board

board

commands

commands

demo

demo

docs

docs

hooks

hooks

scripts

scripts

skills/fleet-doctrine

skills/fleet-doctrine

tests

tests

.gitignore

.gitignore

CHANGELOG.md

CHANGELOG.md

CODE_OF_CONDUCT.md

CODE_OF_CONDUCT.md

CONTRIBUTING.md

CONTRIBUTING.md

LICENSE

LICENSE

README.md

README.md

SECURITY.md

SECURITY.md

package-lock.json

package-lock.json

package.json

package.json

Repository files navigation

Mission control for every Claude Code session on your machine.

You know how it goes. You start one Claude Code session. Then one in a worktree, because you're organized. Then a third one "just to look something up," and a fourth because the second one seemed stuck. It is now 6 PM, two of them are editing util.js at the same time, one has been silently waiting forty minutes for you to approve rm -rf node_modules, and you honestly could not say which terminal tab is which.

Fleet Deck is the air-traffic control tower for that situation.

Every session on the machine appears on one local board — http://127.0.0.1:4711 — with a callsign (falcon-a3f2, otter-91c4, or raven-PROJ-123 when it's working a Jira ticket... yes, the banner is literally the roster), a live column derived from what it's actually doing, and a mailbox. Sessions get whispered at when they're about to trample each other's files. Questions land in an amber rail you can answer from across the room. And when you're feeling ambitious, the board will spawn new workers, route tasks to whoever's idle, and file their plans in a library.

What it does

See everything. queued → working → verifying → needs-you → idle → offline, derived from hook telemetry — never self-reported, because sessions, like people, believe they are almost done. The model badge is derived the same way: Claude Code only reports the model at startup, so Fleet Deck reads it from the session transcript instead and the badge follows a mid-session /model switch rather than freezing on whatever the session happened to launch with.

Conflict radar. Two sessions touching the same file within 30 minutes get warned in context ("coordinate, don't clobber"), the board flashes hazard-red, and yes, it's worktree-aware — the same file edited in two worktrees of one repo is a merge conflict introducing itself early.

Needs-you rail. Permission prompts, multiple-choice questions, MCP forms, and trailing "should I use bcrypt or argon2?" questions all become cards you answer from the board. The terminal never even asks — it just prints ⎿ Allowed by PermissionRequest hook and carries on, slightly smug.

Mail with honest latency. Message any session, a whole repo, or everyone. Delivered at the next turn boundary — idle sessions usually wake within seconds (a small watcher taps them on the shoulder). The board never promises "instant," because we don't lie to you, even about milliseconds.

An orchestrator with no brain, on purpose. assign auto: fix the flaky test picks the best candidate — idle first, least buried, right repo — with a SQL query, not a model call. The core makes zero model calls. Your tokens are yours.

A dynamic fleet. The + Spawn button starts a fresh interactive claude in a daemon-owned tmux window. Watch it work on the board, attach to the pane if you're nostalgic for terminals, kill it when it's done (there's a confirm; we've all misclicked).

A live terminal. Click a board-spawned session's tmux chip and its pane opens in a modal — an xterm.js terminal bridged over WebSocket to a tmux control-mode client (tmux -C attach). No PTY, no native deps, and typing in the modal sends real keystrokes to the agent's pane: you're driving the actual session, not watching a replay. Shift+Enter gives you a newline instead of a submit, with nothing to configure: a terminal normally can't tell Shift+Enter from Enter — both are just a carriage return on the wire, which is why multi-line input needs /terminal-setup in a real emulator — but here the board is the emulator, so it simply sends the ESC CR that Claude Code's own keybinding asks for. The plain-tmux equivalent is still tmux attach -t fleetdeck-4711:fd4711- — same pane, more ritual.

The wall of screens. ▦ Terminals opens every live agent at once, in a grid. All of them stream; exactly one types — the focused tile wears an amber ring and says ⌨ typing here, and every other tile is stdin-disabled at the terminal itself, not merely ignored on the way out. A keystroke lands in a real agent and cannot be recalled, so which one it reaches is never something you have to infer. Click a tile to move the focus, ⤢ to promote it to full size. The whole grid shares one tmux control client, so the tenth tile costs a WebSocket, not a tenth tmux process.

Revive. A reboot kills the panes, not the work — worktrees and transcripts survive on disk. One ⟲ click resumes a dead agent in its own worktree with its whole history: same callsign, same card. Whole columns at a time, if the night was rough.

Remote control. Put an agent on claude.ai and drive it from your phone. The card grows a 📱 chip that opens the session — named after its callsign, so the thing in your pocket is recognizably the thing on your board.

A plan library. Spawn a planner in plan mode. Its plan lands on the board as a rendered card before it can act. Approve it, or capture it to the library and release the planner. Later, execute the plan with your own custom instructions — optionally in unsupervised mode, which is behind a red two-step checkbox that says exactly what it does.

Install

claude plugin marketplace add lacion/fleet-deck # the repo is its own marketplace claude plugin install fleetdeck@fleetdeck

That's it. Your next claude — any terminal, any repo, no wrapper, no launcher, no ritual — brings the fleet up and appears on the board at http://127.0.0.1:4711. Type /fleet in any session for a live summary.

Requires Node 22.5+ — and that's the whole list. There is nothing to npm install: the daemon ships as one bundled file and keeps its state in Node's built-in node:sqlite. Add tmux if you want the board to spawn workers or open their panes in the browser; everything else works without it. Linux, WSL2 and macOS. Windows-native is untested — if you try it, tell us what broke.

Working on Fleet Deck itself, or running it from a fork

claude plugin marketplace add /path/to/fleet-deck # a local clone claude plugin marketplace add your-org/your-fork # or your own fork claude plugin install fleetdeck@fleetdeck

After changing anything under scripts/ you need npm run bundle (the daemon runs the bundle, not the source), and after changing the board, npm run build in board/. Then restart the daemon.

The 60-second tour

Install. Open the board. Launch a claude anywhere — a card appears in about one second.

Launch a second one in the same repo and have them both touch the same file. Watch the hazard ripple. Read the whisper each session receives. Feel seen.

Compose → ORCHESTRATOR → assign auto: add input validation to the signup form. The daemon picks a session; if it's idle, it wakes up and gets to work.

Nobody available? The board offers a spawn a session for this button. One click, one new worker, prefilled with the task.

Tick batch on the spawn form and paste in three tasks, one per line. Three agents, three worktrees, three branches, one click. Then hit ▦ Terminals and watch all three work at once.

Spawn a planner (permission mode: plan), give it something gnarly, and capture its plan. Execute it later with an unsupervised worker while you make coffee. The coffee is not optional; you're a fleet commander now.

Batch spawn: a fleet, not an agent

Tick batch in the spawn form and the prompt box stops being one prompt and becomes a task list — one agent per line:

fix the flaky worktree test update the README install section 3x find the race in the spawn path

That's five agents in one click. Each one gets its own git worktree (--fd-, or --fd-- when the source branch carries a Jira ticket) on its own branch (fd/ / fd/-), so they can all work the same repo without ever standing on each other's edits — that isolation is forced for a batch, not offered. The 3x prefix runs a line several times, which is how you race three independent attempts at one nasty bug and keep the best.

Before anything launches, the form shows you the exact list and the exact count. That preview is the guardrail — there is deliberately no cap on how many agents may be live at once. It's your machine and your token budget; Fleet Deck's job is to make the size of what you're about to do impossible to miss, not to pick a number for you.

Then hit ▦ Terminals and watch the whole fleet work at once:

How it works

terminal 1..n : plain claude + this plugin's hooks │ events (http hooks, fail-open) ▲ whispers, blocks, decisions ▼ │ (hook responses) fleetd — one Node daemon, loopback by default, SQLite state ▲ │ WebSocket push └────────── the board (React) ─────────┘

Zero wrapper. The plugin's hooks make plain claude fleet-aware. The first session's SessionStart hook elects and launches the daemon; the port bind is the election.

Fail open, always. Daemon down? Hooks time out silently and your sessions run exactly as before. Fleet Deck is not load-bearing; it's a tower, not a runway.

Zero model calls in the core. Telemetry, conflict detection, routing, question relay: deterministic code. The only model cost added to your sessions is a ~100-token roster brief and the occasional whisper.

Loopback by default; the LAN costs a key. Out of the box the daemon binds 127.0.0.1 and nothing else on earth can reach it. FLEETDECK_BIND=0.0.0.0 opens it to your network — and then a token becomes mandatory, no exceptions, because this API can spawn unsupervised agents and type into their terminals (LAN mode). Either way, your fleet does not phone home.

Revive: a dead agent is not lost work

When the machine reboots — or tmux dies, or WSL2 decides it has had enough — the panes go. The work doesn't. Each agent's git worktree is still sitting on disk, and so is its Claude transcript, and the daemon knows both paths.

So an OFFLINE card whose worktree and transcript both survive grows a ⟲ revive chip. Clicking it relaunches that spawn in the same worktree with claude --resume (plus --dangerously-skip-permissions, if it had it before). Same callsign, same card, full history — because --resume keeps the session id, the revived agent's very first hook simply un-tombstones the card it already had, rather than opening a stranger's. When more than one card qualifies, the OFFLINE column head offers ⟲ Revive all (N).

It refuses honestly instead of guessing:

409 — the pane is somehow still alive, or that session already has a live spawn.

410 — the worktree or the transcript is gone. There is nothing to resume into and we will not invent one.

We built this the morning after a WSL2 restart took an entire fleet out overnight. Five agents came back with their work intact. It remains the most satisfying button on the board.

Remote control: the fleet in your pocket (/rc)

Claude Code can hand a session to claude.ai. Fleet Deck gives you three doors to that, and names the session after its callsign — so the thing you find in the claude.ai session list is recognizably the thing on your board.

From birth. Tick 📱 remote control on the Spawn form; the worker launches with --remote-control .

On a running agent. A live, idle board-spawned agent shows a 📱 enable remote action. The

[truncated for AI cost control]