Discover refresh controls and page reloads
User-facing change
The owner rejected the separate sticky Refresh panel and selected a circular refresh control immediately to the left of the existing bottom-right Back to top button. Both controls use 56px touch targets and 12px spacing. Refresh uses a dark surface and gold icon; Back to top keeps its gold surface. The full-width panel and permanent hint are removed. A spinner shows pending work, and brief feedback appears above the button. Errors retain the current cards.
Visibility follows scroll position, never scroll speed. A short result set that cannot reach the normal threshold still exposes the controls when its feed is in view. Inactive and onboarding-blocked hubs isolate the action group from focus and pointer input. Mobile safe-area positioning is retained.
Explicit Refresh advances to another available batch and aligns it below the app header. Ordinary pagination does not scroll. Button placement is supplied through a local context/portal; RecTab still owns requests, status and focus.
Reload behavior
An actual document reload can resume the next recommendation cursor or offset, instead of asking for the same cached first batch again. Ordinary navigation, Back and React remounts do not consume this behavior. Only the initial page load can restore a checkpoint; later tab/filter remounts cannot. StrictMode's render and effect setup do not consume it prematurely.
One per-tab sessionStorage checkpoint holds the continuation and up to 1000 recently delivered IDs for 30 minutes. It contains no world text or profile data. It is scoped to account, language, content mode, audience preference, NSFW-only and broad-language settings, and validated against the current page size. Account restoration waits for resolved auth and requires a matching cached profile; if unavailable, the normal server-authoritative first page still works. Search, explicit tags and other sorts do not use this checkpoint.
Logout, account deletion and interest changes clear it. A reset generation also prevents a late request from recreating cleared progress. Writes occur only after a current successful response. Storage failures do not block browsing.
An expired restored cursor or stale first restored batch gets at most one automatic fresh restart. Stale delivery IDs are cleared for that recovery to avoid an empty grid caused by filtering every card. Network/capacity errors remain explicit retries. An exhausted pass or expired checkpoint starts fresh.
This records delivery continuity, not an impression or taste signal. Prefetched cards may never have been viewed. It is not cross-device history, guaranteed novelty after all eligible stories are exhausted, or a new ranking model. Legacy offsets may still drift when the live ranking or catalog changes.
Verification and scope
Regression tests cover portal placement, focus isolation, reload versus Back, offset/cursor resumption, account/audience/profile mismatches, pending auth, duplicate-only recovery, retry budgets, late reset writes, attribution, preference handoff, scrolling and bounded/unavailable browser storage.
The owner's mobile screenshot supplied visual context. No interactive browser verification was performed under the repository's browser-use instruction; automated DOM checks do not establish visual appearance. Release results are recorded in the PR. No server schema, ranking flag, infrastructure or Railway variable change is required.
