All content is data — adding or editing it never requires touching app code. Profiles only affect who a person's own progress is tracked under, not the content itself.
Add a lesson (Training / Manual / SOP)
Open the matching file in /data (training.json, manual.json, or sop.json) and add a new entry with an id, title, summary, and a content array of blocks. It appears in the Library automatically. Add "mandatory": true to show a red "Mandatory" badge on the card and lesson page.
Add a quiz
Open data/quizzes.json and add a new object with a title, its questions, and optionally relatedLessonIds to link it from a lesson page.
Add a video
Open data/videos.json and add an entry with a title and a url — just paste a normal link (YouTube, Vimeo, or a direct .mp4/.webm file). No need to extract an ID by hand. Videos don't have a category filter, just search.
Add a playlist
Two ways: paste a YouTube playlist link as the url to embed the playlist as-is with YouTube's own controls, or add an items array (each with its own title and url) to build a custom in-app playlist with its own list and prev/next buttons.
Add a channel link
To link to a whole channel rather than one video, add "isChannel": true alongside title and url — it opens the channel in a new tab instead of trying to embed it.
Add a whole new content type
Create a new JSON file in /data, then add a line for it in data/library-manifest.json with a type, label, and optional single-letter icon. No JS changes needed.
Guidelines
- Keep content data-only — no lesson/quiz copy in JS or HTML.
- No recipe content, ever — that belongs in a separate project.
- Keep touch targets large — this app runs on a shared touchscreen device.