03 — ApproachTyped content, not a CMS
Content lives in typed TypeScript arrays under `src/data`. That sounds primitive next to a headless CMS, and it buys three real things: the compiler catches a malformed lesson before it deploys, content is versioned with the code that renders it, and there is no external service to go down, expire, or start charging.
Bodies are a discriminated union of block types — text, list, code, note, quote — so the renderer is one exhaustive switch. Adding a block type is a compiler error everywhere it needs handling, which is exactly where you want to find out.