Frontend Slides
- Agents and operations
- Agentic Tools
- 2026
- Open source
Claude Code plugin, HTML, CSS, Playwright and 3 more
Frontend Slides is a coding-agent skill that turns a prompt or a PowerPoint file into one self-contained HTML deck with a fixed 16:9 stage. The skill itself is not my design. I imported Zara Zhang’s zarazhangrui/frontend-slides at commit 9906a34, and its bold templates come from her beautiful-html-templates. The workflow, the twelve style presets, the template pack and the PowerPoint, deploy and PDF scripts are all hers.
I forked it to grow the skill into a slide generator, and three gaps stood in the way. The plugin copy of the skill was a hand-kept duplicate that could drift. A clipped slide looked clean in a screenshot. The full template HTML lived only upstream, so nothing here could render the templates side by side. My work is the tooling that closes those gaps.
bash sync.sh --check✓ plugin mirror is in sync with rootnode scripts/check-slides.mjs web/public/templates/grove.html Slide 1 ● overflow (bottom +52px) div.grove-num “01” Slide 2 ● overflow (bottom +52px) div.grove-num “01” Slide 9 ● overflow (bottom +52px) div.grove-num “02” Slide 12 ● overflow (bottom +52px) div.grove-num “12” 4 overflow FAIL
2 commands10 lines of output
- Chapter
- Agents and operations
- Category
- Agentic Tools
- Year
- Availability
- Open source
- Last commit
- Claude Code plugin
- HTML
- CSS
- Playwright
- React
- Vite
- shadcn/ui
Upstream and mine
The history makes the split exact. The first commit, f006ef4, is the import of zarazhangrui/frontend-slides. Every later commit except one Dependabot bump is mine.
| Part | Origin |
|---|---|
SKILL.md workflow, STYLE_PRESETS.md, viewport-base.css | Upstream, imported at 9906a34 |
bold-template-pack/ index, cards and deck-stage.js | Upstream, derived from beautiful-html-templates |
extract-pptx.py, deploy.sh, export-pdf.sh | Upstream |
sync.sh, the CI drift check, REFERENCES.md | Mine |
check-slides.mjs and the verify step in SKILL.md | Mine |
web/ gallery and the 34 owned template files | Mine, templates forked at e5e204f |
REFERENCES.md records both fork points. LICENSE keeps the original MIT notice and adds a second line for my changes.
Measuring the stage
Every deck clips its stage with overflow: hidden, so text pushed past the frame disappears without a trace. scripts/check-slides.mjs measures geometry instead of pixels. It serves the deck folder over a local HTTP server and opens Chromium through Playwright at 1920 by 1080. It waits for fonts plus 600 ms, since a font swap changes text width. For each .slide it hides the others, removes the .deck-stage scale and forces reveal animations to their end state. A visible element holding text or media that crosses the frame by more than 1.5 px is an overflow error. Flex or grid siblings covering at least 20 percent of the smaller panel raise an overlap warning. Elements marked aria-hidden, or with class names like bg, glow or ornament, count as decoration. Exit codes are 0 for clean, 1 for problems and 2 for bad input.
Templates at true size
The gallery in web/ is Vite, React 19 and shadcn/ui over 34 template files in web/public/templates/. The decks are authored for a full 1920 by 1080 viewport, and a small iframe crops them instead of shrinking them. DeckFrame renders each iframe at that design size and applies transform: scale() with the container width divided by 1920. CSS container units cannot drive scale(), which needs a unitless number, and my first attempt showed only each deck’s top-left corner. Cards filter by scheme, formality, mood and free text. A click opens the live deck in a portal lightbox. It also listens for Escape inside the same-origin iframe, because a focused deck otherwise swallows the key.
Decisions and costs
- Generate the plugin copy rather than edit it. The marketplace install reads
plugins/frontend-slides/skills/frontend-slides/, so the copy must be committed.sync.shrebuilds seven items from the root, and CI runsbash sync.sh --checkon every push. Every skill edit now lands as two identical diffs. - Own the template HTML rather than fetch it. One agent per template fixed 20 of the 34, including literal placeholders such as
[Author Name].fetch-templates.mjsrefuses to overwrite them without--force. Upstream changes are now manual cherry-picks. - Detect decoration by class name. Templates need no extra markup, but unknown names slip through. On
grove.htmlthe slide numberdiv.grove-numreports 52 px of overflow on four slides. This is the heuristic I would revisit first.
Checking a deck
bash scripts/check-slides.sh ./my-deck/ --json
bash scripts/check-slides.sh presentation.html --strict --slide 2
bash sync.sh && bash sync.sh --check
cd web && npm install && npm run dev
The wrapper installs Playwright into a fresh temporary directory on every run. The repository stays clean, and every check pays for an npm install. --strict fails on overlap too. --slide takes a zero-based index, while the report counts slides from one. The same module exports checkSlides(), so a future CLI can import the check rather than shell out.
Limits and status
The CLI and the Claude API web app in DEVELOPING.md are a roadmap, not code. The README names no deployed copy of the gallery. The checker understands only decks built from .slide sections. There are no automated tests yet. The feature work all landed on 29 June 2026, and later commits only move CI runners and dependencies. It is MIT licensed.