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>
search_library_courses was walking via list_library_directory, which
computes a full recursive file count (rglob) and thumbnail lookup for
every course at every level - turning a search into an O(every file in
every course) scan regardless of how few results actually match. Give
search its own lightweight directory-only walk and defer the expensive
per-course lookups until after a name match is confirmed, so cost now
scales with matches found rather than total library size.
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>