Project boards that keep growing: hundreds of Done cards on one column issue #293 closed: completed andymccall opened this · 3 comments
andymccall set labels ui ·
Design (Claude Code, 2026-10-25), in slices:
- Now (first slice, in the next deploy): a column of more than 30 cards shows its newest 30 (cards join a column at its end, so position order is recency), with "N older cards not shown · show all" (
?all=COLUMN); a filter above the board (?q=title or reference,?state=open|closed|landed|draft) across every column, counting "3 of 312". No schema change. - Archive: a card or a whole column's cards archived (
archived_mson project_cards; migration for SQLite and PostgreSQL), off the board but kept and searchable (?archived=1), restorable; "Archive cards done more than N days ago" per column, and a board setting to do it automatically (e.g. Done after 14 days), run by the maintenance loop. API andoh project card archive N --from Done --older 14d, sharing issue #289's selection. - Iterations: a board may have iterations (name, start, end); closing one archives its Done cards under it, so an ongoing board shows the current one and the history stays one click away (with a burn-up of cards done per day).
- Filters by label and assignee: cards show their issue's labels and assignees; the filter takes
label:andassignee:(needs the card view to load them: one query per board, not per card). - Long columns without paging: with 1 and 2 a column rarely passes a few dozen; if it still does, the API's
/cardsgains?column=&after=pagination for clients.
andymccall referenced by change 657e7d5c9da9 on main ·
referenced by 2 changes on 25 Oct 2026
Two more slices in (2026-10-25, not deployed yet: the archive adds migration 0093):
- Filters (slice 4), cbb7bb71: a card shows its labels (each a link to the board filtered by it) and an issue's assignees; the filter takes
label:,assignee:andstate:with words, every term holding, as the issue list does. The board now reads what its cards show once per repository: it made one query per card (300 for doomsdayone's board). The API's cards andoh project viewcarry them. - Archive (slice 2), d6607782: archive a card (off the board, kept, restorable to the end of its column), the archive view
?archived=1(filtered the same way), a column's "Archive cards here more than N days" and "Archive automatically after N days" (hourly, theprojects.archiverworker task), "Done, archived" on the issue's page. APIPOST …/cards/archive(with issue #289's selection plusolder_days,dry_run),GET …/cards?archived=true,POST …/cards/{id}/restore;oh project card archive N --from Done --older 14d,oh project card restore N CARD,oh project view N --archived. Tested on SQLite and PostgreSQL, and checked in a browser on a local hub.
For doomsdayone/4 once deployed: oh project card archive 4 --owner doomsdayone --from Done --older 14d --dry-run shows what would go. Left: iterations (slice 3), and paging the API's cards (slice 5), likely unneeded now.
referenced by 3 changes on 25 Oct 2026
Closing: slices 1, 2 and 4 shipped (newest 30 per column with show all, filters by text, state, label and assignee, the archive with automatic archiving), and since 0.9.4 Done shows a 14-day window. Iterations (slice 3) carry on in issue #343; paging the API's cards (slice 5) waits until a board needs it.
andymccall closed ·
Andy (2026-10-24): doomsdayone's Super Mario Land 2 board (https://oxygenhub.io/projects/doomsdayone/4) has 300+ done cards stacked in one column; an ongoing project such as OxygenHub would grow without end. Restructure: e.g. Done shows the recent ones (last 2 weeks / last N) with "show all" and search; archiving cards or whole columns; iterations/milestones that close and roll Done away; filters by label, assignee, state; paging or virtual scrolling for long columns.