fleet-status — one glance at N sessions

running in production on our own fleet since June 2026 · MIT · public source release in preparation — this page is the spec

Run more than two or three Claude Code sessions and the first thing you lose is the answer to a stupidly simple question: which one needs me right now? fleet-status reads the real state of every window — working, ready, or stuck — and renders it in one line each. The idea is trivial. Getting the state honest is not, and that's the whole skill.

What is this — a page, a skill, a tool? Like sedev, all three: the pattern, a small reader that probes each session, and a Claude Code skill plus renderers (a menubar, status lamps in a chat). This page is the full spec. You can contribute today.
Setting this up with your Claude? This page is written to be read by a model as much as by a human — point Claude Code straight at it ("read this page and set the skill up for me") and it has the full spec, verbatim. No copy-paste, no PDF.

## the model

$ fleet-status
 a1  working   · "editing outboundWorker.js" · 2m18s
 a3  ready     · waiting for input
 a4  working   · "running test suite"        · 0m41s
 a6  stuck?    · no output for 14m            · look here
 m1  asleep    · idle 3h, watcher armed

Green = actually doing work. Blue = done, waiting for you. Amber = suspiciously quiet, probably wants a human. Grey = deliberately idle (see wake-on-event). One glance, and you walk to the one window that matters.

## the hard part: honest state

A status light that lies is worse than no light. The failure that eats naive dashboards is the false-idle: a Claude that looks quiet — no new text on screen — but is mid-thought, about to act. Call it "ready," send it a nudge, and you've interrupted real work. So fleet-status never trusts a single source. It walks a ladder and stops at the first answer it believes:

# state resolution — first confident source wins
1. CLI probe      ask the session directly        → fast, but unreliable alone
2. status service a local endpoint per session    → authoritative when up
3. tmux capture   read the actual pane contents    → ground truth, always available
4. verdict        busy ⇔ a live work-timer is on    → else idle — never "unknown"

## what it reads, what it renders

# same reader, three faces
reader ──▶ menubar   a live dropdown: N lamps, click one → jump to that window
       ├─▶ chat lamps a colored dot next to each session in a fleet-chat cockpit
       └─▶ JSON       one object per session, for your own surface
statelampmeans
working greena live work-timer is running — leave it alone
ready bluefinished, waiting on you — your move
stuck? amberno progress for a while — probably needs a human
asleep greyidle on purpose, watcher armed (wake-on-event)

## quickstart (what shipping looks like)

# install the skill + reader
$ npx fleet-status init
# register the sessions you want to watch (tmux names, panes, hosts)
$ fleet-status add a1 a3 a4 a6 m1
# one glance, any time — or drop the menubar app in your tray
$ fleet-status         # prints the block above
$ fleet-status menubar  # live tray widget

## why not …

… just look at the terminals?
Fine for two. At eight, across two machines, you can't eyeball them — and the one you're not looking at is the one that got stuck. fleet-status is the single pane of glass that scales past your attention span.
… trust the model to report its own status?
A model that's stuck is exactly the one that can't tell you it's stuck. Honest state has to come from outside the session — the pane, the timer — not from asking it nicely.
… a heavier observability stack?
Overkill for "which window needs me." This is a shell reader and a lamp, not Prometheus. It reads terminals, not metrics.

## what ships

## get involved

You don't have to wait for the release:

Like the project? Free and MIT. ♥ support it if it earns its keep — optional, always.

## roadmap

v0.1Public repo: reader + menubar + lamp component, this spec as README, tmux probe
v0.2Remote-host sessions over SSH, per-session stuck thresholds, quiet amber tuning
laterDirect feed from wake-on-event's status endpoint · history (how long was a6 stuck?)

## faq

Does it interrupt the sessions?
No. It only reads — pane captures and a status endpoint. Observing a fleet costs the fleet nothing.
How does it know "stuck" from "thinking hard"?
Time plus the work-timer. A working session keeps its elapsed clock running; a stuck one goes silent with no clock. Amber is "silent past a threshold," and the threshold is yours to set.
Mac and Linux?
Both — our fleet spans Mac minis and Linux VPSes. The reader is shell; the menubar has a native tray build.
Where does this come from?
We got burned by a green light that lied — nudged a Claude that was mid-thought and blew up its work. The state ladder is the scar tissue from fixing that for good.

## status

Not a concept — it's the menubar and the chat lamps our own fleet runs on right now. Left before the public release: generalizing the probes beyond our session naming, the tray installer, docs. This page carries the repo link the day it's up.