Manifest Reference
The course.yaml manifest is the single configuration file that drives the entire course generation pipeline. It defines the course identity, modules, lectures, projects, quizzes, and visual theme. The orchestrator validates this file before executing any pipeline stage.
Complete YAML Example
A full, realistic manifest for a 12-lecture course with 4 modules, 3 projects, and dual-tier quizzes.
# === COURSE IDENTITY ===
course:
name: "Blockchain Technology and Decentralized Finance"
short_name: "Blockchain" # Used in URLs and directory names
institution: "University of Zurich"
department: "Department of Finance"
level: "BSc" # BSc | MSc | PhD
semester: "Spring 2026"
instructor:
name: "Joerg Osterrieder"
email: "joerg.osterrieder@uzh.ch"
title: "Professor of Finance"
repo:
org: "digital-ai-finance" # GitHub org or username
name: "Blockchain" # Repo name (created if missing)
visibility: "public" # public | private
website_url: "https://digital-ai-finance.github.io/Blockchain"
github_repo: "digital-ai-finance/Blockchain"
# === MODULE STRUCTURE ===
modules:
- id: "foundations"
name: "Foundations"
color: "#2CA02C" # Module badge color (green)
lectures: [1, 2, 3] # Lecture numbers in this module
- id: "technology"
name: "Technology"
color: "#FF7F0E" # orange
lectures: [4, 5, 6]
- id: "applications"
name: "Applications"
color: "#D62728" # red
lectures: [7, 8, 9]
- id: "frontiers"
name: "Frontiers"
color: "#3333B2" # blue
lectures: [10, 11, 12]
# === LECTURES ===
lectures:
- number: 1
title: "What Is Blockchain?"
subtitle: "From Ledgers to Distributed Trust"
tex_file: "L01_what_is_blockchain.tex"
topics:
- "History of ledgers and double-entry bookkeeping"
- "The trust problem in digital transactions"
- "Hash functions and Merkle trees"
- "Blocks, chains, and immutability"
- "Consensus without a central authority"
prerequisites: []
figures:
domain_focus: "finance"
required_types:
- "time_series"
- "flowchart"
- "comparison_bar"
- number: 2
title: "Cryptographic Foundations"
subtitle: "The Math That Makes It Work"
tex_file: "L02_cryptographic_foundations.tex"
topics:
- "Symmetric vs asymmetric encryption"
- "Digital signatures and verification"
- "Hash functions: SHA-256 in practice"
- "Public-key infrastructure"
prerequisites: [1]
# ... remaining lectures follow the same pattern
# === PROJECT TRACKS ===
projects:
- id: "defi-dashboard"
title: "DeFi Dashboard"
description: "Build a real-time dashboard tracking DeFi protocol metrics"
difficulty: "intermediate"
lectures: [4, 5, 6, 7]
deliverables:
- "Working web dashboard"
- "Data pipeline documentation"
- "5-minute presentation"
- id: "nft-marketplace"
title: "NFT Marketplace Analysis"
description: "Analyze pricing patterns and market dynamics across NFT platforms"
difficulty: "advanced"
lectures: [7, 8, 9]
deliverables:
- "Analysis report with visualizations"
- "Reproducible Jupyter notebook"
- "10-minute presentation"
- id: "wallet-tracker"
title: "Wallet Activity Tracker"
description: "Track and visualize on-chain wallet activity patterns"
difficulty: "beginner"
lectures: [1, 2, 3]
deliverables:
- "Python script with CLI interface"
- "README with usage examples"
# === QUIZ CONFIGURATION ===
quizzes:
per_lecture: 5
advanced_ratio: 0.3
bloom_levels:
- "understand"
- "apply"
- "analyze"
- "evaluate"
standard:
count: 20
bloom_distribution:
understand: 4
apply: 8
analyze: 6
evaluate: 2
advanced:
count: 20
bloom_distribution:
apply: 4
analyze: 8
evaluate: 6
create: 2
# === VISUAL THEME ===
theme:
primary_color: "#3333B2"
secondary_color: "#0066CC"
nav_color: "#1a1a4e"
hero_gradient_start: "#3333B2"
hero_gradient_end: "#0066CC"
accent_color: "#FF7F0E"
font_family: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif"
logo_path: "assets/logo.png"
Field Reference
Complete reference of all manifest fields, grouped by section. Fields marked Yes are required and will produce a hard error if missing.
Course Identity Fields
| Field | Type | Required | Description |
|---|---|---|---|
| course_name | string | Yes | Full course name |
| short_name | string | Yes | Abbreviated name for file paths and URLs |
| academic_year | string | Yes | e.g., "2025/2026" |
| semester | string | Yes | e.g., "Winter" or "Summer" |
| institution | string | Yes | University name |
| department | string | No | Department name |
| instructor.name | string | Yes | Instructor full name |
| instructor.email | string | No | Contact email |
| instructor.title | string | No | Academic title |
| website_url | string | Yes | Target GitHub Pages URL |
| github_repo | string | Yes | GitHub repository name |
Module Fields
| Field | Type | Required | Description |
|---|---|---|---|
| modules[].name | string | Yes | Module name |
| modules[].color | hex | No | Module accent color (auto-assigned if omitted) |
| modules[].lectures[].title | string | Yes | Lecture title |
| modules[].lectures[].tex_file | string | Yes | Source .tex filename |
| modules[].lectures[].topics | string[] | No | Key topics covered |
| modules[].lectures[].charts | object[] | No | Chart overrides (bypasses auto-derivation) |
Project Fields
| Field | Type | Required | Description |
|---|---|---|---|
| projects[].title | string | Yes | Project title |
| projects[].description | string | Yes | Brief description |
| projects[].lectures | int[] | Yes | Associated lecture numbers |
| projects[].difficulty | string | No | "beginner" / "intermediate" / "advanced" |
Quiz Fields
| Field | Type | Required | Description |
|---|---|---|---|
| quizzes.per_lecture | int | No | Questions per lecture (default: 5) |
| quizzes.advanced_ratio | float | No | Fraction of advanced questions (default: 0.3) |
| quizzes.bloom_levels | string[] | No | Bloom's taxonomy levels to target |
Theme Fields
| Field | Type | Required | Description |
|---|---|---|---|
| theme.primary_color | hex | No | Primary accent color |
| theme.secondary_color | hex | No | Secondary accent |
| theme.font_family | string | No | Web font family |
| theme.logo_path | string | No | Path to logo image |
Validation Rules
The orchestrator validates the manifest before executing any pipeline stage. All errors and warnings are reported at once.
Hard Errors (block execution)
If any of these conditions are detected, the pipeline stops immediately and reports all errors.
-
1
Missing
course_nameorshort_name-- these are the minimum identity fields required to generate any output. -
2
Empty
modulesarray -- at least one module with at least one lecture must be defined. - 3 Module with zero lectures -- every module must contain at least one lecture entry.
-
4
Lecture missing
tex_file-- the pipeline cannot compile a lecture without knowing its source file. -
5
Duplicate
tex_fileacross lectures -- each lecture must reference a unique .tex file to avoid overwriting compiled output.
Soft Warnings (proceed with notice)
These issues are reported but do not stop the pipeline. The orchestrator uses sensible defaults where possible.
-
1
Missing
academic_year-- the year will be omitted from generated headers and footers. -
2
Missing
instructor.email-- the contact section on the website will not include an email link. -
3
Module without explicit
color-- a color will be auto-assigned from the default palette. -
4
Lecture without
topics-- chart auto-derivation will be disabled for this lecture; only manually specified charts will be generated. -
5
No
projectsdefined -- the website will omit the projects section entirely. -
6
No
quizzesconfiguration -- quizzes will use default settings (5 questions per lecture, 0.3 advanced ratio).
Design Tokens
All generated HTML uses a consistent color system derived from the Beamer template and the manifest theme section. These tokens ensure visual consistency across slides, lecture pages, galleries, and the website.
Core Colors
The foundational palette shared across all generated artifacts. These come from the Beamer template color definitions.
| Token | Hex | Usage |
|---|---|---|
| mlpurple | #6C3082 | Primary brand color |
| mllavender | #E6E6FA | Light accent |
| mlblue | #1F77B4 | Charts, links |
| mlorange | #FF7F0E | Highlights |
| mlgreen | #2CA02C | Success states |
| mlred | #D62728 | Errors, warnings |
| mlgray | #7F7F7F | Muted text |
Section Tag Colors
The 8-section pedagogical framework used in lecture HTML pages. Each section type has a distinct color for its tag background, text, and left border.
| Section | Color | Hex |
|---|---|---|
| WHY (Introduction) | Green | #2CA02C |
| WHAT (Theory) | Purple | #3333B2 |
| CASE (Application) | Orange | #FF7F0E |
| HOW (Method) | Blue | #0066CC |
| RISK (Challenges) | Red | #D62728 |
| WHERE (Context) | Teal | #17a2b8 |
| IMPACT (Significance) | Amber | #F7931A |
| SOWHAT (Summary) | Violet | #9b59b6 |
Badge Background Derivation
For module badges and section tags, the background color is derived algorithmically from the section or module color to ensure readability and visual consistency.
Algorithm: Take the section color hex value, parse it to RGB, then mix with white at 85% opacity to produce the badge background.
r, g, bbg_r = 255 * 0.85 + r * 0.15, same for bg_g and bg_bbackground propertyThis produces a subtle tinted background (15% color, 85% white) that pairs with the full-strength color for text, creating high contrast and consistent section identification.
Chart Auto-Derivation Algorithm
When a lecture does not specify explicit chart overrides, the orchestrator derives chart types automatically from the lecture's topic keywords. This eliminates manual figure planning while allowing the instructor to review and override any auto-derived chart.
How It Works
- The system scans each topic string in the lecture's
topicsarray - Topic keywords are matched against a chart type mapping table (case-insensitive)
- Matched chart types are collected into the lecture's figure list
- An overview diagram and summary table are always appended if not already present
- Remaining figure slots are filled by alternating concept illustrations and data visualizations
Chart Type Reference
| Chart Type | Keywords | Description |
|---|---|---|
line_plot |
"trend", "time series", "growth" | Time-based data |
bar_chart |
"comparison", "ranking", "distribution" | Category comparisons |
scatter_plot |
"correlation", "relationship" | Variable relationships |
histogram |
"distribution", "frequency" | Data distribution |
pie_chart |
"composition", "share", "proportion" | Part-of-whole |
heatmap |
"matrix", "correlation matrix" | 2D data intensity |
box_plot |
"quartile", "outlier", "spread" | Statistical distribution |
area_chart |
"cumulative", "stacked" | Accumulated values |
network_graph |
"network", "graph", "connection" | Node-edge relationships |
candlestick |
"stock", "price", "OHLC" | Financial price data |
When explicit charts overrides are provided in the manifest, they take priority. The auto-derivation algorithm only fills remaining slots that are not explicitly specified.