OXYGENHUB

Project boards that keep growing: hundreds of Done cards on one column issue #293 closed: completed andymccall opened this · 3 comments

andymccall

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.

andymccall set labels ui ·

andymccall

Design (Claude Code, 2026-10-25), in slices:

  1. 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.
  2. Archive: a card or a whole column's cards archived (archived_ms on 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 and oh project card archive N --from Done --older 14d, sharing issue #289's selection.
  3. 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).
  4. Filters by label and assignee: cards show their issue's labels and assignees; the filter takes label: and assignee: (needs the card view to load them: one query per board, not per card).
  5. Long columns without paging: with 1 and 2 a column rarely passes a few dozen; if it still does, the API's /cards gains ?column=&after= pagination for clients.

andymccall referenced by change 657e7d5c9da9 on main ·

referenced by 2 changes on 25 Oct 2026

6a306cd03fc1 439ecd8708a1

andymccall

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: and state: 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 and oh project view carry 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, the projects.archiver worker task), "Done, archived" on the issue's page. API POST …/cards/archive (with issue #289's selection plus older_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

b7d2b0b30b4a 946fe7a09faa a3ba7cc10673

andymccall

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 ·