Auto-generated course thumbnails: find_course_thumbnail() falls back to
grabbing a frame from a course's first video via ffmpeg when there's no
manual cover image, cached to .offlineu_thumbnail.jpg so it only ever
runs once. Folded into the "Precompute" prewarm button, now "Precompute
Lengths & Cover Art".
Library-wide "Remaining" stat: sums every course's already-cached
duration (no ffprobe, just a JSON read) into the dashboard's Library
Stats card, alongside the existing "Watched" figure.
Backup restore: new /api/backup/restore endpoint and a "Choose Backup
File..." control in Settings, with zip-slip and missing-course guards.
Also fixed a gap in the export itself - next_up.json and
outline_config.json weren't being backed up before, so restore wouldn't
have been a true round trip.
Move Surprise Me from a full-width button above the course list to a
dice-icon button in the dashboard header, swapping with the course-name
badge depending on whether a course is loaded.
Update README to cover all of the above.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Replace the original upstream template README (public-project framing,
roadmap items already built, links to a different GitHub repo) with
documentation matching the actual private deployment: real
docker-compose.yml, the Gitea->Dockhand rebuild-on-push behavior, env
vars/CLI flags, data file locations, and the full current feature set
(theming, notes hub, video duration/ffprobe caching, backup export,
Outline integration) that had never been documented.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>