Part of the UX backlog. Raised on 2026-06-11 as "resume in progress" navigation.
Progress is already tracked well enough to support this — lib/progress.ts stores completedSections and lastSection per module, and as of 2026-07-29 lastSection records the section the reader is currently on, so a module reopens where they left off.
What is missing is the way in. Neither CatalogClient (homepage) nor LevelCatalogClient (level page) offers a "continue" affordance: grep for resume or continue in both returns nothing. A returning reader has to remember which track, which level and which module they were on, and click through three pages to get back.
Scope
- Surface the most recently touched module as a direct link — "Continue: PHP Beginner, Module 4".
- Decide where it lives: the homepage is the natural spot, since that is where people land.
Notes
getProgress() returns the whole store keyed by track/level/moduleId, so "most recent" needs either a timestamp per module (the store has no updatedAt today) or a single "last visited" pointer written on section change. The store is versioned (version: 2), so adding a field is a migration-friendly change.
Done when
A returning reader can get back to where they were in one click from the homepage.
Part of the UX backlog. Raised on 2026-06-11 as "resume in progress" navigation.
Progress is already tracked well enough to support this —
lib/progress.tsstorescompletedSectionsandlastSectionper module, and as of 2026-07-29lastSectionrecords the section the reader is currently on, so a module reopens where they left off.What is missing is the way in. Neither
CatalogClient(homepage) norLevelCatalogClient(level page) offers a "continue" affordance: grep forresumeorcontinuein both returns nothing. A returning reader has to remember which track, which level and which module they were on, and click through three pages to get back.Scope
Notes
getProgress()returns the whole store keyed bytrack/level/moduleId, so "most recent" needs either a timestamp per module (the store has noupdatedAttoday) or a single "last visited" pointer written on section change. The store is versioned (version: 2), so adding a field is a migration-friendly change.Done when
A returning reader can get back to where they were in one click from the homepage.