Users reading through the Bible want to resume exactly where they left off without having to manually navigate back to their chapter. This feature silently tracks the last-read position and makes it available the next time the app loads — removing the friction of re-finding your place.
bookId (number) and chapter (number) together with a Unix timestamp.localStorage under the key reading-progress as a JSON object.initReadingProgress() — reads from localStorage and loads the stored position into reactive state.updateReadingProgress(bookId, chapter) — writes the new position to both reactive state and localStorage.readingProgress.current returning ReadingPosition | null.localStorage data is silently discarded; unavailable storage is also silently skipped. No toasts or error states.readingProgress.current and route the user directly to their last chapter.localStorage, progress survives page reloads and browser restarts on the same device.Store: apps/web/src/lib/stores/reading-progress.svelte.ts
$state for reactivity; the module-level current variable is the single source of truth at runtime.localStorage key: 'reading-progress'{ bookId: number, chapter: number, timestamp: number }initReadingProgress() returns immediately if typeof window === 'undefined'.API surface:
initReadingProgress(): void // call once on mount
updateReadingProgress(bookId, chapter): void // call on each chapter load
readingProgress.current // reactive read — ReadingPosition | null
No server-side component. No database writes. No authentication required.
Implemented. The store exists and is ready to be wired up to the reader's chapter navigation. Verify that initReadingProgress() is called in the root layout and updateReadingProgress() is called in the reader's chapter load logic.