- Dashboard header shortened to match every other page (was notably
taller than the rest).
- Files moved before Settings in the bottom nav.
- Removed the header's course-name badge - purely redundant with the
page's own heading directly below it.
- Fixed a dead link: "Progress" pointed to #stats, but no element
with that id existed anywhere on the page.
- Added a visible :focus-visible ring across all pages - tabbing
through the site previously gave no indication of what was focused.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Filename-similarity matching within a folder can't distinguish a real
re-download duplicate from a course that splits one topic across
several numbered files ("...Part 1"/"...Part 2", "-1"/"-2"/"-3") -
both look like near-100% matches by name alone, and the latter is a
common, completely normal pattern. This produced hundreds of false
positives in practice. Removes Duplicate Lesson Files entirely
(detection function, its two API routes, and the File Management UI
section); whole-course-folder matching (Duplicate Courses) is
unaffected and stays the only duplicate scan in the app.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Auto-play next lesson on end, with a cancelable countdown and a
Settings toggle (default on).
- Grid-view course cards show a small progress ring (checkmark at
100%) instead of a separate bar.
- Duplicate Lesson Files: scans within each course/folder for media
files that look like the same lesson downloaded twice, with per-file
delete and a shared ignore list with Duplicate Courses.
- Auto-generated cover art now samples a few early candidate frames
and keeps the largest JPEG, favoring an intro title card over a
blank fade-in or a plain presenter frame.
- Settings -> "Regenerate Thumbnails" re-runs that logic for every
course with an auto-generated thumbnail (never touches manual
covers), so already-cached thumbnails can pick up the improvement.
- Add .gitignore for __pycache__/.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Favorites: star toggle on course rows, the course page, and a new
dashboard card; rebased on rename/move, backed up/restored, and
caught by stale-reference cleanup (also fixed a pre-existing gap
where favorites.json wasn't in the backup file list).
- Storage Usage: click a folder row to drill into its contents one
level at a time, with a Back button.
- Lesson player: added ,/. (speed step), [/] (prev/next lesson), and
F (fullscreen) keyboard shortcuts.
- Settings: a CHANGELOG.md-backed "What's New" list, since VERSION
alone only ever shows the current build.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Manage Library search: find any course/folder by name anywhere in
the tree instead of expanding levels one by one; results carry the
same Move/Rename/Hide actions.
- Bulk select: every row gets a checkbox, so items found via search or
expanded across different tree levels can be hidden, shown, or moved
to the same destination together in one batch.
- Undo last action: a "Last action: ... [Undo]" bar appears after any
move/rename (Sort Unsorted apply, Bulk Rename apply, a Manage
Library move/rename, a bulk move) and reverses the whole batch.
Deliberately never covers Hide/Show (already a one-click toggle) or
Delete (permanent by design) - only ever move/rename, which are
trivially reversible. Re-checks each item before reversing it, so a
partial failure reports exactly what did and didn't reverse.
- Storage Usage: disk usage per top-level library folder, largest
first, with a simple proportional bar; a manual scan since it reads
every file's size.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The destination picker (Sort Unsorted, Manage Library Move) was
listing individual course/item folders as pickable destinations
whenever they held content course detection doesn't recognize as
video/audio - ebooks, audiobooks in unsupported formats, etc. Add a
leaf-item check scoped to the picker's own category index so these no
longer show up, without touching the shared course-detection heuristic
used elsewhere (Library browsing, search, stats).
Also replace "Create new folder"'s single free-text path field with a
parent-folder picker plus a plain new-folder-name field and a live
"Will create: X/Y" preview, so the resulting path is confirmed before
applying instead of hand-typed blind.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Plain-text substring matching couldn't handle a batch of
slightly-different patterns (e.g. several release-group suffixes) in
one pass. Add a match-type selector: wildcard (shell-style */?) for
the common case, and full regex (with backreferences in the
replacement) for anything more precise. Invalid regex is caught and
reported inline instead of failing the request.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Delete permanently removes a course from disk (confirmed with the full
path first) and cleans up any Hidden/Next Up/Recently Viewed
references to it. Ignore marks a specific pair as confirmed-not-
duplicates so it stops resurfacing in scans, without suppressing
either course's other matches; ignored pairs are listed and reversible
under "Ignored matches," and now travel with backup/restore.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Replace the dashboard-only footer link with a "Files" item in the
persistent bottom tab bar (Home/Notes/Help/Settings) on every page, so
it's reachable the same way everywhere instead of only from the
dashboard.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fix Sort Unsorted picking a wrong destination on words that are common
clutter across many categories (a creator's name, generic marketing
filler) by ranking matches on a folder's own deliberate name over
incidental sibling-course words, and downweighting borrowed words that
recur across many categories. Add a folder-picker/create-new/rename UI
to override any proposal.
Turn /unsorted into a general File Management page: move Refresh
Library, Bulk Rename, and Manage Library (hide/rename) here from
Settings, add a Move action to Manage Library using the same picker,
and add Duplicate Courses and Clean Up Stale References tools. Add a
footer link to the page from the dashboard.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Scans an Unsorted folder at the library root and proposes destinations
for new courses by matching keywords against the existing category
tree, suggesting new subfolders when nothing matches closely, and
flagging items for manual review when nothing matches at all. Review
and apply happen on a dedicated /unsorted page linked from Settings;
nothing moves until the user confirms.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>