--- name: powerpoint description: "Create, read, edit .pptx decks, slides, notes, templates. Trigger on 'deck,' 'slides,' 'presentation,' or any .pptx filename." license: Adapted from Anthropic skills (commit 9d2f1ae). LICENSE.txt has terms. platforms: [linux, macos, windows] --- # PowerPoint Skill ## Quick Reference | Task | Method | |------|--------| | Read/extract text | `python -m markitdown presentation.pptx` | | Visual overview | `python scripts/thumbnail.py presentation.pptx` | | Edit existing template | Read [editing.md](editing.md) | | Create from scratch | Read [pptxgenjs.md](pptxgenjs.md) | | Deliver to user | `MEDIA:/path/to/output.pptx` in response | ## Reading Content ```bash # Text extraction python -m markitdown presentation.pptx # Visual overview (grid of slide thumbnails) python scripts/thumbnail.py presentation.pptx # Raw XML for deep inspection python scripts/office/unpack.py presentation.pptx unpacked/ ``` ## Editing Workflow **Read [editing.md](editing.md) for full details.** 1. Analyze template: `python scripts/thumbnail.py template.pptx` + `python -m markitdown template.pptx` 2. Unpack: `python scripts/office/unpack.py template.pptx unpacked/` 3. Structural changes (delete/duplicate/reorder slides in `ppt/presentation.xml`) 4. Edit content in each `slide{N}.xml` — use `patch` tool (not sed) 5. Clean: `python scripts/clean.py unpacked/` 6. Pack: `python scripts/office/pack.py unpacked/ output.pptx --original template.pptx` 7. QA: Convert to images, inspect visually ## Creating from Scratch **Read [pptxgenjs.md](pptxgenjs.md) for full details.** Use pptxgenjs (Node.js) when no template exists. Key commands: ```bash # Write a .js file, then: node create_deck.js ``` ## Design Guidelines **Don't create boring slides.** Every slide needs a visual element. ### Color Palettes Pick colors for the topic — don't default to blue. | Theme | Primary | Secondary | Accent | |-------|---------|-----------|--------| | Midnight Executive | `1E2761` | `CADCFC` | `FFFFFF` | | Forest & Moss | `2C5F2D` | `97BC62` | `F5F5F5` | | Coral Energy | `F96167` | `F9E795` | `2F3C7E` | | Charcoal Minimal | `36454F` | `F2F2F2` | `212121` | | Teal Trust | `028090` | `00A896` | `02C39A` | ### Typography | Header Font | Body Font | |-------------|-----------| | Georgia | Calibri | | Arial Black | Arial | | Cambria | Calibri | | Trebuchet MS | Calibri | | Element | Size | |---------|------| | Slide title | 36-44pt bold | | Section header | 20-24pt bold | | Body text | 14-16pt | | Captions | 10-12pt muted | ### Layout Principles - Dominance: one color 60-70%, 1-2 supporting, one accent - Dark/light sandwich: dark title/conclusion, light content - Commit to ONE visual motif (rounded frames, icons in circles, thick borders) - 0.5" minimum margins, 0.3-0.5" between blocks - Vary layouts across slides — don't repeat ### Avoid - Text-only slides (add images, icons, charts, shapes) - Centered body text (left-align; center only titles) - Accent lines under titles (AI-generated hallmark) - Same layout repeated - Low-contrast elements ## QA (Required) **Assume there are problems. Your job is to find them.** ### Content QA ```bash python -m markitdown output.pptx # Check for leftover placeholders: python -m markitdown output.pptx | grep -iE "xxxx|lorem|ipsum|placeholder" ``` ### Visual QA Convert to images, then inspect with `vision_analyze` or `browser_vision`: ```bash python scripts/office/soffice.py --headless --convert-to pdf output.pptx pdftoppm -jpeg -r 150 output.pdf slide ``` Creates `slide-01.jpg`, `slide-02.jpg`, etc. **Use `vision_analyze` on each slide image** — fresh eyes catch what you miss. > ⚠️ **Vision model requirement:** `vision_analyze` needs a vision-capable model. If the active model is text-only (e.g. `glm-5-2`, `gemma-4-31b-it`), visual QA falls back to content QA only (markitdown text extraction). For full visual QA, switch to a vision model or use `browser_vision` as alternative. #### Visual QA Checklist - Overlapping elements (text through shapes, stacked elements) - Text overflow or cutoff - Footer/source collisions - Elements too close (< 0.3" gaps) - Insufficient margins (< 0.5") - Misaligned columns - Low-contrast text or icons - Leftover placeholder content ### Verification Loop 1. Generate → Convert to images → Inspect 2. List issues (look harder if none found) 3. Fix → Re-verify affected slides 4. Repeat until clean pass **Do not declare success without at least one fix-and-verify cycle.** ## Hermes Integration - **Deliver files:** Include `MEDIA:/absolute/path/to/output.pptx` in response - **Visual QA:** Use `vision_analyze` tool on slide JPEGs - **Parallel editing:** Use `delegate_task` for multi-slide XML editing - **Patch tool:** Use `patch` (not sed) for XML edits - **Working dir:** Scripts run from skill dir; use absolute paths for I/O ## Dependencies | Dependency | Install | Purpose | |------------|---------|---------| | markitdown[pptx] | `pip install "markitdown[pptx]"` | Text extraction | | Pillow | `pip install Pillow` | Thumbnail grids | | defusedxml | `pip install defusedxml` | Safe XML parsing | | pptxgenjs | `npm install -g pptxgenjs` | Create from scratch | | LibreOffice | `apt install libreoffice-impress` | PDF conversion | | Poppler | `apt install poppler-utils` | PDF to images | ## Scripts | Script | Purpose | |--------|---------| | `scripts/thumbnail.py` | Grid of slide thumbnails for analysis | | `scripts/office/unpack.py` | Extract + pretty-print PPTX XML | | `scripts/office/pack.py` | Repack with validation | | `scripts/add_slide.py` | Duplicate or create slide from layout | | `scripts/clean.py` | Remove orphaned files | | `scripts/office/soffice.py` | LibreOffice wrapper for sandboxed envs | | `scripts/office/validate.py` | Validate OOXML structure |