How the board works¶
A dashboard spans one or more repositories and lays their open issues out on a grid of swimlanes × columns, both defined by labels. Dragging a card swaps the labels on GitHub. Everything runs on your machine against a local SQLite cache that refreshes in the background.
Placement¶
- A dashboard shows only open issues you created or are assigned to (scope
mine, the default; "you" is the account behind the token). Switch a dashboard toallin settings to see everyone's. - Each swimlane and column lists the labels it matches. An issue lands in the first entry
(in order) it satisfies: by default carrying any of the labels; an entry set to all
needs every one of them (
"match": "all"in the config). - An entry with no labels is the catch-all for issues matching nothing else. At most one per axis. Issues that fit neither are counted as "unplaced" on the board.
- Dragging an issue removes the source entry's labels it carries and adds what the target entry needs: its first label, or every label for an "all" entry. Dropping on a catch-all only removes.
- Hide blocked (per swimlane) drops issues that have at least one open blocker (GitHub "blocked by" relationships).
- Issues carrying the epic label appear in the strip above the board with sub-issue progress; clicking one filters the board to its sub-issues and to issues it blocks or is blocked by.
- Filters (text, assignee, label, epic, sort) live in the URL, so a view is a link.
Sync¶
Sync is sequential per repository, on purpose: GitHub's GraphQL rate limit is shared across everything the token does. Three kinds of pass:
- Incremental — issues updated since the last run, every
refreshMinutes. - Full — every open issue, once a day, for repositories just added to a dashboard, and on demand from the sync button on the board.
- Single issue — after a drag, the moved issue is refetched so the board reflects GitHub rather than an optimistic guess.
The remaining rate-limit budget is shown next to the sync status. The board polls
/api/version and reloads itself when a sync has landed.
Dragging¶
A drop computes a label diff, never a full label list: remove the source entry's labels the
issue carries, add what the target entry needs (its first label, or every label for an all
entry). Two people editing labels in parallel therefore do not clobber each other. The card
moves immediately; if GitHub rejects the change it snaps back and the error is shown.
Epics¶
Issues carrying the dashboard's epicLabel are lifted out of the grid into a strip above it,
each with its sub-issue progress from GitHub. Clicking an epic filters the board to its
sub-issues and to issues it blocks or is blocked by; clicking again clears the filter.
Filters¶
Text, assignee, label, epic and sort live in the query string, so a filtered view is a link you can bookmark or send. Empty values count as unset.