Use when building, theming, or exporting a presentation deck — pitch, sales, keynote, board/QBR, leave-behind one-pager — from slide structure to a token-based theme to PDF or editable PPTX (Marp, Slidev, python-pptx). NOT the words (that is `marketing`), NOT the visual tokens (that is `design`), NOT the investor story arc (that is `pitch-deck`).
npx skills add https://github.com/ericrisco/rsc-harness --skill presentations
> Two first-class pipelines, one decision. Design-led Markdown decks (Marp/Slidev) for a deck that
> *flipa* and exports clean to PDF and PPTX, or native editable PowerPoint via python-pptx
> when the user must hand off a .pptx people will edit in PowerPoint/Keynote/Google Slides.
> The deck owns *structure, visual system, and export*. The words are marketing's job; the
> visual tokens are design's. This skill orchestrates all three into a finished deck.
Also out of scope: a web-native, scroll/animation-heavy landing page (that is
../design/SKILL.md + ../nextjs/SKILL.md); a video / motion explainer as the deliverable — this
skill uses motion only as restrained slide transitions and builds, never as the medium; and the live
financial *model* behind an investor deck — this skill renders the slides and cites the model as the
source of truth.
Never produce deck copy or a deck narrative without a complete brand study. A deck is the brand on
stage: generic slides read as "another AI deck" the moment they hit the projector, and the only cure is
grounding every headline, claim, and tone choice in a real, persisted brand profile. This is the same
gate marketing and design enforce — decks share the study, they do not fork it.
CLAUDE.md for a ## Brand & voice section linking into 02-DOCS/wiki/brand/ (the harness Karpathy-wiki convention: compiled brand articles under 02-DOCS/wiki/brand/, raw inputs the user pastes under 02-DOCS/raw/brand/). No CLAUDE.md, no link, or a link that points nowhere = ABSENT.references/brand-grounding.md — it extends the shared brand checklist with deck-specific dimensions: deck purpose, audience & setting, length, presenter-vs-leave-behind, and must-include slides. Any empty dimension = INCOMPLETE.02-DOCS/wiki/brand/ (raw inputs verbatim under 02-DOCS/raw/brand/), and add/update the ## Brand & voice link in root CLAUDE.md. Exact format → references/brand-grounding.md.02-DOCS/wiki/brand/value-proposition.md, voice in voice.md").Single exception: if the user explicitly says "skip it, rough draft", you may produce a clearly-labelled
DRAFT (ungrounded — not brand-checked) and still recommend running the gate before it ships.
A deck is a *communication* artifact, so the design that matters most is the message design. Everything
below descends from audience-centered design — every choice serves the audience's understanding, not
the presenter's comfort.
Plan the message (six questions). Lock these before storyboarding: (1) who *specifically* is the
audience and what do they already know; (2) the ONE main message they remember a week later; (3) the 3–5
supporting points that carry it; (4) the evidence proving each; (5) the single call-to-action; (6) what is
essential vs. expandable under time pressure. These feed the deck arc directly: message = thesis, points =
beats, CTA = closing ask (→ references/storytelling-and-decks.md).
Assertion-evidence is the slide unit. Each slide = one assertion (a complete claim, written as the
title) + the visual evidence that proves it — never a topic label over a bullet list. *"User engagement rose
43% after the redesign"* + a chart, not *"Engagement"* + three bullets. The body proves the headline; it
never repeats it.
One concept per slide. Working memory is small and the audience is also listening to you. If a slide
needs two breaths to explain, it's two slides. Reveal sequential parts progressively — build order *is* the
explanation — rather than dumping everything at once.
Spoken vs. shown — never both. The slide and your mouth are two channels; redundancy wastes both. *Show*
the assertion, the visual, the number, the next step; *say* the elaboration, the context, the interpretation,
the story. Reading slides verbatim is the fastest way to lose a room.
Full frameworks — the planning questions, the spoken/shown table, the 1–5 evaluation rubric
(audience-centered / visual clarity / cognitive load / accessibility), the implementation checklist, and the
communication anti-patterns — live in references/slide-design.md. Score any draft against the rubric (≥ 4
on each axis) before shipping.
Pick once, up front — switching mid-build is expensive.
| Question | → Markdown deck (Marp/Slidev) | → Native PPTX (python-pptx) |
| --- | --- | --- |
| Primary deliverable | A stunning deck; PDF is the hero, PPTX a bonus | An editable .pptx people will open and change |
| Who edits after handoff | You / engineering, in Markdown + Git | Non-technical stakeholders, in PowerPoint/Keynote/Slides |
| Visual ceiling | High — full CSS/HTML, web fonts, CSS grid, gradients, SVG | PowerPoint's box model; native charts/tables/SmartArt-lite |
| Theming source | Design tokens → CSS theme (OKLCH, type scale, spacing) | Design tokens → .pptx theme (sRGB colors, theme fonts) |
| Data viz | SVG / chart libs / images, full control | Native, editable PowerPoint charts (live in the file) |
| Diffable / reviewable in Git | Yes (Markdown) | No (binary) |
| Speaker notes | Yes (<!-- notes --> / notes:) | Yes (native notes pane) |
| Version control of changes | Excellent | Poor (binary blobs) |
Default to the Markdown pipeline for anything where "stunning" matters and the user is fine getting a
PDF (+ image-based PPTX). Choose python-pptx the moment the user says "I need to edit it in
PowerPoint", "the client edits the slides", "live charts", or "corporate template .potx". When unsure,
ask one question: *"After I hand it over, will someone edit the slides in PowerPoint/Keynote, or is a
polished PDF enough?"* You can also build in Markdown and additionally export a --pptx for handoff —
just warn that Marp/Slidev PPTX slides are images, not editable text (a key gotcha, see exports).
Deep recipes for each → references/markdown-decks.md and references/pptx-python.md.
references/storytelling-and-decks.md. Lock the one-sentence thesis the whole deck proves.marketing collaboration: headlines are copy. Get the skeleton approved before designing pixels.references/slide-design.md, references/markdown-decks.md, references/pptx-python.md)references/slide-design.md)references/storytelling-and-decks.md)references/markdown-decks.md, references/pptx-python.md)scripts/verify.sh (lint deck sources, dry export, import check) and the QA gate below.10. Record deck conventions in 02-DOCS/wiki/stack/presentations.md (Project grounding, below).
One end-to-end pass, brand study already complete. Read this once and you rarely need to round-trip the
references for a standard Markdown deck.
1. Storyboard the spine (assertion headlines only — read top-to-bottom, they ARE the pitch; →
references/storytelling-and-decks.md). Thesis: *"Onboarding v2 is why we can raise now."*
1 Onboarding v2 cut churn 40% (title)
2 One in three users never finished setup (problem — make it ache)
3 We rebuilt the first run as one screen (solution, one visual)
4 Activation rose 28pts in six weeks (proof — chart, one series)
5 TAM is $12B, growing 24%/yr (market, stated assumptions)
6 The ask: $2M to make this the default path (CTA — one ask)
2. Theme from design tokens. Pull OKLCH palette + type scale from 02-DOCS/wiki/stack/design.md into a
Marp CSS theme (full theme → references/markdown-decks.md). The load-bearing move is mapping tokens to
variables *once*, never hand-picking hex per slide:
/* @theme brand — generated from 02-DOCS/wiki/stack/design.md */
@import url('https://fonts.googleapis.com/css2?family=Fraunces:wght@700&family=Inter:wght@400;600&display=swap');
:root { --brand: oklch(0.62 0.19 264); --ink: oklch(0.18 0.03 264);
--surface: oklch(0.98 0.005 264); --accent: oklch(0.74 0.17 52); }
section { background: var(--surface); color: var(--ink); font-family: Inter, sans-serif; font-size: 26px; }
h1 { font-family: Fraunces, serif; font-size: 44px; } strong { color: var(--accent); }
Write the spine into deck.md with marp: true, theme: brand, size: 16:9, talk track in <!-- notes -->.
3. Export to PDF + PPTX and verify fonts embed (gotchas → references/markdown-decks.md):
npx @marp-team/marp-cli@latest deck.md --theme ./theme.css --pdf --pdf-outlines --pdf-notes
npx @marp-team/marp-cli@latest deck.md --theme ./theme.css --pptx # image-per-slide; NOT editable text
pdffonts deck.pdf # every font must read 'emb yes'
./scripts/verify.sh # lint + dry export + QA checklist
If the client will *edit* the slides, this is the wrong pipeline — rebuild with python-pptx (→
references/pptx-python.md), whose build_deck.py emits the same six slides as native editable shapes/charts.
@marp-team/marp-cli. Run pinned: npx @marp-team/marp-cli@latest deck.md --pdf. Exports HTML / PDF / PPTX / PNG / JPEG. Needs a Chromium-family browser (Chrome/Edge) or Firefox for PDF/PPTX/image export (v4 added Firefox via WebDriver BiDi as a fallback; Chrome/Edge are preferred and give the most faithful PDF). --pptx is image-per-slide; --pptx-editable is experimental and needs LibreOffice (soffice). --notes / a .txt output exports speaker notes. Node 18+. (→ references/markdown-decks.md)@slidev/cli (Vue-based). Scaffold npm init slidev@latest; dev slidev; export slidev export (PDF default; --format pptx|png). Export needs playwright-chromium installed in the project (npx playwright install chromium or npm i -D playwright-chromium). PPTX is image-per-slide; notes carry over per slide. Best for code-heavy / developer talks (live code, Monaco, Mermaid, Vue components). (→ references/markdown-decks.md)pip install python-pptx (current major 1.x, e.g. 1.0.x). Pure Python, no Office/LibreOffice needed to write .pptx. Creates masters/layouts, text, tables, native editable charts, images, speaker notes. Cannot render to PDF itself — convert via LibreOffice soffice --headless --convert-to pdf or open in Office. (→ references/pptx-python.md)references/markdown-decks.md)Always pin/verify the version in the target project before generating (marp --version, npx slidev --version, python -c "import pptx; print(pptx.__version__)"). Tooling moves; re-check rather than trusting memory.
marketing)The deck's words are conversion copy on a stage. Defer the *craft* to ../marketing/SKILL.md; this skill
enforces the deck-specific shape:
design)The deck's pixels are the brand's design system projected at 3 metres. Defer the *system* to
../design/SKILL.md; this skill enforces the deck-specific constraints (full depth →
references/slide-design.md):
[[NEEDS PROOF]], never fabricate one to fill a chart.| Anti-pattern | Why it's wrong | Do instead |
| --- | --- | --- |
| Topic-label headlines ("Market", "Team") | Forces the audience to find the point | Assertion headline that states the point |
| Wall of bullets / paragraphs on a slide | Audience reads instead of listening; nothing lands | One idea, ≤ ~6 lines; move detail to notes/appendix |
| Reading the slides verbatim | The slide and the talk become redundant | Slide = the visual; you = the narration; notes = the script |
| Tiny text to fit more | Unreadable from the back; signals filler | Split into more slides; raise the floor, not lower it |
| Hand-picked hex per slide | Drifts off-brand, inconsistent | Map design tokens once into the theme |
| Rainbow charts, 3-D pies, dual axes | Decoration over meaning; misleads | One highlighted series; direct labels; honest axes |
| Generic stock photos + purple gradient | Reads as "AI deck"; no identity | Brand imagery + token palette + a real type pairing |
| Every-element animation, slow transitions | Noise; tanks pacing; nausea | One fast transition family; builds that reveal meaning |
| Exporting PPTX from Marp/Slidev and calling it "editable" | Slides are flattened images, not text | Use python-pptx when editability is required |
| Fonts not embedded in the PDF | Renders with fallback fonts on other machines | Embed fonts; verify (see exports gotchas) |
| Invented metrics to fill a chart | Destroys credibility in the room | Cite the source; mark gaps [[NEEDS PROOF]] |
# --- Markdown: Marp (PDF is the hero; PPTX = images) ---
npx @marp-team/marp-cli@latest deck.md --theme ./theme.css --pdf # vector PDF, fonts embedded
npx @marp-team/marp-cli@latest deck.md --theme ./theme.css --pdf --pdf-outlines --pdf-notes
npx @marp-team/marp-cli@latest deck.md --pptx # image-per-slide PPTX
npx @marp-team/marp-cli@latest deck.md --pptx --pptx-editable # experimental, needs soffice
npx @marp-team/marp-cli@latest deck.md --notes notes.txt # speaker notes only
# --- Markdown: Slidev (code-heavy talks) ---
npm init slidev@latest # scaffold
npx slidev # dev server (localhost:3030)
npx playwright install chromium # one-time, for export
npx slidev export # PDF (default)
npx slidev export --format pptx # image-per-slide PPTX
# --- Native editable PPTX (python-pptx) ---
pip install python-pptx
python build_deck.py # your generator (see ref)
soffice --headless --convert-to pdf deck.pptx # PPTX -> PDF via LibreOffice
# --- Fallback: any HTML deck -> PDF ---
npx decktape reveal http://localhost:8000 deck.pdf
# --- Verify before shipping ---
./scripts/verify.sh # warn-by-default; lint sources + dry export + import check
./scripts/verify.sh --strict # gate CI (warnings become failures)
Run before claiming done — each line is a defect if unchecked. scripts/verify.sh automates the
mechanical subset.
[[NEEDS PROOF]], none invented.references/slide-design.md, "Diagnostic rubric").In a project with a 02-DOCS/ layer (the harness Karpathy wiki), read
02-DOCS/wiki/stack/presentations.md first and stay consistent with it; create or refresh it when
missing or stale, and index it in 02-DOCS/wiki/index.md. It records this project's real choices: the
chosen pipeline (Marp / Slidev / python-pptx) and why, the theme file path and how it maps the design
tokens, the standard deck arc(s), export commands and the canonical output, the presenter-vs-leave-behind
convention, and font-embedding / asset-location notes.
The deck theme is downstream of the design tokens: always reconcile that article with
02-DOCS/wiki/stack/design.md so the deck and the product share one palette and type system.
No 02-DOCS/ layer? Skip silently (optionally suggest harness). Unlike the brand study, deck
conventions are *recorded, not gated* — never block the task on this.
Take ericrisco/presentations from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference pip, npm, npx.
Without those the skill loads but fails at the first command.