This release is a pre-release and may not be stable for production use.
🎓 quarto-coursegen
A CLI tool that scaffolds Quarto course websites from a
single course.yaml definition file.
✨ Features
- Single source of truth — define your entire course (modules, artifacts, schedule, instructors) in one
course.yamlfile - Two-stage pipeline — separate generation (scaffold
.qmdstubs + Quarto config) from rendering (Quarto → HTML/PDF) - Multiple output formats — reveal.js slides, Beamer PDF, HTML handouts, PDF assignments, and a full course website from the same source
- Smart overwrite policy — stubs are never overwritten after the first run; navigation and sub-project configs are always kept up to date
- Customisable templates — override any built-in Jinja2 template locally without forking the tool
- i18n support — UI strings and labels are externalised in
lang/*.yaml(English and German included) initcommand — bootstraps a ready-to-use course repo with a sensible directory structure in one step
📦 Installation
Requires Python ≥ 3.11.
pip install quarto-coursegen
Or with uv:
uv tool install quarto-coursegen
🚀 Quick Start
# 1. Create and bootstrap a new course project
quarto-coursegen init my-course
cd my-course
# 2. Edit course.yaml (title, modules, artifacts, instructors, …)
# 3. Scaffold .qmd stubs and Quarto config from course.yaml
quarto-coursegen generate
# 4. Fill in content in the generated .qmd files
# 5. Render with Quarto
quarto render # course website → docs/
make slides # reveal.js + Beamer PDF → docs/slides/
make handouts # PDF handouts → docs/handouts/
For the full reference — course.yaml schema, command options, templates,
i18n, rendering guide, Python API — see the documentation.
📁 Project layout (generated course repo)
course-repo/
│ ← quarto-coursegen init
├── course.yaml ← edit this: title, modules, artifacts
├── Makefile ← rendering targets (make website / slides / …)
├── assets/
│ └── styles/
├── templates/ ← built-in Jinja2 templates (customise locally)
├── lang/ ← built-in language files (customise locally)
│
│ ← optional
├── coursegen.yaml ← tool config (overrides)
│
│ ← quarto-coursegen generate
├── _quarto.yml ← generated once, then hand-editable
├── _quarto-nav.yml ← always regenerated
├── index.qmd ← generated once, then hand-editable
└── content/
├── modules/
├── slides/
├── handouts/
├── notes/
├── assignments/
└── syllabus.qmd
🧑💻 Development
git clone https://github.com/xylomorph/quarto-coursegen.git
cd quarto-coursegen
uv sync --dev
uv run pytest
🛠️ Tech Stack
| Layer | Technology |
|---|---|
| Language | Python ≥ 3.11 |
| CLI framework | Typer |
| Templating | Jinja2 |
| Config parsing | PyYAML + Pydantic |
| Output formatting | Rich |
| Publishing | Quarto |
| Package manager | uv |
| Testing | pytest |
📚 Building the documentation
quarto render docs_src/ # output → docs/
🗂️ Package layout
src/quarto_coursegen/
├── cli.py ← Typer app (init, generate commands)
├── config.py ← CoursegenConfig, resolve_config, i18n loading
├── core.py ← pure logic (normalize, resolve, collect)
├── env.py ← Jinja2 environment factory
├── generators.py ← generate() and per-file generator functions
├── initializer.py ← init_project()
├── writer.py ← write_file() with Rich output
└── package_data/
├── skeleton/ ← files copied by init (course.yaml, Makefile, …)
├── templates/ ← built-in Jinja2 templates
└── lang/ ← built-in i18n files
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file quarto_coursegen-0.1.0b2.tar.gz.
File metadata
- Download URL: quarto_coursegen-0.1.0b2.tar.gz
- Upload date:
- Size: 548.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a8d3dd82b0bf26d747231972baee747990f7c792d9894cbb28d93551fcc51a55
|
|
| MD5 |
43c07069427b5612f9995f0001020849
|
|
| BLAKE2b-256 |
1cf73e79b7f34dc9c32bedd4d0eacace950267d039c40fd83e739ade3c21443c
|
File details
Details for the file quarto_coursegen-0.1.0b2-py3-none-any.whl.
File metadata
- Download URL: quarto_coursegen-0.1.0b2-py3-none-any.whl
- Upload date:
- Size: 29.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e5be522f7f60d5842693cef742b82f7ab91cbf02da4d908a8c9ea4d1843a9b09
|
|
| MD5 |
4a6404f891ea37642e8ea53298b2df12
|
|
| BLAKE2b-256 |
7ffdbf74f2fb71460c7443f0c7c4e77523eb247437aa3f674b921f529fbe02bc
|