presentation-md
Pick a vibe. Preview it. Ship an editable deck — HTML + PowerPoint — from the AI agent you already use.
🌐 Live gallery · Studio · vs frontend-slides · vs Hallmark
⭐ If this turned your notes into a deck you'd actually present, star the repo.
Quick start
npx @presentation-md/install claude-code
# also: cursor | copilot | codex | gemini-cli | cli
Other install shelves (same skill):
# Universal skills.sh (Claude / Cursor / Copilot / Gemini / …)
npx skills add isatimur/presentation-md --skill presentation-generator
# Claude Code plugin marketplace → then /slides <brief>
# /plugin marketplace add isatimur/presentation-md
# /plugin install presentation-md@presentation-md
Restart your agent and ask: create a presentation about…
First win (no schema homework): the agent should show 3 vibe previews, then scaffold_deck → hand you a Studio share link (?d=). Fill copy, present, export editable PowerPoint when you need Keynote / Google Slides.
Demo without installing: open the gallery or Studio.
Per-agent guides: Claude Code · Cursor · Copilot · Codex · Gemini CLI.
Install matrix: docs/distribution/INSTALL-MATRIX.md.
Why presentation-md wins vs Hallmark (and frontend-slides)
Hallmark is the viral anti-AI-slop page/UI skill — four verbs, ~20 themes, 57 slop gates, stunning gallery. presentation-md shares that craft refusal energy for decks: typed Deck JSON, 75 themes, MCP audit/judge, Studio ?d= share, editable PPTX. Honest take: vs Hallmark.
| presentation-md | Hallmark | |
|---|---|---|
| Artifact | Slide decks (HTML + PPTX + Deck JSON) | Landing pages / UI |
| Themes | 75 published + brand import | ~20 named + custom OKLCH |
| One-prompt share | scaffold_deck → studio_share_url (?d=) |
Working page emit |
| MCP | 14 typed tools (scaffold, audit, judge, share, export…) | Skill refs (preview MCP on their roadmap) |
| Studio | Hosted editor + Present + Copy link | Showcase site |
| Install | npx @presentation-md/install · skills.sh |
npx skills add nutlope/hallmark |
frontend-slides feels better on first glance — simpler story, spectacular HTML demos, viral template wall, zero schema friction. We keep that vibe → preview → craft energy and add the product layer agents need to ship decks for real:
| presentation-md | frontend-slides | |
|---|---|---|
| First-win path | Vibe → preview → scaffold_deck → Studio share (?d=) |
Prompt → style previews → freeform HTML |
| Themes | 75 published + create-from-brand | Style presets / bold template pack |
| Discovery | Studio mood browse + Compare 3 + My deck restyle + MCP preview_themes + inline PNGs |
Live style gallery (strong) |
| One-shot quality | Anti-slop + stunning-25-first + density lock + audit_deck/judge_deck + apply_safe_fixes |
Anti-slop rules; no shared audit product |
| Authoring model | Schema-validated Deck JSON (under the hood) agents can diff/edit one slide | Prompt → HTML (harder to surgically edit) |
| Layouts | 18 craft layouts + custom-html recipes |
Template-driven HTML |
| MCP | Typed tools: scaffold, render, export, audit, judge, preview, import | — |
| Export | Native editable PPTX ↔ Deck JSON round-trip | HTML-first (+ PDF/deploy scripts) |
| Proofs | 75/75 structured gallery + Studio live preview | Showcase templates |
| Install | npx @presentation-md/install <agent> + Claude /slides plugin |
Clone / copy skill |
Also beats Gamma / Slidev / Marp on the agent path: structured JSON (not opaque slides), any coding agent (not one app), and PowerPoint you can still edit.
Stunning-25 template wall
Three layouts per flagship — Title · Bento · Compare — the same show-don’t-tell energy as a bold template gallery. Full wall: presentation-md.vercel.app/#template-wall.
What it is
A universal skill layer for Claude Code, Cursor, Codex, Gemini CLI, Copilot, and plain CLI. The agent writes Deck JSON; @presentation-md/render emits self-contained HTML; @presentation-md/export maps every layout to native PowerPoint shapes; Studio edits with live preview. Themes are swappable npm packages.
Also ships deck-design-judge (contrast / overflow gates + rubric) and optional multi-model scoring. Benchmark: swiirl-deck-benchmark.vercel.app. Provenance: ATTRIBUTION.md.
Packages
Themes
75 themes ship as @presentation-md/theme-* packages — from default-tech and corporate through editorial systems (soft-editorial, editorial-forest, vellum), bold frontend-slides fidelity packs (mat, grove, signal, bold-signal), and loud craft surfaces (neon-noir, crt-terminal, brutalist-acid).
Browse live proofs: gallery · theme catalog in packages/core/references/themes.md.
Need a theme that isn't here? create-presentation-md-theme --from-url <site> or --from-css <file>
generates one from any brand's live site or CSS in seconds — see
@presentation-md/create-theme.
Adapters
| Adapter | Description | Install |
|---|---|---|
claude-code |
Copies skill to ~/.claude/skills/ + registers MCP server in ~/.claude/mcp.json |
npx @presentation-md/install claude-code |
cursor |
Adds .mdc rule to ~/.cursor/rules/ + MCP server entry |
npx @presentation-md/install cursor |
copilot |
Writes to .github/copilot-instructions.md + .vscode/mcp.json (run from project root) |
npx @presentation-md/install copilot |
codex |
Adds skill to ~/.codex/instructions.md + MCP server |
npx @presentation-md/install codex |
gemini-cli |
Writes GEMINI.md skill to ~/.gemini/instructions/ + MCP server |
npx @presentation-md/install gemini-cli |
cli |
Standalone — renders decks via the presentation-md-render CLI, no MCP |
npx @presentation-md/install cli |
Deck JSON example
{
"type": "deck",
"meta": {
"title": "Q3 Product Review",
"company": "Acme Inc.",
"theme": "corporate"
},
"slides": [
{
"layout": "title",
"heading": "Q3 Product Review",
"lead": "July – September 2026",
"notes": "Open with the headline number, then land the theme of the quarter."
},
{
"layout": "image-hero",
"eyebrow": "Product",
"heading": "The work, in one frame",
"lead": "Ship velocity you can see.",
"image": "https://images.unsplash.com/photo-1551434678-e076c223a692?w=1600",
"imageAlt": "Team collaborating around a laptop"
},
{
"layout": "stat-row",
"heading": "By the numbers",
"stats": [
{ "label": "MRR", "value": "$420k" },
{ "label": "Active users", "value": "12,400" },
{ "label": "NPS", "value": "67" }
]
},
{
"layout": "two-column",
"heading": "What we shipped",
"body": "**Instant replay** — re-watch any session segment in one click.\n\n**Smart digest** — daily AI summary delivered to Slack.",
"aside": "**API v2** — REST + webhook parity.\n\n**iOS widgets** — glanceable stats on the lock screen.",
"ratio": "2-1",
"notes": "Spend time on Instant replay — demo if possible."
},
{
"layout": "comparison",
"heading": "Before vs after",
"leftLabel": "Before",
"left": "Manual decks, inconsistent themes, no PPTX handoff.",
"rightLabel": "After",
"right": "Schema-validated Deck JSON, 75 themes, native PowerPoint.",
"emphasis": "right"
},
{
"layout": "feature-grid",
"heading": "Upcoming in Q4",
"columns": "bento",
"cards": [
{ "title": "Real-time co-editing", "body": "Multiple agents annotating the same deck." },
{ "title": "Theme marketplace", "body": "Install community themes from the CLI." },
{ "title": "PDF export", "body": "Headless export via Playwright." },
{ "title": "Enterprise SSO", "body": "SAML 2.0 + SCIM for large orgs." },
{ "title": "Presenter polish", "body": "Notes drawer + craft knobs in Studio." }
]
},
{
"layout": "quote",
"quote": "The best presentation is the one that actually gets made.",
"by": "Every engineer who missed a deadline"
},
{
"layout": "timeline",
"heading": "Q4 milestones",
"steps": [
{ "title": "Oct 15 — Co-editing beta", "body": "Invite-only for design partners." },
{ "title": "Nov 1 — Theme marketplace", "body": "Browse and install from the CLI." },
{ "title": "Nov 20 — PDF export GA", "body": "One-command headless export." },
{ "title": "Dec 10 — Enterprise SSO", "body": "SAML 2.0 + SCIM provisioning." }
]
},
{
"layout": "data-table",
"heading": "Regional breakdown",
"columns": ["Region", "MRR", "Growth"],
"rows": [
["North America", "$210k", "+22%"],
["Europe", "$140k", "+15%"],
["APAC", "$70k", "+41%"]
]
},
{
"layout": "closing",
"heading": "Questions?",
"lead": "deck source at github.com/isatimur/presentation-md",
"notes": "Leave five minutes for Q&A."
}
]
}
Import from PowerPoint
Bring an existing .pptx back into Deck JSON for editing, re-theming, or agent iteration:
# CLI
presentation-md-render --from-pptx board-deck.pptx -o deck.json --theme corporate
Agents can call the import_pptx MCP tool. Fidelity notes (layouts, images, speaker notes) live in
packages/core/references/pptx-import.md.
Export to PowerPoint, Keynote & Google Slides
Because a deck is structured data (not free-form HTML), every slide maps cleanly to native slide shapes. One exporter covers all three apps:
# CLI
presentation-md-render deck.json --format pptx -o deck.pptx
presentation-md-render deck.json --format pdf -o deck.pdf
// Programmatic (Node)
import { renderDeckPptx, renderDeckPdf } from "@presentation-md/render";
await writeFile("deck.pptx", await renderDeckPptx(deckJson));
await writeFile("deck.pdf", await renderDeckPdf(deckJson));
The result is a native, editable .pptx:
- PowerPoint — opens directly.
- Keynote — File → Open (Keynote has no portable native format;
.pptxis the bridge). - Google Slides — File → Import slides / upload to Drive → opens as an editable Slides deck.
Agents can call the export_deck MCP tool (format: "pptx" | "html" | "pdf"). PDF uses Chromium's print pipeline (vector, selectable text). Fidelity notes (fonts, colors, images) live in
packages/export/references/pptx-fidelity.md.
Studio
@presentation-md/studio is a browser editor: edit a deck through
schema-driven forms, see a live preview, and download HTML or .pptx. It's a fully static Vite SPA
(client-side render + export, no backend).
pnpm --filter @presentation-md/studio dev # local editor
pnpm --filter @presentation-md/studio build:web # static build → web/studio/ (Vercel)
MCP tools
| Tool | Purpose |
|---|---|
render_deck |
Render a Deck JSON string to a self-contained HTML file |
export_deck |
Export a Deck JSON to native PowerPoint (.pptx), vector PDF, or html |
audit_deck |
Schema-validate + craft gates; optional apply_safe_fixes returns repaired JSON |
judge_deck |
Design judge — t0/t1 JSON gates; t2 HTML metrics + Chrome shots; t3 panel/agent rubric |
list_themes |
Enumerate available themes (bundled + installed) with name, version, and vibe |
apply_theme |
Swap meta.theme (default also runs repairCraft — Studio My deck Use parity; pass apply_safe_fixes:false for a pure swap) |
generate_deck_prompt |
Build a generation prompt wired to a theme + schema |
import_pptx |
Import a .pptx into Deck JSON |
import_markdown |
Convert Markdown (+ optional front matter) into Deck JSON |
preview_themes |
Render 1–3 theme previews; pass json for My deck restyle; optional mode: "layouts" for multi-slide craft bake |
import_brand_theme |
Generate a theme from a brand URL or CSS file |
Contributing
See CONTRIBUTING.md.
License
MIT — see LICENSE.
No comments yet
Be the first to share your take.