Presentation forge
Build beautiful, self-contained HTML presentations (slide decks) with the bundled Presentation Forge engine: one HTML file per slide, bundled into a single portable index.html with presenter mode, progressive reveal, and swappable themes. Use this whenever the user wants to create, design, write, or build a presentation, slide deck, talk, or "slides" as HTML or for the browser; wants a web-based or single-file shareable deck; wants to turn a topic, brief, outline, notes, or a document into slides (technical talks AND any other subject); or wants to recreate a brand/PowerPoint look as a reusable theme, from a .pptx, from image(s), or from a text description, optionally integrating a company logo. Produces HTML decks, not native PowerPoint files.From its SKILL.md
npx -y skills add thmsgo18/presentation-forgeAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 7 stars7 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 8 commands, including `mkdir -p "<target>"` and 7 more.
SKILL.md
11.0 KB, ~2.6k tokens by cl100k_base, as published. Nobody here has run it
Presentation Forge
Presentation Forge turns plain HTML into polished presentations. You write one
HTML file per slide; a tiny Python build step (build.py, standard library
only) bundles the slides, the engine, the chosen theme and all images into a
single self-contained index.html that opens by double-click, emails
cleanly, and works offline.
Everything needed ships inside this skill, so it works the same in Claude Code, in the Claude apps, and via the API - anywhere Claude has a filesystem and can run Python.
Three layers, always kept separate:
- engine (
template/engine/) - rendering logic: scaling, navigation, presenter mode, progressive reveal. Don't edit it to change content or look. - theme (
template/themes/<name>/) - the look: colours, type, spacing, fonts, logos, backgrounds. Swap themes without touching slides. - content (
slides/) - the slides, one file each, ordered by name.
This skill supports two workflows, chosen from what the user asks:
- Create a presentation - author a deck from a topic or brief.
- Import a theme - build a reusable theme from a
.pptx, image(s), or a description, with optional logo integration. Seereference/import-theme.mdfor the full procedure.
Where the engine lives
This skill bundles the deck scaffold in template/, a sibling of this
SKILL.md. It contains engine/, themes/ (the dark obsidian and the light
ink-blue), example slides/, assets/, build.py and deck.config.json.
Resolve the skill's own directory first (it's wherever this SKILL.md was read
from), then treat template/ as relative to it. A robust way to locate it:
SKILL_DIR="$(dirname "$(find . -name SKILL.md -path '*presentation-forge*' 2>/dev/null | head -1)")"
# or just use the directory you read this SKILL.md from
TEMPLATE="$SKILL_DIR/template"
In Claude Code the skill folder is known directly; in the Claude apps / API the
skill is unzipped into the working filesystem - in both cases template/ sits
next to SKILL.md.
Workflow 1 - Create a presentation
-
Pick a target directory for the deck (ask the user, or default to a new kebab-case folder named after the topic, in the current working directory). Each deck is its own folder - never build inside the skill's
template/. -
Copy the template into the target, contents and dotfiles included:
mkdir -p "<target>" cp -R "$TEMPLATE/." "<target>/" rm -f "<target>/index.html" # stale demo build; you'll regenerate it -
Configure
<target>/deck.config.json:title,lang,theme(see Configuration). -
Outline, then write the slides in
<target>/slides/- replace the example files with real content, one<section class="slide">per file, numbered01-,02-, … so they order correctly. Plan a tight arc:01-title.html→slide slide--titlewith.eyebrow,.display,.lead.- an agenda slide for longer decks;
slide--sectiondividers between parts. - content slides: one idea per slide - a strong
.titleplus a few.bullets, a.two-col, a.card, ablockquote, or apre>codeblock. Vary the blocks so the deck breathes; avoid walls of text. - a
slide--concludeclosing slide. aside.notesfor speaker notes;class="fragment"to reveal points step by step when build-up helps. Follow the authoring contract below.
-
Build:
python3 build.pyrun inside<target>(orpython3 "<target>/build.py"); usepythoninstead ofpython3if that's what resolves on this machine (common on Windows). Add--opento open it,--watchto rebuild on save. -
Verify the build printed
Built index.html - N slideswith the count you expect, and resolve any! missing image/no <section class="slide">warnings. Report the deck folder and how to present (arrow keys / Space,ppresenter mode,?shortcuts).
Write it well, from the start
Treat the writing as the product, not an afterthought. Before writing slides, fix the one core message, the audience, and a clear arc (title, context, 2-4 sections, a close with the takeaway and next step). Then, per slide:
- make the title a full assertion that states the point ("Caching cut p99 by 40%", not "Performance"); the body is only the evidence for it;
- one idea per slide, few words, parallel and concrete bullets, no walls of text - prose belongs in the notes;
- give almost every content slide speaker notes in
<aside class="notes">: the spoken narration and delivery cues the slide does NOT show (not a copy of the slide text, not a word-for-word script); - match the language to the audience; flag specifics you invent for a thin brief.
For the full method (arc, assertion-evidence, tight on-slide text, and exactly
what to put in speaker notes), read
reference/writing-decks.md before writing. It is
what makes the deck and its text excellent rather than merely correct.
Workflow 2 - Import a theme
Reproduce a brand's charter as a reusable theme under
template/themes/<name>/ (or a deck's themes/<name>/): its palette, its
real fonts (downloaded and embedded, not a system fallback), its logo, and
its visual signature (layout: title placement, bands, rules, footer). The
reference can be:
- a saved style file (
.pfstyle.json) from a previous session - the exact, one-step path:scripts/theme_bundle.py unpackrebuilds the whole theme (CSS, fonts, logo, backgrounds) byte for byte, with no reproduction needed; - a PowerPoint (
.pptx) -scripts/pptx_theme.pyextracts the palette, the fonts, the embedded media, and the master's layout geometry (title/body boxes, font sizes, background); - image(s) -
scripts/image_colors.pysamples the exact dominant colours; view the image for typography and layout; - a text description - brand words mapped to tokens;
- optionally a company logo to integrate onto slides.
Real fonts are fetched with scripts/fetch_font.py (Google Fonts) when free, with
a fallback to asking for the font files. Whenever you build a theme, export it
with scripts/theme_bundle.py pack into a single <name>.pfstyle.json and give it
to the user: handing back that one file in any future conversation recreates the
exact same style, with no image or PowerPoint needed. The full step-by-step
procedure (colour mapping, font fetching, logo integration, reproducing the layout
in slides.css, and packing/unpacking the style file) is in
reference/import-theme.md. Read it when this
workflow triggers.
The slide authoring contract
Each file in slides/ is exactly one slide. Keep markup plain and lean on the
theme's classes - that keeps slides consistent and themes swappable.
<section class="slide">
<h2 class="title">One clear point per slide.</h2>
<ul class="bullets">
<li>One idea per line.</li>
</ul>
<aside class="notes">Speaker notes - shown only in presenter mode.</aside>
</section>
Slides are authored on a fixed 1920×1080 canvas; the engine scales it to any screen, so always design against that fixed size.
Slide variants
| Class | Use |
|---|---|
slide | standard content slide |
slide slide--title | opening / hero slide |
slide slide--section | section divider (dark background) |
slide slide--conclude | closing slide |
Content blocks (from the theme)
.eyebrow (kicker) · .display (largest heading) · h1/.title,
h2/.subtitle, .lead · ul.bullets · .two-col (two-column grid) · .card
(callout) · blockquote · pre > code (escape < > &) · .footer · .muted /
.accent (colour helpers) · aside.notes (presenter-only notes).
Progressive reveal
Add class="fragment" to any element to reveal it step by step on click. Each
→ reveals the next fragment, then advances to the next slide; the presenter view
shows step 2/3.
Images
Put a deck's content images in assets/ and reference them relative to the deck
root (<img src="assets/diagram.png">); build.py inlines them as base64. Keep
theme assets (fonts, backgrounds, logos) inside the theme folder.
Configuration (deck.config.json)
| Key | Default | Purpose |
|---|---|---|
title | Presentation | page title |
lang | en | document language (fr, en, …) |
theme | ink-blue | which themes/<name>/ folder to use |
width height | 1920 1080 | design canvas size |
transition | fade | fade · slide · zoom |
exit_hint | English string | toast shown on entering full screen |
Theming basics
A theme is a self-contained folder: tokens.css (colours, type scale, spacing,
font-family names), fonts.css (@font-face), slides.css (block styling), plus
fonts/, images/, logos/. To make a look, copy themes/ink-blue/ to
themes/<name>/, edit tokens.css, and set "theme": "<name>". Every theme must
define the same token names and style the same slide classes, so switching a theme
never breaks a deck.
Reference
reference/writing-decks.md- how to write the presentation and its text well, and what to put in speaker notes. Load it for Workflow 1.reference/import-theme.md- full theme-import procedure (pptx / image / description / logo). Load it for Workflow 2.template/docs/writing-slides.md- the deep authoring guide (navigation, presenter mode, deeper theming). Load it when you need detail beyond the contract above.
Guardrails
- One
<section class="slide">per file inslides/; the build warns otherwise. - Don't edit
engine/to change content or styling - that's the theme's job. - Don't build inside
template/; always copy it into a per-deck folder first. - Prefer the theme's classes over inline styles, so themes stay swappable.
What ships with it: 71 files
1792.9 KB alongside SKILL.md, 10 of them executable
docs/
- screenshots/comparison-table.png167.9 KB
- screenshots/presenter-mode.png150.3 KB
reference/
- import-theme.md9.8 KB
- writing-decks.md5.9 KB
scripts/
- fetch_font.pyruns5.5 KB
- image_colors.pyruns3.6 KB
- pf_venv.pyruns1.9 KB
- pptx_theme.pyruns9.8 KB
- theme_bundle.pyruns6.5 KB
template/
- assets/.gitkeep0 B
- build.pyruns8.2 KB
- deck.config.json183 B
- docs/writing-slides.md6.5 KB
- engine/base.css25.2 KB
- engine/deck-stage.jsruns69.6 KB
- index.html752.1 KB
- LICENSE1.0 KB
- README.fr.md4.4 KB
- README.md4.0 KB
- slides/01-title.html894 B
- slides/02-problem.html829 B
- slides/03-versus.html2.2 KB
- slides/04-agenda.html474 B
- slides/05-section-idea.html358 B
- slides/06-three-layers.html1.2 KB
- slides/07-markup.html2.0 KB
- slides/08-one-file.html1.2 KB
- slides/09-section-stage.html407 B
- slides/10-presenter.html807 B
- slides/11-demo-toolbar.html2.1 KB
- slides/12-demo-presenter.html1.3 KB
- slides/13-demo-presenter-tools.html1.6 KB
- CHANGELOG.md3.0 KB
- CONTRIBUTING.md2.3 KB
- .editorconfig309 B
- .gitattributes498 B
- .gitignore104 B
- LICENSE1.0 KB
- README.fr.md10.7 KB
- README.md9.4 KB
31 more files not listed here. See all 71 in the repository.