Slide Maker

Generate presentation decks grounded in real GitHub projects, or walk through a structured brief-to-slides process.

Fork and run
Create an account to run on Jetty. Free for your first 10 runs.
Run time8–15 mins
Version1.2.0
Agent + Model
claude-codeclaude-sonnet-4-6

Example runs

Example 1

Investor pitch deck for Jetty

A bold-signal pitch deck grounded in the Jetty MCP skills repo — exported to a printable deck.pdf.

Inputs

Modecreate
Style presetbold-signal
Source repo URLjettyio/jettyio-skills
Goal or update instructionsinvestor pitch deck for Jetty (jetty.io), the agentic evaluation platform for AI/ML workflows

Acceptance checklist

10/10 checks passed.
  • Spec completeness
  • Through line
  • Source grounding
  • Density
  • No internal leakage
  • No LLM tells
  • Compilation
  • PDF export
  • Results hygiene
  • Output files

Runbook

version1.2.0
evaluationprogrammatic
agentclaude-code
modelclaude-sonnet-4-6
snapshotpython312-uv
primary_outputsdeck.pdf, slides.md

slide-maker — Agent Runbook

EXECUTE THIS RUNBOOK NOW. Begin immediately with Step 1 and work through the steps in order, running the shell commands and writing every deliverable to /app/results. This is a task to perform with tools, not a document to read back or summarize. Your first action is a tool call (Step 1: Environment Setup). The run is complete only when a non-empty deck.pdf and the other deliverables exist in /app/results.

Inputs (already provided — do NOT ask the user)

These values come from the run parameters. Proceed with them immediately — never pause to ask the user for a goal, topic, mode, or style. If a value below still shows its raw {{...}} placeholder, treat it as: goal → stop with an error; mode → create; style → auto; source repo → none (brief-driven).

  • Goal / update instructions: {{goal_or_update_instructions}}
  • Mode: {{mode}}
  • Style preset: {{style_preset}}
  • Source repo URL: {{source_repo_url}}

Objective

Generate presentation decks grounded in real GitHub projects, or walk through a structured brief-to-slides process. This skill supports creating and updating native Slidev deck projects — complete with a compiled slides.md, a deck.spec.md specification, a printable deck.pdf, and a project README.md. Use when the user asks to create a presentation, slide deck, talk, pitch, keynote, or Slidev project — especially when they want slides based on an existing codebase, architecture, or project documentation. The workflow spans eight phases: determine mode, gather sources, intake narrative principles, choose style, write the spec, compile slides, validate quality, and deliver the finished deck.

REQUIRED OUTPUT FILES (MANDATORY)

You MUST write all of the following files to /app/results. The task is NOT complete until every file exists and is non-empty.

FileDescription
/app/results/deck.spec.mdThe slide deck specification (always required)
/app/results/slides.mdThe compiled Slidev slides (always required)
/app/results/deck.pdfThe compiled deck exported to PDF via slidev export (always required)
/app/results/README.mdProject README for the deck (always required)
/app/results/styles/tokens.cssCSS token overrides (when visual customization is needed)
/app/results/summary.mdExecutive summary with run metadata, mode, and any issues
/app/results/validation_report.jsonStructured validation results with stages, results, and overall_passed

deck.pdf is the headline deliverable and a hard gate. slidev build (a static site) is NOT a substitute for slidev export (the PDF). A run with no non-empty deck.pdf is a failure — set overall_passed=false; do not report success.

/app/results must contain ONLY the deliverables above. Do all Slidev project setup (npm install, slidev build) in /app/work, never in /app/resultsnode_modules/, dist/, and package*.json must never land in /app/results (everything there is persisted as a run output).

Parameters

ParameterDefaultDescription
Results directory/app/resultsOutput directory for all results
Goal or update instructions(required)What to create or update — e.g. "pitch deck for ProjectX from its GitHub repo"
Modecreatecreate or update a Slidev deck project
Source repo URL(optional)GitHub repository URL to base a project deck on
Style presetautoVisual style preset — pass a slug from the Style Preset Catalog in Step 5 (e.g. bold-signal, vintage-editorial, terminal-green). auto lets the agent pick one by mood.

Dependencies

DependencyTypeRequiredDescription
Node.js / npmRuntimeYesRequired to run Slidev
@slidev/clinpm packageYesSlidev CLI for compiling and previewing decks
playwright-chromiumnpm packageYesHeadless Chromium that slidev export drives to render deck.pdf
GitHub API / ghExternal APIOptionalClone source repos when building project decks

This runbook is self-contained — slide kinds, the deck-spec schema, Slidev syntax, compiler rules, and validation checklists are all inline in the steps that use them. There are no external reference files to fetch.

Step 1: Environment Setup

Verify the environment and install required dependencies.

# Check Node.js and npm command -v node >/dev/null || { echo "ERROR: Node.js not installed"; exit 1; } command -v npm >/dev/null || { echo "ERROR: npm not installed"; exit 1; } # Install Slidev CLI if not present npm list -g @slidev/cli 2>/dev/null || npm install -g @slidev/cli # Install the headless Chromium that `slidev export` uses to render the PDF npm list -g playwright-chromium 2>/dev/null || npm install -g playwright-chromium # Create the deliverables dir AND an isolated build dir. # Slidev project setup (npm install, build) happens in /app/work so that # node_modules/, dist/, and package*.json never pollute /app/results. mkdir -p /app/results/styles /app/work # The goal/mode/style come from the Inputs block above (substituted from the run # parameters), NOT from environment variables. Read them from there. GOAL="{{goal_or_update_instructions}}" MODE="{{mode}}"; [ -z "$MODE" ] || [ "$MODE" = "{{mode}}" ] && MODE="create" STYLE="{{style_preset}}"; [ -z "$STYLE" ] || [ "$STYLE" = "{{style_preset}}" ] && STYLE="auto" REPO="{{source_repo_url}}"; [ "$REPO" = "{{source_repo_url}}" ] && REPO="" if [ -z "$GOAL" ] || [ "$GOAL" = "{{goal_or_update_instructions}}" ]; then echo "ERROR: no goal/update instructions were provided to this run" exit 1 fi echo "Setup complete. GOAL=$GOAL | MODE=$MODE | STYLE=$STYLE | REPO=${REPO:-<none, brief-driven>}"

The work proceeds in eight phases. Every reference each phase needs is inline in the step shown below — read it when you reach that step rather than loading it all upfront.

PhaseCovered byPurpose
1. Determine modeStep 2Create vs. update
2. Gather sourcesStep 3Source-material lookup, extraction heuristics, through-line, project identity
3. IntakeStep 4 (Presentation principles + Narrative arcs)Rhetorical principles, narrative structure, through-line design
4. Style directionStep 5 (Style Preset Catalog)Visual presets and token palettes
5. Write specStep 6 (Deck-spec schema + Slide Kinds catalog)Spec schema and slide type catalog
6. CompileStep 7 (Slidev reference + Compiler rules)Compilation rules, Slidev features
7. ValidateStep 9 (Acceptance checklist + LLM tells)Quality gates
8. DeliverSteps 10–11Export the deck to PDF, then write final deliverables

Step 2: Determine Mode

Identify whether this is a create or update run.

  • Create: No existing slides.md — start from scratch.
  • Update: An existing slides.md is present — apply targeted changes from the goal.
if [ -f "/app/results/slides.md" ]; then MODE="update" else MODE="create" fi echo "Mode detected: $MODE"

Unsupported: standalone HTML, PPTX, HTML-to-Slidev, non-project artifacts. If the goal implies these, redirect to a Slidev deck project and explain why.

Step 3: Gather Source Material (project decks only)

For project decks (user provided a GitHub repo or codebase):

  • Clone or fetch the repository
  • Extract: project name, tagline, key architecture, noteworthy features, open issues, recent releases
  • Identify a through-line: the single most important idea or narrative arc for this audience
  • Capture project identity signals for use in style direction

For brief-driven decks (no repo):

  • Collect from the user: topic, audience, key message, desired slide count, and any existing material

Extraction heuristics

  • Prefer primary sources in this order: README → architecture/design docs → code comments and module layout → recent commits/releases → open issues.
  • For every claim you intend to put on a slide, note the exact source (file, commit, README section, or issue number). Anything you can't trace is a candidate to cut, not to assert.
  • If the user supplied images/screenshots, inspect each one, mark it USABLE or NOT USABLE (with a reason), and let the usable set co-design the outline — e.g. 3 product screenshots naturally imply 3 feature slides.
  • Capture identity signals for Step 5: dominant brand colors, logo, tone (playful vs. enterprise), and the audience's technical depth.

Step 4: Intake — Narrative Principles

Shape the deck's arc before writing any slide:

  • Establish a clear through-line (one sentence that captures the deck's core argument)
  • Map a narrative structure (see Narrative arcs below)
  • Identify the audience and calibrate complexity accordingly

Presentation principles

  • One idea per slide. If a slide argues two things, split it. Large type, strong hierarchy, generous whitespace beat dense walls of text.
  • Show, don't tell. Prefer a diagram, a real metric, a screenshot, or a code excerpt over an abstract bullet describing it.
  • Earn every claim. Each factual statement should trace to a source from Step 3. Cut what you can't ground.
  • Distinctive over generic. Avoid "AI slop" — predictable layouts, purple-on-white gradients, and default system fonts. Commit to one cohesive aesthetic (set in Step 5) with dominant colors and sharp accents.
  • Calibrate density to delivery. Speaker-led decks: 1–3 bullets/slide, lots of section beats and statement slides. Read-first decks (sent async): denser, self-contained slides with 4–6 bullets or cards.

Narrative arcs — pick the one that fits the goal:

ArcShapeGood for
Problem → Insight → Solution → Proof → CTAClassic persuasive buildPitch decks, launches
Context → Tension → ResolutionStory spineTalks, keynotes
What → Why it matters → How → What's nextExplainerTeaching, internal updates
Status quo → What changed → ImplicationsBefore/afterRoadmaps, retros

Restate the through-line on the cover and call back to it on the closing slide.

Step 5: Style Direction

The full preset catalog is inline below — no external STYLE_PRESETS.md is required.

Select or confirm a visual style preset:

  • If the user passed a Style preset slug, apply that preset exactly.
  • If the value is auto (the default), pick a preset using the Pick by mood map below, then state in summary.md which preset you chose and why.

Each preset defines a font pairing and a color palette. When you need to deviate from a preset's tokens (brand colors, a custom typeface), write the overrides to /app/results/styles/tokens.css.

Style Preset Catalog

Pass the slug (first column) as the Style preset parameter. The default recommendation is Bold Signal — a versatile dark theme with strong visual hierarchy.

SlugPresetThemeVibeFonts (display / body)Key colors
bold-signalBold SignalDarkConfident, bold, high-impact (default)Archivo Black / Space Groteskbg #1a1a1a · accent #FF5722 · text #ffffff
electric-studioElectric StudioDarkClean, professional, high-contrastManrope / Manropebg #0a0a0a · accent #4361ee · text #ffffff
creative-voltageCreative VoltageDarkCreative, energetic, retro-modernSyne / Space Monobg #1a1a2e · primary #0066ff · neon #d4ff00
dark-botanicalDark BotanicalDarkElegant, sophisticated, premiumCormorant / IBM Plex Sansbg #0f0f0f · text #e8e4df · accent #d4a574
notebook-tabsNotebook TabsLightEditorial, organized, tactileBodoni Moda / DM Sanscard #f8f6f1 · tabs #98d4bb#ffe6a7 · text #2d2d2d
pastel-geometryPastel GeometryLightFriendly, modern, approachablePlus Jakarta Sansbg #c8d9e6 · card #faf9f7 · pills #f0b4d4#7c6aad
split-pastelSplit PastelLightPlayful, friendly, creativeOutfitpeach #f5e6dc · lavender #e4dff0 · text #1a1a1a
vintage-editorialVintage EditorialLightWitty, editorial, personality-drivenFraunces / Work Sanscream #f5f3ee · text #1a1a1a · accent #e8d4c0
neon-cyberNeon CyberDarkFuturistic, high-energySpace Grotesk / IBM Plex Mononavy #0a0f1c · cyan + magenta neon
terminal-greenTerminal GreenDarkDeveloper / technicalIBM Plex Monobg #0d1117 · terminal green #39d353
swiss-modernSwiss ModernLightBauhaus, minimal, grid-drivenHelvetica Neue / Interblack + white · red #ff3300
paper-and-inkPaper & InkLightLiterary, calm, editorialSpectral / Intercream #faf9f7 · charcoal · crimson #c41e3a

Pick by mood

When Style preset is auto, choose by the feeling the audience should leave with:

  • Impressed / confident → Bold Signal, Electric Studio, Dark Botanical
  • Excited / energized → Creative Voltage, Neon Cyber, Split Pastel
  • Calm / focused → Notebook Tabs, Paper & Ink, Swiss Modern
  • Inspired / moved → Dark Botanical, Vintage Editorial, Pastel Geometry
  • Technical / developer → Terminal Green, Electric Studio

When in doubt, use Bold Signal.

Step 6: Write or Revise deck.spec.md

Write the slide deck specification to /app/results/deck.spec.md. The spec is the contract for Step 7 — compile only what the spec describes.

Deck-spec schema. The spec must include:

  • Through-line — one sentence.
  • Meta — selected style preset (slug from Step 5), target slide count/range, density mode (speaker-led or read-first), audience.
  • Slide list — one entry per slide with:
    • number — sequential slide number
    • kind — from the Slide Kinds catalog below
    • headline — the slide's single claim, written out
    • notes — a 1–3 line speaker-notes outline
    • sources — file / commit / README section / issue backing each factual claim (project decks)

Slide Kinds catalog

Each kind maps to a Slidev built-in layout (used in Step 7). Use content when nothing else fits.

KindSlidev layout:Use for
covercoverOpening slide — deck title + through-line
introintroTitle + author/context
sectionsectionMarks the start of a new section
contentdefaultGeneral point with a headline + 1–6 bullets
two-columntwo-colsSide-by-side compare / text + visual
two-column-headertwo-cols-headerShared header over two columns
imageimage, image-left, image-rightA screenshot/diagram as the focus
quotequoteA pulled quotation with prominence
statementstatementA single bold assertion
factfactOne big metric/number with prominence
codedefault (fenced code block)A code excerpt or config
fullfullEdge-to-edge visual / diagram
closingendRecap of the through-line + call to action

For update mode: apply only the changes indicated in the goal; preserve unchanged slides.

Validation gate — do not proceed to Step 7 until:

  • Through-line is one sentence, present in the spec
  • Every slide has a kind (from the catalog) and a headline
  • Slide count is within the agreed range

Step 7: Compile the Deck

Compile /app/results/slides.md from the approved spec. Do NOT add content not in the approved spec.

Slidev reference

A Slidev deck is a single Markdown file. Slides are separated by a line containing only ---. Per-slide options go in a YAML frontmatter block immediately after the separator.

  • Headmatter (the very first frontmatter block) sets deck-wide config:
    --- theme: default title: <deck title> transition: slide-left ---
  • Per-slide frontmatter sets the layout and slide options:
    --- layout: two-cols class: text-center background: /images/cover.png ---
  • Common layouts (map slide kinds → these): cover, intro, section, default, two-cols, two-cols-header, image-left, image-right, image, quote, statement, fact, full, center, end.
  • Two-column content uses a ::right:: slot divider between the left and right columns (::left::/::right:: for two-cols-header).
  • Speaker notes are an HTML comment at the end of a slide: <!-- notes here -->.
  • Code uses fenced blocks with a language; line highlighting via {2,4-6} after the language.
  • Styling: apply preset token overrides from styles/tokens.css; per-slide tweaks via the class: key + UnoCSS utilities.

Compiler rules

  • Start slides.md with the headmatter block, then emit slides in spec order.
  • One spec slide → one Slidev slide. Use the layout: mapped from each slide's kind.
  • Split, don't shrink. If a slide's content exceeds its density budget, break it into two slides rather than cramming or reducing font size. If a change causes overflow, split automatically and note it in summary.md.
  • Keep every factual claim traceable to the sources recorded in the spec.
  • Put the speaker-notes outline into each slide's <!-- ... --> notes comment.
# Build in the isolated /app/work dir — never in /app/results (keeps node_modules/ # dist out of the persisted outputs). slides.md itself stays a deliverable in /app/results. cp /app/results/slides.md /app/work/slides.md cp -r /app/results/styles /app/work/styles 2>/dev/null || true cd /app/work && slidev build slides.md --out /app/work/dist 2>&1 | tail -20

Compilation must exit 0. If it fails, fix compiler errors before proceeding (max 3 rounds).

Step 8: Iterate on Errors (max 3 rounds)

If Step 6 validation or Step 7 compilation fails:

  1. Read the specific failure message

  2. Apply the targeted fix:

    IssueFix
    Through-line missing or multi-sentenceRewrite to a single clear sentence
    Unknown slide kindUse the closest kind from the Slide Kinds catalog (Step 6) or content
    Slidev syntax errorConsult the Slidev reference (Step 7) for correct syntax
    Slide count out of rangeMerge or split slides to hit the target range
    Token CSS syntax errorValidate CSS syntax; check styles/tokens.css
    Dark preset renders on a white backgroundstyles/tokens.css vars do NOT reliably override the default theme's page background. For dark presets (bold-signal, dark-botanical, etc.) set the background globally — a background: in the headmatter and/or a global <style> block setting --slidev-theme / the slide background-color — not tokens alone
    Cover/first slide renders blank in deck.pdfslidev export can rasterize the first slide before the theme/fonts finish loading; give the cover explicit, high-contrast title text and re-export. Verify by rendering deck.pdf page 1, not by trusting the build
  3. Re-run the failed step and overwrite the output

  4. Repeat up to 3 times total

After 3 rounds, if compilation still fails, write the failure into summary.md and set overall_passed=false in validation_report.json.

Step 9: Validate & Evaluate Quality

Evaluate the deck against the acceptance checklist below, then scan every slide and speaker note for the LLM tells listed underneath.

Acceptance checklist

GateCriterion
Spec completenessAll slides have kind + headline + notes outline
Through-lineVisible in cover slide and callback in closing slide
Source groundingEvery factual claim traceable to a source reference
DensityNo slide exceeds its density budget; overflow was split, not shrunk
No internal leakageNo slide text exposes runbook/spec internals — kind names, layout: values, preset slugs, file paths, "Option A/B", or the raw goal text
No LLM tellsZero instances from the list below
Compilationslidev build exits 0
PDF exportslidev export produced a non-empty deck.pdfslidev build alone does NOT satisfy this gate
Results hygiene/app/results contains only deliverables — no node_modules/, dist/, or package*.json
Output filesAll required outputs exist and are non-empty

LLM tells — find and rewrite any of these:

  • Filler openers/closers: "In conclusion", "In today's fast-paced world", "It's worth noting that", "At the end of the day", "Let's dive in", "Delve into".
  • Hollow intensifiers and hedges: "very", "really", "truly", "seamless", "robust", "powerful", "cutting-edge", "game-changing", "revolutionary", "leverage", "utilize" (use "use").
  • Unsupported superlatives ("the best", "the most advanced") with no source behind them.
  • Generic transitions ("Moving on", "Next up", "Now let's talk about") and empty agenda restatements.
  • Symmetry tics: every slide having exactly three bullets, or three-item lists everywhere regardless of content.
  • Design slop flagged in Step 4: default system fonts, purple-on-white gradients, cookie-cutter card grids.

Step 10: Export to PDF

Print the validated deck to PDF with Slidev's built-in exporter. Run this after Step 9 passes so the PDF reflects the final slides.

cd /app/work # slidev export renders each slide through headless Chromium → the deck.pdf hero deliverable. slidev export slides.md --output /app/results/deck.pdf --timeout 60000 2>&1 | tail -20 # If Chromium is missing, install it and retry export ONCE. if [ ! -s /app/results/deck.pdf ]; then npm install -g playwright-chromium 2>&1 | tail -3 (cd /app/work && slidev export slides.md --output /app/results/deck.pdf --timeout 60000 2>&1 | tail -20) fi # HARD GATE — a non-empty deck.pdf is mandatory. if [ -s /app/results/deck.pdf ]; then echo "PASS: deck.pdf ($(wc -c < /app/results/deck.pdf) bytes)" else echo "FAIL: deck.pdf was NOT produced. This run is a FAILURE — record the export" echo "error in summary.md and set overall_passed=false in validation_report.json." echo "Do NOT report success. 'slidev build' (a static site) is NOT a substitute." fi
  • One page per slide by default. To bake click-through animations into extra pages, add --with-clicks.
  • If export fails because Chromium is missing, run npm install -g playwright-chromium (Step 1 already does this) and retry once.
  • If the PDF still can't be produced after one retry, record the failure in summary.md, set overall_passed=false in validation_report.json, and continue — never silently skip it.

Step 11: Deliver

Write the final deliverables to /app/results/:

  • deck.spec.md — approved spec
  • slides.md — compiled Slidev slides
  • deck.pdf — the deck exported to PDF
  • README.md — project README with deck title, through-line, how to run, slide count, preset used
  • styles/tokens.css — token overrides (if applicable)

Step 12: Write Validation Report

Write /app/results/validation_report.json reflecting all stage outcomes. It MUST include an explicit pdf_export stage and a results_hygiene stage:

{ "stages": [ { "name": "compilation", "passed": true, "message": "slidev build exited 0" }, { "name": "pdf_export", "passed": true, "message": "deck.pdf produced (NNN bytes)" }, { "name": "results_hygiene", "passed": true, "message": "no node_modules/dist in /app/results" }, { "name": "output_files", "passed": true, "message": "all deliverables present and non-empty" } ], "overall_passed": true }

overall_passed MUST be false if pdf_export did not produce a non-empty deck.pdf.

Step 13: Write Executive Summary

Write /app/results/summary.md with run metadata, mode detected, through-line, slide count, preset used, validation results, and any issues.

Final Checklist (MANDATORY — do not skip)

Verification Script

RESULTS_DIR="/app/results" echo "=== RESULTS HYGIENE (scrub build scaffolding — safety net) ===" rm -rf "$RESULTS_DIR/node_modules" "$RESULTS_DIR/dist" "$RESULTS_DIR/.slidev" \ "$RESULTS_DIR/package.json" "$RESULTS_DIR/package-lock.json" if [ -d "$RESULTS_DIR/node_modules" ] || [ -d "$RESULTS_DIR/dist" ]; then echo "FAIL: build scaffolding still present in /app/results" else echo "PASS: /app/results is clean (deliverables only)" fi echo "=== FINAL OUTPUT VERIFICATION ===" for f in \ "$RESULTS_DIR/deck.spec.md" \ "$RESULTS_DIR/slides.md" \ "$RESULTS_DIR/deck.pdf" \ "$RESULTS_DIR/README.md" \ "$RESULTS_DIR/summary.md" \ "$RESULTS_DIR/validation_report.json"; do if [ ! -s "$f" ]; then echo "FAIL: $f is missing or empty" else echo "PASS: $f ($(wc -c < "$f") bytes)" fi done # deck.pdf is the hard gate — build is not a substitute for export. [ -s "$RESULTS_DIR/deck.pdf" ] || echo "CRITICAL: deck.pdf missing — overall_passed MUST be false" echo "=== VERIFICATION COMPLETE ==="

Checklist

  • deck.spec.md exists with through-line and full slide list
  • slides.md compiles without errors via slidev build
  • deck.pdf was exported via slidev export and is non-empty
  • README.md contains deck title, through-line, and run instructions
  • styles/tokens.css written if visual overrides were needed
  • summary.md documents mode, through-line, slide count, preset, and any issues
  • validation_report.json has stages, results, and overall_passed
  • All quality gates in Step 9 passed
  • Verification script printed PASS for every required file

If ANY item fails, go back and fix it. Do NOT finish until all items pass.

Tips

  • Read each step when you reach it. This runbook is self-contained — the catalogs and references (style presets, slide kinds, Slidev syntax, validation) live in the step that uses them. Don't try to fetch external docs; there are none.
  • Through-line first. Before writing a single slide, nail the through-line. Every slide decision flows from it.
  • Spec before compile. Never start slides.md without an approved deck.spec.md. The spec is the contract.
  • Grounding over generality. For project decks, every factual claim should trace back to a specific file, commit, README section, or issue in the source repo. Avoid generic statements.
  • LLM tells are silent failures. Run the LLM-tells scan in Step 9 before delivery. Phrases like "In conclusion", "Delve into", or unsupported superlatives undermine credibility.
  • deck.pdf is the ground truth, not slides.md or slidev build. slidev build produces a static website (dist/); only slidev export produces the deck.pdf the deck is judged on. A run without a non-empty deck.pdf has failed, however good slides.md looks.
  • Build in /app/work, deliver to /app/results. Run every npm install / slidev build in /app/work so node_modules/, dist/, and package*.json never get persisted as run outputs. /app/results holds only the deliverables (deck.spec.md, slides.md, deck.pdf, README.md, styles/, the two reports).