From a bare course idea to finished lecture slides, speaker notes, labs, quizzes, and homework — in hours or days, not weeks or months. A structured AI pipeline for preparing university course materials, with state tracking so nothing gets forgotten or re-explained between sessions.
The skill is a cross-tool Agent Skill (
SKILL.md), so it should run on any Agent Skill–compatible tool; explicitly tested on Claude Code and Cowork, OpenAI Codex CLI, and Cursor — one skill, installed per tool (see Installation). Deeper cross-tool parity is tracked in docs/MULTI_HARNESS_PLAN.md.
Preparing a course the usual way costs weeks: a slide plan that drifts from what you actually teach, Beamer files that fight you on layout, speaker notes written from memory the night before, lab assignments and grading built by hand every semester. Plain chat-based AI help doesn't fix this — every session starts from zero, so you re-explain your audience and re-reject the same bad ideas every week.
course-maker is a pipeline, not a chat: it remembers your course's audience, style, and every decision you've made, and turns that into consistent, ready-to-use material.
- Speed: one lecture — plan, figures, slides, speaker notes — in hours; a whole new course's worth of lectures, labs, and quizzes in days.
- Fits your audience: rigor level, language, and style are set once and applied to every lecture, lab, and quiz — no re-explaining, no drift.
- A course that survives next semester: every course is a predictable file layout with an explicit status table and decision log, so updating one lecture, or picking the whole course back up a year later, takes minutes, not archaeology.
One pipeline, the whole course — not just slides:
| For... | You get |
|---|---|
| Lectures | slide-by-slide plan → visualization list → Python figure scripts → chunked Beamer/Slidev deck → speaker notes |
| Seminars | the same deck pipeline plus a practical live-coding notebook |
| Labs | plan → notebook → instructor spec → pytest-based autograded tests → student validation → publish to your LMS |
| Quizzes / exams | interactive plan → chunked question bank with answer key → student-facing export |
| Homework | task brief + grading rubric → student handout (pdf/latex/docx) |
| The course itself | course_plan.md as the single source of truth, a generated student syllabus, and a status dashboard across every pipeline |
For one lecture, that looks like:
/course-maker plan 3 # detailed slide-by-slide plan
/course-maker visuals 3 # list of visualizations, TikZ vs Python
/course-maker figures 3 # Python script to generate PNG figures
/course-maker slides 3 # LaTeX/Beamer presentation (chunked)
/course-maker slides 3 next # ...next 5 slides
/course-maker notes 3 # speaker notes (chunked)
Each step reads the outputs of previous steps and a history.md that logs every
decision and rejected idea — so the agent doesn't re-propose what you already turned down,
and each new lecture benefits from lessons learned in previous ones. Labs,
seminars, quizzes, and homework each have their own pipeline in the same
style — see Commands for the full reference.
Requirements: any Agent Skill–compatible agent (tested on Claude Code, Cowork, OpenAI Codex CLI, and Cursor), plus git. For local Beamer compilation: a LaTeX distribution. For lab tests: Python 3.11+.
The same skill (SKILL.md + references/) works in every tool; only how you
install it differs. Pick one of two ways.
Download course-maker-vX.Y.Z.zip from the
latest release. It
is a self-contained, versioned copy of the skill — a single course-maker/
folder — with the version stamped into it.
-
claude.ai / Claude Cowork: upload the zip as-is via Settings → Features (Skills). Do not unzip.
-
Claude Code / Codex / Cursor: unzip it into the tool's skills directory. The archive already contains the
course-maker/folder, so it lands in the right place:unzip course-maker-v1.3.0.zip -d ~/.claude/skills/ # Claude Code unzip course-maker-v1.3.0.zip -d ~/.agents/skills/ # Codex CLI unzip course-maker-v1.3.0.zip -d ~/.cursor/skills/ # Cursor (only if not using the above)
Re-download and re-unzip to update.
Best if you want a git pull to update every tool at once, or you're editing
the skill. Not applicable to Cowork. Run from the PARENT directory of the clone:
git clone https://github.com/markpolyak/course-maker
# Claude Code:
ln -s "$(pwd)/course-maker/skill" ~/.claude/skills/course-maker
# Codex CLI:
mkdir -p ~/.agents/skills
ln -s "$(pwd)/course-maker/skill" ~/.agents/skills/course-makerReplace ln -s with cp -r for a self-contained copy (re-copy after updates).
Cursor needs no separate install — it also reads the Claude Code and Codex
skill directories, so it picks up either symlink above. (Only using Cursor? Put
the link in ~/.cursor/skills/course-maker.)
Then create a course and initialize it in your agent:
# Create a new course repository
mkdir my-course && cd my-course && git init
# Open in Claude Code / Codex / Cursor and initialize
> /course-maker course init
> /course-maker course plancourse init creates AGENTS.md (course context), course_conventions.md,
slides_preamble.tex, and the directory layout. course plan walks you through
filling in course_plan.md (or imports an existing one).
- Run
/course-maker course init— fills inAGENTS.md(course context) and per-course templates from your answers (course name, audience, style, language, slides format, LaTeX engine). - Run
/course-maker course plan— interactively createscourse_plan.md, or imports yours if you already have one. - Run
/course-maker plan 1and review the output. - When satisfied, run
/course-maker visuals 1.
Full walkthrough: docs/getting-started.md.
The two main sources of wasted rounds in lecture prep:
Problem 1: the agent doesn't remember what you rejected.
Each session starts fresh. You say "compress section 3", the agent does it, next week
it's back. → history.md per lecture fixes this: every decision is logged and re-read
at the start of each step.
Problem 2: Beamer slides time out or overflow.
A 20-slide .tex file is 600–900 lines. Generating it in one shot risks hanging or
truncating the output, in any of the supported tools. → Slides and speaker notes are
generated in chunks of 5, with approval between each chunk.
A third source — the agent silently skipping a references/*.md file mentioned in
the dispatcher — is addressed by the ## Inviolable rules block in SKILL.md,
which is always loaded and lists the critical rules that survive any skip.
my-course/
AGENTS.md ← course context (audience, style, language, profile)
course_plan.md ← master plan (source of truth)
syllabus.md ← student-facing syllabus (generated from course_plan.md)
COURSE_STATE.md ← status of all pipelines: ✅ 🔄 ❌ ⚠️
course_conventions.md ← terminology + language rules (generated by course init)
slides_preamble.tex ← LaTeX/Beamer preamble (generated by course init)
lab_templates.md ← lab notebook/test templates (generated by lab course-init)
lms_adapter.md ← LMS publish workflow (copied from the profile by lab course-init)
lectures/
01/
plan.md ← slide-by-slide plan
visuals.md ← visualization list with TikZ feasibility
figures/
figures.py ← generates all PNG figures
fig01_name.png
slides.tex ← Beamer presentation
speaker_notes.md ← live spoken text for the lecturer
history.md ← decision log
labs/
shared/ ← per-course base templates
lab1/
lab_spec.md ← instructor-only contract (not published to students)
history.md
starter/ ← student-facing files (delivery depends on the LMS adapter)
exercises.ipynb
conftest.py
tests.py
...
seminars/ ← per-seminar decks + practical notebooks
quizzes/ ← quiz/exam banks + student exports
homework/ ← homework briefs + rubrics (or nested under a seminar)
Lecture pipeline:
| Command | Description |
|---|---|
/course-maker |
Project status (all pipelines) |
/course-maker help |
Command reference |
/course-maker course init |
Scaffold a new course repository |
/course-maker course plan |
Create, fill, or update course_plan.md (interactive) |
/course-maker course status |
Status table for all pipelines |
/course-maker course update |
Detect manual edits to course_plan.md, flag affected lectures |
/course-maker doctor |
Check for state drift, missing files, config gaps (read-only) |
/course-maker stats |
Progress bars across pipelines (read-only) |
/course-maker syllabus [pdf|latex|docx] |
Generate/update student syllabus.md; optional export |
/course-maker plan N |
Step 1: detailed slide plan for lecture N |
/course-maker visuals N |
Step 2: visualization list |
/course-maker figures N |
Step 3: Python figure generation script |
/course-maker slides N |
Step 4: Beamer slides, chunk 0 (preamble + title) |
/course-maker slides N next |
Step 4: next chunk of 5 slides |
/course-maker notes N |
Step 5: speaker notes, slides 1–5 |
/course-maker notes N next |
Step 5: next chunk of 5 slides |
/course-maker status N |
State + history summary for lecture N |
Seminar pipeline (a lecture deck + a practical part, in seminars/NN/):
| Command | Description |
|---|---|
/course-maker seminar plan|visuals|figures|slides|notes N |
Deck steps — reuse the lecture step pipeline, targeting seminars/NN/ |
/course-maker seminar practice N |
Practical live code-demo notebook (practice.ipynb) |
/course-maker seminar status N |
Status + last 3 history entries |
Lab pipeline:
| Command | Description |
|---|---|
/course-maker lab course-init |
One-time setup: create labs/shared/ with templates; install the LMS adapter |
/course-maker lab init N [url] [slug] |
Scaffold lab N (starter setup per the LMS adapter; url used only by remote-starter profiles) |
/course-maker lab plan N |
Step 1a: interactive planning until approved |
/course-maker lab notebook N |
Step 1b: generate exercises.ipynb |
/course-maker lab spec N |
Step 1b: generate lab_spec.md (auto plan/notebook mode) |
/course-maker lab datasets N |
Step 1b: generate datasets_info.md (optional) |
/course-maker lab tests N |
Step 2: tests.py, requirements.txt, README (+ grade_report.py if a reporter is used) |
/course-maker lab validate N <id> |
Step 3: validate as student (new session required) |
/course-maker lab publish N |
Run the publish workflow from lms_adapter.md (LMS-specific) |
/course-maker lab update N |
Re-publish after post-release fix |
/course-maker lab status N |
Status + last 3 history entries |
Quiz pipeline (quizzes / tests / exams):
| Command | Description |
|---|---|
/course-maker quiz plan N |
Step 1: interactive quiz plan (blocks, types, variants) |
/course-maker quiz generate N [next] |
Step 2: generate question bank (chunked by block) |
/course-maker quiz publish N [format] |
Step 3: export student-facing version (markdown) |
Homework pipeline (manually graded take-home assignment — no autograding):
| Command | Description |
|---|---|
/course-maker homework plan N [dir] |
Step 1: interactive task brief + grading rubric (dir default homework/NN/) |
/course-maker homework publish N [format] |
Step 2: assemble student handout; markdown default, pdf/latex/docx via pandoc |
/course-maker homework status N |
Status + last 3 history entries |
examples/regularization-course/ is a full example produced end to end by the skill: two lectures with every pipeline artifact (plan, visuals, figures, slides, speaker notes, decision history), plus a lab through the tests step. See examples/README.md for what it covers and how to contribute your own — examples must come from actually running the skill, not be hand-assembled.
Active roadmap with execution plan: docs/IMPROVEMENT_PLAN.md.
Quick status:
- Claude Code skill (
~/.claude/skills/) - Chunked generation for slides and speaker notes
- State tracking (
COURSE_STATE.md+history.md) - Lab assignment pipeline (
/course-maker lab *commands) - Seminar, quiz, and homework pipelines
- Working out-of-the-box templates (
conftest_base.py,tests.yaml) -
## Inviolable rulesblock inSKILL.md(critical rules survive skipped references) - Profile layer: pluggable LMS adapters + user defaults + opt-in grading extensions
- Syllabus auto-generation from
course_plan.md - Course health & progress tooling:
doctor,stats, state drift checker, bulky-history warning - Additional slide formats: Slidev and pptx (in addition to Beamer)
- Overleaf integration (cloud LaTeX compilation)
- [~] Cross-tool support: skill installs on Claude Code, Codex CLI, and Cursor (Agent Skills standard); full parity (declaudize wording,
AGENTS.mdcourse layer) tracked in docs/MULTI_HARNESS_PLAN.md - Multi-agent harness support (similar to GSD Redux)
See CONTRIBUTING.md.
The best contributions right now: examples from courses you actually taught (any discipline), and bug reports from the Beamer compilation step with the specific error + fix.
MIT