How to Add a New Lesson to the AI Engineering from Scratch Curriculum
Adding a new lesson to the AI Engineering from Scratch curriculum requires creating a standardized folder structure under phases/, writing docs/en.md using the provided template, and registering the lesson in both README.md and ROADMAP.md before opening a pull request.
The rohitg00/ai-engineering-from-scratch repository organizes its hands-on curriculum into independent lesson directories that feed a static site generator. If you want to add a new lesson to the AI Engineering from Scratch curriculum, you must follow a strict three-step convention—folder scaffolding, documentation, and navigation registration—that is enforced by the CI pipeline. The entire workflow is defined in CONTRIBUTING.md and LESSON_TEMPLATE.md at the repository root.
Create the Lesson Folder Structure
The repository uses a deterministic file system layout. Every lesson lives under phases/<NN>-<phase-slug>/<MM>-<lesson-slug>/, where <NN> is the phase number and <MM> is the lesson number.
Inside that path, you must create three sub-directories:
code/— Runnable implementations in Python, TypeScript, Rust, or Julia.docs/— Narrative documentation; must containen.md.outputs/— Optional artifacts such as prompts, skills, agents, or MCP servers.
The canonical layout is illustrated in LESSON_TEMPLATE.md (lines 7–21). Copy this scaffold directly and replace the placeholder slugs with your own.
Write the Lesson Documentation
All curriculum content is authored in a single file: <lesson-path>/docs/en.md. This file must start with a standardized front-matter block that the site generator expects.
Front-Matter Template
As shown in LESSON_TEMPLATE.md (lines 25–34), the header should follow this exact shape:
# My New Lesson Title
> One-line motto that captures the core idea.
**Type:** Build
**Languages:** Python, TypeScript
**Prerequisites:** [Previous lesson link]
**Time:** ~30 minutes
Six-Beat Narrative Structure
After the front matter, the document must follow the six-beat sequence documented in the template (lines 35–80):
- Problem — Define what the learner will solve.
- Concept — Explain the underlying theory.
- Build It — Implement the solution step by step.
- Use It — Demonstrate real-world usage.
- Ship It — Package or deploy the artifact.
- Exercises — Provide practice challenges.
Stick to this structure so the generated site renders the lesson consistently with the rest of the curriculum.
Register the Lesson in the AI Engineering from Scratch Curriculum
Visibility depends on two top-level markdown files. The site/build.js script parses both to produce site/data.js, so manual updates are mandatory.
Update README.md
Add a new row to the appropriate phase table in README.md. Maintain the existing column order:
| 23 | [My New Lesson](phases/03-deep-learning-core/23-my-new-lesson/) | Build | Python |
This entry creates the hyperlink used by the curriculum browser.
Update ROADMAP.md
Add a matching entry under the corresponding phase section in ROADMAP.md. Use the ⬚ glyph to mark work-in-progress status:
⬚ 23 My New Lesson
According to the contribution guide, keeping README.md and ROADMAP.md in sync triggers the CI readme-counts-sync job correctly.
Validate Locally with the Site Generator
Before committing, run site/build.js to verify that the site data regenerates cleanly. After execution, git diff site/data.js should show only a timestamp change (see CONTRIBUTING.md line 22). If additional lines appear, your folder path or table row is malformed.
You can run the generator with Node:
node site/build.js
And check the diff:
git diff site/data.js
Submit Your Lesson Changes
The repository enforces a strict pull-request workflow. Follow these steps exactly:
- Fork the repository and create a feature branch (e.g.,
add-lesson-phase3-23-my-new-lesson). - Commit one change per lesson folder. Multiple lessons require separate commits.
- Run unit tests inside the lesson's
code/directory:
python -m unittest discover phases/03-deep-learning-core/23-my-new-lesson/code
- Use a conventional commit title such as
feat(phase-03/23): add my-new-lesson. - Open a PR; the CI pipeline will automatically regenerate site data and enforce README/ROADMAP integrity.
Complete Shell Workflow to Add a New Lesson
Below is a runnable sequence that scaffolds a lesson, writes documentation, updates navigation files, and prepares a commit. Replace the placeholder slugs with your actual lesson:
# 1. Clone and branch
git clone https://github.com/rohitg00/ai-engineering-from-scratch.git
cd ai-engineering-from-scratch
git checkout -b add-lesson-phase3-23-my-new-lesson
# 2. Scaffold folders
mkdir -p phases/03-deep-learning-core/23-my-new-lesson/{code,docs,outputs}
cp LESSON_TEMPLATE.md phases/03-deep-learning-core/23-my-new-lesson/docs/en.md
# 3. Edit documentation
$EDITOR phases/03-deep-learning-core/23-my-new-lesson/docs/en.md
# 4. Add a runnable implementation
cat > phases/03-deep-learning-core/23-my-new-lesson/code/main.py <<'PY'
def demo():
print("Hello from my new lesson")
if __name__ == "__main__":
demo()
PY
# 5. Append row to README.md phase table
# | 23 | [My New Lesson](phases/03-deep-learning-core/23-my-new-lesson/) | Build | Python |
# 6. Append entry to ROADMAP.md
# ⬚ 23 My New Lesson
# 7. Run lesson tests
python -m unittest discover phases/03-deep-learning-core/23-my-new-lesson/code
# 8. Commit and push
git add phases/03-deep-learning-core/23-my-new-lesson README.md ROADMAP.md
git commit -m "feat(phase-03/23): add my-new-lesson"
git push origin add-lesson-phase3-23-my-new-lesson
# 9. Open pull request
gh pr create --title "feat(phase-03/23): add my-new-lesson" \
--body "Adds a new lesson to Phase 3 on building X from scratch."
Summary
- Folder layout: Create
phases/<NN>-<phase-slug>/<MM>-<lesson-slug>/withcode/,docs/, andoutputs/subdirectories. - Documentation: Write
docs/en.mdusing the front-matter and six-beat template fromLESSON_TEMPLATE.md. - Navigation: Add a table row to
README.mdand a status line toROADMAP.mdsosite/build.jscan discover the lesson. - Validation: Run the site generator locally and confirm only
site/data.jstimestamps change. - Contribution: Submit one commit per lesson with a conventional commit title and passing unit tests.
Frequently Asked Questions
What files are required inside a new lesson folder?
At minimum, you need docs/en.md inside a docs/ directory, plus a code/ directory for implementations. An outputs/ directory is optional and used for prompts, skills, agents, or MCP servers. The exact skeleton is shown in LESSON_TEMPLATE.md (lines 7–21).
Where do I find the documentation template for a lesson?
The scaffold lives in LESSON_TEMPLATE.md at the repository root. It specifies the folder hierarchy, the front-matter block (lines 25–34), and the six-beat narrative structure (lines 35–80) that every lesson must follow.
Why does my pull request fail CI after adding a lesson?
The most common cause is desynchronized navigation tables. The CI pipeline parses README.md and ROADMAP.md to regenerate the site. If either file is missing the new lesson entry, or if site/data.js contains unexpected diffs, the readme-counts-sync job will fail. Always run node site/build.js locally first.
Can I submit multiple new lessons in a single commit?
No. The repository enforces a strict "one commit per lesson" policy. Each new lesson folder, along with its corresponding README.md and ROADMAP.md updates, should be committed separately with a conventional title such as feat(phase-03/23): add my-new-lesson.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →