Prepending older actions changes `actions`, and the bottom-pinning effect watches `actions`. If nothing had un-pinned the view first, loading earlier turns scrolled straight past them to the newest one -- the reader asks to go back and the story throws them forward. Scrolling up is what normally un-pins, so the case that breaks is the one where the reader never scrolled: a window short enough to fit the viewport, where the "N earlier moments" button is the only way back and the button is what fails. Reading backwards is the opposite of following along, so a prepend now clears the pin explicitly rather than relying on a scroll having happened. Found by re-reading this path rather than by running it -- the scroll behaviour is the one part of the paging work nothing exercises, since the frontend has no test runner. Also holds off three seconds after a failed page fetch. Parked near the top, momentum scrolling calls this dozens of times a second, and against an endpoint that is failing that is a retry storm rather than a retry. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Dvvqn9ZDR4ixeFPHNbww7
React + Vite
This template provides a minimal setup to get React working in Vite with HMR and some Oxlint rules.
Currently, two official plugins are available:
- @vitejs/plugin-react uses Oxc
- @vitejs/plugin-react-swc uses SWC
React Compiler
The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see this documentation.
Expanding the Oxlint configuration
If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the TS template for information on how to integrate TypeScript and Oxlint's TypeScript related rules in your project.