A lightweight, static dashboard for triaging GitHub repositories. It shows live counts and recent items for issues and pull requests using GitHub Search, with cards for common states (unlabeled issues, PRs without DRIs, your assignments, etc.). Everything runs in the browser; just provide a repo name and, optionally, a personal access token for higher rate limits.
See CONTRIBUTING.md for setup, testing, and PR guidelines, and read the full codebase tour in ONBOARDING.md.
This dashboard is built around a DRI (Directly Responsible Individual) model:
- Every PR/issue has a DRI.
- The DRI plays one of two roles:
- Reviewer (most common): expected to review and shepherd the change. This is the default when the DRI is not the author and the author is not MIA.
- Coder: expected to write the code. The coder is always the author unless the author is MIA; if the author is MIA, the DRI becomes the coder.
- There is always exactly one assignee at any time—the person currently working the item. The assignee “bounces” between coder and reviewer as ownership changes.
In practice, with labels, you’ll see labels like DRI:@maintainer1, DRI:@maintainer2, etc., to declare the DRI. The optional op_mia label or a coder flag in the body marks the author as MIA and makes the DRI the coder.
Open docs/index.html via a local server (e.g., npm run serve then http://localhost:3000/). You’ll see:
- Repo field: enter
owner/repo. The dashboard won’t run searches until this is valid. - Handle field: your GitHub handle (with
@). - Token field: optional PAT for higher rate limits; stored in localStorage; “×” clears it.
- Load buttons for Pulls, Triage, Issues sections.
- Cards are not loaded yet; status reads “Not loaded”.
By default, the dashboard searches labels for DRI (and author-MIA flag) tokens. It expects labels like DRI:@alice and MIA labels like op_mia. The DRI token text (DRI:@) and coder/MIA flag texts are configurable.
- Your pull requests
- Blocking:
is:pr is:open assignee:<you> - DRI waiting:
is:pr is:open label:"DRI:@you" -assignee:<you>(you’re DRI, someone else is assigned) - DRI: You:
is:pr is:open label:"DRI:@you"
- Blocking:
- Issue triaging
- WAITING:
is:pr is:open label:"DRI:@*"withno:assignee(DRI declared, nobody assigned) - Unowned:
is:pr is:open NOT label:"DRI:@*"(no DRI label) - Owned:
is:pr is:open label:"DRI:@*"(has a DRI) - Needs DRI:
is:pr is:open assignee:* in:body NOT "DRI:@..."(assigned but missing DRI token)
- WAITING:
- Issues
- Untriaged:
is:issue is:open no:label - In Progress:
is:issue is:open assignee:* - Mine:
is:issue is:open assignee:<you>
- Untriaged:
Each query is prefixed with repo:<owner/repo> once you enter a valid repo.
- Default: off → searches use labels (
label:"DRI:@user"andop_mia). - When on: searches use body text (
in:body "DRI:@user"and bodycoderflag). - Changing this toggle marks all cards stale; reload to re-run searches with the new source.
When rendering items, the dashboard extracts DRI and coder/reviewer role:
- DRI comes from the selected source (labels by default, or body if toggled).
- The coder is the author unless the author is marked MIA (
coderin body orop_mialabel). - When the author is MIA, the DRI becomes the coder.
- Everyone else is the reviewer (the common case).
- Assignee line shows who’s currently assigned; if you’re involved, hints like “(pls code)” or “(pls review)” appear.
- Notes: each item has a local note field with a red “!” toggle, stored in localStorage per repo+item.
- Repo: required; validated as
owner/repo. - Handle: normalized to start with
@. - Token: optional PAT; stored in localStorage; “×” clears and removes it.
- DRI token: default
DRI:@; used in queries and extraction. - MIA flags: body flag
coder, label flagop_mia; both configurable. - DRI source toggle: labels vs body; persisted in settings.
- Settings, notes, and card cache are in localStorage; query params can override and lock fields (including
use_body_text=true/false).
- Serve the docs folder:
npm install(once), thennpm run serve, open the shown URL. - Enter
owner/repoand your handle. Optionally paste a PAT and hit “×” to clear later. - Leave the DRI source toggle off to use labels (recommended). If your repo encodes DRI in bodies, turn it on.
- Click “Load” on Pulls, Triage, Issues. Cards fill with counts and recent items.
- Use inline notes to mark items; use “Reload” on a card to refresh it individually.
- If you need to switch DRI source (labels vs body), toggle the checkbox; cards go stale; click “Load” again.
You can prefill and lock fields via query params:
?repo=owner/repo&handle=@you&dri_token=DRI:@&coder_body_flag=coder&coder_label_flag=op_mia&use_body_text=true|false(true = look in body; false = labels)
Locked fields become disabled in the UI.
- Tokens are stored in localStorage for convenience; use the inline clear control to remove them.
- The page fetches from the GitHub API directly and applies a strict Content Security Policy; no backend is required. Serve via a local server (e.g.,
npm run serve);file://won’t work with module imports.
- Install deps:
npm install - Serve locally:
npm run serve - Tests (with coverage gate):
npm testornpx vitest run --coverage - Lint/format:
npm run lint/npm run format - Types (JS with TS checking):
npm run typecheck