Drilling into a Library folder only ever swapped #library-groups's
contents via fetch, never touching browser history - so back had
nothing of the app's own to step through once you were a few folders
deep, and fell straight through to exiting the app instead of going up
a level.
Push a history entry per drill-down and breadcrumb jump, and restore
libraryTrail/re-fetch that level on popstate, so back now un-drills
one folder at a time and only reaches the app's actual exit once
you're back at the library root.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Templates only, no backend changes:
- Fixed the real bug: JS-generated status/loading text and a few component
styles used hardcoded hex (#007acc, #999/#666, #28a745, #ff6b6b) instead
of the CSS variables the theme system already provides, so they didn't
track the user's chosen theme/accent - most visible on Light or any named
theme other than the default. Added --success/--error to all 5 templates'
:root blocks and replaced every non-:root occurrence. Left the
.lesson-type badge colors and generic UI chrome grays alone (intentional,
not theme-dependent). Verified live by switching to Nord and Light themes.
- Dashboard cards (Library Stats, Next Up, Pick Back Up, Recently Added,
Continue Watching, Recently Viewed) are now collapsible, state remembered
per device via localStorage - the no-course dashboard had grown to 7
stacked cards.
- Course page's three action buttons get consistent compact sizing and
icons instead of a plain stack.
- Library browser and transcript search show shimmering skeleton rows
instead of bare "Loading..."/"Searching..." text while a fetch is in
flight.
- Hover treatment made consistent: transcript results get the same lift
.lesson-item already had, heatmap cells get a GitHub-style hover
scale-up, and Notes Hub links get a background-chip hover.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Six more dashboard features, all built on the per-course progress-file
scanning infrastructure from earlier sessions:
- Notes Hub (/notes): every lesson note across the library in one place,
newest first, reusing the existing /recent/open cross-course jump route.
- Transcript search: opt-in checkbox on the Library search box, searching
inside .srt/.vtt files. Kept cheap by doing a raw substring match as the
filter step and only extracting a snippet for files that actually match.
- Stale course nudges ("Pick Back Up"): courses with progress that haven't
been touched in 14+ days.
- Study guide export: compiles a course's notes into one downloadable
markdown file, section/lesson structure preserved.
- Next Up queue: an ordered, persisted "what to tackle next" list with
up/down reordering and a queue button on every course row.
- Activity heatmap: a 90-day contribution-style calendar in the Library
Stats card.
_scan_library_activity() now does one walk over every course's progress
file per dashboard load; library stats, stale courses, and the heatmap all
derive from that single scan instead of three independent ones.
Also refactored the duplicated lesson-progress-key lookup (used in three
places now) into _resolve_lesson_progress_key(), and flagged a pre-existing
bug found along the way (not fixed here, kept out of scope): subtitle files
never actually attach to a Lesson object, so the video player's caption
track has never had anything to render.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Five more usability features on top of the search/thumbnails batch:
- Recently Added: dashboard card of courses by folder mtime, separate from
Recently Viewed (watched vs. just showed up on disk).
- Bulk find/replace rename across every course/folder name at once, with a
mandatory preview step before anything touches disk. Refactored the
single-item rename route to share the same validate/apply logic.
- Estimated time remaining on the loaded course's stats card, computed only
from lessons that have actually reported a duration.
- Library-wide stats overview: total courses, lessons tracked, time
watched, daily streak - read from each course's small progress file
rather than re-scanning course contents.
- One-click backup/export zip of settings, hidden-paths, recently-viewed,
and every course's progress/notes.
Also fixes a real performance bug found along the way: search was routing
through list_library_directory, which computes a full recursive file count
and thumbnail lookup for every course at every level regardless of match -
turning a search into an O(every file in the library) scan. Gave search its
own lightweight directory-only walk (iter_all_courses), now shared by
Recently Added and the stats overview too, so the expensive per-course work
only runs for courses that actually match.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Eight usability additions on top of the mobile redesign: course cover-image
thumbnails, a debounced library search, a Continue Watching section split
from Recently Viewed, per-lesson playback speed control, an installable
PWA manifest/icons, name sort in the library browser, per-lesson notes, and
a bulk mark-course-as-watched action. Also fixes two real bugs found along
the way: lesson_view.html was missing the viewport meta tag (so lesson
pages weren't actually mobile-responsive), and update_lesson_progress
always overwrote the whole progress entry, which would have silently
deleted a saved note on the next routine autosave.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>