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.

bashsession

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

A coding-agent skill for single-file HTML decks, forked from zarazhangrui/frontend-slides and extended with visual QA, owned templates and a gallery.
Chapter
Agents and operations
Category
Agentic Tools
Year
Availability
Open source
Last commit
stack7 parts
  • Claude Code plugin
  • HTML
  • CSS
  • Playwright
  • React
  • Vite
  • shadcn/ui

Agent Skills, Claude Code, HTML Slides, Playwright, React

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.

PartOrigin
SKILL.md workflow, STYLE_PRESETS.md, viewport-base.cssUpstream, imported at 9906a34
bold-template-pack/ index, cards and deck-stage.jsUpstream, derived from beautiful-html-templates
extract-pptx.py, deploy.sh, export-pdf.shUpstream
sync.sh, the CI drift check, REFERENCES.mdMine
check-slides.mjs and the verify step in SKILL.mdMine
web/ gallery and the 34 owned template filesMine, 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.sh rebuilds seven items from the root, and CI runs bash sync.sh --check on 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.mjs refuses 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.html the slide number div.grove-num reports 52 px of overflow on four slides. This is the heuristic I would revisit first.

Checking a deck

bash4 lines
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.

All 43 projects