✦ open platform

Create a course

A Discovery Quest course is content, not code — worlds, lessons, and narration composed from the engine’s building blocks. Anyone can write one (or have an AI draft it), and it ships as a pull request we review for accuracy and age-appropriateness. Free and open.

Everything is open. The engine, the validator, and every official course live in one public repo — read them, learn from them, fork them.

📖 Authoring guide ↗ ⟨/⟩ GitHub ↗

The one idea: courses are data

The platform splits in two. The engine (code, fixed) provides boards — the interactive activities a child plays — and views — the visuals a lesson talks over. Your course (data) composes those and supplies the words. You never write game code. Browse the full vocabulary on any course’s engine primitives page.

Draft it with AI

Tell us your idea, then copy the prompt into ChatGPT, Claude, or any capable model — it points the model at the authoring guide and helps it produce a valid course tailored to your topic.

Your AI prompt

Anatomy of a course

One YAML (or JSON) document:

course
├─ formatVersion · id · title · subject · companion · voice · engine   (header)
├─ worlds[]                       a themed area on the map
│   └─ stations[]                 one playable activity
│        board:  <board kind>     ← must exist in the capability catalog
│        bands:  [0, 1, …]        difficulty bands the board generates
│        lesson: <lesson id>      ← the "Learn it" shown before practice
├─ lessons{ <id>: … }
│   └─ sections[].beats[]         say · caption · view{ kind, …props }
├─ narration{ <key>: <spoken> }   caption MUST equal narration[say]
└─ content{ … }                   (optional) word banks a board draws from

The validator enforces: every board/view.kind exists in the catalog; props are well-typed; each beat.caption equals its narration[say] exactly; and every reference resolves.

A worked example

A minimal, valid English course — one world, one station, its lesson, and the narration. Use it as a template.

course:
  formatVersion: 1
  id: demo
  title: Demo Quest
  subject: English
  companion: luna
  voice: { id: jessica, profile: teaching-slow }
  engine: '>=1.0'
  worlds:
    - id: phonics
      title: Phonics Cove
      emoji: 🐚
      stations:
        - id: ph-set1
          title: First Sounds
          board: soundToLetter      # a board kind from the catalog
          bands: [0]
          lesson: letter-sounds
  lessons:
    letter-sounds:
      title: Letter Sounds
      sections:
        - id: s
          label: S
          beats:
            - say: lph-2
              caption: This is the letter S. It says sss, like at the start of sun.
              view: { kind: phoneme, letter: s, word: sun, emoji: ☀️ }
  narration:
    lph-2: This is the letter S. It says sss, like at the start of sun.

Validate & open a pull request

  1. Fork & clone discovery-quest, then npm install.
  2. Add your <id>.course.yml under the subject library.
  3. Validate: npm run course:check -- <file> --app packages/<subject> until it prints ✓.
  4. Commit with a DCO sign-off and open a PR — the template covers the safety & contributor checklist.

Kid-safe & original (non-negotiable)

See it in action

Every official course is explained step by step: Luna’s Math Quest · English Quest · engine primitives.

Questions? hello@discoveryquest.app