Skip to content
Dashboard

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.

The Detent dashboard: a project sidebar, a header row of running, queued, waiting, blocked, and completed counts, and Kanban lanes for Backlog, Blocked, Human Review, and Review with issue cards showing repository, title, dispatch source, and waiting reason.
A real board across nine projects. Note the waiting reasons on the blocked cards — the dashboard says why something is stopped, not just that it is.
01 · What it shows

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 →

02 · The lanes

Detent's configured delivery path.

A ProjectV2 board, a boardless issue Status field, or repository status labels all render into this view.

composed snapshot 2 working 1 held at gate
Todo 2
#1626 detent

feat(admission): surface pending proposals

#1619 detent

feat(health): surface stranded active work

In Progress 2
#1614 detent

chore(safety): guard dispatch capacity paths

agent working
#1611 detent

fix(scheduler): clean orphan cycle state

make check running
Human Review 1
#1585 detent

fix(orchestrator): add token progress brake

held at the gate
the detent —
released only by you
Rework 1
#1593 detent

fix(board): collapse staleness warnings

2 threads unresolved
Merging 1
#1628 detent

docs(cli): refresh version output example

rebased, CI watch
Done 785
#1624 detent

test(project): relax watcher deadlock guard

merged, green

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 →

03 · The terminal UI

For people who live in tmux.

Same lanes, same counts, same reasons — no browser.

$ detent tui
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 watch

The 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.

04 · Design rules

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.

Keep reading