- Lesson page's global keyboard shortcuts (space/arrows for play-pause/
seek/volume) fired regardless of focus, so typing a space in the notes
textarea toggled the video instead of typing. Now skipped entirely
whenever a text field/select has focus.
- Outline topics no longer spawn their own top-level collection each time.
A topic is now a document inside one fixed, user-configured collection
(Settings -> Outline Integration -> Default collection), and a lesson's
note becomes a child document nested under its topic - matching how
notes actually get organized in a real Outline instance instead of
cluttering the collections list with one per topic.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Pick a topic on a lesson's note and it pushes to that topic's collection
in a self-hosted Outline instance when you leave the page; notes without a
topic stay local-only. Settings gets a new Outline Integration card
(URL/token, Save, Test Connection).
Credential handling: the API token lives in its own outline_config.json
in DATA_DIR, deliberately kept out of the general settings flow (GET
/api/settings is fetched on every page load by theme.js - no place for a
secret to ride along). GET /api/outline/config only ever returns whether
it's configured, never the token itself.
The topic chooser reflects Outline's live collection list rather than a
locally cached copy, and resolves a newly-typed topic name to a real
collection immediately (find-by-name-or-create) rather than waiting until
the note is pushed. That's not just an optimization: the push itself fires
via navigator.sendBeacon() on pagehide, which can't read a response, so a
page that fires pagehide more than once for the same load (a back/forward-
cache restore, for instance) would otherwise re-send the same "create a
new topic" intent every time and spawn duplicate collections. Verified
live against a local mock Outline server that firing pagehide repeatedly
for the same lesson creates the collection/document once and updates
thereafter.
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>