Skip to content

Slideshow Creator

Try it: /pm-skills:utility-slideshow-creator "Your context here"

Generate professional presentations (.pptx and .pdf) from a JSON deck specification. Zero design decisions at generation time - Claude selects slide types and fills content slots; all visual properties are pre-decided by the theme.

  • Creating slide decks for stakeholder updates, product reviews, team presentations
  • Generating professional .pptx files from content briefs
  • Producing consistent presentations without manual formatting
  • Exporting presentations to PDF for sharing or archiving
  • Creating complex data visualizations (use dedicated charting tools)
  • Building interactive web presentations (this produces .pptx, not HTML)
  • Editing existing PowerPoint files (this creates new decks from scratch)

Invoke the skill by name (/pm-skills:utility-slideshow-creator on Claude Code, $utility-slideshow-creator on Codex):

/pm-skills:utility-slideshow-creator "Your context here"

Or reference the skill file directly: skills/utility-slideshow-creator/SKILL.md

  1. Read the content brief - Understand topic, audience, length, specific requirements
  2. Plan the deck - Select slide types using the decision logic table. Assign dark/light variants for visual rhythm (alternate to avoid monotony).
  3. Write the JSON deck specification - Fill content slots, respecting character limits from references/slide-types.md
  4. Run the generation script - node scripts/generate-deck.js deck-spec.json
  5. Optionally export PDF - node scripts/export-pdf.mjs deck-spec.json output.pdf
  6. Report the output - Tell the user where the file(s) are

Two-phase architecture:

  1. Spec phase (Claude) - Read the content brief, select slide types using decision logic, write a JSON deck specification. Content slots have character limits calibrated to prevent overflow. This is the only phase that costs tokens.
  2. Generation phase (Local script) - Run node scripts/generate-deck.js deck-spec.json to produce .pptx. Optionally run node scripts/export-pdf.mjs deck-spec.json for PDF. Deterministic rendering, zero token cost.

Both outputs come from the same JSON spec, so .pptx and .pdf always match.

#Type KeyPurposeDefault Variant
1title_darkOpening slide (bold)dark only
2title_lightOpening slide (internal/lighter)light only
3sectionSection dividerdark
4contentParagraph explanationlight
5bullets3-6 key pointslight
6two_colSide-by-side comparisonlight
7statSingle key metriclight
8dual_statTwo metrics compareddark
9quoteTestimonial or pull quotedark
10three_cardThree parallel conceptsdark
11four_gridFour concepts in 2x2 griddark
12timelineDates or milestones (max 6)light
13process_flowSequential workflow (max 5)light
14agendaMeeting agenda (max 7)light
15highlightKey finding or executive summarylight
16tableTabular datalight
17icon_rowsFeature list with markers (max 4)light
18closingEnd slidedark only

Full slot definitions and character limits: references/slide-types.md

Content PatternUse
Opening the deck (bold)title_dark
Opening the deck (internal)title_light
Transitioning between topicssection
Paragraph explanationcontent
List of 3-6 pointsbullets
Side-by-side comparisontwo_col
Single key metricstat
Two metrics compareddual_stat
Testimonial or pull quotequote
Three parallel conceptsthree_card
Four concepts in a gridfour_grid
Dates or milestonestimeline
Sequential workflowprocess_flow
Meeting agendaagenda
Key finding or summaryhighlight
Tabular datatable
Feature list with markersicon_rows
Ending the deckclosing

Full decision logic with variant strategy: references/decision-logic.md

{
"title": "Q3 Product Update",
"author": "Product Team",
"footerText": "Internal . Q3 Review",
"slides": [
{ "type": "title_dark", "title": "Q3 Product Update", "subtitle": "October 2026" },
{ "type": "stat", "stat": "94%", "label": "Customer satisfaction score", "accentColor": "secondary" },
{ "type": "bullets", "title": "What Shipped", "bullets": ["Feature A", "Feature B", "Feature C"] },
{ "type": "closing" }
]
}

Colors accept theme token names ("accent", "secondary", "tertiary", "warm") or 6-character hex strings ("2563EB").

Full schema and workflow: references/TEMPLATE.md and references/platform-rules.md

  • Planning artifact: JSON deck specification (the file Claude writes)
  • Final output: .pptx file (+ optional .pdf), generated locally from the spec
  • Quality gate: All items in the quality checklist pass
FilePurpose
references/TEMPLATE.mdJSON deck specification template with field documentation
references/EXAMPLE.mdWorked example: Q3 Product Update deck (9 slides)
references/slide-types.mdAll 18 slide types: content slots, character limits, variants
references/decision-logic.mdContent pattern → slide type mapping, variant strategy, deck sizing
references/platform-rules.mdpptxgenjs requirements, Google Slides compatibility, output format
{
"title": "",
"author": "",
"footerText": "",
"outputFileName": "",
"slides": []
}
FieldTypeRequiredNotes
titlestringyesPresentation title, used as .pptx metadata
authorstringnoAuthor name for .pptx metadata
footerTextstringnoDefault footer text for all slides
outputFileNamestringnoOutput filename. Default: title slugified + .pptx
slidesarrayyesArray of slide objects

Every slide object has type (required) plus content slots defined in slide-types.md.

FieldTypeNotes
variantstring”dark” or “light” — see defaults per type in slide-types.md
notesstringSpeaker notes for presenter view (no character limit)
footerstringOverride deck-level footerText for this slide
slideNumstringOverride auto-incremented slide number

Color fields (accentColor, leftColor, rightColor, card/item color) accept:

  • Theme token names: "accent", "secondary", "tertiary", "warm", "primary", "primaryDark", "muted"
  • 6-character hex strings: "2563EB", "0891B2" (no # prefix)
Type KeyRequired SlotsOptional Slots
title_darktitlesubtitle
title_lighttitlesubtitle
sectiontitlevariant
contenttitle, bodyvariant
bulletstitle, bullets[]variant
two_coltitle, leftTitle, leftItems[], rightTitle, rightItems[]variant
statstat, labelaccentColor, variant
dual_statleftStat, leftLabel, rightStat, rightLabeltitle, leftColor, rightColor, variant
quotequoteattribution, variant
three_cardcards[3]title, variant
four_gridcards[4]title, variant
timelinetitle, milestones[]variant
process_flowtitle, steps[]variant
agendaitems[]title, intro, variant
highlighttitle, highlightcontext, accentColor, variant
tabletitle, headers[], rows[][]variant
icon_rowstitle, items[]variant
closing(none)tagline, url

See slide-types.md for character limits and detailed slot definitions.

Example: Q3 Product Update Deck

This example walks through creating a 9-slide product update deck for an engineering all-hands meeting, demonstrating the spec-writing workflow from content brief to JSON output.

The product team needs a deck for the Q3 engineering all-hands covering:

  • Customer satisfaction hit a record high (94%)
  • Three major features shipped (real-time analytics dashboard, API rate limiting, bulk data import)
  • Revenue grew 18% quarter-over-quarter
  • Roadmap preview for Q4 (3 milestones)
  • Key insight: teams using the analytics dashboard have 2.4x faster incident response times
#ContentTypeVariantRationale
1Openingtitle_darkdarkBold external opener
2Section: MetricssectiondarkTopic transition
3CSAT recordstatlightSingle metric spotlight
4Revenue comparisondual_statdarkTwo numbers gain from comparison
5Features shippedbulletslight3-6 point list
6Feature detailsthree_carddarkThree parallel concepts
7Key insighthighlightlightExecutive takeaway
8Q4 roadmaptimelinelightChronological milestones
9CloseclosingdarkStandard ending

Dark-light alternation: D, D, L, D, L, D, L, L, D — slight imbalance at slides 7-8 (both light) but acceptable because highlight and timeline are visually distinct types.

{
"title": "Q3 Product Update",
"author": "Product Team",
"footerText": "Internal -- Engineering All-Hands",
"outputFileName": "q3-product-update.pptx",
"slides": [
{
"type": "title_dark",
"title": "Q3 Product\nUpdate",
"subtitle": "Engineering All-Hands -- October 2026",
"notes": "Welcome everyone. Quick overview of what shipped and what's ahead."
},
{
"type": "section",
"title": "Key\nMetrics",
"variant": "dark",
"notes": "Starting with our headline performance numbers."
},
{
"type": "stat",
"stat": "94%",
"label": "Customer satisfaction -- highest score this year",
"accentColor": "secondary",
"variant": "light",
"notes": "Up from 88% in Q2. Primary driver: faster support response times from the new dashboard."
},
{
"type": "dual_stat",
"title": "Revenue Growth",
"leftStat": "$3.2M",
"leftLabel": "Q2 recurring revenue",
"leftColor": "muted",
"rightStat": "$3.8M",
"rightLabel": "Q3 recurring revenue",
"rightColor": "accent",
"variant": "dark",
"notes": "18% QoQ growth. Bulk import feature drove 40% of new contract value."
},
{
"type": "bullets",
"title": "What Shipped in Q3",
"bullets": [
"Real-time analytics dashboard with customizable widgets",
"API rate limiting with per-client quotas and alerting",
"Bulk data import supporting CSV, JSON, and XML formats",
"SSO integration for enterprise customers"
],
"variant": "light",
"notes": "Four major features. Each had full rollout with zero critical incidents."
},
{
"type": "three_card",
"title": "Feature Highlights",
"cards": [
{
"title": "Analytics Dashboard",
"bullets": ["Real-time metrics", "Custom widgets", "Export to PDF"],
"color": "accent"
},
{
"title": "API Rate Limiting",
"bullets": ["Per-client quotas", "Automatic alerting", "Usage dashboard"],
"color": "secondary"
},
{
"title": "Bulk Import",
"bullets": ["CSV, JSON, XML", "Validation preview", "Async processing"],
"color": "tertiary"
}
],
"variant": "dark",
"notes": "Deeper dive on the three headline features."
},
{
"type": "highlight",
"title": "Key Insight",
"highlight": "Teams using the analytics dashboard resolve incidents 2.4x faster than teams using manual monitoring.",
"context": "Based on analysis of 180 incidents across 45 teams during August-September. The effect is strongest for teams with 3+ custom dashboard widgets configured.",
"accentColor": "accent",
"variant": "light",
"notes": "This is our strongest product-market signal this quarter."
},
{
"type": "timeline",
"title": "Q4 Roadmap",
"milestones": [
{ "label": "OCT", "description": "Advanced filtering and saved views" },
{ "label": "NOV", "description": "Webhook integrations and event streaming" },
{ "label": "DEC", "description": "SOC 2 Type II certification complete" },
{ "label": "JAN", "description": "Public API v2 general availability" }
],
"variant": "light",
"notes": "Four milestones across the quarter. SOC 2 is the compliance gate for enterprise expansion."
},
{
"type": "closing",
"notes": "Thank you. Questions?"
}
]
}
  • Line break control: Title slide uses \n to split “Q3 Product” and “Update” onto separate lines for deliberate text wrapping
  • Section dividers: The section slide creates a clear visual break before the metrics block, signaling a topic change to the audience
  • Single vs comparative metrics: stat spotlights one number (CSAT score) while dual_stat places two numbers side-by-side for direct comparison (Q2 vs Q3 revenue)
  • Parallel structure: three_card gives equal visual weight to three shipped features, avoiding the implicit ranking that a bullet list creates
  • Highlight restraint: highlight is used exactly once for the strongest finding — overuse dilutes its impact
  • Chronological milestones: timeline presents Q4 roadmap items in calendar order, making sequencing and dependencies visible
  • Speaker notes on every slide: Notes provide presenter context without cluttering the slide surface — especially useful for stakeholder decks that get forwarded without the presenter
  • Dark/light rhythm: Variants alternate to maintain visual energy; the consecutive light slides (7-8) work because highlight and timeline have distinct visual structures
  • Character-limit compliance: All content respects the limits defined in slide-types.md — titles stay concise, bullets stay scannable, and the highlight sentence remains under the maximum length
  • Every slide has a valid type key (one of the 18 defined types)
  • All content slots respect character limits from references/slide-types.md
  • Dark/light variants alternate for visual rhythm (no 3+ consecutive same-variant slides)
  • Deck has a title slide (first) and a closing slide (last)
  • Section dividers separate distinct topics in decks > 6 slides
  • Speaker notes included for key slides (stats, highlights, transitions)
  • JSON is valid (no trailing commas, proper quoting, correct nesting)
  • Color values are valid theme tokens or 6-character hex strings (no # prefix)