✦ 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 fromThe 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
- Fork & clone discovery-quest, then
npm install. - Add your
<id>.course.ymlunder the subject library. - Validate:
npm run course:check -- <file> --app packages/<subject>until it prints ✓. - Commit with a DCO sign-off and open a PR — the template covers the safety & contributor checklist.
Kid-safe & original (non-negotiable)
- Age-appropriate, accurate, and kind — nothing scary, violent, or mature.
- No personal data and no external links.
- Your original work (or content you have the rights to) — no copyrighted passages, characters, or images.
- Merge is gated: maintainers review every submission before it ships.
See it in action
Every official course is explained step by step: Luna’s Math Quest · English Quest · engine primitives.
Questions? hello@discoveryquest.app