Directory layout

Each course is a directory under courses/ whose name must equal the course id.

CoursePack layout

Three levels of manifest

FilePurposeOrdering
course.yamlCourse info, license, section or chapter listList position
chapter.yamlChapter title and lesson listList position
lesson.yamlLesson title and optional code/video metadata—

Chapter and lesson directory names are only storage locations and may be renamed; public identity always comes from the manifest id. The course directory is the exception: it must equal the course id.

Path rules

  • Chapter and lesson directories listed in manifests must be single names (letters, digits, . _ -) — never a/b or ...
  • Paths such as cover and license files must be relative paths inside the course directory.
  • Symlinks are not allowed anywhere in a course.
  • The course-home intro lives at intro.<lang>.md in the course root; it is not declared in course.yaml.

Where resources live

Shared images go in assets/; images used by one lesson may live in that lesson's own assets/. Content always uses relative paths, so previews on GitHub work too.

Next: Manifest fields.