# Presentation Generator

> Create stunning slide decks from notes — vibe → preview → craft. Self-contained HTML plus editable PowerPoint. 75 themes, Studio share links, MCP craft gates. Use for pitch decks, investor updates, keynotes, product launches, sales demos, and any presentation request.

- Skill: `isatimur/presentation-generator` (Agent Skill, multi-file: 71 files)
- Install (CLI): `npx skillmds@latest add isatimur/presentation-generator`
- Raw SKILL.md: https://api.skillmd.com/api/skills/isatimur/presentation-generator/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- License: MIT
- Author: isatimur (https://skillmd.com/u/isatimur)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/isatimur/presentation-generator

---


# Presentation Generator

Create stunning slide decks with an AI coding agent — HTML you own, plus editable PowerPoint when the room needs Office.

**Default first win (no schema lecture):** ask for a deck → show three vibes → scaffold → hand the user a Studio share link.

```text
User: "Series A pitch for our AI infra startup — bold, not corporate"
You:  preview_themes (safe + bold + wildcard) → user picks
      scaffold_deck(purpose, theme) → return studio_share_url (?d=)
      fill copy → audit_deck → render / export PPTX if asked
```

Gallery + Studio (zero install): https://presentation-md.vercel.app

---

## Progressive disclosure (load only what you need)

This `SKILL.md` is the workflow map. Open supporting files on demand — do **not** dump schema, all 75 themes, or layout encyclopedias into context before the user has a vibe.

| File | Purpose | Load when |
| --- | --- | --- |
| `SKILL.md` (this file) | Workflow + first-win path | Always |
| `references/theme-shortlists.json` | Use-case vibe shortlists | Phase 1 (vibe) |
| `references/stunning-25.md` | Flagship craft ceilings | Phase 1 when brief matches |
| `references/theme-selection-index.json` | Compact theme metadata | Phase 1 shortlist |
| `references/themes.md` | One-liners for all 75 | Only if shortlists miss |
| `references/layout-recipes.md` | Pitch / launch / wrap slide maps | Phase 3 (craft) |
| `references/deck-schema.md` | Layout prop reference | Phase 3 while emitting JSON |
| `references/anti-slop-bans.md` | Banned AI-slop aesthetics | Before custom styling |
| `references/custom-html-recipes.md` | Schema-safe art escapes | Only for intentional art beats |
| `references/animation-patterns.md` | Motion on direct-HTML path | Direct-HTML only |
| `references/pptx-import.md` / `markdown-import.md` | Import bridges | When converting existing decks |

---

## Phases — vibe → preview → craft → share

### Phase 0 — Mode

- **New deck** → Phase 1
- **Convert PPTX / Markdown** → `import_pptx` / `import_markdown` (see import refs), then Phase 2
- **Enhance existing** → open Studio / Deck JSON; remorph or retheme; skip discovery if vibe is locked

### Phase 1 — Vibe (ask once, together)

Collect purpose, length/density, content readiness, and a rough mood. Prefer intelligent defaults over interrogation (≤3 clarifying questions).

Do **not** ask the user to memorize theme names or layout enums.

### Phase 2 — Preview (show, don’t tell)

Shortlist **3** themes: **1 safe · 1 bold · 1 wildcard**. Call `preview_themes` (inline PNGs on by default; ≥2 themes → layouts mode). User picks visually.

If they already named a theme/alias/brand URL, skip to Phase 3 (`import_brand_theme` for brand match).

### Phase 3 — Craft

**Preferred first hop when MCP is available:**

1. `scaffold_deck(purpose, theme)` → craft-floor skeleton + **`studio_share_url`**
2. Fill real copy (no lorem)
3. `audit_deck` (`apply_safe_fixes` / `remorph_density` as needed) then `judge_deck` (t1+)
4. `render_deck` / export PPTX / hand Studio link

Only open `references/deck-schema.md` and layout details when emitting or repairing JSON. Prefer recipe maps in `references/layout-recipes.md` over freehanding 14-slide feature-grid funerals.

**Direct-HTML fallback** (no tooling): single self-contained `.html`, internal CSS only, fixed 16:9 stage — see Rendering Guidelines below.

### Phase 4 — Share

Always surface the editable handoff: `studio_share_url` / `share_deck_link` / Studio **Copy link**. Optional: `export_deck` (PPTX / PDF / MD / notes), `deploy_deck` (confirm-gated).

---

## Install (any agent)

```bash
npx @presentation-md/install claude-code   # or: cursor | copilot | codex | gemini-cli | cli
```

```bash
npx skills add isatimur/presentation-md --skill presentation-generator
```

```text
/plugin marketplace add isatimur/presentation-md
/plugin install presentation-md@presentation-md
```

Then restart and ask for a deck — or `/slides <brief>` in Claude Code.

---

## Four verbs (after the first win)

| Verb | What it does |
| --- | --- |
| **scaffold / build** *(default)* | `scaffold_deck` → Deck JSON + **`studio_share_url`**. One hop to an editable Studio link. |
| **audit** | `audit_deck` (+ `apply_safe_fixes` / `remorph_density`) then `judge_deck` — schema-valid ≠ shippable. |
| **remorph / retheme** | `apply_theme` · `remorph_density` · Studio **My deck restyle** / `preview_themes` with `json`. |
| **share** | Hand `studio_share_url` / Studio **Copy link**. Optional PPTX/PDF/deploy. |

Studio: https://presentation-md.vercel.app/studio — live edit, present, export PPTX. Craft controls (`ratio`, `emphasis`, `bento`, `notes`, …) live in Deck JSON and the Studio form; set them when crafting, not when discovering vibes.

Honest compares: [vs frontend-slides](https://presentation-md.vercel.app/vs/frontend-slides) · [vs Hallmark](https://presentation-md.vercel.app/vs/hallmark)

---

## Narrative Architecture — Before You Write One Slide

The biggest mistake in presentations: **jumping straight to content without building the story spine.**

Every deck needs a dramatic arc. Use one of these:

### The Problem-Solution Arc (pitches, sales)
```
Hook → Pain → Insight → Solution → Proof → Vision → Ask
```

### The Revelation Arc (keynotes, product launches)
```
Context → Surprising Claim → Evidence → Mechanism → Implications → Call to Action
```

### The Decision Arc (investor updates, board decks)
```
Situation → Complication → Resolution → Forward Guidance → Risk Register → Recommendation
```

### The Transformation Arc (before/after, case studies)
```
World Before → The Turning Point → The Method → World After → What's Next
```

**The tension law:** every slide should create a tiny question in the audience's mind that the next slide answers. If a slide answers a question no one was asking, cut it.

---

## The 18 Layout Types

Each layout is a tool. Match the layout to the job, not to the order.
**Only these eighteen names are valid in deck JSON** (`references/deck-schema.md`). If you need a
"manifesto" or "metric-hero" *feeling*, compose it with the closest layout below — never invent a layout name.

### `title` — Single cinematic statement
**When to use:** opening cover, or a one-idea hero beat.
**Props:** `{ heading, lead?, eyebrow? }`
**Design rule:** heading fills most of the vertical space. Nothing competes with it.
**Compose:** a "manifesto" = `title` with an enormous one-sentence `heading` and empty `lead`.

### `section` — Rhythm break
**When to use:** between major acts. Resets cognitive load. Creates anticipation.
**Props:** `{ heading, number?, eyebrow? }`
**Design rule:** almost empty is correct — type itself is the visual.

### `two-column` — Argument + evidence
**When to use:** explaining a concept with supporting copy, a side image, or a pull-aside.
**Props:** `{ heading, lead?, body?, image?, imageAlt?, aside?, ratio?: "1-1"|"2-1"|"1-2"|"3-2"|"2-3", reverse? }`
**Compose:** "photo-story" = `two-column` with `image` + caption in `lead`/`body`. Asymmetric craft = `ratio: "2-1"` (or `"1-2"`) so type or media dominates; `aside` for a quote panel when there's no image; `reverse: true` flips media to the left.
**Craft tip:** Prefer `ratio` + `aside` over a balanced 50/50 when the slide needs a pull-quote or one dominant claim — balanced columns read as template; asymmetry reads as designed.

### `image-hero` — Full-bleed cinematic moment
**When to use:** emotional beat, product shot, team photo, location reveal — one image carries the slide.
**Props:** `{ heading, lead?, eyebrow?, image, imageAlt? }`
**Design rule:** the image is the hero; text sits on a bottom scrim. Keep copy short — one headline, one line max.

### `comparison` — Side-by-side contrast
**When to use:** before/after, old way vs new way, us vs them, option A vs B.
**Props:** `{ heading?, leftLabel?, left, rightLabel?, right, eyebrow?, emphasis?: "left"|"right" }`
**Design rule:** parallel structure in both columns — same kind of claim on each side so the contrast reads instantly. Use `emphasis` to grow the winning column.
**Craft tip:** Always set `emphasis` toward the winning side in a sales or pitch deck — equal-weight comparisons feel undecided.

### `feature-grid` — Capabilities overview
**When to use:** product features, service offerings, team skills.
**Props:** `{ heading, cards: [{ icon?, title, body? }], columns?: 2|3|4|"bento" }` (3–6 cards)
**Design rule:** odd counts (3, 5) feel more dynamic than even. `"bento"` = asymmetric hero + four supporting cards.
**Craft tip:** For 5 cards on `genz-bento`, `playful`, or any hard/soft bento surface, prefer `columns: "bento"` so the first card becomes a hero tile — mirrors the handcrafted gallery energy.

### `stat-row` — Proof through numbers
**When to use:** traction, market size, ROI validation — or a single room-stopping metric.
**Props:** `{ heading?, stats: [{ value, label }] }` (1–5 stats)
**Design rule:** the number is 3–4× the label. For a "metric-hero", use **one** stat and a short heading.

### `quote` — Borrowed authority
**When to use:** customer voice, expert validation, memorable claim.
**Props:** `{ quote, by? }`
**Design rule:** the quote should work as a tweet. If it wouldn't, find a better quote.

### `timeline` — Progress and plan
**When to use:** GTM roadmap, implementation steps, historical trajectory, "how it works".
**Props:** `{ heading, steps: [{ title, body? }] }`
**Compose:** a "process" flow = `timeline` with numbered titles (`"01 · Sign up"`, …).

### `data-table` — Detailed evidence
**When to use:** financial summary, feature matrix, risk register, multi-column comparison grid.
**Props:** `{ heading, columns: string[], rows: string[][], eyebrow?, lead? }`
**Compose:** a competitive matrix with 3+ columns = `data-table`; a simple A-vs-B story = `comparison`.

### `code` — Snippet / API proof
**When to use:** developer demos, SDK install, one-file "aha", CLI recipes — when the product *is* the code.
**Props:** `{ heading?, lead?, eyebrow?, code, language?, filename? }`
**Design rule:** keep the snippet short (≤18 lines). Prefer a real filename in chrome. Never invent syntax highlighting markup — plain text only (renderer escapes HTML).

### `chart` — Data visualization
**When to use:** trends, composition, ranked series — when a table or stat-row is not enough.
**Props:** `{ heading?, lead?, chartType?: "bar"|"horizontal-bar"|"line"|"area"|"pie"|"donut", categories?, series: [{ name?, values }], showLegend?, showValues?, stacked? }`
**Design rule:** one chart job per slide. Prefer `bar`/`line` for trends; `pie`/`donut` for share (single series). Theme colors drive series fills automatically.
**Craft tip:** Set `showValues` only when the exact number matters more than the shape — otherwise let the marks speak.

### `custom-html` — Schema-safe art escape hatch
**When to use:** one-off frontend-slides craft that no layout covers — without abandoning Deck JSON / Studio / theme tokens. At most **one** intentional art beat per deck unless the brief is pure poster.
**Props:** `{ heading?, lead?, html }`
**Design rule:** use theme CSS variables (`var(--accent)`, `var(--heading-font)`, …). Scripts and event handlers are stripped. PPTX approximates `custom-html` to text — ship HTML when the art is the point. Theme surface chrome (grids, rails, mastheads, soft washes, hard frames, Win95 bars, electric-studio split/rail, studio acid frame, grove monograph rules, etc.) is approximated as native PPTX shapes for every theme package. Pulse / risograph / candy-pop get denser soft-blob + frame stand-ins; Pulse eyebrows render as filled chips; candy-pop cards get hard ink borders (not just slide chrome). Paper/editorial themes keep quiet fiber grain as HTML-only — PPTX carries rules/washes/mastheads. True `mix-blend-mode` / animated marquees remain HTML-only.
**Recipes:** `references/custom-html-recipes.md` — split panels, big-number + hairline, poster stamp stack, typographic explosion. Prefer those over inventing sticker piles.

### `closing` — The ask / CTA
**When to use:** every deck ends here. Make the next action unmissable.
**Props:** `{ heading, lead?, actions?: [{ label, href?, style?: "solid"|"outline"|"ghost", icon? }], cta?: { label?, href? } }`
**Design rule:** one primary action by default. For wrap/share/store/launch/investor duals, use `actions[]` with solid + outline pills (max 3) and an `icon` on every pill (FA brands for social; rocket/download/calendar for CTAs). `cta` is an alias for `actions[0]`. Stunning-25 **and** launch/investor closings prefer dual asks with icons — a lone `cta` trips `audit_deck`.

### `streak-grid` — Day-streak / habit cells
**When to use:** year-wrap streak beats, habit calendars, filled-vs-empty progress grids.
**Props:** `{ heading?, lead?, filled, total?, cols?, body? }`
**Design rule:** keep `total ≤ 120`. Prefer over `custom-html` squares. PPTX maps to rounded rects.

### `metric-ring` — Circular KPI
**When to use:** percentile flex, completion %, single hero ring KPI (Pulse / Verdant / Bounce energy).
**Props:** `{ heading?, value, label?, pct?, lead?, body? }`
**Design rule:** omit/`pct: 100` = full badge ring; `1–99` = arc progress. Prefer over a lone stat chip when the ring is the story.

---

## The Themes — Visual Identity System

Each theme is a complete design language: colors, typography, geometry, motion, and soul.
**Do not memorize 75 palettes here** — discover them from references (progressive disclosure):

1. **Use-case shortlists** — `references/theme-shortlists.json` (Series A, developer demo, wrap, …)
2. **Compact vibe table** — `references/themes.md` (all 75 one-liners)
3. **Selection index** — `references/theme-selection-index.json` (mood, best_for, aliases, gallery)
4. **Stunning twenty-five** — `references/stunning-25.md` (flagship craft ceilings + Studio `?example=`)
5. **Layout recipes** — `references/layout-recipes.md` (pitch / launch / wrap / neon / poster / paper / hud / modernist / soft-product / playful / neon-tech / data-editorial / scatterbrain slide maps)
6. **Visual pick** — MCP `preview_themes` / `list_themes` (never ask the user to choose from bare names)

Install: `npm i @presentation-md/theme-<name>`. Scaffold: `npx @presentation-md/create-theme`.
Brand match: `import_brand_theme` MCP or `npx @presentation-md/create-theme --from-url …`.

When a brief matches a stunning-25 vibe, open that structured proof and match its craft ceiling —
do not invent a watered-down palette.

**Default craft bar (beat Gamma / Beautiful.ai / md-slides / Claude Design canvas / frontend-slides on first glance):**
1. **One-shot bar** — the first deck JSON must already clear anti-slop + craft gates. Do not ship a "vibe draft" and hope a second pass fixes it.
2. Open a stunning-25 structured proof before writing slides — match density, type scale, and asymmetry. Prefer stunning-25 / popular shortlists when the brief matches; never invent a watered-down palette.
3. **Density lock** — choose speaker-led vs reading-first once with purpose; keep that density for the whole deck (never mix cramped reading copy into a speaker talk).
4. Prefer `image-hero` or a composed visual beat on slide 1 for investor/launch/brand decks.
5. Force asymmetry early: `comparison` + `emphasis`, `two-column` with non-1-1 `ratio`, or `feature-grid` `columns: "bento"`.
6. Run `audit_deck` then `judge_deck` (`t1` minimum, `t2` before delivery). Schema-valid ≠ shippable.
7. Read `references/anti-slop-bans.md` — Inter/purple/cream-terracotta defaults are banned unless the theme owns them.
8. Prefer theme-native PPTX chrome (paper washes, masthead double rules, hero-gated candy/pills/corner blots on `soft-editorial` / `capsule` / `long-table` / `paper-ink`; always-on hard frames / offset-shadow strips / plates / tablets / multi-layer arcade shadows / Win95 bevels on `stencil-tablet` / `retro-zine` / `daisy-days` / `block-frame` / `creative-mode` / `sakura-chroma` / `8-bit-orbit` / `retro-windows` / `scatterbrain`; neon rim/scanlines/horizon glow/soft aero shadow on `neon-noir` / `vaporwave` / `y2k-aero`; poster hatch/speckle frames + hard cards on `coral` / `peoples-platform` / `bold-signal`; hard-card strokes on `genz-bento` / `brutalist-acid` / `bauhaus` / `neo-grid-bold` / `bold-poster` / `raw-grid` / `creative-voltage` / `kinetic-wrapped`; HUD grid/reticle chrome on `aerospace-hud` / `blueprint` / `crt-terminal`) over inventing flat card stacks — export is a craft surface, not a screenshot dump.
9. When the brief is paper/editorial (`soft-editorial`, `heritage-editorial`, `emerald-editorial`, `vintage-editorial`, `pink-script`, `claude`, `paper-ink`, `long-table`), write magazine cadence — short literary leads, one quote beat, comparison with emphasis — not SaaS three-up grids.
10. Open `references/layout-recipes.md` and match a slide-count contract for the brief (pitch, launch, wrap, neon, poster, paper, hud, modernist, hard-bento, glass, electric, briefing, quiet-luxe, soft-product, playful, neon-tech, data-editorial, scatterbrain) before freehanding layouts.


## Typography Hierarchy — The Scale System

Great presentations use exactly 4 type sizes, never more:

| Role | Size | Weight | Usage |
|------|------|--------|-------|
| Display | 4–8rem | 800–900 | Cover headlines, hero metric values |
| Heading | 2–3rem | 700 | Slide titles |
| Body | 0.9–1rem | 400–500 | Explanatory copy, bullets |
| Caption | 0.75–0.85rem | 400 | Sources, labels, footnotes |

**The contrast law:** adjacent text blocks must differ by at least 1.5× in size OR weight OR color. Never change just one axis on similar-importance content.

**The line-length law:** headings: ≤ 8 words. Body: ≤ 12 words per line. Bullets: ≤ 7 words each.

---

## Color & Consistency — The Rules That Separate Good from Great

**Rule 1 — The 60-30-10 ratio.** 60% background neutral, 30% secondary (cards, surfaces), 10% accent (calls to action, data highlights, emphasis). Never invert this.

**Rule 2 — One warm, one cool.** Every great palette pairs one warm tone with one cool tone. Violet + cyan. Navy + gold. Coral + lime. They create visual tension that keeps eyes moving.

**Rule 3 — Earn your accent.** If you use your accent color on more than 15% of any slide's surface area, it stops being an accent. It becomes noise. Make the audience work for the highlight.

**Rule 4 — Token discipline.** Every color and font on every slide comes from the chosen theme's tokens — nothing else. No off-palette one-off, no hand-picked hex "just for this slide," no default-to-blue because it feels safe. One deck, one palette, one type system, applied identically from cover to close. Inconsistency is the fastest way to look unfinished.

**Rule 5 — One motif, repeated.** Pick a single distinctive visual device — a card frame, an icon-in-circle treatment, a corner tick, a consistent chart style — and repeat it on every slide. Repetition reads as craft; a brand-new decorative idea on each slide reads as chaos. Let the subject inform the accent, not habit.

---

## Animation & Motion — The Timing System

All CSS animations in this skill follow a choreography hierarchy:

| Element | Delay | Duration | Easing |
|---------|-------|----------|--------|
| Slide background | 0ms | instant | — |
| Main headline | 0ms | 400ms | ease-out |
| Supporting content | 100ms | 350ms | ease-out |
| Cards / grid items | 150ms + 60ms×n | 300ms | ease-out |
| Decorative elements | 200ms | 500ms | ease-in-out |

Use `@keyframes fadeUp` universally: `from { opacity:0; transform:translateY(20px) }`.

**The breathing rule:** every slide needs at least 40px of "air" on all sides. Crowded slides signal anxiety to audiences and undermine trust.

---

## The 7 Laws of the Unforgettable Slide

1. **One job per slide.** If you can describe what a slide does in more than one sentence, split it.

2. **The 3-second rule.** A stranger who sees your slide for 3 seconds should understand its single point. If they can't, redesign.

3. **Data needs context.** "87% retention" means nothing. "87% retention — industry average is 34%" is a story.

4. **Avoid the river of bullets.** Bullets are for grocery lists. Presentations are for ideas. Rewrite bullets as short provocations or kill them entirely.

5. **The slide before the big reveal is the most important slide.** It creates the question. The big reveal slide just answers it. Invest in the setup.

6. **White space is confidence.** Filling every pixel signals insecurity. Empty space says: "We don't need to convince you with volume."

7. **The last slide is the first slide people remember.** They leave the room thinking about it. Make it the strongest statement in the deck, not a list of contact info.

---

## Complete Deck Templates

Canonical slide maps (pitch, sales, keynote, investor, launch, wrap, neon, poster, paper)
live in `references/layout-recipes.md` — open that file and match a recipe before freehanding
layouts. Keep layout-count discipline; write theme-native voice on top.

---

## The Deadly Sins of Presentation Design

1. **The Wall of Text** — More than 40 words on a slide is a document, not a slide.
2. **The Identical Grid** — Every slide using the same layout is a PowerPoint funeral.
3. **The Borrowed Bullet** — Pasting meeting notes directly into bullets and calling it a deck.
4. **The Missing Tension** — No question set up → no answer satisfying. Every slide should create or resolve tension.
5. **The Timid Headline** — "Q1 Update" says nothing. "Q1: Our best quarter ever — here's why it happened" says everything.
6. **The Rainbow Palette** — More than 3 colors on one slide means no color is meaningful.
7. **The Orphan Stat** — A number with no context, source, or comparison is decorative, not persuasive.
8. **The Graveyard Outro** — Ending with "Questions?" or your LinkedIn URL. End with your strongest statement.
9. **The Premature Close** — Asking for the sale before building desire. The close should feel inevitable, not pushy.
10. **The Crowded Canvas** — Padding under 32px on any edge. Margins are not wasted space.
11. **The Inconsistent Accent** — Using your accent color on 8 different things. It signals everything and means nothing.
12. **The Slide Count Ego** — 47 slides for a 30-minute meeting. Edit ruthlessly. The best decks have the fewest slides that get the job done.

### The AI-Slop Tells — instant credibility killers

These are the details that make a deck read as machine-generated. A reviewer clocks them in under a second, and every one is avoidable.

13. **The Accent Line Under the Title** — a thin decorative rule slapped beneath every heading is the single clearest fingerprint of an AI-generated slide. Let type size, weight, and whitespace establish the hierarchy. Never draw a line under a title just to fill the gap.
14. **The Text-Only Slide** — every slide earns at least one deliberate visual element: a chart, an icon, an image, a shape, a pull-stat. Words floating alone in the middle of a slide are a memo, not a presentation. (The `section` and manifesto-style `title` layouts are the intentional exceptions — there the *type itself* is the visual.)
15. **The Centered Paragraph** — center a hero headline if you like, but body copy, bullets, and multi-line captions are always left-aligned. Centered running text has a ragged left edge the eye can't track.
16. **The Overflow** — nothing falls off the slide and nothing overlaps. Every element sits inside the safe margin with real breathing room around it. Text clipped at the edge or a chart crashing into a caption instantly reads as broken.
17. **The Low-Contrast Whisper** — light text on a light surface, or dark on dark. Body text must clear a genuine contrast ratio (aim WCAG AA, ~4.5:1). "It looks fine on my monitor" fails in a bright conference room every time.
18. **The Italic Crutch** — reaching for `italic` to signal emphasis, a quote, or "elegance" is a font-rendering roulette: most of the display fonts in these themes don't ship a true italic, so the browser fake-slants the roman weight and it reads as broken, not intentional. Get emphasis from weight, size, color, or space instead.

---

## Theme Discovery (show, don't tell)

Do **not** ask the user to pick a theme from a bare name list when they are unsure.
Match frontend-slides' mandatory visual discovery — but with structured themes + MCP + a **one-shot quality bar** so the first draft already beats their vibe-pack defaults. Studio matches that bar in-product: Generate modal **live Title/Bento/Compare shot strip on by default**, theme pick-3 **auto-enables live My deck restyle** (selected slide re-themed in each slot — content-true, not a canned gallery; Craft proofs Title/Bento/Compare still one toggle away) when the tray hits 3, and Example featured trio shows the **same shared-iframe shot strip** (scroll-crop densified — one live document per theme, not 3× iframes) plus **Compare 3 themes** → live theme tray.

### One-shot quality bar (beat frontend-slides first drafts)

frontend-slides wins on discovery UX; presentation-md wins when the **first** emitted deck is already shippable craft — not a purple SaaS skeleton.

1. **Stunning-25-first** — when the brief matches a flagship vibe, lock that theme (or a popular shortlist sibling) and open the structured proof / Studio `?example=` *before* writing slides.
2. **Density lock** — speaker-led vs reading-first chosen once; never mix cramped reading density into a live-talk deck (or vice versa). If density drifts after drafting, call `audit_deck` with `remorph_density` (or Studio **Speaker density** / **Reading density**, or CLI `--remorph-density`) before rewriting copy.
3. **Anti-slop gate** — read `references/anti-slop-bans.md` before any custom styling; ban Inter-only / purple-on-white / cream-terracotta / accent-underline titles / text-only content slides unless the chosen theme owns them.
4. **Layouts preview for pick-3** — `preview_themes` with ≥2 themes **auto-defaults to `mode: "layouts"`** (pass `mode: "title"` only for a cover skim). Pass `json` (Deck JSON) to restyle **your** slides across the pick (Studio My deck parity; optional `slide_index`). Inline PNGs attach as MCP image content by default — compare in-chat, then `apply_theme`.
5. **Craft gates before ship** — `audit_deck` then `judge_deck` (t1→t2). Schema-valid ≠ shippable. Fix asymmetry, emphasis, dual CTA, image-hero, data beat, notes.

Default when vibe is vague: a popular shortlist + one stunning-25 bold option in the preview mix — never three near-identical safe corporate looks.

1. Read `references/theme-selection-index.json` (mood, best_for, avoid_for, scheme, **aliases**).
   - frontend-slides STYLE_PRESET names map via aliases: **Neon Cyber** → `neon-noir`,
     **Terminal Green** → `crt-terminal`, **Swiss Modern** → `swiss-typographic`.
   - **Stunning twenty-five:** when the brief matches a flagship vibe, read `references/stunning-25.md`
     and open that structured proof / Studio `?example=` before authoring.
   - Optional fast path: `references/theme-shortlists.json` — pick a use-case shortlist
     (Series A, developer demo, swiss agency, …) instead of scanning all 75.
     Prefer shortlists marked `"popular": true` when the vibe is vague.
   - `list_themes` returns `preview_url` + `studio_url` on **every** theme (stunning-25 →
     `?example=` craft; others → `?theme=` blank slate) plus `studio_example` / `gallery_url`
     when available — open those before authoring (show-don't-tell).
     `preview_themes` also returns `studio_share_url` (`?d=`) for the exact bake deck.
2. Shortlist **3** themes that fit purpose + audience + density. **Preview mix (mandatory):**
   - **1 safe / readable** theme (core-defaults, corporate, soft-product, quiet paper)
   - **1 bold / expressive** theme (stunning-25, neon, brutal/poster, wrap)
   - **1 wildcard** — either a second bold shortlist pick **or** a brand/import-driven custom direction
     that creates useful contrast (do not force three near-identical pastels)
3. **Required when tooling is available:** call `preview_themes` with those 3 names
   (writes `.presentation-md/theme-previews/<theme>-layouts-preview.html` for pick-3). **≥2 themes
   auto-defaults to `mode: "layouts"`** so body craft (cards, comparison, stats, quote, code)
   is visible — pass `mode: "title"` only for a cover skim. Open each file for the user —
   they pick visually, not from adjectives alone.
4. If MCP is unavailable, run:
   `npx @presentation-md/render preview.json -o previews/<theme>.html --theme <name>` three times
   (one title slide each).
5. After they pick, set `meta.theme` and proceed. Read `references/anti-slop-bans.md` before custom styling.
6. When a theme has a `gallery` field, open that craft deck as a multi-slide proof (not just the title preview).

If they already named a theme, alias, or brand URL, skip discovery (`import_brand_theme` for brand match).

### Density modes (ask once with purpose)

| Density | Best for | Design behavior |
|---------|----------|-----------------|
| **Speaker-led (low)** | Talks, keynotes, live pitches | One idea per slide, large type, generous space, 1–3 bullets max, more slides if needed |
| **Reading-first (high)** | Board packs, async review, handouts | Self-contained slides, structured grids/tables, tighter but intentional spacing |

Never shrink until cramped — split into more slides instead.

See also: `references/animation-patterns.md` for motion craft on the direct-HTML path.

---

## Parameters to Collect

Before generating, confirm (ask together when possible — purpose, length/density, content readiness):

| Parameter | What good looks like |
|-----------|---------------------|
| **Purpose** | "Raise a Series A" not "show investors stuff" |
| **Audience** | "Two partners at a16z who've seen 200 AI pitches" not "investors" |
| **Ask** | "$12M for 18 months of runway" not "funding" |
| **Density** | Speaker-led (low density, big type) vs reading-first (higher density, more self-contained) |
| **Vibe** | Theme discovery above, or describe the soul in 3 adjectives |
| **Content** | Raw notes, data, existing copy — the messier the better |
| **Constraints** | Time, slide count, branding rules |

Fill gaps with intelligent defaults (`theme-shortlists.json` / `list_themes` with `include_shortlists` — prefer `core-defaults` when vibe is vague). Never ask more than 3 clarifying questions.

---

## MCP Tools

Fourteen tools via `@presentation-md/mcp-server` (not the deprecated `@presentation-skill-pack/mcp-server` stub — it only redirects). Restart the client after switching packages.

| Tool | Use it to |
|------|-----------|
| `render_deck` | Convert deck JSON → polished HTML |
| `export_deck` | Export deck JSON → `.pptx`, vector PDF, html, **Markdown** (`format: "md"` — Marp round-trip), or **speaker-notes** handouts (`format: "notes_txt"` / `"notes_vtt"`) |
| `audit_deck` | Schema-validate + craft gates; optional `apply_safe_fixes` returns repaired JSON (fields + beat inserts: image-hero / comparison / data / logo-wall / wrap tones + theme-honesty leftovers); optional `remorph_density` (`speaker`/`reading`) for non-LLM structural density remorph |
| `list_themes` | See installed themes with vibe/description + proof deep-links (`preview_url` + always-on `studio_url`); filter with `browse` chips (site/Studio parity), shortlist, mood, or query; use `suggested_preview` (safe/bold/wildcard) for pick-3 |
| `apply_theme` | Swap `meta.theme` (default also runs `repairCraft` for theme honesty — Studio My deck Use parity; pass `apply_safe_fixes:false` for a pure swap) |
| `generate_deck_prompt` | Build a generation prompt wired to a theme + schema |
| `scaffold_deck` | Scaffold a recipe skeleton (pitch / launch / wrap / paper / …) with craft floors pre-wired — returns **`studio_share_url`** (`?d=`) by default for one-call editable Studio handoff; fill copy, then audit |
| `share_deck_link` | Encode Deck JSON → Studio `?d=` URL (Copy link parity) for editable user handoff after edits |
| `deploy_deck` | Opt-in Vercel preview via `deploy.sh` — **dry-run unless `confirm:true`** after human approval; `prod` needs `confirm_prod` |
| `preview_themes` | Render 1–3 theme HTML previews; **inline PNG screenshots** on by default; `studio_share_url` for the exact bake; pass `json` for Studio **My deck** restyle (content-true) + optional `slide_index`; `mode: "layouts"` for multi-slide craft bake |
| CLI `--preview-compare` | Same pick-3 craft bake + discovery PNGs without MCP: `presentation-md-render --preview-compare a,b,c` |
| `import_pptx` | Import a `.pptx` into deck JSON (see `references/pptx-import.md`) |
| `import_markdown` | Import Marp/md-slides Markdown → Deck JSON (`---` splits, ` ```chart ` / ` ```html `) |
| `judge_deck` | Design judge — `tier` t0/t1 JSON gates; **t2** HTML metrics + Chrome shots (**inline PNGs** by default); **t3** panel or agent rubric |
| `import_brand_theme` | Generate a theme from a brand URL or CSS file |

---

## Rendering Guidelines

- **Direct to file** when inside a repo: write `<slug>/deck.html`
- **Code block** when copy-paste is requested: wrap the rendered HTML in a fenced code block, no surrounding explanation
- **No framework imports** — all CSS is internal, no Tailwind/Bootstrap/React
- **No lorem ipsum** — all copy must be plausible, specific, and consistent with the brand
- **Deck-spec path:** use the renderer — it ships 16:9 slides, scroll-snap, keyboard arrows, `.nav-hint`, entrance motion, and `prefers-reduced-motion`
- **Direct-HTML path:** match that craft — scroll-snap, arrow keys, print-safe `@media print`, hide `.nav-hint` when printing
- **Never `display: grid` (or `flex`) directly on an `<li>` that contains inline elements** (`<code>`, `<span>`, `<a>`) — the browser wraps each inline child in an anonymous block box to satisfy the grid formatting context, which silently breaks bullet alignment and spacing. Put the grid/flex on a wrapper `<div>` inside the `<li>` instead, or keep the `<li>` a plain block and let its child own the layout.

---

## Import from Markdown

Marp / md-slides authors can bridge into Deck JSON without rewriting slides:

```bash
presentation-md-render --from-md ./deck.md -o deck.json --theme kinetic-wrapped
```

Or call `import_markdown`. Front matter sets `theme` / `title` / `company`. Slides split on `---`.
Use fenced ` ```chart bar ` CSV blocks for charts and ` ```html ` for custom-html art.

**Export the other way:** `presentation-md-render deck.json --format md -o deck.md`, MCP `export_deck` `format: "md"`, or Studio **Source ▾ → Download Markdown** — same Marp/md-slides dialect for round-trip.

## Import from PowerPoint

When the user already has a `.pptx`, import it into deck JSON first (don't retype slides):

```bash
presentation-md-render --from-pptx ./board-deck.pptx -o deck.json --theme claude
```

Or call the `import_pptx` MCP tool. Then review layouts, adjust copy, swap themes, and render/export as usual. Details: `references/pptx-import.md`.

---

## Export & Share

Once a deck is done, it can leave the browser two ways. Both scripts live inside *this skill's own directory*, not the user's project — resolve `<skill-dir>` to wherever this `SKILL.md` is installed (e.g. `~/.claude/skills/presentation-generator/` or the plugin's skill path) and invoke them from there, passing the deck's path as an argument:

- **PDF** — MCP `export_deck` with `format: "pdf"`, CLI `presentation-md-render deck.json --format pdf -o deck.pdf`, Studio **Source ▾ → Download PDF** (local Studio: headless Chromium blob via `/api/export-pdf`, same `@page` 16:9 as MCP/CLI; static hosts: client raster; print dialog last resort), or `bash <skill-dir>/scripts/export-pdf.sh ./deck.html [./output.pdf]`. MCP/CLI render through headless Chromium's print pipeline (not screenshots): vector output, selectable text, one page per slide via the deck's own `@media print` rule. Installs Playwright on first run. Good for email, Slack, Notion, or printing.
- **Live URL** — MCP `deploy_deck` / CLI `presentation-md-render deck.html --deploy` (dry-run by default) or `bash <skill-dir>/scripts/deploy.sh ./deck.html` (or a deck directory). Deploys to Vercel and prints a shareable URL that works on any device. Defaults to a **preview** deployment, not production — pass `--prod` / `prod:true` only once the human has confirmed it's fine to publish permanently. **Confirm with the human before running this**: it's an externally-visible action, and decks are often confidential drafts. MCP/CLI require `confirm:true` / `--confirm-deploy` to actually invoke deploy.sh (otherwise dry-run only). Requires `npx vercel login` once, interactively, beforehand. A single-file deck that references local images/fonts will be refused (they'd 404 once deployed) — inline them as `data:` URLs first, or deploy the deck's whole directory instead.

For native, editable PowerPoint, use the Studio export mentioned above instead — it's a different fidelity trade-off (editable shapes vs. exact CSS rendering).

---

## Self-Review Before You Ship

You have been staring at this deck while building it, so you now see what you *intended*, not what is actually on the slide. Assume there are problems and go find them — a deliberate review pass is not optional, even for a 3-slide deck.

**Tooling first (deck-spec path) — non-skippable when MCP/CLI is available:**
1. Call `preview_themes` (or open gallery structured proofs) before locking a vibe — never invent a palette.
2. Call `audit_deck` on the deck JSON — fix every `error`, then address `warning`s. Pass `apply_safe_fixes: true` to auto-fill safe structural craft **and insert missing beats** (image-hero, comparison, stat-row, logo-wall, wrap tones/ranked/streak, cadence swaps, theme-honesty leftovers, emphasis, ratio, bento, CTA/icons, speaker notes, candy-pop brand) and get back `json` + `fixes_applied[]`. Pass `remorph_density: "speaker"|"reading"` for a **non-LLM structural density remorph** (speaker splits crowded grids/lists + moves overflow body into notes; reading merges thin continuation lists + promotes notes onto thin bodies) — Studio craft panel + CLI `--remorph-density` parity. Prefer `scaffold_deck` when starting from a brief so the first JSON already clears craft floors.
3. Call `judge_deck` for craft gates (`tier=t1`). Escalate to `tier=t2` (HTML metrics + **inline slide PNGs**) before delivery; `tier=t3` when highest stakes.
4. Render with `render_deck` / CLI, open the HTML, and spot-check with keyboard arrows.
5. Re-run `judge_deck` at t2/t3 with attached shots → fix → re-score. Do not ship on schema-valid alone.

Then walk every slide against this checklist and fix before delivering:

- **Placeholder sweep** — search the output for leftover scaffolding: `Lorem`, `ipsum`, `XXXX`, `TODO`, `[`, `placeholder`, dummy numbers. Zero may survive.
- **Overflow & overlap** — nothing clipped at an edge, nothing colliding, every element inside the safe margin.
- **Contrast** — every text block is legible against its actual background (see AI-Slop Tell #17).
- **AI-slop tells** — no accent line under a title, no text-only content slide, no centered paragraphs.
- **Visual beat** — investor, launch, and brand decks need ≥1 real `image-hero` (composed SVG/data URI or asset). Icon grids alone are not a visual. Kinetic wraps may use ranked/streak/metric/hero-stat instead.
- **Present-mode craft** — add brief `notes` on 2–4 key slides; decks with ≥6 slides need a data beat (`chart` / `stat-row` / `data-table` / `ranked-list` / `metric-ring` / `timeline`); launch/investor closings prefer dual `actions[]` with icons (not a lone `cta`).
- **Asymmetry** — at least one `comparison` with `emphasis`, `two-column`, `code`, `ranked-list`, `logo-wall`, `streak-grid`, `metric-ring`, or `columns: "bento"` — never a stack of identical three-up cards.
- **Token discipline** — colors and fonts all trace back to the chosen

…(truncated)
