Three compounding issues caused the 4+ second load: 1. getAllRatings() ran sequentially after the first Promise.all group, adding it unnecessarily to the critical path. Now runs in parallel with listBooks/getVotedSlugs/getSavedSlugs (all 4 concurrent). 2. discovery_votes was fetched twice on every page load — once inside getBooksForDiscovery (via getVotedSlugs) and again by getVotedBooks. Fixed by caching getVotedSlugs results with a 30s TTL so the second call hits cache instead of PocketBase. 3. getVotedSlugs and getSavedSlugs were always uncached, hitting PocketBase on every navigation. Added short-TTL per-user Valkey cache entries (voted: 30s, saved: 60s). Cache is invalidated immediately after each write (upsertDiscoveryVote, clearDiscoveryVotes, undoDiscoveryVote, saveBook) so stale data is never served.
sv
Everything you need to build a Svelte project, powered by sv.
Creating a project
If you're seeing this, you've probably already done this step. Congrats!
# create a new project
npx sv create my-app
To recreate this project with the same configuration:
# recreate this project
npx sv@0.12.4 create --template minimal --types ts --install npm ui
Developing
Once you've created a project and installed dependencies with npm install (or pnpm install or yarn), start a development server:
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --open
Building
To create a production version of your app:
npm run build
You can preview the production build with npm run preview.
To deploy your app, you may need to install an adapter for your target environment.