html-slides
Skill13 starsChanged 13 days agoMITView on GitHub
Builds single-file HTML slide decks from any content: DESIGN.md brand or a style preset, light/dark, embedded fonts, tracks, speaker notes, live stages, offline; PDF export, a quality gate and an anonymity check before sending. Trigger: "create a presentation", "make slides", "slide deck", "html slides", "PowerPoint alternative", "/slides".
12 other projects use a version of this.
Adopted by
Most recently taken up by
- jasonlohyp/skillstheir own version, first seen Nov 8, 2026
- samuelhe52/skillstheir own version, first seen Nov 8, 2026
- samuelhe52/agent-skillstheir own version, first seen Nov 8, 2026
- AgnesAI-Labs/agnet-skills-cntheir own version, first seen Nov 1, 2026
- 32Lwk/html-slidestheir own version, first seen Oct 13, 2026
- BibekBhusal0/skillstheir own version, first seen Oct 11, 2026
Used with
Projects with it also use frontend-design.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
BlockSkillfrontend-design
Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
Also in 3 projects that use this
Other versions12 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 12
- claude-office-skills/skills★ 433same name
- proyecto26/slides-ai-plugin★ 39same name
- phanghonghao/THU-Awesome-Skills★ 8same name
- 32Lwk/html-slides★ 2same name
- ikkeseb/skills★ 2same name
- KhucHieuNghi/agents-skills★ 2same name
- aemerson-commits/shareable-skills★ 1same name
- AgnesAI-Labs/agnet-skills-cn★ 1same name
- BibekBhusal0/skills★ 1same name
- samuelhe52/agent-skills★ 1same name
2 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository44 other files it gives its agents.
- AGENTS.mdAGENTS.md
- skills/board-pilot/references/agents.mdAGENTS.md
- .github/copilot-instructions.mdCopilot instructions
- a2aSkill
- archiveSkill
- board-pilotSkill
- bridge-auditSkill
- bridge-contributeSkill
- bridge-curatorSkill
- bridge-explorerSkill
- bridge-greetingSkill
- bridge-leak-checkSkill
- bridge-learnSkill
- bridge-onboardSkill
- bridge-overlaySkill
- bridge-promoteSkill
- bridge-statusSkill
- bridge-syncSkill
- briefingSkill
- calendarSkill
- capability-brokerSkill
- channelSkill
- cmuxSkill
- cockpitSkill
- dashboardSkill
- debriefSkill
- doc-systemSkill
- github-projects-managerSkill
- html-canvasSkill
- knowledge-repo-initSkill
- mail-draftSkill
- mandantsSkill
- meeting-transcriptionSkill
- object-storeSkill
- onboard-simSkill
- remoteSkill
- scheduleSkill
- secretsSkill
- spec-kickoffSkill
- task-close-postmortemSkill
- tmuxSkill
- tracker-syncSkill
- workloadSkill
- workspaceSkill
The file
We split this skill into the rules it gives an agent
2 rules. 0 are common, 1 is distinctive, and 1 is very specific to this project.
0
Common
Most of the 7 edited versions we read keep these.
1
Distinctive
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 45
Never hand-assemble a deck.
- Very specific: line 75
DESIGN.md wins: When one is found walking up from the output path, or given with --design (a path or an id under identity/designs/), the …
“Common” is measured: kept by at least 6 in 10 of the 7 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
HTML Slide Deck Generator
Single-file HTML presentations: a scroll-snap engine with keyboard, tracks,
speaker notes and deep links, the Bridge's DESIGN.md brand or one of
10 style presets, light and dark, fonts embedded, nothing fetched from a network. The
foundation (tokens, fonts, the quality gate, the send bundle) is shared with
html-canvas and called from there, never copied: this skill needs
skills/html-canvas/ next to it.
Decision tree
| The request | Do this | Read |
| A new deck | scripts/new-deck.py (Build path below) | reference/slide-types.md, reference/rules.md |
| Bring an existing deck up to date: newer engine, changed DESIGN.md, other preset | new-deck.py --refresh deck.html | reference/deck-build.md |
| Edit the slides of an existing deck | edit them by hand (outside the marker regions), then the gate | reference/slide-types.md |
| A different cut of one deck (prep vs. live, short vs. long) | data-track on slides, key F | reference/slide-types.md § Engine Contract |
| Speaker notes, a clickable agenda | <aside class="notes">, slide type 10 (Overview) | reference/slide-types.md |
| A running simulation inside a slide | new-deck.py --with-stage, a .stage element | reference/stage.md |
| Presenting live: blank screen, jump to a slide number, zoom, language switch, notes handout | built in: keys B / W, digits + Enter, Alt+click, L, data-print-notes | reference/slide-types.md § Engine Contract |
| An optional deck feature (one of the 5 modules below) or writing one | new-deck.py --with NAME (or --with all), SlideDeck.use() | reference/modules.md |
| A presenter view on a second screen, a time budget per slide, a rehearsal with plan vs actual | --with presenter, data-time="90" on slides, key P | reference/modules.md § Module: presenter |
| Point at or mark up a slide while presenting: laser pointer, pen, marker | --with draw, keys Q and D | reference/modules.md § Module: draw |
| Reveal points one by one, walk through code line by line | --with steps, data-step, data-lines | reference/modules.md § Module: steps |
| Morph an element from one slide to the next | --with morph, data-morph="name" | reference/modules.md § Module: morph |
| A deck handed over to be read, not presented: every slide with its notes as one document | --with read, key R; a send copy opens in it with --deck-attr data-read-default= | reference/modules.md § Module: read |
| Pick a look | DESIGN.md (default) or a style preset by name | reference/deck-build.md § Presets |
| A deck in no house brand, or no DESIGN.md exists | --preset <slug> | presets/_template.yaml, assets/discovery-menu.html |
| PDF, mail, customer, external | the send path below | reference/output-formats.md |
| A new style preset | fill presets/_template.yaml | reference/deck-build.md § Presets |
| A page to read, not a deck to present | use html-canvas instead |
Build path: generator first
Never hand-assemble a deck. The generator writes every generated part between markers, asserts each splice, and keeps the deck refreshable.
python3 skills/html-slides/scripts/new-deck.py --title "Quarterly review" --lang en \
--slides slides.html --out work/tasks/<slug>/deliverables/deck.html- Plan the content against the density limits in
reference/rules.md: title, sections, content slides, closing. Split, never cram. - Write the slides as one HTML fragment of
<section class="slide ...">elements, from the 11 slide types inreference/slide-types.md. Without--slidesthe deck gets one title slide to fill in. - Generate with
new-deck.py. Engine options (tracks, counter format, back link) go on the deck element with--deck-attr data-NAME=VALUE. It splices the pre-paint theme script, the embedded fonts, the tokens,assets/slide-engine.cssandassets/slide-engine.js(first lineslide-engine v2), plus the stage module with--with-stageand each deck module named by--with(reference/modules.md).--lang delocalises the controls, the help and the ARIA texts. - Run the gate (Definition of done), then open the file in the browser.
Updating an existing deck: new-deck.py --refresh deck.html rewrites only the
marker regions the deck already carries (engine, tokens, fonts, preset CSS, stage, modules)
from the current assets, DESIGN.md and preset. The slides are never touched, and a
second run gives the same bytes. A deck from before the generator has no markers:
leave it as it is (its engine is embedded and keeps working), or move its slides
into a fresh new-deck.py --slides build. Details: reference/deck-build.md.
Look: DESIGN.md first, style presets as fallback
- DESIGN.md wins. When one is found walking up from the output path, or given
with
--design(a path or an id underidentity/designs/), thedesignpreset is the default. A deck inside the Bridge wears the design the Bridge resolves (the theme'sbranding.design, else the root DESIGN.md); a deck written into another repository keeps that repository's DESIGN.md: colours throughpresets/design.map.yamlandhtml-canvas/scripts/design-to-css.py, families and weights from DESIGN.md typography. Nothing is hand-picked. The preset also holds the brand rules a slide's markup cannot break: headings in the heading colour, status colours for state only (a chapter colour or glow from a snippet gives way), 1px lines, code in the mono family on the muted surface, no shadow or texture..fxon<html>, the deck or a slide brings the decoration back. - Style presets (
--preset swiss-modernand the others) are for a deck that should not carry the house brand, and the fallback without DESIGN.md (the one markeddefault: true). Offer the pickerassets/discovery-menu.htmlwhen the user wants to choose; no answer means the default. - Theme contract: the engine keeps
.theme-dark/.theme-lighton<html>, stored asslide-theme, the OS preference while nothing is stored, key T toggles. The shared rule set ishtml-canvas/references/theme-contract.md. - Fonts are embedded by default (style presets depend on their typefaces);
--no-embed-fontsleaves the deck on its fallback stacks. A send copy always embeds.
Definition of done
verify-page.py from html-canvas is the gate. Exit 0 is done; a requested browser
pass that cannot run is an error, not a pass.
V=skills/html-canvas/scripts/verify-page.py
python3 $V deck.html --design DESIGN.md # always: no external or sibling file, no placeholder, no stray hex
uv run --with playwright python $V deck.html --design DESIGN.md --deck # before delivery: renders it,
# contrast per theme, overflow per slide, one print page per slidePass the same --design the deck was built with. Without it the gate takes the
nearest DESIGN.md at or above the deck, but never above the project root (the
first folder with .git or bridge-config.yaml), and says which one it used.
A deck built from another DESIGN.md gets a design-source warning. --deck
needs playwright and its chromium; a bare python3 without them fails as
browser-skipped.
A style preset deck is off brand by definition: while a DESIGN.md is in reach,
the gate reports its preset colours as hex errors. That is the one known
exception; every other finding gets fixed.
Send path
| Trigger | Action |
| "send to customer", "external", "check before sending" | scripts/check-anonymity.py deck.html, resolve every hit (exit 1 on hits) |
| "as PDF", "print", "attachment" | node scripts/render-pdf.cjs deck.html deck.pdf [--theme light], one 16:9 page per slide |
| The deck loads local files (images, a stage page next to it) | scripts/inline-assets.py deck.html deck-send.html, which runs the shared html-canvas/scripts/bundle.py |
| Mail the deck | anonymity check, gate, bundle, PDF, then check the bundled copy again |
| Send it to readers, not an audience | build a reading copy from the same slides (--with read --deck-attr data-read-default=), then the same path |
An instance names its own wordlist in bridge-config.yaml under
html_slides.anonymity_wordlist, never in this skill. Order and options:
reference/output-formats.md.
Files
| File | Read it when |
scripts/new-deck.py | building or refreshing any deck |
reference/deck-build.md | marker regions, preset choice, fonts, refresh, writing a preset |
reference/slide-types.md | writing slides; the Engine Contract (options, keys, API) |
reference/rules.md | planning content: the DESIGN.md rule, anti-slop list, density limits |
reference/stage.md | a live simulation inside a slide |
reference/modules.md | deck modules: --with, the plugin API SlideDeck.use(), writing and testing one |
reference/output-formats.md | PDF, bundle, anonymity check, the package to send |
presets/_template.yaml | the preset schema, before writing one |
assets/slide-engine.css, assets/slide-engine.js | extending the engine (then add a test) |
assets/slide-stage.css, assets/slide-stage.js | extending the stage (same) |
assets/modules/ | the deck modules (draw, morph, presenter, read, steps), one .js and .css each |
assets/fonts/, scripts/font-face.py | preset fonts (woff2 plus OFL licences) |
scripts/check-anonymity.py, scripts/render-pdf.cjs, scripts/inline-assets.py | the send path |
Tests
PYTHONDONTWRITEBYTECODE=1 uv run --with pytest --with pyyaml --with playwright \
python -m pytest skills/html-slides/tests -q -rsBrowser tests need playwright and its chromium and skip without them; the
render-pdf tests also need node playwright. Changing the engine, a preset or a
count in these docs means running them; tests/test_docs.py holds the counts to
the tree.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

