Skip to main content
Canonical format, version 1. Validate against the published JSON Schemas rather than reimplementing the parser.
A course is a single project folder. One project.json manifest at the root names every collection, asset, and lesson by a project-relative path, and defines the outline.

Directory tree

Paths in project.json are relative to the project root. Paths inside a collection file (its recordFiles) are relative to that collection file, so content/collections/vocabulary.json references records with "../records/cat.json".

project.json

The parsed in-memory CourseProject (see Reader and writer) carries more optional fields than the fixture writes, such as level, license, contributors, funding, sponsors, and coverAssetId. The fixture keeps the manifest minimal; a real course may populate more. Read defensively and treat extra fields as optional.

Loading order

  1. Read and parse project.json. Reject an unknown format; refuse a formatVersion higher than you support, and upgrade one lower than yours (see File formats).
  2. Load each collection file, then its recordFiles.
  3. Load each asset file.
  4. Load each lesson file, then each part file it references.
  5. Build the in-memory course and a binding resolver (see Resolving and rendering).