Repository navigation
Epic: 'Continue Reading' Flow & Auto-Add Prompts #13256
Description
Epic: "Continue Reading" Flow
Summary
New patrons land on an empty My Books page — the Loans carousel just says "No books are on this shelf," with no path back to value. We know populated shelves correlate strongly with retention, so this Epic closes that gap with a "Continue Reading" shelf on My Books. The moment a patron has touched one book, their dashboard should already look alive.
Two structural problems drive the empty state today and motivate the sub-tasks below:
- Short-term borrows disappear. Most loans are ~1hr; once expired, they vanish from the active dashboard with no "pick up where you left off" surface.
- No historical fallback. A patron who interacts with books or open-access items needs a reliable server-side reading history to power the Continue Reading experience across devices.
Close this issue once all phases below are merged and the unified carousel is live on My Books.
graph TD
Phase1[Phase 1: Merge Active Loans & Loan History Carousel] --> Phase2[Phase 2: Database-Backed Read History & Unified Carousel]
Roadmap & Checklist
[x] Phase 1: Merge Active Loans & Loan History Carousel (Backend + Template)
Tracked in #13272.
Replace the legacy Loans carousel on My Books with a unified carousel that displays both active CDL loans and past checkouts.
- Fetch active loans (
get_loans_of_user) and historical loans (user_borrow_history). - Deduplicate books by work OLID.
- Sort by last-access/updated timestamp descending.
[x] Phase 2: Database-Backed Read History & Unified Carousel
Tracked in #13273.
Implement server-side database-backed read history (read_history table) and integrate it directly into the unified Continue Reading carousel alongside active loans and loan history, superseding client-side localStorage tracking.
- Automatically record reading activity during borrow and read flows.
- Merge active loans, loan history, and database read history with robust work-key deduplication and timestamp sorting (prioritizing active loans).
Sub-Issues
- "Continue Reading" Phase 1: Merge Active Loans & Loan History Carousel #13272 — Phase 1: Merge Active Loans & Loan History Carousel
- Continue Reading Phase 2: Database-Backed Read Tracking & Unified Carousel #13273 — Phase 2: Database-Backed Read History & Unified Carousel
Next steps
- Close this issue once Phase 2 is merged and the unified Continue Reading carousel is confirmed live.
Engineering Standards
- Python: double quotes, max line length 162, Ruff-compliant import order.
- JS: ESLint-compliant, single quotes, no jQuery in new components.
- CSS: Stylelint-compliant — no hex colors, use variables defined in
static/css/. - i18n: don't split sentences into separate translatable fragments around HTML links. Use single translatable strings with placeholders (e.g.
%(link_start)s/%(link_end)s) so translators can reposition links per target-language grammar.
Metadata
Metadata
Assignees
Labels
Type
Projects
- StatusShow more project fieldsIn Flight
Activity
lokesh commentedon Aug 4, 2026
This 2x2 grid of options seems overly complex. I'd like to propose a simpler approach, but first I'd like to understand what patron acitons/info is...
Sadashii commentedon Aug 5, 2026
This behavior adds the book to a patrons
Currently Readingbookshelf - by default, that is currently public.It can be toggled to be made private.
Ideally, to provide maximum value to a patron, we want them to choose 'Always add' in the prompt.
Sadashii commentedon Aug 6, 2026
Perhaps a checkbox that is 'Remember my decision' and two action buttons "Add to bookshelf", "Don't add"
Worthwile to directly provide them an option to change their privacy settings in this modal itself? In case they hesitate to add it due to privacy reasons, providing this option here directly might prompt them to toggle and then remember this action?
feat: db-backed read history and unified carousel (Fixes internetarch…