A Claude Code plugin for authoring and building presentation decks across five formats: Marp (Markdown), LaTeX Beamer, Slidev (Vue/Markdown), PowerPoint (via python-pptx), and asciinema terminal demos.
Slash-command driven, theme-extensible, with a builder subagent that keeps
long renders out of your main conversation. The same skills run unchanged
under Claude Code, Codex CLI, and Gemini CLI — install the whole plugin in
Claude Code, or just the per-skill .skill bundles elsewhere.
Useful for school, university, conferences, sprint reviews, tech talks, kickoffs, and thesis defenses.
/plugin marketplace add dro42/presentation-kit
/plugin install presentation-kit
To develop or test locally:
/plugin marketplace add /path/to/presentation-kit
/plugin install presentation-kit
Codex reads skills from ~/.codex/skills/ (also .agents/skills/ in a
project root). Install one skill, or all five:
mkdir -p ~/.codex/skills
for s in marp beamer asciinema slidev pptx; do
curl -L -o /tmp/$s.skill \
https://github.com/dro42/presentation-kit/releases/latest/download/$s.skill
unzip -q /tmp/$s.skill -d ~/.codex/skills/
doneGemini reads skills from ~/.gemini/skills/ (also .agents/skills/ in a
project root):
mkdir -p ~/.gemini/skills
for s in marp beamer asciinema slidev pptx; do
curl -L -o /tmp/$s.skill \
https://github.com/dro42/presentation-kit/releases/latest/download/$s.skill
unzip -q /tmp/$s.skill -d ~/.gemini/skills/
doneBoth Codex and Gemini also discover skills from a project-local
.agents/skills/ directory. Drop the unzipped skills there once and they
work for both runtimes:
mkdir -p .agents/skills
for s in marp beamer asciinema slidev pptx; do
curl -L -o /tmp/$s.skill \
https://github.com/dro42/presentation-kit/releases/latest/download/$s.skill
unzip -q /tmp/$s.skill -d .agents/skills/
doneCodex and Gemini ignore commands/, agents/, hooks/, and
.claude-plugin/. The portable surface is the per-skill .skill zip
(SKILL.md + references/ + assets/ + scripts/).
| Slash command | Skill | Output |
|---|---|---|
/marp |
marp — Markdown decks via marp-cli |
PDF, PPTX, HTML, PNG |
/beamer |
beamer — LaTeX Beamer decks via latexmk |
|
/slidev |
slidev — Vue/Markdown decks with interactive code |
HTML SPA, PDF, PPTX |
/pptx |
pptx — YAML → .pptx via python-pptx |
PowerPoint .pptx |
/asciinema |
asciinema — Terminal demos (record, narrate, embed) |
.cast, GIF, SVG |
Plus:
presentation-buildersubagent — watch-mode and long renders run in an isolated context so the main conversation stays clean.- SessionStart hook — when you open a directory containing
slides.md, a Beamer.texfile,.pptx,deck.yaml, or.cast, the matching slash command surfaces. Marp vs Slidevslides.mddisambiguated by frontmatter signal. - Eight bundled templates per format —
basic,academic,thesis-defense,research-update,sprint-review,tech-talk,lightning-talk,kickoff. Same content shape across all four slide-producing skills, so the same outline serves any venue. - Asciinema integration — record terminal demos with the bundled
wrapper, write timestamped narration scripts, embed as a live player
(Marp HTML, Slidev, reveal.js) or convert to GIF via
aggfor Beamer and pptx. - AI-agnostic skill bodies — SKILL.md files use relative paths only,
so the same skill works under Claude Code, Codex CLI, and Gemini CLI.
Claude-specific
${CLAUDE_PLUGIN_ROOT}paths live only in thecommands/*.mdslash-command files.
These tools must be installed for the corresponding skill to build artifacts:
| Skill | Tool | Install |
|---|---|---|
/marp |
marp-cli |
npm install -g @marp-team/marp-cli |
/beamer |
latexmk + pdflatex |
macOS: BasicTeX / MacTeX. Linux: TeX Live. |
/slidev |
Node.js ≥ 18 | brew install node or nvm/fnm. PDF export: npx playwright install chromium. |
/pptx |
python-pptx | pip install python-pptx pyyaml Pillow |
/asciinema |
asciinema |
brew install asciinema (macOS) or pip install asciinema. For GIF: brew install agg. |
The plugin detects missing tools and surfaces the install command before attempting a build; nothing is installed silently.
Plugin-bundled themes live inside the plugin and get overwritten when the plugin updates. Your themes live separately:
${XDG_DATA_HOME:-$HOME/.local/share}/presentation-kit/themes/
├── marp/ # *.css files, used via marp --theme-set
├── beamer/ # beamertheme*.sty files, copied next to your .tex
├── slidev/ # slidev-theme-<name>/ directories (local-dir themes)
├── pptx/ # *.pptx master templates
└── asciinema/ # *.json terminal color presets
Saving a theme you've iterated on:
# File-based formats
bash "${CLAUDE_PLUGIN_ROOT}/scripts/save-theme.sh" marp <name> ./theme.css
bash "${CLAUDE_PLUGIN_ROOT}/scripts/save-theme.sh" beamer <name> ./beamerthemeFoo.sty
bash "${CLAUDE_PLUGIN_ROOT}/scripts/save-theme.sh" pptx <name> ./brand-master.pptx
bash "${CLAUDE_PLUGIN_ROOT}/scripts/save-theme.sh" asciinema <name> ./theme.json
# Directory-based: Slidev local themes
bash "${CLAUDE_PLUGIN_ROOT}/scripts/save-theme.sh" slidev <name> ./slidev-theme-<name>/
# Overwrite an existing user theme
bash "${CLAUDE_PLUGIN_ROOT}/scripts/save-theme.sh" --force marp dynatrace-dark ./theme.css(Outside Claude Code, run the bundled scripts/save-theme.sh inside each
.skill package — bash scripts/save-theme.sh ... from the skill directory.)
User themes shadow bundled themes when their basenames match. The skills
tag each theme as (user) or (bundled) when listing them so the active
source is unambiguous.
The scenarios that delegate to presentation-builder:
- Watch mode —
marp --watch,latexmk -pvc,slidevdev server. - Multi-format batch — one source → PDF + PPTX + HTML in one shot.
- Long single build — large decks, biblatex, Playwright PDF export.
- Anything expected to take > ~30 s.
The subagent returns a single Markdown report listing each artifact's
path, size, build duration, and any compiler warnings. It has a narrow
Bash allowlist (no rm); cleanup is the caller's responsibility.
The SessionStart hook runs hooks/detect-presentation.sh against your
current working directory. It surfaces a context line for each detected
format:
slides.mdwithmarp: true→/marpslides.mdwithlayout/transition/mdc/colorSchemaortheme: @slidev/*|seriph|apple-basic→/slidevslides.mdwiththeme: defaultalone → ambiguous (surface both)*.texwith\documentclass{beamer}→/beamerpackage.jsonwith@slidev/cli→/slidev*.pptxordeck.yamlwithslides:/meta:/layout:→/pptx*.cast→/asciinema
Silent in directories without presentation files. Always exits 0. The
detected-file message is JSON-encoded via jq -Rs (with a sed fallback
when jq isn't installed) to ensure the injection can't break the hook
contract.
presentation-kit/
├── .claude-plugin/
│ ├── plugin.json
│ └── marketplace.json
├── commands/
│ ├── marp.md beamer.md slidev.md pptx.md asciinema.md
├── skills/
│ ├── marp/ SKILL.md + references/ + assets/{templates,themes}/
│ ├── beamer/ SKILL.md + references/ + assets/{templates,themes,preamble}/
│ ├── slidev/ SKILL.md + references/ + assets/{templates,themes/slidev-theme-minimal}/
│ ├── pptx/ SKILL.md + references/ + scripts/{generate.py,layouts.py} + assets/templates/
│ └── asciinema/ SKILL.md + references/ + scripts/record-demo.sh + assets/{themes,embed-snippets,narration-template.md}
├── agents/
│ └── presentation-builder.md
├── hooks/
│ ├── hooks.json
│ └── detect-presentation.sh
└── scripts/
├── save-theme.sh single source of truth
└── build-skill-bundles.sh produces dist/*.skill for Codex / Gemini
Build output (gitignored): dist/{marp,beamer,asciinema,slidev,pptx}.skill
dist/manifest.json. Built on demand viabash scripts/build-skill-bundles.sh; attached to GitHub Releases.
reveal.jsskill — HTML/JS framework with the chalkboard/notes/pdf plugin ecosystemquartoskill — Pandoc-based reproducible slides with R/Python/Julia code execution- Slidev theme as a proper npm package (
slidev-theme-presentation-kit-minimal) - Asciinema → MP4 via
agg | ffmpegfor venues that require video uploads - Optional listing in
claude-plugins-official/external_plugins/via upstream PR
Issues and PRs welcome at https://github.com/dro42/presentation-kit. The
bundled themes use <NAME> / <TITLE> / <INSTITUTE> placeholders
throughout — PRs against documentation, additional templates, or new
output formats are the easiest way to start.
MIT. See LICENSE.