---
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 |
