Skip to content

Changelog

  • docs-portal: redesign the home in the marquee style (209d686)
  • docs-portal: show emails, architecture and changelog (48e9c26)
  • release: version and publish every release to main (5d33ed0)
  • docs-portal: publish the design system and api docs (8a3d0b4)
  • docs-portal: load story media on the published storybook (e03eab8)
  • readme: open the repository with the marquee readme (63f8e24)
  • deps: add git-cliff and dependency-cruiser (e8bcc60)
  • enrollment-welcome: welcome the learner on enrolling from the course page (0ce0b48)
  • available-courses: open the course page from a poster’s Enroll (c85cd6f)
  • page-not-found: give the missing page the cinema theme (6c37f56)
  • my-learning: keep the catalog in reach from My learning (4212e6c)
  • course-overview: serve the progress board at /progress (698f26a)
  • available-courses: show every course as a poster in one lobby (b4dc1de)
  • course-content: say who each course is for and its highlights (fa001e6)
  • course-detail-page: link the course page from the progress board (0147b77)
  • course-detail-page: show a course page before the learner joins (1adc17e)
  • profile-page: keep the learner card in view beside the settings (b892635)
  • course-overview: open a one-video lesson on its overview (5c2b4e5)
  • atlas-of-american-sounds: add the atlas as a reference course (e9081bb)
  • my-learning: add the course enrollment views (a9d724f)
  • course-enrollment: enroll learners and keep a place per course (5b8cb71)
  • content: track the advanced course’s notes, posters and pdfs (2c1249a)
  • content: publish the advanced course with its lectures on youtube (68767b5)
  • storybook: set stories and docs pages on the cinema backdrop (6ed5ea9)
  • storybook: theme the manager in immersion cinema dark (ff32fe4)
  • resume-tile: stop the hover flicker on stretched tile links (c91a422)
  • cinema-confetti: share the confetti burst across celebrations (09ce247)
  • cinema-stories: drop the inert backgrounds parameter (142c1be)
  • api-reference: call the docs script with pnpm run (63a7528)
  • e2e: cover the enrollment welcome on the course page (d63e75f)
  • e2e: cover enrolling through the course page from a poster (75c4ec9)
  • e2e: cover the missing path line and the lobby link (904ef75)
  • e2e: cover my learning’s catalog access and /progress (5157ca0)
  • e2e: cover the poster lobby and the next-up bar (5fb259d)
  • e2e: cover the board to course page round trip (b974c73)
  • e2e: expect the course page on a synced second device (06b1c25)
  • e2e: cover the course page and enroll board specs (77c28d2)
  • e2e: cover the profile layout and its folded account forms (aba9b9c)
  • e2e: cover a one-video lesson tile opening its overview (72242e1)
  • e2e: cover the reference course on home, courses and a lesson (568a759)
  • e2e: cover onboarding step 3, available courses and my learning (c142baa)
  • e2e: retire the self-hosted content quarantine (4084697)
  • typedoc-theme: add the cinema theme for the api reference (5dbcfee)
  • api-reference: generate the reference with the cinema theme (fa61967)
  • e2e: stop forcing draft courses on in the e2e job (daab885)
  • account-forms: place the security check last in each form (f96572b)
  • turnstile: hide the challenge outside the dev server (01d86dc)
  • transactional-email: keep the cinema frame in outlook ios dark (c85c2fe)
  • deployment: explain why turnstile stays in managed mode (eee98c4)
  • account-forms: put email and password before google (c12c8e3)
  • install: offer installing on android, ipad and macos (25532ef)
  • site-header: drop the tagline from the section eyebrow (77088e0)
  • install: stop the install prompt crashing server renders (fa53ba1)
  • transactional-email: keep account emails legible in gmail dark (7ec0f73)
  • deployment: document the manual production setup (b89dbeb)
  • site-header: offer create account in the phone account menu (add2ed4)
  • site-header: stop the phone header clipping the wordmark (88871cb)
  • sitemap: list the privacy policy and the terms (68939f8)
  • site-header: send the wordmark to my learning when signed in (4e50354)
  • profile-page: lead the profile with the card and its progress (0c1876b)
  • account-wait: show every account wait on screen (292c68e)
  • learner-account: manage the password and the address (3b8254e)
  • learner-onboarding: seed the card with the account name (27fb32c)
  • i18n: add account, email and error copy in three locales (3aeb798)
  • e2e: stop the suite hanging at teardown (3de5230)
  • routing: answer an unknown path with a real 404 (e47d10f)
  • lesson-view: stop a destroyed player leaking a rejection (21f1def)
  • storybook: render the 24 stories the preview was breaking (71bf345)
  • e2e: assert a finished lesson the way the route shows it (4af700d)
  • e2e: quarantine the course tests reached without a slug (c629544)
  • e2e: skip only the viewport routes that need content (9264837)
  • e2e: quarantine what CI cannot run, and only that (bf72475)
  • storybook: guard the preview seams and story fixtures (dfd01a7)
  • transactional-email: draw the account emails in cinema dark (2e88b89)
  • production-deployment: report errors and verify every push (874c4b5)
  • account-deletion: let a learner delete their account (41cd4d1)
  • learner-state: read and write learner progress on the server (6bb9946)
  • learner-account: put every personal route behind a session (c18751c)
  • learner-database: keep learner data in turso (d41666c)
  • deps: add drizzle, better auth, email and sentry packages (4cb6a67)
  • e2e: raise the shard count to eight (8f18953)
  • vitest: stop a medialess jsdom failing the run (e344287)
  • vitest: report the stack of an unhandled rejection (b3b50e4)
  • branches: merge main into develop (0826272)
  • local-stack: run libsql and mailpit next to the dev server (4d424aa)
  • legal-pages: publish the privacy policy and the terms (763d6d6)
  • module-overview: show the lesson prize on the route (6a52ed2)
  • course-overview: show module prizes on the tile (5cfcab8)
  • achievements: add prizes, reminder and way back (5e6c0f2)
  • my-learning: add learner onboarding, my learning and profile pages (f90e00f)
  • lesson-view: show one centre control over youtube (22758ea)
  • lesson-view: reveal the controls on a tap on touch (dbc98f7)
  • loading: show skeletons while pages and the player load (0fb2bdb)
  • lesson-view: close the lesson with next up, undo and confetti (df30a77)
  • lesson-view: show the course outline as a compact row (4feb811)
  • lesson-view: hold to play the lesson at double speed (ec4acb6)
  • install-guide: let the learner swipe through the guide (5df8933)
  • lesson-view: turn the hint to the finger’s direction (46d87a6)
  • lesson-player: let the learner choose the seek step (0740adc)
  • lesson-player: show and chain double-tap seeks (8569f0a)
  • install-guide: teach iphone learners to install the app (b26693f)
  • catalog: reach the video in one click from any card (35b57da)
  • lesson-notes: show notes in the learner’s own language (475880b)
  • watch-progress: show how much of each video is watched (1cb7ccd)
  • site-metadata: describe the site to social platforms and crawlers (7bbf7c3)
  • brand: rename the wordmark to ENGLISH·COURSE (0ae775b)
  • draft-courses: withhold draft courses from the served catalog (f8a0931)
  • course-catalog: make the basic course the entry level (71ba9ac)
  • course-content: ship the basic course (c55cd6c)
  • lesson-page: play lessons hosted on youtube (6295081)
  • cinema-home: show every course as a ladder of levels (70726d2)
  • cinema-lesson-view: split notes on explicit language sections (391ee0e)
  • cinema-course-overview: show modules as galleries, not videos (3f7b8ca)
  • course-platform-domain: summarize each module’s lessons (c33341b)
  • course-content-storage: resolve content URLs at read time via BlobStore (09d0a4a)
  • ui: rebuild the resume prompt on a real shadcn Dialog primitive (52a8b48)
  • lesson-view: show the video title overlay as cover art only (86a5db3)
  • use-case-dependencies: wire the playback position port (ef9125a)
  • lesson-view: rebuild lesson as cinema player (b6767b9)
  • module-overview: render episode list with hero (80825f3)
  • course-overview: render modules as poster grid (9c09ab4)
  • home: rebuild home as streaming cover (482bcd9)
  • layout: mount cinema header and backdrop (152048a)
  • i18n: add cinema microcopy (pt) (ffce4e6)
  • i18n: add cinema microcopy (es) (8338660)
  • i18n: add cinema microcopy (en) (e6bf7b6)
  • lesson-view: add notes and transcript tabs (68d4db8)
  • lesson-view: add bilingual notes splitter (281f419)
  • site-header: add cinema top bar with section chrome (27f8884)
  • featured-course: add featured course rail (d7387ae)
  • cinema-hero: add streaming home hero (94a5daa)
  • cinema-background: add glow and letterbox backdrop (23be14a)
  • poster-card: add reusable cinema poster card (8a814f1)
  • play-button: add circular play affordance (68b5e49)
  • gold-badge: add gold and neutral pill badge (875744b)
  • eyebrow: add gold eyebrow label (d32f2eb)
  • brand: add LEARN·ENGLISH wordmark (f208ed5)
  • theme: add immersion cinema token palette (light + dark) (a9f152a)
  • lesson-page: load notes alongside the lesson view (37a7ca4)
  • lesson-view: integrate notes and source resource region (c6772c8)
  • up-next-card: add min-h and polite completion region (60b2af5)
  • mark-as-complete: add polite live region and focus styling (9cacd62)
  • module-list: keep active module open and link others to overview (f02292a)
  • lesson-list: add touch targets and focus styles to lesson rows (59a08dd)
  • lesson-notes: add inline Markdown notes renderer (38705ca)
  • module-page: add locale-aware module overview page (823314a)
  • module-overview: add module overview with lesson list (387d212)
  • course-page: add locale-aware course overview page (b06fb14)
  • course-overview: add course overview with practice track navigation (fb07b88)
  • home: render locale-aware course catalog on home page (c4e0a91)
  • course-catalog: add CourseCard with poster fallback and track (775f24d)
  • i18n: add catalog, overview and notes messages (c02e792)
  • layout: add skip link and sticky header utilities (aecf2f5)
  • skip-link: add accessible skip-to-content link (bbb226c)
  • practice-track: add non-interactive practice track summary (027f5db)
  • use-case-deps: expose catalog and notes use cases in deps (a8d82d1)
  • scripts: emit lesson-to-notes key mapping in seed generator (3daa234)
  • lesson-notes: add LocalFilesystemLessonNotesRepository (cd20c04)
  • lesson-notes: add findLessonNotes use case (1994db7)
  • module-overview: add findModuleForView use case (5ff8fe1)
  • course-overview: add findCourseForView use case (ee34d57)
  • course-catalog: add findCourseCatalog use case (02188c9)
  • lesson-notes-repository: add LessonNotesRepository domain port (590818d)
  • blob-store: implement safe Markdown readText in LocalFilesystemBlobStore (e0980d5)
  • blob-store: add readText to BlobStore interface (b8a6dc5)
  • scripts: add normalize-content-disk script (e932c88)
  • scripts: validate exists + emit sourceNames via manifest (9f716c6)
  • scripts: extract shared slug resolver + toPosix helper (b9287a8)
  • use-case-deps: add USE_COURSE_CONTENT_SEED env switch (2075bcc)
  • seed: add generated seed for Advanced Intermediate content (c901e35)
  • local-filesystem: add filesystem-backed ResourceRepository (119b68b)
  • local-filesystem: add filesystem-backed LessonRepository (d6dc7b0)
  • scripts: add seed generator script (71aef88)
  • scripts: add lesson folder discriminator (2dfba55)
  • scripts: add ffprobe helper for duration extraction (88b87ae)
  • blob-store: add LocalFilesystemBlobStore driver (3a88305)
  • blob-store: introduce BlobStore adapter primitive (7522ebb)
  • scripts: add manual slug override map (a58d2b2)
  • scripts: add folder-name slugify utility (f54bf3a)
  • scripts: add deterministic uuidv5 helper (fdf7a7e)
  • i18n: rename ‘Go home’ copy and add locale not-found + not-found keys (176ed2a)
  • i18n: rename ‘Go home’ copy and add locale not-found + not-found keys (431bfbf)
  • i18n: rename ‘Go home’ copy and add locale not-found + not-found keys (ed07c9c)
  • lesson-page: handle course-not-found inline + home link (0b75ec9)
  • lesson-page: unified inline error rendering + per-page title (f60e7cb)
  • layout: generate per-locale document metadata (55b031d)
  • routes: add localized locale-segment not-found page (49c4b01)
  • routes: add locale catch-all that triggers notFound() (187f89e)
  • i18n: add lesson page keys to pt messages (479a9e6)
  • i18n: add lesson page keys to es messages (2f8ae9d)
  • i18n: add lesson page keys to en messages (dc718f9)
  • app: add lesson page route with server action (d2369e3)
  • lesson-view: add LessonPageError with kind variants (9259e9a)
  • lesson-view: add LessonView composition component (dee586f)
  • lesson-view: add MarkAsCompleteButton client component (efc20f0)
  • lesson-view: add UpNextCard component (92f6c71)
  • lesson-view: add ResourceList component (c1cf0cc)
  • lesson-view: add ResourceItem component (d98ecfe)
  • lesson-view: add NativeVideoPlayer component (5822de6)
  • lesson-view: add OutlineDrawer responsive shell (d8fa15e)
  • lesson-view: add Outline component (b8cb6aa)
  • lesson-view: add ModuleList component (5bd8b27)
  • lesson-view: add LessonList component (b4ff1ac)
  • lesson-view: add LessonBreadcrumb component (1345cd4)
  • lesson-view: export lesson-view component barrel (a5f72a2)
  • adapters: seed two modules and three lessons across them (f0f7dc7)
  • adapters: add useCaseDependencies wiring seam (02940d8)
  • adapters: add in-memory ProgressTracker set (74c0bbe)
  • adapters: add in-memory ResourceRepository with seed (7762eb4)
  • adapters: add in-memory ModuleRepository with seed (9ce8cba)
  • domain: add markLessonComplete use case (2b3b017)
  • domain: add findLessonForView composition use case (42488b8)
  • domain: extend findNextLesson across module boundaries (8b299b5)
  • domain: add ProgressTracker port interface (a7e8eac)
  • domain: add ResourceRepository port interface (333c212)
  • domain: add ModuleRepository port interface (57c9b87)
  • domain: add VideoLesson variant and moduleId on reading (9760f9a)
  • domain: add moduleCount field to Course entity (dba1551)
  • domain: add url-or-path entity helper (1626e2f)
  • domain: add Resource entity and kind enum (0dc46d1)
  • domain: add Module entity zod schema (e52bfa2)
  • domain: add ModuleId and ResourceId branded uuids (4cb22e2)
  • i18n-pt: add course navigator strings (758fcd0)
  • i18n-es: add course navigator strings (241e2ad)
  • i18n-en: add course navigator strings (07b1c6e)
  • course-navigator: add storybook stories (8a1e24e)
  • course-navigator: add react component (eab0d38)
  • in-memory-seed: add production seed data (d2e32da)
  • in-memory-lesson-repository: implement in-memory adapter (a038091)
  • in-memory-course-repository: implement in-memory adapter (3cefab5)
  • find-next-lesson: add use case implementation (2cc817f)
  • find-next-lesson: add domain error union (dd42860)
  • id-generator: add id generator port (dc8a62a)
  • clock: add clock port (e36a70a)
  • lesson-repository: add lesson repository port (3fc9fbc)
  • course-repository: add course repository port (43076e4)
  • result: add neverthrow result re-export module (3390344)
  • lesson: add lesson discriminated union (41a0170)
  • course: add course Zod schema (757bb50)
  • ids: add branded uuid schemas (abfeacd)
  • slug: add slug Zod schema (2943491)
  • locale-messages: add ThemeToggle translations for English, Spanish, and Portuguese (bce3d56)
  • locale-layout: integrate ThemeProvider for theme management (0c53ca3)
  • locale-switcher: add LocaleSwitcher component with stories and tests (90fc062)
  • theme-toggle: add ThemeToggle component with stories and tests (678a66e)
  • button: add Button component with variants and sizes (355aaa2)
  • storybook: add toolbar configuration for internationalization (6945f16)
  • storybook: add internationalization support for Storybook (daa6070)
  • faker: add getFakerIntl function for locale-specific data (5c94a30)
  • button: add localized messages for Button component (3ed9a09)
  • button: add Storybook stories for Button component (39bb5f2)
  • locale-layout: implement locale-aware layout with static rendering (743b8ba)
  • home-page: implement locale-aware home page with switcher (5f253c8)
  • i18n: add English, Spanish, and Portuguese locale messages (a6f5a6a)
  • locale-switcher: add locale switcher component (535a811)
  • i18n: add centralized routing configuration (ac146ca)
  • i18n: add request config for locale message loading (0a5aebf)
  • i18n: add locale-aware navigation wrappers (a8b3096)
  • layout: wrap children with Providers component (6a1fa68)
  • providers: add client-side providers for the app (eba96a1)
  • safe-action: add base safe-action client for server actions (0e3b6c2)
  • globals-css: enhance theme variables and dark mode styles (81ef441)
  • button: add button component with variants and styles (0b852b4)
  • utils: add utility function for class name merging (a8b9f4b)
  • bootstrap: initialize project using scaffold from next.sj (3021f10)
  • lesson-view: fit fullscreen video without cropping (36ae768)
  • install-guide: teach the tap that opens the share sheet out (fdae204)
  • lesson-player: let a tap on the video toggle playback (0f75b5b)
  • lesson-player: point the scroll hint’s arrow where the page goes (fdcc0ab)
  • lesson-player: free the enlarged video from safari’s toolbar (c547286)
  • resume-overlay: fit the resume choice inside the player on phones (69c1a4f)
  • lesson-player: repair the video player on iphone safari (2deec25)
  • not-found: stop logging an error for every dotted unknown path (559b06b)
  • resource-item: render resource links without the locale prefix (6ba2050)
  • course-content: restore the apostrophes in the contractions module (b0ce232)
  • course-content: restore the vowel lessons’ real names (d3bc061)
  • seed-gen: emit a repo-relative source path in the description (c4869cb)
  • storybook: stop mocking next-intl in the lesson-view stories (c47058e)
  • seed-gen: format the generated seed with prettier (7999c87)
  • poster-card: preload the above-the-fold poster (5be2098)
  • resource-list: accept translated title override and fix i18n heading (80cab56)
  • lesson-breadcrumb: link course and module segments to their overviews (dcc4e1b)
  • scripts-slug: handle NFD-decomposed accents from macOS (e1b217f)
  • lesson-page: route lesson not-found to locale home (d81ea96)
  • eslint: catch sub-path imports via patterns in domain rule (8cf2ed1)
  • storybook: drop addon-vitest to fix matchers init order (54d8ff3)
  • i18n: correct import path for locale messages (8de8a59)
  • lesson-view: drop the lesson notes (source) card (5b40171)
  • course-content: declare the catalog in manifests (3e04872)
  • ids: use the zod v4 top-level uuid schema (c7eb438)
  • practice-track-summary: align the folder with its export (852a841)
  • storybook: clear the vitest stub lint warnings (390b3bd)
  • blob-store: drop an unused local binding (5687571)
  • lesson-notes: remove inline notes tests (8f87fca)
  • lesson-notes: remove inline notes component (5f0cd51)
  • course-overview: remove practice track (05a5ac5)
  • course-catalog: remove course card story (e56cea6)
  • course-catalog: remove course card tests (7c81d8e)
  • course-catalog: remove unused course card (e124d39)
  • module-overview: widen module page layout (7d9aa33)
  • course-overview: widen course page layout (b4bce7a)
  • theme-toggle: restyle as cinema chip (075ba81)
  • locale-switcher: restyle as cinema chip (feff16a)
  • i18n: add lesson path builders in lesson-routes module (af7a805)
  • scripts: slugify file basenames + expose raw names (2c285d9)
  • ui-button: update imports for folder structure (e137dad)
  • utils: move to folder per AGENTS convention (2f725e6)
  • safe-action: move to folder per AGENTS convention (c44060d)
  • storybook: remove Storybook documentation file (75b320b)
  • locale-switcher: correct import path for LocaleSwitcher component (22eaf22)
  • vercel-react-best-practices: improve code formatting and consistency (2d28b65)
  • agents: rename providers to global-providers (f06f8a7)
  • layout: rename Providers to GlobalProviders (eac6889)
  • providers: rename providers to global-providers (0bb185a)
  • basic-course: enrich the lesson notes with bilingual sections (daa86b2)
  • content-storage: document both manifests and the move flow (bbf0fd8)
  • claude-md: load the agents rules into every session (2719666)
  • agents: document the conventions the codebase now enforces (12a46ef)
  • utils: document what cn’s tailwind-merge step buys (fefe5b0)
  • poster-card: add poster card stories (60b70c4)
  • play-button: add play button story (8c34c1a)
  • gold-badge: add gold badge story (28c4a03)
  • eyebrow: add eyebrow story (330bfde)
  • brand: add brand story (a532faf)
  • scripts: document scripts/ utilities (4e8314e)
  • blob-store: document BlobStore abstraction (e2f8464)
  • theme-toggle: explain next-themes React 19 warning in JSDoc (c9260d4)
  • storybook: rename resource to match seed (5034eea)
  • storybook: rename resource to match seed (6adde73)
  • specs: add lesson-view-polish capability spec (55de6e8)
  • specs: route error states to locale home (846d58d)
  • specs: document next-themes warning in architecture boundaries (614642e)
  • specs: archive delta spec for lesson-view-polish (055b881)
  • specs: archive delta spec for lesson-page (b050b16)
  • specs: archive delta spec for architecture-boundaries (8b715c6)
  • specs: add lesson-page capability spec (33d232a)
  • specs: add course-platform-domain capability spec (89a4009)
  • specs: add architecture-boundaries capability spec (80af4df)
  • glossary: add lesson page and progress terms (6a8fe54)
  • agents: drop ts-pattern from domain allowlist (edf5d88)
  • agents: update clean code guidelines and non-negotiables (b824d65)
  • commit-conventions: update header length requirement to 90 chars (0e9c3fd)
  • agents: enforce commit message format with commitlint (8484322)
  • commit-conventions: codify test-commit discipline rule (4818bfb)
  • agents: document hexagonal architecture rules (15cf3aa)
  • agents: update feature workflow for OpenSpec and TDD (2aed6d7)
  • readme: update README with setup instructions and API documentation details (0e18b8c)
  • agents: add TypeDoc documentation instructions and guidelines (dabfb27)
  • agents: update component addition guidelines and folder structure (d3ecb73)
  • button: add Storybook stories for Button component (191b2c6)
  • agents: add Storybook usage guidelines for component development (3d9d795)
  • storybook: add architecture and configuration notes for Storybook setup (41b26a5)
  • button: update JSDoc comments for Button component (577bff3)
  • agents: reorganize import statements for consistency (592fc59)
  • testing-conventions: add writing conventions for tests (4f4a54c)
  • agents: add guidelines for internationalization with next-intl (eb33d6c)
  • testing-conventions: add writing conventions for tests (0ac5c75)
  • frontend-design: add frontend design guidance and principles (ecccbf7)
  • improve-codebase-architecture: add HTML report format and process documentation (a74c0c0)
  • jsdoc-typescript-docs: add JSDoc TypeScript documentation (79e5ae1)
  • shadcn: add registry authoring and rules documentation (5b2e520)
  • skill-creator: add skill packaging and validation scripts (9566b64)
  • best-practices: add rules for optimizing rerenders and server actions (9806488)
  • agent-browser: add initial agent-browser skill documentation (925d2df)
  • skill: add initial skill documentation (39ec855)
  • commit-conventions: update renaming and moving guidelines (b3bbb87)
  • agents: update agents documentation with library usage guidelines (bb32530)
  • commit-conventions: add commit message guidelines (bb512c0)
  • agents: add instructions for AI coding assistants and testing stack (3ff5d3a)
  • commit-instructions: clarify test commit guidelines (4ae922a)
  • commit-instructions: clarify documentation commit type rules (258d587)
  • commit-instructions: clarify dependency-related commit type rules (7d4fc1a)
  • commit-instructions: add commit message rules and examples (4354082)
  • course-overview: show lesson rings and one continue rule (bca414c)
  • onboarding: gate course routes on learner card (7333572)
  • course-overview: show modules as a poster carousel (ac976b8)
  • module-overview: show the module as a route through its videos (fc2db4f)
  • my-learning: cover onboarding, my learning and profile (8b20ec5)
  • lesson-view: close the lesson in the rail at every width (ee5d779)
  • draft-courses: pin the draft field and the visibility table (c12e3bc)
  • lesson-notes: render notes markdown with real typography (208389e)
  • notes-shape: guard the lesson notes bilingual shape (2915918)
  • video-player: disambiguate the design.md ref (7476fdf)
  • video-player: hold the first play on playing (607430e)
  • course-content: serve basic-course videos from youtube (c22a723)
  • lesson-playback-resume: drive the in-player overlay (ecaf693)
  • lesson-view: ask to resume inside the player on first play (f2f0bd9)
  • content-tooling: move, verify and materialize assets (94d5380)
  • content-signing: serve private stores via a redirect (6b27798)
  • courses-manifest: declare courses in one manifest (df4959e)
  • content-locations: route each content key to its store (dbb57e6)
  • play-affordance: drop the decorative play circle from both panels (36fa838)
  • cinema-theme-tokens: make the theme toggle binary and dark-first (de2c12e)
  • responsive-viewport-fit: fit every route to phone viewports (c4bb526)
  • cinema-module-overview: drop the module hero tile (798b742)
  • lesson-view: show the learner where they are in the outline (374619f)
  • use-scroll-current-into-view: scroll a region to its current row (6f47af4)
  • centered-scroll-top: centre a row inside a scrollable region (6a7edef)
  • lesson-page: pin the resource link locale-prefix regression (2de85f7)
  • lesson-view: mark the lessons already taken (fd277f4)
  • lesson-progress: persist completion in the browser (df1ca93)
  • seed-gen: add title overrides and unify apostrophes (b9b0493)
  • seed-gen: take lesson titles from the notes heading (35c5b91)
  • module-overview: show real artwork in episode rows (55fe68f)
  • components: cover the header, skip link and cinema surfaces (7703f3b)
  • button: decouple the asChild case from next/link (531ae85)
  • playback-position: read and validate via the domain (a10571c)
  • lesson-actions: run the actions through next-safe-action (20153ad)
  • module-list: expand outline modules in place (df392ae)
  • lesson-page: retarget the spec at the content seed (240d5fe)
  • theme-toggle: fix the hydration mismatch (d00ecf3)
  • lesson-playback-resume: cover the resume cycle e2e (d9fba00)
  • lesson-view: persist and resume the playback position (073e461)
  • lesson-video-resume: add the resume overlay (df59b83)
  • lesson-actions: validate action input with zod (c490200)
  • playback-position: add localStorage and in-memory adapters (d43ff2a)
  • playback-position: add record and get use cases (b86b09b)
  • playback-position: add repository port and value object (db69086)
  • e2e: add cinema chrome and tabs specs (e137c54)
  • e2e: update catalog specs for cinema ui (0e806be)
  • lesson-view: cover hero and tabs (5e210ce)
  • module-overview: cover episode rows (017af4d)
  • course-overview: cover poster grid (6bd6d60)
  • theme: guard token contrast at wcag aa (46a692b)
  • lesson-view: cover notes tabs (26df238)
  • lesson-view: cover bilingual notes splitter (51ce311)
  • site-header: cover section derivation (4930b36)
  • featured-course: cover featured rail (c0b0ae3)
  • cinema-hero: cover hero and empty catalog (7cacfd9)
  • cinema-background: cover decorative backdrop (c17c496)
  • poster-card: cover poster and glow fallback (8fd5a64)
  • play-button: cover decorative and interactive modes (d03ed79)
  • gold-badge: cover badge variants (dcad747)
  • eyebrow: cover eyebrow rendering (75e6554)
  • brand: cover wordmark link (3a83486)
  • course-catalog: cover course to lesson happy path (c666f57)
  • lesson-view: cover notes and source resource integration (92b3337)
  • lesson-breadcrumb: cover overview link destinations (1027964)
  • test-setup: extend domain stubs for read use cases (3bab866)
  • blob-store: cover readText safety and traversal rejection (40ec8e5)
  • scripts: cover normalize-content-disk (40df72d)
  • scripts: cover exists validation + manifest bridge (9fbfc83)
  • scripts: cover basename slugification + raw names (19eee74)
  • scripts: cover shared resolve-slug + toPosix (69cf94c)
  • scripts-slug: cover NFD accent decomposition (20338c5)
  • use-case-deps: cover env-var wiring (5b4bbbe)
  • local-filesystem: cover resource repository (e2fe5fb)
  • local-filesystem: cover lesson repository (7d7e87a)
  • scripts: add smoke runner against real content (46ee0c1)
  • scripts: cover seed generator integration (0343ac4)
  • scripts: cover lesson discrimination rules (446d7c0)
  • scripts: cover ffprobe tagged errors (cbc84ae)
  • blob-store: cover LocalFilesystemBlobStore (b83cef6)
  • scripts: cover slugify normalisation (a53dbe7)
  • scripts: cover uuidv5 determinism (659c648)
  • e2e: align Playwright with inline-error + per-page title (96a7a87)
  • lesson-page: cover course-not-found + home href (2d0bce0)
  • routes: cover locale not-found page (0a2faa5)
  • e2e: cover lesson page flows in playwright (b32775e)
  • course-navigator: cover story wiring for new deps (1a3bd63)
  • course-navigator: cover navigator with new deps (87db964)
  • stubs: add stubs for module and resource repos (0098afe)
  • adapters: cover cross-module listByCourse ordering (c7ab91e)
  • adapters: cover moduleCount preservation in seed (0654b87)
  • domain: cover cross-module next lesson traversal (9f16e01)
  • domain: cover lesson discriminated union variants (c5e6ad3)
  • domain: cover moduleCount validation in Course (a290dc4)
  • domain: cover ModuleId and ResourceId schemas (8e32cce)
  • course-navigator: cover component behavior (e3accb4)
  • in-memory-lesson-repository: cover repository behavior (9bbac0b)
  • in-memory-course-repository: cover repository behavior (41641a5)
  • domain-repos: add stub repositories for tests (c261ad1)
  • find-next-lesson: cover use case behavior (f1f9e8c)
  • lesson: cover lesson parsing (2950146)
  • course: cover course parsing (1a03dc1)
  • ids: cover branded uuid parsing (64c71b5)
  • slug: cover slug parsing (74dd117)
  • button: add unit tests for Button component (eee33ec)
  • next-mocks: refactor image mock tests for clarity (f88f5c6)
  • utils: enhance cn test cases with descriptive structure (55e0da7)
  • next/image: add tests for next/image component (f89a083)
  • utils: add tests for class name utility function (bb15aea)
  • content-storage: add cloud storage and testcontainers deps (f0002fe)
  • deps: add react-markdown and remark-gfm (df7d986)
  • deps: refresh pnpm-lock for tsx devDependency (71873f9)
  • deps: add tsx + normalize/generate pnpm scripts (850f08e)
  • dev-deps: add commitlint for commit message validation (d4cd6a8)
  • deps: add husky for Git hooks management (f3d3638)
  • domain: add neverthrow runtime dependency (5ed1252)
  • deps: add typedoc for documentation generation (f67150e)
  • deps: add next-themes dependency (7bc744f)
  • deps: add Storybook dependencies and scripts (0fef2a6)
  • dev-deps: add prettier-plugin-sort-imports and prettier-plugin-tailwindcss (f4f1404)
  • deps: add next-intl dependency (9c6ecc8)
  • deps: add new dependencies to package.json (7ed00da)
  • package: add playwright for end-to-end testing (4e4664d)
  • deps: add vitest and testing libraries (0dbe24e)
  • deps: add new dependencies for project (043639c)
  • content: drop basic course videos served from youtube (7cc7402)
  • agent-hooks: block src edits without an active openspec change (1c926cc)
  • config: track .env.example so new clones see required variables (5841b92)
  • eslint: watch the remaining persistence adapter roots (c2a6f79)
  • openspec: quote the tasks rules so the config parses (21fb28d)
  • vitest: exclude agent worktrees from the test run (5ecdc03)
  • lesson-view: restyle up-next as gold card (b0d7fc8)
  • lesson-view: restyle resource cards (be848dc)
  • lesson-view: restyle resource links to gold (cbc2897)
  • lesson-view: restyle outline drawer panel (6312de0)
  • lesson-view: restyle outline heading (ac1ee42)
  • lesson-view: use black player surface (6474569)
  • lesson-view: restyle outline module links (f584bc0)
  • lesson-view: restyle mark-complete to gold (aa03e6d)
  • lesson-view: mark current lesson in gold (deef278)
  • lesson-view: restyle breadcrumb to gold (0d1fc61)
  • openspec: archive add-course-catalog-and-inline-lesson-notes change (42f8163)
  • skills: install frontend-design and web-design-guidelines (d2f107e)
  • playwright: opt content seed into web server command (112cced)
  • tsconfig: enable vitest globals types (b01b183)
  • seed-content: regenerate with notes key mapping (7c4d234)
  • openspec: archive normalize-course-content-disk-layout change (f73f10a)
  • seed-content: regenerate with normalized keys and source names (9a8971f)
  • openspec: fix multiline YAML key in tasks rules (a14809a)
  • gitignore: ignore local course content directory (46ca270)
  • tsconfig: enable allowImportingTsExtensions (30aa2ac)
  • gitignore: ignore local Advanced Intermediate Course directory (137310b)
  • seed: drop redundant kind suffix from resource titles (26637f9)
  • openspec: archive polish-lesson-view-ux yaml metadata (733a81a)
  • gitignore: ignore debug-storybook runtime log (b666e63)
  • openspec: preserve archived add-lesson-view snapshot (9f19445)
  • public: add placeholder handout fixtures for seed (0c6c6ca)
  • public: add placeholder thumbnail fixture for seed (08d3505)
  • public: add placeholder video fixture for seed (d5667df)
  • openspec: preserve archived adopt-hex change snapshot (90dd406)
  • openspec: archive adopt-hexagonal-architecture change (520e38e)
  • storybook: add vitest alias stub for preview runtime (01169a8)
  • gitignore: ignore playwright-mcp runtime dir (7b40e60)
  • clean-code: add clean-code skill with source and path details (9313f13)
  • husky: add commit-msg hook for commit message validation (68d22a8)
  • commitlint: add commitlint configuration for commit message validation (bef066d)
  • husky: add pre-commit hook for staged-only format check (8f46020)
  • openspec: add change metadata for hexagonal architecture (d16dafd)
  • test-mocks: register i18n navigation mock (a4e653f)
  • test-mocks: add global mock for @/i18n/navigation (41f6d9d)
  • eslint: add domain boundary rule and folder-per-entity (a58f1df)
  • settings: add TDD reminder hook configuration (1840006)
  • tdd-reminder: add TDD reminder hook for source file edits (dce8a42)
  • openspec: update configuration for artifact rules and project context (f635302)
  • config: update ignore patterns for tooling directories (76488f6)
  • openspec: add initial configuration for spec-driven schema (cfcb0fd)
  • openspec: add new skills for change management and onboarding (139202f)
  • openspec: add new skills for change management and onboarding (b2113c9)
  • openspec: add new skills for change management and onboarding (1150452)
  • skills: add test-driven-development skill (8353acb)
  • typedoc: add typedoc configuration for documentation generation (9154605)
  • gitignore: update .gitignore to ignore generated docs (ea0c521)
  • eslint: update ESLint config to ignore generated docs (8cd8a14)
  • prettierignore: update ignore patterns for generated files (9ca937c)
  • i18n: merge locale messages for Storybook previews (72a3348)
  • storybook: add main configuration for Storybook (cb17f02)
  • storybook: add preview configuration for theming and intl support (d502980)
  • storybook: add preview-head.html for font loading (d670475)
  • skills: add storybook story writing skill (ed6320c)
  • pnpm-workspace: add esbuild to allowed builds (dcef379)
  • layout: reorganize imports and improve layout structure (b6e3788)
  • proxy: add newline for improved readability (8b1d686)
  • gitignore: add .agents/skills/ to ignore list (073e5dd)
  • prettierignore: add .agents/skills/ to ignore list (c875c1c)
  • prettier-config: update import order and add plugins (4d81e6d)
  • eslint-config: reorder imports and update ignore patterns (5c91af8)
  • skills-lock: update testing-conventions entry in skills-lock.json (35b3fb4)
  • tsconfig: update exclude patterns for TypeScript configuration (b6786e6)
  • vitest-config: reorder imports for consistency (dcf7cc6)
  • vercel-react-best-practices: remove outdated rerender optimization rules (efbb95e)
  • config: integrate next-intl plugin for locale support (5b3d353)
  • middleware: add proxy middleware for locale routing (ac703e1)
  • pnpm-workspace: add support for @parcel/watcher and @swc/core (e3eb324)
  • skills-lock: add testing-conventions skill entry (0afd8e5)
  • docs: improve formatting and consistency in documentation (af29abb)
  • schemas: update formatting and structure in schemas documentation (12fec75)
  • jsdoc-typescript-docs: update formatting and consistency in documentation (46240b7)
  • HTML-report: improve formatting and consistency of CSS styles (006923a)
  • skills-lock: add initial skills-lock configuration (f9fcac2)
  • package: add typecheck and verify scripts (246ba93)
  • vscode-settings: update commit message generation instructions (eb465e3)
  • test-setup: remove inline test setup code for cleaner imports (7ec6000)
  • test-setup: add cleanup after each test to prevent leaks (a4dbc11)
  • test-setup: add matchers for jest-dom integration (7ad3e62)
  • mocks: add global mocks aggregator file (6fb2d79)
  • test-setup: add mocks for next/image and next/font/google (a4a58a6)
  • gitignore: update .gitignore to include test result directories (e921f10)
  • playwright-config: add playwright configuration for E2E tests (7c61661)
  • vitest-config: update vitest configuration to exclude specific directories (e753556)
  • vitest-config: add vitest configuration file (596fbdd)
  • vitest-setup: add vitest setup for testing environment (a3a2d9c)
  • components-json: add components configuration file (87c615f)
  • vscode-settings: add commit message generation instructions (9adecf0)
  • prettier: add Prettier and ESLint configuration files with dependencies (5d7a84c)
  • docs(commit-conventions): :memo: update renaming and moving guidelines (4a8739f)