Writes or upgrades speaker notes for HTML slides to presentation-ready quality. Three fields per slide: notes, talking_points, and a template-configurable third field. Batch mode for 4+ slides with parallel subagent dispatch. Use when: "write speaker notes", "add notes", "improve the notes", "upgrade notes quality", "batch notes", "add talking points"
Writes or upgrades speaker notes for HTML slide decks. Each slide gets three structured note fields that transform raw slides into a complete presenter package. The third field is configurable per workflow template, making the same skill useful for proposals, training decks, board presentations, and general keynotes.
Every slide produces three note fields, stored as a JSON object:
notes (200-500 characters)The presenter's walk sequence through the slide. Not a script — a map.
Must contain:
Prohibited:
talking_points (4-8 speakable bullets)Bullets the presenter can read naturally. Each is one breath — 10-20 words.
Must contain:
Prohibited:
The third field's name and content type are read from the active workflow
template's notes.tab3 configuration. If no template is active, defaults
to references.
| Template | Field Name | Content Type |
|---|---|---|
| general | references | Source attributions, data citations, page numbers |
| rfp-exec | decision_points | Key decisions this slide supports, approval actions |
| training | learning_objectives | What the learner should know/do after this slide |
| architecture | data_sources | System names, API endpoints, metric sources |
| board-strategy | metrics | KPI definitions, measurement methodology, baselines |
Notes are stored alongside slides in notes.json:
{
"slides": [
{
"slide_index": 0,
"slide_file": "01-ai-powered-analytics.html",
"notes": "Start with the headline number — say 'sixty percent faster decisions.' Point to the three stat cards left to right: cycle time, insight speed, adoption. Pause on adoption — this is the surprise number that proves it's not just a tool upgrade.",
"talking_points": [
"Our AI platform cut decision latency from 14 days to under 6",
"That's not a lab number — it's measured across 200 active users",
"Adoption hit 92% in the first quarter without a mandate",
"If asked: 'What about the remaining 8%?' — They're in departments still onboarding, not resistant users",
"This sets up the expansion case we'll cover next"
],
"references": [
"Decision cycle data: Q4 2025 Operations Dashboard, p.12",
"Adoption survey: Internal UX Research, January 2026"
]
}
],
"template": "general",
"tab3_field": "references",
"generated_at": "2026-03-23T10:00:00Z"
}
When processing 4 or more slides, batch mode activates automatically.
notes.jsonnotes.jsonBefore overwriting, read existing notes.json. For each slide:
"user_edited": true, preserve them entirelyEvery generated note must pass these checks before writing:
notes field is 200-500 characters (not shorter, not longer)notes field references specific visual elements on the slidenotes field does not start with the slide titletalking_points has 4-8 bulletsIf any check fails, revise that slide's notes before writing.
| Skill | What | Why |
|---|---|---|
| generate | HTML slide files | Source content for note generation |
| outline | outline.json | Narrative context, slide purpose, audience |
| workflow | deck-state.json | Active template name for tab3 configuration |
| config | config.json | User preferences (verbosity, language) |
| Skill | What | Why |
|---|---|---|
| presenter-html | notes.json | Three-tab notes panel content |
| checkpoint | Notes generation status | Session state tracking |
# Generate notes for all slides in a directory
python ${CLAUDE_SKILL_DIR}/scripts/slide_notes.py \
--slides-dir ./slides \
--outline outline.json \
--output notes.json
# Upgrade existing notes (preserves user edits)
python ${CLAUDE_SKILL_DIR}/scripts/slide_notes.py \
--slides-dir ./slides \
--existing notes.json \
--upgrade \
--output notes.json
# Generate notes for a single slide
python ${CLAUDE_SKILL_DIR}/scripts/slide_notes.py \
--slide ./slides/03-key-metrics.html \
--outline outline.json \
--output notes.json
# Override tab3 field name
python ${CLAUDE_SKILL_DIR}/scripts/slide_notes.py \
--slides-dir ./slides \
--tab3-field learning_objectives \
--output notes.json