marp-deck
A deck here is a keynote: black or white, one idea per slide, type you can read from the back
of the room, and a picture whenever a picture says it better. This skill is the whole craft. Read
it once, then write.
1. The shape of a keynote
Every talk, whatever the subject, follows this arc. Use it as the outline; drop what the talk does
not need, never reorder what it keeps.
| # |
Slide |
Class |
What it does |
| 1 |
Opening |
hero |
The promise, in a sentence the audience will repeat. A wallpaper behind it. |
| 2 |
The world today |
statement |
The problem, felt from the audience's seat. No product yet. |
| 3 |
So we asked |
statement |
The question that led to the idea. Tension, not answer. |
| 4 |
The idea |
section |
The answer, named. A wallpaper. This is the reveal. |
| 5 |
Three pillars |
pillars |
What makes it work. Three names, three lines. Never four. |
| 6 |
See it |
image |
The product, the prototype, the screen — full bleed or in a device frame. |
| 7 |
The number |
number |
One figure, made human. "1,000 songs in your pocket", not "5 GB". |
| 8 |
Proof |
chart or quote |
A chart from real numbers, or one voice who tried it. |
| 9 |
Available |
closing |
When, where, how much. Plain. |
| 10 |
One more thing |
omt |
Optional. Only if there is really one more thing. |
| 11 |
Close |
hero |
The promise again, shorter. The wallpaper from slide 1. |
Ten slides for a ten-minute talk. A longer talk repeats 2–8 per act. A shorter one keeps 1, 4, 5,
7, 11. Section openers (section) mark each act.
2. Copy: write like the person on stage
- The headline is the sentence you would say out loud. Eight words or fewer. If it needs a
comma, it is two slides.
- Say what it does for someone, not what it is. Benefit, then feature — if the feature is
needed at all.
- One idea per slide. The check warns above 40 words; a keynote slide usually has fewer than
- Everything else goes in the speaker notes.
- Numbers made human. Convert to something a person can feel: time saved a day, songs in a
pocket, cups of coffee. Round it. One number per slide.
- Threes. Three pillars, three reasons, three words. Not two, not five.
- Verbs, plain words, no jargon. No "leverage", "seamless", "robust", "solution". No
adjectives that do not earn their place. No exclamation marks.
- Tension, then release. Problem, question, answer. The reveal slide is short; the audience
finishes the sentence.
- Speaker notes carry the argument (
<!-- notes --> under a slide). The slides carry the punch.
Write the notes as spoken sentences, two to five per slide, so the presenter can read them cold —
the pane's Presenter view shows them large beside the next slide, and that is where the user
rehearses.
- Never a bulleted paragraph on a slide. If a list is unavoidable, it is three lines of three
to five words each. The themes render lists as a clean stack with hairlines, no bullets.
3. Design: two themes, one accent, nothing else
Front matter — pick one theme for the whole deck:
---
marp: true
theme: keynote-dark # or keynote-light. Never both in one deck.
paginate: true
---
keynote-dark — black, white type. The keynote. Use it unless the talk is about paper, light,
health, or the user asks for white.
keynote-light — white, near-black type. Airy, daytime.
Rules the themes assume:
- Huge type, generous space. Headlines up to 132px. Do not shrink text to fit; cut words.
- One image per slide at most. Full bleed (
) or centred (). No image
next to a paragraph.
- Art is generated, not found. No clip art, no stock photos, no emoji, no icons. Wallpapers
for hero/section/closing, charts for numbers, device frames for screens (section 4). A photo
the user supplies goes full bleed or in a frame.
- One accent colour per deck,
#2997ff by default (links, chart bars). Change it only with a
reason, then keep it.
- Consistency is the design. Same overline style, same positions, same wallpaper palette
through the deck. Pick a palette on slide 1 and stay with it.
The slide classes
Set one per slide with a scoped directive on the slide's first line, then the content:
<!-- _class: hero -->

# The best way to give a talk.
Now on every Mac.
| Class |
Content |
Notes |
hero |
 + # headline + one line |
Centred, 132px, no page number. Slides 1 and 11. |
statement |
# one sentence (+ one quiet line) |
Left, 92px, wraps at 14 characters wide. Problem, question. |
section |
 + # name |
An act opener or the reveal. |
pillars |
#### overline + ## headline + a 3-column block (below) |
Three names, three lines. |
image |
 + one caption line |
Full bleed. Caption bottom-left. |
number |
# 3× + one line |
300px gradient figure. The line says what it means. |
chart |
## headline +  |
Centred, chart as wide as the slide. |
quote |
> the words + — who |
60px, curly quotes drawn for you. |
closing |
# headline + lines |
Availability: when, where, price. |
omt |
# One more thing. |
Then the next slide is the thing. |
| (none) |
#### overline + ## headline + text or a list |
The plain slide. Use rarely. |
Pillars block:
<!-- _class: pillars -->
#### What makes it work
## Three things.
<div class="columns">
<div>
### Fast
Opens before you sit down.
</div>
<div>
### Quiet
No fans. No noise. Ever.
</div>
<div>
### Yours
Every setting, on every device.
</div>
</div>
Blank lines inside the <div>s matter: they let Markdown render inside HTML. Keep them.
Other directives you may use: <!-- _paginate: false --> on a slide,  for a
half-image slide, / for a sized inline image, <!-- _color: … --> only
on an image slide whose picture is light. Nothing else; no inline styles, no other HTML.
4. Art: art.mjs, offline, in seconds
Every deck gets art. All of it is generated into assets/ from the toolchain, deterministic from a
seed, no network, no accounts:
# wallpapers: gradient light on black (or --light). Palettes: aurora sunset ocean graphite spectrum
"$MARP_TOOLCHAIN/art" wallpaper -o assets/hero.svg --palette aurora --seed 7
"$MARP_TOOLCHAIN/art" wallpaper -o assets/reveal.svg --palette aurora --seed 12
# a chart from the talk's real numbers: bar (default) or line, in the accent colour
"$MARP_TOOLCHAIN/art" chart -o assets/growth.svg --data "2023:12,2024:31,2025:64" --label "Teams on it" --type bar
# a screenshot or photo in a device, on a wallpaper: phone (default), laptop, window
"$MARP_TOOLCHAIN/art" frame -o assets/demo.svg --image assets/screen.png --kind laptop --palette ocean
- Same palette across the deck; vary
--seed so slides differ. Seeds 1–99 all look good.
- Charts only from numbers in the talk; never decorate. Four to six points, label the axis in
words (
--label). Add --light for keynote-light.
- Frames want a real image in
assets/ (PNG, JPG, WebP, SVG). Ask the user for the screenshot
if the talk shows a product and none is there; use a wallpaper image slide until it arrives.
- Never reference an image that is not in the workspace. The check fails the deck.
5. The check
"$MARP_TOOLCHAIN/check" # deck.md
"$MARP_TOOLCHAIN/check" other.md # another file
Writes .harness/verdict.json (what the pane header shows) and prints every finding. Errors: the
deck does not render, a slide is empty, an image is missing. Warnings: over 40 words on a slide, no
image anywhere in the deck, no heading on the first slide, fewer than three slides, no marp: true.
Ready = no errors and at least three slides. Polish = no warnings either. The viewer runs the same
check on every save; run it yourself to read the list.
6. Export
"$MARP_TOOLCHAIN/marp" deck.md --theme-set "$MARP_THEMES" --allow-local-files --no-stdin -o dist/deck.pdf
"$MARP_TOOLCHAIN/marp" deck.md --theme-set "$MARP_THEMES" --allow-local-files --no-stdin -o dist/deck.pptx
"$MARP_TOOLCHAIN/marp" deck.md --theme-set "$MARP_THEMES" --allow-local-files --no-stdin -o dist/deck.html
--theme-set is what makes the keynote themes real outside the viewer; without it the export falls
back to the default theme. PDF and PPTX render through a Chromium-family browser — the machine's, or
the headless one setup fetched when it had none; toolchain/doctor.sh says which. HTML needs nothing. --no-stdin matters in a tool
shell. Keynote (the app) opens the PPTX.
1---2name: marp-deck3description: Write a keynote-grade slide deck in Marp Markdown (deck.md) — the structure of a great talk, the copy rules, the two keynote themes and their slide classes, offline art (wallpapers, charts, device frames), the check, and the export.4---56# marp-deck78A deck here is a **keynote**: black or white, one idea per slide, type you can read from the back9of the room, and a picture whenever a picture says it better. This skill is the whole craft. Read10it once, then write.1112## 1. The shape of a keynote1314Every talk, whatever the subject, follows this arc. Use it as the outline; drop what the talk does15not need, never reorder what it keeps.1617| # | Slide | Class | What it does |18|---|-------|-------|--------------|19| 1 | Opening | `hero` | The promise, in a sentence the audience will repeat. A wallpaper behind it. |20| 2 | The world today | `statement` | The problem, felt from the audience's seat. No product yet. |21| 3 | So we asked | `statement` | The question that led to the idea. Tension, not answer. |22| 4 | The idea | `section` | The answer, named. A wallpaper. This is the reveal. |23| 5 | Three pillars | `pillars` | What makes it work. Three names, three lines. Never four. |24| 6 | See it | `image` | The product, the prototype, the screen — full bleed or in a device frame. |25| 7 | The number | `number` | One figure, made human. "1,000 songs in your pocket", not "5 GB". |26| 8 | Proof | `chart` or `quote` | A chart from real numbers, or one voice who tried it. |27| 9 | Available | `closing` | When, where, how much. Plain. |28| 10 | One more thing | `omt` | Optional. Only if there is really one more thing. |29| 11 | Close | `hero` | The promise again, shorter. The wallpaper from slide 1. |3031Ten slides for a ten-minute talk. A longer talk repeats 2–8 per act. A shorter one keeps 1, 4, 5,327, 11. Section openers (`section`) mark each act.3334## 2. Copy: write like the person on stage3536- **The headline is the sentence you would say out loud.** Eight words or fewer. If it needs a37 comma, it is two slides.38- **Say what it does for someone, not what it is.** Benefit, then feature — if the feature is39 needed at all.40- **One idea per slide.** The check warns above 40 words; a keynote slide usually has fewer than41 15. Everything else goes in the speaker notes.42- **Numbers made human.** Convert to something a person can feel: time saved a day, songs in a43 pocket, cups of coffee. Round it. One number per slide.44- **Threes.** Three pillars, three reasons, three words. Not two, not five.45- **Verbs, plain words, no jargon.** No "leverage", "seamless", "robust", "solution". No46 adjectives that do not earn their place. No exclamation marks.47- **Tension, then release.** Problem, question, answer. The reveal slide is short; the audience48 finishes the sentence.49- **Speaker notes carry the argument** (`<!-- notes -->` under a slide). The slides carry the punch.50 Write the notes as spoken sentences, two to five per slide, so the presenter can read them cold —51 the pane's Presenter view shows them large beside the next slide, and that is where the user52 rehearses.53- **Never a bulleted paragraph on a slide.** If a list is unavoidable, it is three lines of three54 to five words each. The themes render lists as a clean stack with hairlines, no bullets.5556## 3. Design: two themes, one accent, nothing else5758Front matter — pick one theme for the whole deck:5960```markdown61---62marp: true63theme: keynote-dark # or keynote-light. Never both in one deck.64paginate: true65---66```6768- `keynote-dark` — black, white type. The keynote. Use it unless the talk is about paper, light,69 health, or the user asks for white.70- `keynote-light` — white, near-black type. Airy, daytime.7172Rules the themes assume:7374- **Huge type, generous space.** Headlines up to 132px. Do not shrink text to fit; cut words.75- **One image per slide at most.** Full bleed (``) or centred (``). No image76 next to a paragraph.77- **Art is generated, not found.** No clip art, no stock photos, no emoji, no icons. Wallpapers78 for hero/section/closing, charts for numbers, device frames for screens (section 4). A photo79 the user supplies goes full bleed or in a frame.80- **One accent colour per deck**, `#2997ff` by default (links, chart bars). Change it only with a81 reason, then keep it.82- **Consistency is the design.** Same overline style, same positions, same wallpaper palette83 through the deck. Pick a palette on slide 1 and stay with it.8485### The slide classes8687Set one per slide with a scoped directive on the slide's first line, then the content:8889```markdown90<!-- _class: hero -->9192# The best way to give a talk.93Now on every Mac.94```9596| Class | Content | Notes |97|-------|---------|-------|98| `hero` | `` + `# headline` + one line | Centred, 132px, no page number. Slides 1 and 11. |99| `statement` | `# one sentence` (+ one quiet line) | Left, 92px, wraps at 14 characters wide. Problem, question. |100| `section` | `` + `# name` | An act opener or the reveal. |101| `pillars` | `#### overline` + `## headline` + a 3-column block (below) | Three names, three lines. |102| `image` | `` + one caption line | Full bleed. Caption bottom-left. |103| `number` | `# 3×` + one line | 300px gradient figure. The line says what it means. |104| `chart` | `## headline` + `` | Centred, chart as wide as the slide. |105| `quote` | `> the words` + `— who` | 60px, curly quotes drawn for you. |106| `closing` | `# headline` + lines | Availability: when, where, price. |107| `omt` | `# One more thing.` | Then the next slide is the thing. |108| (none) | `#### overline` + `## headline` + text or a list | The plain slide. Use rarely. |109110Pillars block:111112```markdown113<!-- _class: pillars -->114#### What makes it work115## Three things.116117<div class="columns">118<div>119120### Fast121Opens before you sit down.122123</div>124<div>125126### Quiet127No fans. No noise. Ever.128129</div>130<div>131132### Yours133Every setting, on every device.134135</div>136</div>137```138139Blank lines inside the `<div>`s matter: they let Markdown render inside HTML. Keep them.140141Other directives you may use: `<!-- _paginate: false -->` on a slide, `` for a142half-image slide, ``/`` for a sized inline image, `<!-- _color: … -->` only143on an image slide whose picture is light. Nothing else; no inline styles, no other HTML.144145## 4. Art: `art.mjs`, offline, in seconds146147Every deck gets art. All of it is generated into `assets/` from the toolchain, deterministic from a148seed, no network, no accounts:149150```sh151# wallpapers: gradient light on black (or --light). Palettes: aurora sunset ocean graphite spectrum152"$MARP_TOOLCHAIN/art" wallpaper -o assets/hero.svg --palette aurora --seed 7153"$MARP_TOOLCHAIN/art" wallpaper -o assets/reveal.svg --palette aurora --seed 12154155# a chart from the talk's real numbers: bar (default) or line, in the accent colour156"$MARP_TOOLCHAIN/art" chart -o assets/growth.svg --data "2023:12,2024:31,2025:64" --label "Teams on it" --type bar157158# a screenshot or photo in a device, on a wallpaper: phone (default), laptop, window159"$MARP_TOOLCHAIN/art" frame -o assets/demo.svg --image assets/screen.png --kind laptop --palette ocean160```161162- Same palette across the deck; vary `--seed` so slides differ. Seeds 1–99 all look good.163- Charts only from numbers in the talk; never decorate. Four to six points, label the axis in164 words (`--label`). Add `--light` for `keynote-light`.165- Frames want a real image in `assets/` (PNG, JPG, WebP, SVG). Ask the user for the screenshot166 if the talk shows a product and none is there; use a wallpaper `image` slide until it arrives.167- Never reference an image that is not in the workspace. The check fails the deck.168169## 5. The check170171```sh172"$MARP_TOOLCHAIN/check" # deck.md173"$MARP_TOOLCHAIN/check" other.md # another file174```175176Writes `.harness/verdict.json` (what the pane header shows) and prints every finding. Errors: the177deck does not render, a slide is empty, an image is missing. Warnings: over 40 words on a slide, no178image anywhere in the deck, no heading on the first slide, fewer than three slides, no `marp: true`.179Ready = no errors and at least three slides. Polish = no warnings either. The viewer runs the same180check on every save; run it yourself to read the list.181182## 6. Export183184```sh185"$MARP_TOOLCHAIN/marp" deck.md --theme-set "$MARP_THEMES" --allow-local-files --no-stdin -o dist/deck.pdf186"$MARP_TOOLCHAIN/marp" deck.md --theme-set "$MARP_THEMES" --allow-local-files --no-stdin -o dist/deck.pptx187"$MARP_TOOLCHAIN/marp" deck.md --theme-set "$MARP_THEMES" --allow-local-files --no-stdin -o dist/deck.html188```189190`--theme-set` is what makes the keynote themes real outside the viewer; without it the export falls191back to the default theme. PDF and PPTX render through a Chromium-family browser — the machine's, or192the headless one setup fetched when it had none; `toolchain/doctor.sh` says which. HTML needs nothing. `--no-stdin` matters in a tool193shell. Keynote (the app) opens the PPTX.