Build polished slide decks (.pptx) using pptxgenjs. Use this skill whenever a user asks to create a presentation, deck, or slides — or when a topic and audience have been established and slides are the next logical output. Triggers include: "build me a presentation", "create a slide deck", "make slides for", "I need a deck", "turn this into a presentation". Always run the intake questionnaire (in PRESENTATION_STYLE.md) before generating any slides. Read PRESENTATION_STYLE.md before doing anything else in this skill.
Generates .pptx slide decks using a self-contained Node.js project.
Dependencies are scoped to this directory — nothing installs globally.
Read PRESENTATION_STYLE.md before starting. It contains the design
principles, the intake questionnaire, and the anti-patterns to avoid. Do not
skip it.
presentation-skill/
├── SKILL.md ← this file
├── PRESENTATION_STYLE.md ← design principles + intake questionnaire
├── package.json ← pptxgenjs, react-icons, sharp, react, react-dom
├── package-lock.json ← lockfile (Trivy scans this)
├── .node-version ← pins Node 24 (Volta-compatible)
├── .gitignore
├── src/
│ ├── build_deck.js ← slide generator (Claude Code populates this)
│ └── design_system.js ← palette, fonts, layout helpers (shared)
└── output/ ← generated .pptx files land here (gitignored)
Before running npm ci for the first time, or after any package.json change,
run a Trivy scan on the lockfile:
trivy fs --scanners vuln,secret \
--severity HIGH,CRITICAL \
${CLAUDE_PLUGIN_ROOT}
If Trivy reports HIGH or CRITICAL CVEs, invoke /security-review:security-review
before proceeding.
If Trivy is not yet set up, invoke /security-review:trivy-scan.
Dependencies are local to this project — they do not install globally.
cd ${CLAUDE_PLUGIN_ROOT}
# Node dependencies (first time, or after package.json changes)
npm ci
# Python dependencies (uv manages Python + venv automatically)
uv sync
Verify the install:
npm run install-check
# Should print: deps ok
uv run python -m markitdown --help
# Should print markitdown usage
Read PRESENTATION_STYLE.md now if you haven't already.
Work through the intake questionnaire with the user before writing any slide code. Do not proceed until all required questions are answered:
Confirm the proposed narrative arc with the user before proceeding.
If the user provided a company template deck, extract the brand's visual
identity before generating any slides. If no template was provided, skip to
Step 4 — the defaults in design_system.js will be used.
cd ${CLAUDE_PLUGIN_ROOT}
uv run python -m markitdown <path-to-template>.pptx
Note the slide titles, ordering conventions, and any recurring text patterns (e.g. footer text, disclaimer wording).
cd ${CLAUDE_PLUGIN_ROOT}
# macOS with Microsoft PowerPoint:
osascript -e 'tell application "Microsoft PowerPoint" to save active presentation in POSIX file "/tmp/template.pdf" as save as PDF'
# macOS/Linux with LibreOffice:
soffice --headless --convert-to pdf --outdir /tmp <path-to-template>.pptx
rm -f /tmp/template-slide-*.jpg
pdftoppm -jpeg -r 150 /tmp/template.pdf /tmp/template-slide
Read every template slide image. Identify:
design_system.jsEdit PALETTE, FONTS, SIZE, and the slide helper functions in
src/design_system.js to match the template's brand. Preserve the helper
function signatures so build_deck.js remains compatible.
src/build_deck.jsEdit the CONFIG block at the top of src/build_deck.js:
const CONFIG = {
title: "<thesis from intake Q4>",
author: "Alexandros Bantis",
fileName: "<topic-date>.pptx", // e.g. "agentic-systems-2026-04.pptx"
};
These come from PRESENTATION_STYLE.md — they are non-negotiable:
addChapterSlide() from
design_system.js. Sparse by design.addImagePlaceholder() with a
detailed image brief if real images aren't available yet.cd ${CLAUDE_PLUGIN_ROOT}
node src/build_deck.js
# Output: output/<filename>.pptx
Assume there are problems. Your job is to find them.
cd ${CLAUDE_PLUGIN_ROOT}
uv run python -m markitdown output/<filename>.pptx
Check: correct slide order, no missing titles, no leftover placeholder text, thesis present in title and conclusion.
cd ${CLAUDE_PLUGIN_ROOT}
# Convert .pptx to PDF
# macOS with Microsoft PowerPoint installed:
osascript -e 'tell application "Microsoft PowerPoint" to save active presentation in POSIX file "/tmp/deck.pdf" as save as PDF'
# macOS/Linux with LibreOffice:
soffice --headless --convert-to pdf --outdir output output/<filename>.pptx
rm -f slide-*.jpg
pdftoppm -jpeg -r 120 output/<filename>.pdf slide
ls -1 "$PWD"/slide-*.jpg
Inspect every slide image. Look for:
After any fix:
node src/build_deck.jsDo not declare success until at least one full fix-and-verify cycle completes with no new issues found.
# The .pptx is in output/ — present it to the user
ls ${CLAUDE_PLUGIN_ROOT}/output/
If the user wants the file uploaded to Google Drive, use the gws CLI or the
Google Drive API. That workflow is outside this skill's scope — hand off the
file path.
PRESENTATION_STYLE.md (this directory)references/dependencies.md