Install any skill in seconds. Free to start, no credit card required.
Get Started Free →For consulting delivery work: turn diagnosis, frameworks, and project work into a client-adoptable action plan. Built around the core query "consulting-final-deck", with engagement manager judgment, buyer-ready proof, and this outcome: accept the recommendation and commit owners to the roadmap.
.claude/skills/nexu-io-html-ppt/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 129% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 135% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -18% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 149% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 43% | 0% |
Author professional HTML presentations as static files. One theme file = one look. One layout file = one page type. One animation class = one entry effect. All pages share a token-based design system in assets/base.css.
bashnpx skills add https://github.com/lewislulu/html-ppt-skill
One command, no build. Pure static HTML/CSS/JS with only CDN webfonts.
assets/themes/*.css) — minimal-white, editorial-serif, soft-pastel, sharp-mono, arctic-cool, sunset-warm, catppuccin-latte/mocha, dracula, tokyo-night, nord, solarized-light, gruvbox-dark, rose-pine, neo-brutalism, glassmorphism, bauhaus, swiss-grid, terminal-green, xiaohongshu-white, rainbow-gradient, aurora, blueprint, memphis-pop, cyberpunk-neon, y2k-chrome, retro-tv, japanese-minimal, vaporwave, midcentury, corporate-clean, academic-paper, news-broadcast, pitch-deck-vc, magazine-bold, engineering-whiteprinttemplates/full-decks/<name>/) — complete multi-slide decks with scoped .tpl-<name> CSS. 8 extracted from real-world decks (xhs-white-editorial, graphify-dark-graph, knowledge-arch-blueprint, hermes-cyber-terminal, obsidian-claude-gradient, testing-safety-alert, xhs-pastel-card, dir-key-nav-minimal), 7 scenario scaffolds (pitch-deck, product-launch, tech-sharing, weekly-report, xhs-post 3:4, course-module, presenter-mode-reveal — 演讲者模式专用)templates/single-page/*.html) with realistic demo dataassets/animations/animations.css) via data-animassets/animations/fx/*.js) via data-fx — particle-burst, confetti-cannon, firework, starfield, matrix-rain, knowledge-graph (force-directed), neural-net (pulses), constellation, orbit-ring, galaxy-swirl, word-cascade, letter-explode, chain-react, magnetic-field, data-stream, gradient-blob, sparkle-trail, shockwave, typewriter-multi, counter-explosionassets/runtime.js) — arrows, T (theme), A (anim), F/O, S (presenter mode: magnetic-card popup with CURRENT / NEXT / SCRIPT / TIMER cards), N (notes drawer), R (reset timer in presenter)assets/animations/fx-runtime.js) — auto-inits [data-fx] on slide enter, cleans up on leaveUse when the user asks for any kind of slide-based output or wants to turn text/notes into a presentable deck. Prefer this over building from scratch.
If the user mentions any of: 演讲 / 分享 / 讲稿 / 逐字稿 / speaker notes / presenter view / 演讲者视图 / 提词器, or says things like "我要去给团队讲 xxx", "要做一场技术分享", "怕讲不流畅", "想要一份带逐字稿的 PPT" — use the presenter-mode-reveal full-deck template and write 150–300 words of 逐字稿 in each slide's <aside class="notes">.
See references/presenter-mode.md for the full authoring guide including the 3 rules of speaker script writing:
All full-deck templates support the S key presenter mode (it's built into runtime.js). S opens a new popup window with 4 magnetic cards:
Each card is draggable by its header and resizable by the bottom-right corner handle. Card positions/sizes persist to localStorage per deck. A "Reset layout" button restores the default arrangement.
Why the previews are pixel-perfect: each preview is an <iframe> that loads the actual deck HTML with a ?preview=N query param; runtime.js detects this and renders only slide N with no chrome. So the preview uses the same CSS, theme, fonts, and viewport as the audience view — colors and layout are guaranteed identical.
Smooth navigation: on slide change, the presenter window sends postMessage({type:'preview-goto', idx:N}) to each iframe. The iframe just toggles .is-active between slides — no reload, no flicker. The two windows also stay in sync via BroadcastChannel.
Only presenter-mode-reveal is designed from the ground up around the feature with proper example 逐字稿 on every slide.
Keyboard in presenter window: ← → navigate (syncs audience) · R reset timer · Esc close popup. Keyboard in audience window: S open presenter · T cycle theme · ← → navigate (syncs presenter) · F fullscreen · O overview.
Before writing slides, resolve the three decisions below from the user's brief, project metadata, supplied content, and conversation. If they are sufficiently clear, choose a tasteful default and proceed without waiting for confirmation; state the choices briefly in the plan. Ask one consolidated clarification only when a missing answer would materially change the deck.
watching (engineers / execs / 小红书读者 / 学生 / VC)?
candidates based on tone:
pitch-deck-vc, corporate-clean, swiss-gridtokyo-night, dracula, catppuccin-mocha,terminal-green, blueprint
xiaohongshu-white, soft-pastel, rainbow-gradient,magazine-bold
academic-paper, editorial-serif, minimal-whitecyberpunk-neon, vaporwave, y2k-chrome,neo-brutalism
the closest templates/full-decks/<name>/. If the user's content suggests something obvious (e.g. "我要做产品发布会" → product-launch), use it confidently instead of asking blindly.
A good clarification, when one is actually needed, follows the active discovery-question-form protocol and contains only unresolved fields. For example, if content and audience are known but the requested tone spans incompatible themes, ask one theme question with 2–3 recommended options. Do not repeat the form as a markdown checklist.
If the known context already resolves them, scaffold the deck and start writing immediately.
bash ./scripts/new-deck.sh my-talk open examples/my-talk/index.html
T to cycle. Or hard-code it:html <link rel="stylesheet" id="theme-link" href="../assets/themes/aurora.css"> Catalog in references/themes.md.
<section class="slide">...</section> blocks out offiles in templates/single-page/ into your deck. Replace the demo data. Catalog in references/layouts.md.
data-anim="fade-up" (or class="anim-fade-up") onany element. On <ul>/grids, use anim-stagger-list for sequenced reveals. For canvas FX, use <div data-fx="knowledge-graph">...</div> and include <script src="../assets/animations/fx-runtime.js"></script>. Catalog in references/animations.md.
templates/full-decks/<name>/ intoexamples/my-talk/ as a starting point. Each folder is self-contained with scoped CSS. Catalog in references/full-decks.md and gallery at templates/full-decks-index.html.
bash ./scripts/render.sh templates/theme-showcase.html # one shot ./scripts/render.sh examples/my-talk/index.html 12 # 12 slides
closest layout from templates/single-page/ first, then replace content.
from CSS variables defined in assets/base.css and overridden by a theme. Good: color: var(--text-1). Bad: color: #111.
a new templates/single-page/*.html if none of the 30 fit.
.deck-header, .deck-footer, .slide-numberand the progress bar are provided by assets/base.css + runtime.js.
<script src="../assets/runtime.js"></script>so the deck supports ← → / T / A / F / S / O / hash deep-links.
.slide per logical page. runtime.js makes .slide.is-activevisible; all others are hidden.
<div class="notes">…</div> insideeach slide. Press S to open the overlay.
"这一页展示了……" or "Speaker: 这里可以补充……" or small explanatory captions aimed at the presenter MUST go inside <div class="notes">, NOT as visible <p> / <span> elements on the slide. The .notes class is display:none by default — it only appears in the S overlay. Slides should contain ONLY audience-facing content (titles, bullet points, data, charts, images).
See references/authoring-guide.md for a step-by-step walkthrough: file structure, naming, how to transform an outline into a deck, how to choose layouts and themes per audience, how to do a Chinese + English deck, and how to export.
html-ppt/
├── SKILL.md (this file)
├── references/ (detailed catalogs, load as needed)
├── assets/
│ ├── base.css (tokens + primitives — do not edit per deck)
│ ├── fonts.css (webfont imports)
│ ├── runtime.js (keyboard + presenter + overview + theme cycle)
│ ├── themes/*.css (36 token overrides, one per theme)
│ └── animations/
│ ├── animations.css (27 named CSS entry animations)
│ ├── fx-runtime.js (auto-init [data-fx] on slide enter)
│ └── fx/*.js (20 canvas FX modules: particles/graph/fireworks…)
├── templates/
│ ├── deck.html (minimal 6-slide starter)
│ ├── theme-showcase.html (36 slides, iframe-isolated per theme)
│ ├── layout-showcase.html (iframe tour of all 31 layouts)
│ ├── animation-showcase.html (20 FX + 27 CSS animation slides)
│ ├── full-decks-index.html (gallery of all 14 full-deck templates)
│ ├── full-decks/<name>/ (14 scoped multi-slide deck templates)
│ └── single-page/*.html (31 layout files with demo data)
├── scripts/
│ ├── new-deck.sh (scaffold a deck from deck.html)
│ └── render.sh (headless Chrome → PNG)
└── examples/demo-deck/ (complete working deck)scripts/render.sh wraps headless Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome. For multi-slide capture, runtime.js exposes #/N deep-links, and render.sh iterates 1..N.
bash./scripts/render.sh templates/single-page/kpi-grid.html # single page ./scripts/render.sh examples/demo-deck/index.html 8 out-dir # 8 slides, custom dir
← → Space PgUp PgDn Home End navigate
F fullscreen
S open presenter window (magnetic cards: current/next/script/timer)
N quick notes drawer (bottom overlay)
R reset timer (in presenter window)
?preview=N URL param — force preview-only mode (single slide, no chrome)
O slide overview grid
T cycle themes (reads data-themes attr)
A cycle demo animation on current slide
#/N in URL deep-link to slide N
Esc close all overlaysMIT. Copyright (c) 2026 lewis <sudolewis@gmail.com>.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 50,386 | 42,294 | -16% | 1 | 1 | 0% | 8,287 | 11,950 | +44% | 0 | 0 | — |
case-02 | fail→fail | 92,067 | 59,056 | -36% | 1 | 1 | 0% | 8,264 | 11,927 | +44% | 0 | 0 | — |
case-03 | fail→fail | 35,984 | 50,853 | +41% | 1 | 1 | 0% | 8,045 | 11,915 | +48% | 0 | 0 | — |
case-04 | fail→fail | 39,615 | 27,285 | -31% | 1 | 1 | 0% | 7,742 | 8,958 | +16% | 0 | 0 | — |
case-05 | fail→fail | 54,675 | 64,734 | +18% | 1 | 1 | 0% | 8,246 | 11,149 | +35% | 0 | 0 | — |
case-06 | fail→fail | 14,837 | 9,981 | -33% | 1 | 1 | 0% | 2,028 | 5,486 | +171% | 0 | 0 | — |
case-07 | fail→pass | 18,367 | 4,016 | -78% | 1 | 1 | 0% | 1,921 | 4,398 | +129% | 0 | 0 | — |
case-08 | fail→pass | 10,764 | 3,378 | -69% | 1 | 1 | 0% | 1,816 | 4,265 | +135% | 0 | 0 | — |
case-09 | fail→pass | 28,725 | 4,736 | -84% | 1 | 1 | 0% | 5,115 | 4,197 | -18% | 0 | 0 | — |
case-10 | fail→fail | 27,337 | 8,802 | -68% | 1 | 1 | 0% | 4,158 | 4,750 | +14% | 0 | 0 | — |
case-11 | pass→pass | 12,452 | 7,934 | -36% | 1 | 1 | 0% | 1,553 | 4,785 | +208% | 0 | 0 | — |
case-12 | fail→pass | 15,184 | 10,480 | -31% | 1 | 1 | 0% | 2,106 | 5,245 | +149% | 0 | 0 | — |
case-13 | fail→pass | 23,185 | 16,207 | -30% | 1 | 1 | 0% | 4,188 | 5,996 | +43% | 0 | 0 | — |
case-14 | pass→pass | 21,862 | 27,898 | +28% | 1 | 1 | 0% | 3,350 | 7,090 | +112% | 0 | 0 | — |
case-15 | fail→pass | 9,567 | 6,140 | -36% | 1 | 1 | 0% | 1,462 | 4,722 | +223% | 0 | 0 | — |
case-16 | fail→pass | 58,286 | 7,607 | -87% | 1 | 1 | 0% | 5,877 | 4,769 | -19% | 0 | 0 | — |
case-17 | pass→pass | 15,878 | 3,511 | -78% | 1 | 1 | 0% | 1,569 | 4,236 | +170% | 0 | 0 | — |
case-18 | fail→pass | 20,869 | 9,730 | -53% | 1 | 1 | 0% | 3,236 | 5,312 | +64% | 0 | 0 | — |
case-19 | pass→pass | 16,012 | 7,116 | -56% | 1 | 1 | 0% | 2,126 | 4,756 | +124% | 0 | 0 | — |
case-20 | pass→pass | 12,397 | 13,611 | +10% | 1 | 1 | 0% | 2,370 | 5,805 | +145% | 0 | 0 | — |
case-21 | pass→pass | 23,040 | 21,786 | -5% | 1 | 1 | 0% | 3,457 | 7,769 | +125% | 0 | 0 | — |
case-22 | pass→pass | 29,786 | 14,116 | -53% | 1 | 1 | 0% | 3,045 | 6,383 | +110% | 0 | 0 | — |
case-23 | fail→pass | 11,262 | 10,262 | -9% | 1 | 1 | 0% | 1,759 | 4,762 | +171% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +39 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.