feat(admission): surface pending proposals
The board stays honest.
Detent ships a web dashboard and a terminal UI over the same state. "In progress" means an agent is working right now, not that someone forgot to move a card.

Instrument panel, not a status page.
Live counts
Running, queued, waiting, blocked, and completed over the last 48 hours, across every project on the host.
Running agents
Which issue each agent has, how long it has been working, and what it is doing right now — dispatch, make check, PR update.
Why something is stopped
Not just the lane. The actual reason: dependency not ready, paused by project status, mergeStateStatus DIRTY, awaiting review artifact.
Token, budget, and rate limit
Live spend against your cap and the current rate-limit posture, so a run that is about to hit a wall is visible before it does.
Board flow
Charts, trends, and timelines with hover detail — where work is accumulating and how long it sits in each lane.
Density and staleness
Compact, cozy, and comfy card densities, plus an explicit stale-data banner when the tracker poll is behind.
The dashboard is also an API. Everything the browser renders is available as JSON. Dashboard and APIs →
Detent's configured delivery path.
A ProjectV2 board, a boardless issue Status field, or repository status labels all render into this view.
feat(health): surface stranded active work
chore(safety): guard dispatch capacity paths
fix(scheduler): clean orphan cycle state
fix(orchestrator): add token progress brake
released only by you
fix(board): collapse staleness warnings
docs(cli): refresh version output example
test(project): relax watcher deadlock guard
The six lanes shown come from Detent's own production configuration, not a fixed product state model; each workflow defines its own states. This is not a live board: the issue numbers and titles come from real merged work in digitaldrywood/detent, composed across the path for this illustration. The counts describe the illustration; 785 is the all-time landed pull requests on that repository. Non-code workflow example →
For people who live in tmux.
Same lanes, same counts, same reasons — no browser.
detent · 9 projects · running · held · budget and rate limit in the header
▸ In Progress agent working, make check …
▸ Human Review held: approval label
▸ Rework review threads unresolved
▸ Merging train: rebased, CI watchThe TUI reads the same state the dashboard does. There is no separate data path to drift out of sync, and no browser tab to keep open on a second monitor.
The dashboard binds locally by default. Nothing is exposed to a network you did not choose to expose it to.
The same system this site is built in.
The dashboard's palette, type scale, and geometry are the ones you are reading right now — the marketing site imports the product's tokens rather than approximating them.
Four semantics, one accent
ok, warn, error, info — and teal for interactivity only. Never a fifth semantic, and never accent for status.
Hairlines, not shadows
1px borders carry every boundary. Card radius 6px, chip radius 4px, on a strict 4px spacing grid.
Mono means machine
State names, config, CLI output, and lane labels are set in Geist Mono because they are literal strings, not decoration.
One thing animates
A 6px pulsing dot per active agent, and the held card's ring. Reduced-motion turns both off.
The state machine, the gate model, worktree isolation, and the merge train.
The interaction-model argument, the default choices, and the comparison matrix.
Platform-tabbed install commands, requirements, and the first run.
Reviewed recordings of Detent moving real work through checked-in workflows.
The curated operator reference, mirrored from a pinned Detent release.
MIT, the repository, releases, contributing, and the self-hosting proof.