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>