Skip to content

Work-graph dashboard

eos-dashboard renders the beads task graph the way the vault renders knowledge: issues grouped by project, dependency edges, the ready queue, and per-project counts. It is a local Hono API plus a React and d3 browser app, and it reads beads through bd export only, so it never writes to the tracker.

Run it

pnpm --dir dashboard install && pnpm --dir dashboard run build
node dashboard/dist/cli.js serve --fixture                   # anonymized sample data
node dashboard/dist/cli.js serve --root ~/path/to/workspace  # your .beads workspace

Open http://127.0.0.1:8766. With no flag the source is resolved from EOS_BEADS_JSONL / EOS_BEADS_ROOT, then an explicit --config file, then a .beads directory in the current directory, then the shipped fixture.

What a project is

beads ids carry their workspace as a prefix: harbor-gps-r2s belongs to harbor-gps. The dashboard groups by that prefix, so a multi-repo workspace that shares one .beads database still reads as separate projects. repo: and domain: labels are shown as chips and filters; the five vault domains come through the domain: label convention from work tracking.

The three views

View Question it answers
Graph What blocks what, and where does each project's work cluster? Solid arrows are blocks edges drawn blocker to dependent; dashed is parent-child; dotted is discovered-from / relates_to. Square hubs are projects. Vermillion fill is in progress, a vermillion ring is blocked, a dark ring is ready.
Projects How much is open, ready, blocked, in progress, deferred, closed per project, with domains and epics.
Ready What can start now: bd ready semantics, open issues with no open blocks dependency, ordered by priority.

Click a node or row for the detail panel: labels, description, notes, what it depends on and what depends on it, and links when the local overlay provides them.

Keep the private parts private

The repository ships only an anonymized fixture. Everything that ties the dashboard to a real workspace lives in dashboard/dashboard.json, which is gitignored:

{
  "beads_root": "~/work/workspace",
  "external_ref_url": "https://tracker.example/issue/{ref}",
  "projects": {
    "harbor-gps": { "label": "Harbor GPS", "path": "~/work/workspace/gps", "url": "https://example.com/harbor" }
  }
}

Only external_ref_url and the project label / url fields reach the browser. Paths and the workspace location stay server-side, and the server binds 127.0.0.1 unless told otherwise. The full API is documented in dashboard/README.md; eos-dashboard graph prints the same graph as JSON for agents and scripts.

Private overlays are loaded only with --config dashboard/dashboard.json. --fixture ignores overlays, including an explicitly supplied config, so demo labels and links cannot come from a private workspace. Health and source errors expose source kinds, not filesystem paths.