> ## Documentation Index
> Fetch the complete documentation index at: https://docs.asakiri.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Project layout

> The directory tree of a course project and the project.json manifest.

<Info>
  Canonical format, version 1. Validate against the published
  [JSON Schemas](https://github.com/AsakiriLingo/asakiri-studio/tree/main/schemas/asakiri-course/v1)
  rather than reimplementing the parser.
</Info>

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

```
japanese-starter/
├─ project.json                       manifest: metadata, file lists, outline
├─ content/
│  ├─ collections/
│  │  ├─ vocabulary.json              a collection (fields + record file list)
│  │  └─ hiragana.json
│  └─ records/
│     ├─ cat.json                     one record per file
│     ├─ dog.json
│     └─ hiragana/
│        ├─ a.json
│        └─ ha.json
├─ media/
│  └─ assets/
│     └─ cat-image/
│        ├─ asset.json                asset metadata
│        └─ original.svg              the binary file
└─ lessons/
   └─ meet-neko/
      ├─ lesson.json                  lesson: ordered parts, each pointing at a file
      └─ parts/
         ├─ intro/document.json       a Tiptap rich-text part
         ├─ in-media/composition.json a rich-media part
         └─ choose/exercise.json      an exercise part
```

<Info>
  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"`.
</Info>

## project.json

```json theme={null}
{
  "format": "asakiri-course",
  "formatVersion": 1,
  "project": {
    "id": "course_japanese_starter",
    "title": "Japanese Starter",
    "description": "A small fixture showing reusable content across lessons and every exercise type.",
    "defaultLocale": "en",
    "learningLocales": ["ja"]
  },
  "collections": ["content/collections/vocabulary.json", "content/collections/hiragana.json"],
  "assets": [
    "media/assets/cat-image/asset.json",
    "media/assets/cat-ja-audio/asset.json"
  ],
  "lessons": [
    "lessons/meet-neko/lesson.json",
    "lessons/practice-neko/lesson.json"
  ],
  "outline": [
    {
      "id": "section_getting_started",
      "title": "Getting started",
      "lessonIds": ["lesson_meet_neko", "lesson_practice_neko"]
    }
  ]
}
```

| Field | Meaning |
| - | - |
| `format`, `formatVersion` | Always `"asakiri-course"` and an integer version. Every file in the project carries them, not just the manifest. |
| `project` | Course metadata. `defaultLocale` and `learningLocales` drive locale handling. |
| `collections`, `assets`, `lessons` | Project-relative paths to each entity file. |
| `outline` | Ordered sections, each with a `title` and an ordered `lessonIds` list. The outline is the course structure; the `lessons` list is just where to load them from. |

<Note>
  The parsed in-memory `CourseProject` (see [Reader and writer](/build/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.
</Note>

## 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](/build/file-formats#versioning-and-migration)).
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](/build/resolving-and-rendering)).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.