Slide Upgrade
Convert any input — PPTX, Markdown, or a plain prompt — into a visually stunning, Canva-quality HTML slide deck. Images are base64-encoded into the HTML; videos (too large for inline embedding) are copied to a media/ folder alongside the HTML with relative path references. The output looks like it was designed in Canva or Figma, not PowerPoint.
Design Philosophy
The output should feel like a contemporary creative portfolio or Canva template, not a corporate PowerPoint. Key principles:
- Massive, bold typography — headings should dominate the slide (100-200px, condensed, uppercase)
- Full-colour backgrounds — bold yellow, deep blue, rich black, vibrant red — not just white
- Confident whitespace — don't fill every pixel; let elements breathe
- Photo-forward layouts — images bleed to edges, use geometric crops (circles, arches, diagonals)
- Visual hierarchy through scale — the difference between heading and body should be dramatic (5-10x)
- Slide numbering — prominent slide numbers (01, 02, 03) add editorial structure
- Horizontal rules — use lines to separate and structure content, not boxes
- Type as hero — on many slides, the typography IS the design; no images needed
Inputs
PPTX File
- Unzip the PPTX and parse the raw XML (see
references/pptx-extractor.md) — do not use python-pptx, it misses videos, shape-fill images, and SVGs
- Read each slide XML to extract text, images, videos, tables, and backgrounds
- Redesign from scratch — don't try to replicate the PPTX layout; reimagine it with Canva-quality design
- Base64-encode images for self-contained HTML; copy videos to a
media/ folder alongside the HTML with relative path references
Markdown File
- Read the
.md file
- Split on
--- horizontal rules for slide breaks (if present)
- If no explicit breaks, use heading hierarchy:
# H1 = section dividers, ## H2 = individual slides
- Parse content per slide, then design
Prompt Only
- Plan the slide structure with the user
- Generate content and design simultaneously
Workflow
Step 1: Extract & Understand
For PPTX: Unzip and parse the raw XML (see references/pptx-extractor.md):
rm -rf /tmp/pptx-unpacked && mkdir -p /tmp/pptx-unpacked
cd /tmp/pptx-unpacked && unzip -o "path/to/file.pptx" > /dev/null 2>&1
Then:
- Read
ppt/presentation.xml + ppt/_rels/presentation.xml.rels to determine slide order
- List
ppt/media/ to see all images (png/jpeg/svg) and videos (mp4)
- Check each
ppt/slides/_rels/slideN.xml.rels to map media → slides
- Read each
ppt/slides/slideN.xml to extract text, tables, backgrounds, and layout
- Copy videos to
media/ folder next to output HTML; base64-encode images
For Markdown: Read the file and identify slide breaks and content hierarchy.
For prompts: Confirm the slide outline with the user.
Step 2: Plan the Design
- Choose a theme — pick from presets (see
references/canva-aesthetic.md) or create a custom palette based on the content/brand
- Choose fonts — pick a display font and body font from Google Fonts. For the Canva aesthetic, strongly prefer bold condensed display fonts: Bebas Neue, Anton, Oswald, Archivo Black, Syne
- Map each slide to a layout type — assign from the patterns in
references/canva-aesthetic.md
- Plan variety — alternate between dark/light backgrounds, image/text-only slides, and layout styles. Never use the same layout twice in a row.
Step 3: Build the HTML
Use the base template from the html-slides skill (~/.claude/skills/html-slides/references/base-template.md), but:
- Override the theme with the chosen palette
- Override the fonts with the chosen display/body pair
- Add the enhanced CSS classes from
references/canva-aesthetic.md
- Build each slide using the Canva-style patterns
Critical Rules
- Minimal files — one
.html file with CSS/JS embedded and images base64-encoded. Videos go in a media/ folder alongside the HTML (too large for base64). If no videos, the output is a single self-contained file.
- 16:9 canvas — 1920x1080 internal resolution, CSS-scaled to viewport.
- Content density — max 5 bullets, max 30 words per text block, 40%+ whitespace, one idea per slide.
- Font loading — Google Fonts via
<link> in <head>. Always include the display font + body font + fallbacks.
- Keyboard nav — arrow keys, space, click, touch, F for fullscreen.
Typography Priorities
- Display headings: condensed, uppercase, 120-200px, weight 800-900
- Section headings: 60-96px, weight 700
- Card/table headings: 36-48px, weight 700
- Body text: 26-32px, weight 400, generous line-height — err on the side of very large
- Table cells: 28-32px — tables must be legible from the back of the room
- Labels/tags in diagrams: 24-28px, weight 600
- Captions/sources: 20-22px, weight 500-600, uppercase with letter-spacing
- Stat numbers: 100-160px, weight 300 (light) or 900 (black)
- Absolute minimum 20px for any text on screen — never use 12-18px range
- When in doubt, go larger. Slides are viewed from a distance.
Step 4: Screenshot & QA
Use Playwright to screenshot each slide:
npx playwright install chromium 2>/dev/null
node -e "
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage({ viewport: { width: 1920, height: 1080 } });
await page.goto('file://FILEPATH');
await page.waitForLoadState('networkidle');
const count = await page.evaluate(() => document.querySelectorAll('.slide').length);
for (let i = 0; i < count; i++) {
await page.evaluate(n => { window.currentSlide = n; showSlide(n); }, i);
await page.waitForTimeout(300);
await page.screenshot({ path: '/tmp/html-slides/slide-' + i + '.png' });
}
await browser.close();
})();
"
Or use headless Chrome:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless --screenshot=/tmp/slide.png --window-size=1920,1080 file:///path/to/slides.html
ALWAYS visually inspect screenshots with the Read tool. Check for:
- Text overflow or clipping
- Font fallback (wrong font rendering)
- Colour contrast / readability — especially text over gradients, images, or colour transitions. If a gradient goes light-to-dark, text colour must work against ALL zones, or replace with a solid overlay
- Any text below 20px — if found, increase it
- Layout balance and whitespace
- Image distortion or cropping issues
Step 5: Deliver
- Save the
.html file to the working directory
- Show screenshots of key slides (at minimum: title, a content slide, closing)
- Presenting instructions:
- Open in Chrome/Safari/Firefox
- Press F for fullscreen
- Arrow keys or space to navigate
- Escape to exit fullscreen
- Cmd+P to export as PDF
- Ask if adjustments are needed
Reference Files
references/pptx-extractor.md — XML-based approach for extracting PPTX content, images, and videos
references/canva-aesthetic.md — Canva-style themes, layout patterns, and CSS techniques
~/.claude/skills/html-slides/references/base-template.md — HTML/CSS/JS boilerplate (from html-slides skill)
~/.claude/skills/html-slides/references/design-system.md — Base theme presets and typography scale
~/.claude/skills/html-slides/references/slide-patterns.md — Standard layout patterns
1---2name: slide-upgrade3description: Convert PPTX files or Markdown into stunning, Canva-quality HTML slide decks. Use when asked to upgrade a PowerPoint, re-render slides as HTML, convert a presentation, or create modern slides from markdown/text. Triggers on phrases like 'upgrade this pptx', 're-render as html slides', 'convert this presentation', 'make canva-style slides', 'slide-upgrade', 'turn this into html slides', 'redesign these slides', 'beautiful slides'. Produces an .html file (images base64-encoded; videos in a media/ folder) with bold typography, modern layouts, and full presentation navigation.4---56# Slide Upgrade78Convert any input — PPTX, Markdown, or a plain prompt — into a visually stunning, Canva-quality HTML slide deck. Images are base64-encoded into the HTML; videos (too large for inline embedding) are copied to a `media/` folder alongside the HTML with relative path references. The output looks like it was designed in Canva or Figma, not PowerPoint.910## Design Philosophy1112The output should feel like a **contemporary creative portfolio** or **Canva template**, not a corporate PowerPoint. Key principles:1314- **Massive, bold typography** — headings should dominate the slide (100-200px, condensed, uppercase)15- **Full-colour backgrounds** — bold yellow, deep blue, rich black, vibrant red — not just white16- **Confident whitespace** — don't fill every pixel; let elements breathe17- **Photo-forward layouts** — images bleed to edges, use geometric crops (circles, arches, diagonals)18- **Visual hierarchy through scale** — the difference between heading and body should be dramatic (5-10x)19- **Slide numbering** — prominent slide numbers (01, 02, 03) add editorial structure20- **Horizontal rules** — use lines to separate and structure content, not boxes21- **Type as hero** — on many slides, the typography IS the design; no images needed2223## Inputs2425### PPTX File261. Unzip the PPTX and parse the raw XML (see `references/pptx-extractor.md`) — **do not use python-pptx**, it misses videos, shape-fill images, and SVGs272. Read each slide XML to extract text, images, videos, tables, and backgrounds283. **Redesign from scratch** — don't try to replicate the PPTX layout; reimagine it with Canva-quality design294. Base64-encode images for self-contained HTML; copy videos to a `media/` folder alongside the HTML with relative path references3031### Markdown File321. Read the `.md` file332. Split on `---` horizontal rules for slide breaks (if present)343. If no explicit breaks, use heading hierarchy: `# H1` = section dividers, `## H2` = individual slides354. Parse content per slide, then design3637### Prompt Only381. Plan the slide structure with the user392. Generate content and design simultaneously4041## Workflow4243### Step 1: Extract & Understand4445**For PPTX:** Unzip and parse the raw XML (see `references/pptx-extractor.md`):4647```bash48rm -rf /tmp/pptx-unpacked && mkdir -p /tmp/pptx-unpacked49cd /tmp/pptx-unpacked && unzip -o "path/to/file.pptx" > /dev/null 2>&150```5152Then:531. Read `ppt/presentation.xml` + `ppt/_rels/presentation.xml.rels` to determine slide order542. List `ppt/media/` to see all images (png/jpeg/svg) and videos (mp4)553. Check each `ppt/slides/_rels/slideN.xml.rels` to map media → slides564. Read each `ppt/slides/slideN.xml` to extract text, tables, backgrounds, and layout575. Copy videos to `media/` folder next to output HTML; base64-encode images5859**For Markdown:** Read the file and identify slide breaks and content hierarchy.6061**For prompts:** Confirm the slide outline with the user.6263### Step 2: Plan the Design64651. **Choose a theme** — pick from presets (see `references/canva-aesthetic.md`) or create a custom palette based on the content/brand662. **Choose fonts** — pick a display font and body font from Google Fonts. For the Canva aesthetic, strongly prefer bold condensed display fonts: **Bebas Neue, Anton, Oswald, Archivo Black, Syne**673. **Map each slide to a layout type** — assign from the patterns in `references/canva-aesthetic.md`684. **Plan variety** — alternate between dark/light backgrounds, image/text-only slides, and layout styles. Never use the same layout twice in a row.6970### Step 3: Build the HTML7172Use the base template from the `html-slides` skill (`~/.claude/skills/html-slides/references/base-template.md`), but:7374- **Override the theme** with the chosen palette75- **Override the fonts** with the chosen display/body pair76- **Add the enhanced CSS classes** from `references/canva-aesthetic.md`77- **Build each slide** using the Canva-style patterns7879#### Critical Rules80811. **Minimal files** — one `.html` file with CSS/JS embedded and images base64-encoded. Videos go in a `media/` folder alongside the HTML (too large for base64). If no videos, the output is a single self-contained file.822. **16:9 canvas** — 1920x1080 internal resolution, CSS-scaled to viewport.833. **Content density** — max 5 bullets, max 30 words per text block, 40%+ whitespace, one idea per slide.844. **Font loading** — Google Fonts via `<link>` in `<head>`. Always include the display font + body font + fallbacks.855. **Keyboard nav** — arrow keys, space, click, touch, F for fullscreen.8687#### Typography Priorities8889- Display headings: **condensed, uppercase, 120-200px, weight 800-900**90- Section headings: **60-96px, weight 700**91- Card/table headings: **36-48px, weight 700**92- Body text: **26-32px, weight 400, generous line-height** — err on the side of very large93- Table cells: **28-32px** — tables must be legible from the back of the room94- Labels/tags in diagrams: **24-28px, weight 600**95- Captions/sources: **20-22px, weight 500-600, uppercase with letter-spacing**96- Stat numbers: **100-160px, weight 300 (light) or 900 (black)**97- **Absolute minimum 20px** for any text on screen — never use 12-18px range98- When in doubt, go larger. Slides are viewed from a distance.99100### Step 4: Screenshot & QA101102Use Playwright to screenshot each slide:103104```bash105npx playwright install chromium 2>/dev/null106node -e "107const { chromium } = require('playwright');108(async () => {109 const browser = await chromium.launch();110 const page = await browser.newPage({ viewport: { width: 1920, height: 1080 } });111 await page.goto('file://FILEPATH');112 await page.waitForLoadState('networkidle');113 const count = await page.evaluate(() => document.querySelectorAll('.slide').length);114 for (let i = 0; i < count; i++) {115 await page.evaluate(n => { window.currentSlide = n; showSlide(n); }, i);116 await page.waitForTimeout(300);117 await page.screenshot({ path: '/tmp/html-slides/slide-' + i + '.png' });118 }119 await browser.close();120})();121"122```123124Or use headless Chrome:125```bash126"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless --screenshot=/tmp/slide.png --window-size=1920,1080 file:///path/to/slides.html127```128129**ALWAYS visually inspect screenshots** with the Read tool. Check for:130- Text overflow or clipping131- Font fallback (wrong font rendering)132- Colour contrast / readability — especially text over gradients, images, or colour transitions. If a gradient goes light-to-dark, text colour must work against ALL zones, or replace with a solid overlay133- Any text below 20px — if found, increase it134- Layout balance and whitespace135- Image distortion or cropping issues136137### Step 5: Deliver1381391. Save the `.html` file to the working directory1402. Show screenshots of key slides (at minimum: title, a content slide, closing)1413. Presenting instructions:142 - Open in Chrome/Safari/Firefox143 - Press **F** for fullscreen144 - **Arrow keys** or **space** to navigate145 - **Escape** to exit fullscreen146 - **Cmd+P** to export as PDF1474. Ask if adjustments are needed148149## Reference Files150151- `references/pptx-extractor.md` — XML-based approach for extracting PPTX content, images, and videos152- `references/canva-aesthetic.md` — Canva-style themes, layout patterns, and CSS techniques153- `~/.claude/skills/html-slides/references/base-template.md` — HTML/CSS/JS boilerplate (from html-slides skill)154- `~/.claude/skills/html-slides/references/design-system.md` — Base theme presets and typography scale155- `~/.claude/skills/html-slides/references/slide-patterns.md` — Standard layout patterns