What you’ll learn
One repository, many readers. The people who fix things — engineers and
designers — want lists: which lint rules fired, which frames aren’t ready, where
the parity grid has holes. The people who fund things — design-system owners and
managers — want trends: is drift going down, is contrast holding, is the system
getting adopted. For a long time a dashboard had to pick a side. This wave stops
making it choose. There is one history under .ds-bridge/, and now there are many
lenses onto it. You pick a view, and from then on ds-bridge report renders
your dashboard — without changing anyone else’s.
A word for designers and managers: nothing here asks you to think about files. A view is just a saved preference for which panels you want to see. You can pick a ready-made one named after your role, or hand-build a list, and either way the choice lives in a small, readable file your team reviews in a pull request like any other change.
- Why views exist — one shared history, a different lens for each role
- The five presets, and why
consumeris deliberately the thinnest - Three ways to choose a view: the conversational setup, the raw wizard, and a one-off flag
- What materialization means when you add or remove a single artifact — and why an explicit list never silently grows
Setup
You’ll need the ds-bridge plugin (Getting started
covers install and the preferences dialog) and a project you’ve run ds-bridge
in at least once, so there’s a .ds-bridge/history.jsonl to render. No Figma
token is required to pick a view — that’s purely a preference. The dashboard reads
whatever history you already have.
# Render the dashboard with whatever view is configured (everything, by default).
ds-bridge report
Steps
-
Meet the seven artifacts. Run
dashboard listto see the whole catalog — every panel a dashboard can show, its id, and which personas tend to care about it. With no view set, everything is on:View: everything (default) ┌────┬──────────────┬───────────────────┬──────────────────────────────────────┐ │ on │ id │ title │ personas │ ├────┼──────────────┼───────────────────┼──────────────────────────────────────┤ │ ✓ │ system-score │ System score │ owner, engineering, design, consumer │ │ ✓ │ drift-trend │ Token drift │ owner, engineering │ │ ✓ │ lint-summary │ Lint violations │ engineering │ │ ✓ │ readiness │ Handoff readiness │ design │ │ ✓ │ parity │ Component parity │ owner, design, consumer │ │ ✓ │ a11y │ Contrast (a11y) │ design, owner │ │ ✓ │ impact │ Change impact │ engineering, consumer │ └────┴──────────────┴───────────────────┴──────────────────────────────────────┘system-scoreis the one number atop every view — a weighted blend of drift, lint, readiness, and contrast, replayed from your run history (and available as a README badge viads-bridge badge).The
personascolumn is a hint, not a rule — it’s how the presets were drawn. You’re free to compose any list you like. -
Pick a view in conversation. The friendliest path is the slash command. Inside Claude Code, run:
/ds-bridge:dashboard --setupIt asks who the dashboard is for, offers to add or drop any artifact, saves your choice with
ds-bridge dashboard set, and offers to open the result. It’s the same outcome as the steps below — just guided in plain language. -
Or run the raw wizard. Prefer the terminal?
ds-bridge dashboard setupruns the same flow with no AI in the loop. Here’s a complete session — pick a preset by number, decline customizing, and save:Pick a dashboard view: 1) owner 2) engineering 3) design 4) consumer 5) everything View number: 1 Customize the "owner" view? (y/N) n Save preset "owner"? (y/N) y Saved. Your dashboard view is now preset "owner". Render it now? ds-bridge report --openThe wizard needs a real terminal — it reads your answers from the keyboard. In a script or CI, reach for
dashboard setinstead (Step 5). -
Read the five presets. Each preset is a named, ordered list drawn from the seven artifacts. The ids are a stable contract — so what you pick today keeps meaning the same thing tomorrow (presets may gain new artifacts as the catalog grows; the system score now leads every one):
owner system-score · drift-trend · parity · a11y engineering system-score · lint-summary · impact · drift-trend design system-score · readiness · a11y · parity consumer system-score · parity · impact everything all seven, in catalog order (the default)consumeris intentionally the thinnest — the score plus two panels. A consumer of the system — someone building with it rather than on it — mostly wants to know two things: does the component I need exist and match (parity), and will a change to the system ripple into my code (impact)? That restraint is the point, not an omission. A short, honest dashboard beats a long one nobody reads. -
Set a view without prompts.
dashboard setis the non-interactive writer — what the slash command calls under the hood, and what you’d use in CI. Save theownerpreset:ds-bridge dashboard set --view ownerView set to "owner".Now
dashboard listshows the resolved selection — the same catalog, with only the owner panels marked on, and the source named asproject(it came from.ds-bridge.json, not the default):View: owner (project) ┌────┬──────────────┬───────────────────┬─────────────────────────┐ │ on │ id │ title │ personas │ ├────┼──────────────┼───────────────────┼─────────────────────────┤ │ ✓ │ drift-trend │ Token drift │ owner, engineering │ │ │ lint-summary │ Lint violations │ engineering │ │ │ readiness │ Handoff readiness │ design │ │ ✓ │ parity │ Component parity │ owner, design, consumer │ │ ✓ │ a11y │ Contrast (a11y) │ design, owner │ │ │ impact │ Change impact │ engineering, consumer │ └────┴──────────────┴───────────────────┴─────────────────────────┘ -
Override for a single run. A persisted view is your everyday default, but any one render can wear a different lens with
--view— nothing is written to disk. An engineer on an owner-configured repo can glance at their own panels without disturbing the saved choice:ds-bridge report --view engineering --open~/acme-app/.ds-bridge/reports/dashboard.htmlRun it again with no flag and you’re back to the owner dashboard. Flags win for that invocation; the project file wins everywhere else. The resolution order is simple: a
--view/--artifactsflag, then the project config, theneverything. -
Add or remove one artifact — and meet materialization. Sometimes a preset is almost right.
dashboard addanddashboard removetweak it by a single panel. The first time you do this on top of a preset, ds-bridge materializes the preset into an explicit list, then makes the edit. Starting from the savedownerview, addimpact:ds-bridge dashboard add impactYour view is now an explicit list and will not auto-gain future preset artifacts. Added "impact". View: drift-trend, parity, a11y, impact.That notice is the important part, and it’s a promise — not a warning. The moment your view becomes an explicit list, it stops tracking the preset. If a future release adds a seventh artifact to
owner, your list won’t silently grow to include it, because you’ve said exactly what you want. Explicit means explicit. That’s intent, not a bug — and if you’d rather follow the preset again, justdashboard set --view ownerto go back.Under the hood, the edit lands in
.ds-bridge.jsonas a plain, reviewable list:{ "dashboard_artifacts": [ "drift-trend", "parity", "a11y", "impact" ] }This file is yours to read but not to hand-edit for this purpose: the wizard,
dashboard set,add, andremoveare the sanctioned writers, and they keep the file tidy and your other settings untouched. Because it’s committed, your teammates see the dashboard change in the same pull request as the work that prompted it.
Result
You can now answer “whose dashboard is this?” with “mine — and yours, from the
same history.” You’ve seen the full catalog, the five frozen presets, and three
ways to choose: a conversational --setup, the raw terminal wizard, and a one-off
--view flag for a single render. A saved view lives in .ds-bridge.json as a
small, PR-reviewable preference; a --view flag overrides it just for that run;
and the resolution order — flag, then project config, then everything — is the
same everywhere.
The two view choices map to two keys, and only one is ever set at a time: a
preset persists as dashboard_view (a single name like owner), while a
hand-built or materialized list persists as dashboard_artifacts (an ordered
list of ids). Picking a preset clears any explicit list, and editing with
add/remove converts a preset to a list — so the two never fight. Let
dashboard set and the wizard manage them; that’s what keeps the file honest.
Troubleshooting
- The wizard exits straight away with code 2?
dashboard setuponly runs in a real terminal, because it reads your answers from the keyboard. In a script, a pipeline, or anywhere stdin isn’t a TTY, it exits 2 and points you at the non-interactiveds-bridge dashboard set --view <preset>(or--artifacts <a,b>) instead — same result, no prompts. - It says an artifact id is unknown?
set,add, andremovevalidate every id against the catalog and exit 2 rather than guess. The message offers the nearest matches, so a typo likeparityyis answered withparity. Runds-bridge dashboard listto see the seven exact ids. - It complains that both keys are set?
dashboard_viewanddashboard_artifactsare mutually exclusive — a view is either a preset name or an explicit list, never both. If you hand-edited.ds-bridge.jsonand set both, ds-bridge exits 2 rather than guessing which you meant. Delete one, or letdashboard setrewrite the file cleanly. - You set a view but
reportstill shows everything? Check that a--viewor--artifactsflag isn’t overriding it for that run — flags beat the project file by design. With no flag,reportreads.ds-bridge.json; confirm your edit landed there withds-bridge dashboard list.