PowerPoint Decks
anthropics/skills
Creates, edits, reads and validates .pptx and .potx files, using pptxgenjs for new decks and direct XML edits for existing ones, with helper scripts for thumbnails and checks.
Creates, edits and reads PowerPoint .pptx files with python-pptx or PptxGenJS, with scripts for XML edits, text dumps, PDF and image rendering, and thumbnails.
$ npx skills add XiaomiMiMo/MiMo-Code --skill pptx-official -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install XiaomiMiMo/MiMo-Code pptx-official --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/XiaomiMiMo/MiMo-Code.git skills-src && mkdir -p .claude/skills && cp -r skills-src/packages/cli/src/skill/builtin/.bundle/pptx-official .claude/skills/pptx-official && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "pptx-official" agent skill from https://github.com/XiaomiMiMo/MiMo-Code/tree/main/packages/cli/src/skill/builtin/.bundle/pptx-official into .claude/skills/pptx-official/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pptx-official", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/XiaomiMiMo/MiMo-Code/tree/main/packages/cli/src/skill/builtin/.bundle/pptx-officialType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add XiaomiMiMo/MiMo-Code --skill pptx-official -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install XiaomiMiMo/MiMo-Code pptx-official --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/XiaomiMiMo/MiMo-Code.git skills-src && mkdir -p .agents/skills && cp -r skills-src/packages/cli/src/skill/builtin/.bundle/pptx-official .agents/skills/pptx-official && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "pptx-official" agent skill from https://github.com/XiaomiMiMo/MiMo-Code/tree/main/packages/cli/src/skill/builtin/.bundle/pptx-official into .agents/skills/pptx-official/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pptx-official", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add XiaomiMiMo/MiMo-Code --skill pptx-official -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install XiaomiMiMo/MiMo-Code pptx-official --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/XiaomiMiMo/MiMo-Code.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/packages/cli/src/skill/builtin/.bundle/pptx-official .cursor/skills/pptx-official && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "pptx-official" agent skill from https://github.com/XiaomiMiMo/MiMo-Code/tree/main/packages/cli/src/skill/builtin/.bundle/pptx-official into .cursor/skills/pptx-official/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pptx-official", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/XiaomiMiMo/MiMo-Code.git --path packages/cli/src/skill/builtin/.bundle/pptx-official--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add XiaomiMiMo/MiMo-Code --skill pptx-official -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install XiaomiMiMo/MiMo-Code pptx-official --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/XiaomiMiMo/MiMo-Code.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/packages/cli/src/skill/builtin/.bundle/pptx-official .gemini/skills/pptx-official && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "pptx-official" agent skill from https://github.com/XiaomiMiMo/MiMo-Code/tree/main/packages/cli/src/skill/builtin/.bundle/pptx-official into .gemini/skills/pptx-official/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pptx-official", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install XiaomiMiMo/MiMo-Code pptx-officialInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add XiaomiMiMo/MiMo-Code --skill pptx-official -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/XiaomiMiMo/MiMo-Code.git skills-src && mkdir -p .github/skills && cp -r skills-src/packages/cli/src/skill/builtin/.bundle/pptx-official .github/skills/pptx-official && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "pptx-official" agent skill from https://github.com/XiaomiMiMo/MiMo-Code/tree/main/packages/cli/src/skill/builtin/.bundle/pptx-official into .github/skills/pptx-official/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pptx-official", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add XiaomiMiMo/MiMo-Code --skill pptx-official -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install XiaomiMiMo/MiMo-Code pptx-official --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/XiaomiMiMo/MiMo-Code.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/packages/cli/src/skill/builtin/.bundle/pptx-official .opencode/skills/pptx-official && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "pptx-official" agent skill from https://github.com/XiaomiMiMo/MiMo-Code/tree/main/packages/cli/src/skill/builtin/.bundle/pptx-official into .opencode/skills/pptx-official/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pptx-official", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
pptx-officialCreates, edits and reads PowerPoint .pptx files with python-pptx or PptxGenJS, with scripts for XML edits, text dumps, PDF and image rendering, and thumbnails.
A decision matrix in the skill maps each situation to a path. New decks are authored with python-pptx for structured, repeatable output or PptxGenJS for design-heavy work, a template is filled by replacing placeholders so its master and layouts survive, and deep changes such as reordering slides or adding unusual objects go through an explode, edit XML, assemble cycle. Reading text, notes and structure out of an existing deck has its own extraction pipeline.
Bundled scripts cover the rest: assemble, explode, prune and insert_slide for structure, dump_text and diagnose for inspection, render_pdf and render_slides for PDF and image output through LibreOffice, and contact_sheet for a thumbnail grid made with Pillow. Mixed jobs follow a fixed order of read, plan slide by slide, edit or create, validate, then visual QA. Separate create, edit and read guides hold the details. It stays out of the way when the deliverable is a Word file, spreadsheet, PDF report, HTML site or Google Slides API call.
The toolkit is Apache-2.0 licensed, written against the public ECMA-376 presentation spec and built on permissively licensed libraries, so it can be reused in commercial projects. Where a bundled runtime is provided through the MIMO_PYTHON, MIMO_SOFFICE and MIMO_NODE variables, no separate installs are needed.
7 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 6babeb0. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 12 files in scripts/ (Python and TypeScript), which the agent can run.
Shell commands in SKILL.md call:
uvbuncurlbrewpythonshbashapt-getnpmnpxsofficeFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
astral.shbun.shAlso links to:
ecma-international.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
PowerPoint PPTX Toolkit loads about 6.8k tokens when it runs. Until then it costs about 207 tokens; SKILL.md has 2,872 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
curl -LsSf https://astral.sh/uv/install.sh | shpowershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"curl -fsSL https://bun.sh/install | bash# Windows: powershell -c "irm bun.sh/install.ps1|iex"sudo apt-get install -y libreoffice poppler-utilsAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from XiaomiMiMo/MiMo-Code at commit 6babeb0, republished under its Apache-2.0 licence (© XiaomiMiMo). 2,872 words, ~6,787 tokens.
.claude/skills/pptx-official/SKILL.md (or your agent's skills folder). This skill also uses 16 other files; get the full folder from GitHub.An Apache-2.0 toolkit for producing, editing, and reading Microsoft PowerPoint
(.pptx) files. Written from scratch against the public
ECMA-376 / ISO/IEC 29500 (PresentationML)
specification and built on permissively-licensed tooling (python-pptx MIT,
pptxgenjs MIT, lxml BSD-3-Clause, Pillow MIT-CMU, optional external
binaries soffice MPL 2.0 and pdftoppm GPL) so it can be reused in
commercial projects without restriction.
| Situation | Path | Read first |
|---|---|---|
| Build a deck from a prompt or dataset — no source file to start from | Author with python-pptx (structured / repeatable) or PptxGenJS (design-heavy, JS) | create.md |
You have a .pptx template to fill in — keep its master, layouts, look | Placeholder replacement via python-pptx | edit.md → Template fill |
| Deep structural edits — reorder slides, splice XML, add unusual objects | Explode → edit XML parts → assemble | edit.md → Raw XML workflow |
Only need the text / speaker notes / structure out of a .pptx | Extraction pipeline | read.md |
| Turn a deck into PDF or PNG images (visual QA, publishing) | scripts/render_pdf.py / scripts/render_slides.py via LibreOffice | see QA below |
| Grid of slide thumbnails for previewing a template | scripts/contact_sheet.py (Pillow) | read.md → Thumbnails |
If the task mixes several of these, do them in this order: read → plan slide-by-slide → edit/create → validate → visual QA.
Bundled runtime: when the
MIMO_PYTHONenvironment variable is set, skipuv/pip installs — run every Python command below withuv runreplaced by"$MIMO_PYTHON"(python-pptx/Pillow/lxml preinstalled; pip console scripts unavailable, use"$MIMO_PYTHON" -m <module>). A bundled LibreOffice is exposed asMIMO_SOFFICE(picked up automatically bysoffice_bridge.py/render_pdf.py), and slide rasterisation automatically falls back to pypdfium2 in that interpreter when Poppler (pdftoppm) is absent. For the PptxGenJS authoring path, bundled Node.js is exposed asMIMO_NODE, with pptxgenjs/react/react-dom/sharp/react-icons/mathjax-full preinstalled inMIMO_NODE_MODULES— run scripts asNODE_PATH="$MIMO_NODE_MODULES" "$MIMO_NODE" <script.js>instead ofnpm install.
If uv or bun are not yet installed:
# Install uv (Python package/project manager)
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows: powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# Install bun (TypeScript runtime, replaces Node.js for this workflow)
# macOS / Linux
curl -fsSL https://bun.sh/install | bash
# Windows: powershell -c "irm bun.sh/install.ps1|iex"Only if the user explicitly refuses uv / bun, substitute pip (in a venv you manage yourself) for uv, and npm/pnpm + npx tsx for bun — everything else in this skill stays the same.
Python dependencies are managed by uv. Do not use pip directly.
# Initialize project (if no pyproject.toml exists)
uv init -p 3.12
# Add dependencies
uv add python-pptx lxml Pillow
uv add defusedxml # safe XML parsing (recommended for manual XML edits)Rules:
pip — always uv add for packages.python scripts/... directly — always uv run scripts/....python -m venv or source .venv/bin/activate.For PptxGenJS creation, use bun (project-local, not global installs):
# Initialize (if no package.json exists)
bun init -y
# Add dependencies
bun add pptxgenjs # core PPTX creation library
bun add react react-dom sharp # rasterization (icons + formulas)
bun add react-icons # icon library (FA, MD, etc.)
bun add mathjax-full # LaTeX formula rendering
# Type definitions (including Bun runtime types)
bun add -d @types/bun @types/react @types/react-domCreate a tsconfig.json if one doesn't exist:
{
"compilerOptions": {
"lib": ["ESNext"],
"target": "ESNext",
"module": "Preserve",
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"noEmit": true,
"jsx": "react-jsx",
"strict": true,
"skipLibCheck": true,
"types": ["bun"]
}
}Run scripts directly as TypeScript — no transpilation needed:
bun run create-ppt.tsAlways run type checking after writing or modifying TS code:
bun tsc --noEmitModels may inadvertently use outdated PptxGenJS API signatures or deprecated syntax without realizing it. A type check catches these mismatches before runtime.
# macOS
brew install --cask libreoffice
brew install poppler
# Debian/Ubuntu
sudo apt-get install -y libreoffice poppler-utilsEvery script under scripts/ uses only the standard library plus
python-pptx, lxml, and Pillow. No proprietary dependencies. External
binaries (soffice, pdftoppm) are invoked as subprocesses; nothing is
bundled or statically linked.
# 1. Extract text from every slide (title, body, notes) — the "what does it say?" query
uv run scripts/dump_text.py input.pptx --notes > input.txt
# 2. Convert a deck to PDF for review
uv run scripts/render_pdf.py input.pptx # writes input.pdf next to it
# 3. Convert every slide to a PNG (visual QA)
uv run scripts/render_slides.py input.pptx --out slides/ # writes slides/slide-1.png, ...
# 4. Grid thumbnail preview (planning which template slide to reuse)
uv run scripts/contact_sheet.py input.pptx --cols 3 # writes input.contact-sheet.jpg
# 5. Explode a .pptx into readable XML for surgical edits
uv run scripts/explode.py input.pptx unpacked/
# 6. Reassemble an exploded tree
uv run scripts/assemble.py unpacked/ output.pptx
# 7. Drop orphaned slides and unused media before reassembly
uv run scripts/prune.py unpacked/
# 8. Duplicate slide 3, or spin up a new slide from layout 5
uv run scripts/insert_slide.py unpacked/ --clone slide3.xml
uv run scripts/insert_slide.py unpacked/ --blank-from slideLayout5.xml
# 9. Well-formedness check (ZIP + XML + python-pptx round-trip)
uv run scripts/diagnose.py output.pptxEvery script is a small Python CLI. Some scripts (e.g. render_pdf.py,
render_slides.py, contact_sheet.py) import from a shared helper
(soffice_bridge.py) in the same directory — copy them together. Read the top
of each file for its full CLI options.
A live preview server is available for real-time slide feedback. Not started by default. When multi-slide work begins, ask the user if they want live preview enabled.
Only offer this in a pure command-line environment. This server is for the MiMoCode CLI. If you are running inside a host that embeds MiMoCode via the SDK — a web UI, a desktop app, an IDE plugin, etc. — that host almost certainly has its own native preview / file-open mechanism; use it instead and do NOT start this server.
If yes, and this is a CLI environment:
# `scripts/preview.ts` lives in this skill's bundle directory, not in
# your cwd. Prefix it with the absolute path shown in this skill's
# location header (the folder that contains SKILL.md) — refer to it
# as <SKILL_DIR> below.
# Start (spawns background server, prints URL, exits immediately)
bun run <SKILL_DIR>/scripts/preview.ts /path/to/output.pptx
bun run <SKILL_DIR>/scripts/preview.ts /path/to/output.pptx --port 5000
# Stop
bun run <SKILL_DIR>/scripts/preview.ts --stop /path/to/output.pptxIf the server is already running, preview.ts detects this via PID file
and prints the existing URL instead of spawning a duplicate.
The background server watches the .pptx file, debounces (800ms),
converts to PDF via LibreOffice, and pushes a WebSocket reload to the
browser. The browser's native PDF viewer provides scroll, thumbnails,
zoom, and search. Preview output goes to .pptx-preview/ (separate
from qa/, no conflict with other scripts).
Give the user the printed URL to open in their browser.
Live preview is for humans only — it does NOT replace visual QA.
The preview server lets the user watch progress. You must still run
the visual QA subagent (render PNGs to qa/, spawn a vision model to
inspect them) as described in the "Visual QA execution model" section.
These are independent workflows:
When to regenerate the .pptx during multi-slide work: If the user
has the preview server running, regenerate the .pptx (re-run the
creation script) after completing each logical module — e.g. after
finishing a section's slides, not after every single shape placement.
This gives the user meaningful visual checkpoints without excessive
intermediate renders.
Slides are a visual surface. Users read the deck at 40 feet from the back of a room, or in a browser tab three inches wide on a phone. Both have to work. Keep these in mind:
slide_layout once and
apply it. This makes swapping the theme a one-line change instead of a
fifty-slide sweep.slide.notes_slide.notes_text_frame so the presenter can rehearse from
the deck itself. On the slide, keep it to the phrase they can hold in
their head."Every slide earns its visuals" does not mean "generate an image for every slide." Choose the source based on what the image does. Four channels, ordered by preference (lower cost + higher stability first):
L1 · Draw in code. Icons via react-icons / iconify. Charts via matplotlib / plotly / echarts. Flowcharts, comparisons, org charts via shapes + lines. Anything that is a data or concept visualization — never fetch or generate an image for this.
L2 · Search a stock library, then download the bytes. When a slide
needs a generic real photo (city skyline, office desk, team
collaboration, nature, stock imagery), use websearch with a
site:unsplash.com / site:pexels.com / site:pixabay.com query to find
a real URL, then download the image to a local file and pass that path
to add_picture (see Downloading below). Do NOT try to pass an HTTP URL
directly to add_picture — python-pptx's add_picture only accepts a
local path or a file-like object; it will NOT fetch a URL for you.
L3 · Search a specific source. For specific real things (a
particular company's logo, a specific product's official screenshot, a
named person's photo), use websearch with a targeted query (e.g.
"Acme Inc" logo site:acme.com, or <product name> screenshot) instead of
a stock-library query, then download the bytes the same way as L2. Never
call image_gen here — a generated logo will not look like the real logo.
Note: webfetch returns text/markdown/html only and cannot deliver binary
image bytes — use bash + curl or python urllib to download.
L4 · Generate with image_gen. Only for stylized visuals — cover
art, hero backgrounds, illustration-style concept images, brand-mood
imagery. Budget: at most 1–2 image_gen calls per deck, typically for
cover or section dividers. Not for every content slide.
add_pictureTwo working patterns. Both keep the file local so add_picture can read
the bytes:
# Pattern A: download to a temp file, then pass the path
from urllib.request import Request, urlopen
from pathlib import Path
def download_image(url: str, dest: Path) -> Path:
req = Request(url, headers={"User-Agent": "Mozilla/5.0"}) # some CDNs 403 an empty UA
with urlopen(req, timeout=15) as r:
dest.write_bytes(r.read())
return dest
path = download_image(hit_url, Path("assets/hero.jpg"))
slide.shapes.add_picture(str(path), Inches(1), Inches(1.5), width=Inches(11))# Pattern B: in-memory via BytesIO — no temp file, but same request headers
from io import BytesIO
from urllib.request import Request, urlopen
req = Request(hit_url, headers={"User-Agent": "Mozilla/5.0"})
with urlopen(req, timeout=15) as r:
slide.shapes.add_picture(BytesIO(r.read()), Inches(1), Inches(1.5), width=Inches(11))Or from a bash step:
curl -sSL -A "Mozilla/5.0" -o assets/hero.jpg "$URL"Wrap any download in a try/except: on failure fall through to the next channel (L3 → L4) or a shape+text fallback — never leave a slide blank.
image_gen)image_gen on every content slide. Slow, expensive,
style-inconsistent, visually noisy. A 20-slide deck with 20 generated
images is a red flag, not a success.add_picture. python-pptx will raise
FileNotFoundError — always download the bytes first (see Downloading).webfetch to grab image bytes. webfetch returns text only.
Use bash + curl or python urllib for binaries.image_gen.
The output will not resemble the real thing. Use targeted web search (L3).L2/L3 both cost about one websearch + one download per image — cheap
compared to L4, still not free. L1 remains the default.
| Deck type | Dominant | Notes |
|---|---|---|
| Status / OKR / weekly | L1 (~90%) | Icons + data charts. Almost no L2 / L3 / L4. |
| Strategy / proposal | L1 + L2 | ~60% L1, ~30% L2 (searched stock), ~10% L4 cover. |
| Sales / pitch / BP | L2 + L3 | Customer logos and product shots (L3) matter. 1 L4 cover max. |
| Training / education | L1 (~80%) | Diagrams and flowcharts win. |
| Launch / brand | L4-heavy | Visuals are the point. Still limit style drift and reuse assets. |
| Competitive analysis | L3-heavy | Logos and screenshots are irreplaceable. |
| Element | Font | Size | Weight | Notes |
|---|---|---|---|---|
| Slide title | Calibri / Segoe UI | 32-40pt | Bold | One line — wrap = rework the title |
| Section header | Calibri | 24-28pt | Bold | On dedicated divider slides |
| Body / bullets | Calibri | 18-22pt | Regular | Never below 18pt for a room; 14pt for on-screen decks |
| Stat callout | Calibri Light | 60-96pt | Bold | The number, then the label below at 14-18pt |
| Caption / footer | Calibri | 10-12pt | Regular | Muted gray #7A7A7A |
| Code / mono | Consolas / Cascadia Code | 16-20pt | Regular | Left aligned, no word wrap |
Change the palette for the topic (financial → navy #1F3A5F; environment →
forest #2C5F2D; product launches → your brand's accent). Avoid pure black
on pure white for backgrounds — #F7F5F0 cream on #1F1F1F ink reads
softer under a projector.
| Aspect | Width × Height (inches) | Pixels @ 96 DPI | When to use |
|---|---|---|---|
| 16:9 widescreen (default) | 13.333 × 7.5 | 1280 × 720 | Almost every new deck |
| 16:10 | 13.333 × 8.333 | 1280 × 800 | Older projectors; some corporate templates |
| 4:3 standard | 10.0 × 7.5 | 960 × 720 | Academia, legacy templates, printed handouts |
| A4 landscape | 11.69 × 8.27 | 1123 × 794 | Print-first decks (EU) |
| Letter landscape | 11.0 × 8.5 | 1056 × 816 | Print-first decks (US) |
Assume something is wrong. PowerPoint opens broken files quietly: a misaligned text box, a chart pointing at deleted data, a stray placeholder that survived template fill. Verify explicitly.
Opens cleanly. No repair dialog, no missing-part warning.
uv run scripts/diagnose.py output.pptxText integrity. No placeholder residue and no unfilled {{token}}s:
uv run scripts/dump_text.py output.pptx --notes \
| grep -Ei "\{\{|TODO|TBD|lorem|ipsum|xxxx|click to add"Grep must return nothing.
Visual sanity. Render the whole deck to PNG, spot-check the first, last, and any slide you touched. Look for:
uv run scripts/render_slides.py output.pptx --out qa/Layout hygiene. Every non-master slide should reference a real layout,
not slideLayout1 by default for a section divider:
uv run python -c "
from pptx import Presentation
prs = Presentation('output.pptx')
for i, s in enumerate(prs.slides, 1):
print(f'slide {i}: layout={s.slide_layout.name!r}')"If any of these fail, fix and re-run — don't paper over.
Slide images are expensive. A single rendered PNG at 150 DPI consumes thousands of context tokens. Loading multiple slides into the main conversation for inspection will quickly exhaust your context budget and crowd out useful working memory.
Default: always use a subagent for visual inspection. Spawn a
general subagent with the rendered PNG paths and the
inspection criteria from step 3 above. The subagent reports findings as
text (slide number + issue description); the images never enter the main
conversation context. This is mandatory unless the exception below applies.
actor({
operation: {
action: "run",
subagent_type: "general",
// omit `model` when your current model is vision-capable (preferred — see Model selection)
description: "Visual QA slides",
prompt: "Inspect the rendered slide images in qa/ for: text overflow, overlapping shapes, cut-off labels, wrong-scale icons, off-brand colors. Report each issue as 'slide N: <problem>'. Images: qa/slide-1.png through qa/slide-<N>.png."
}
})Model selection (in priority order):
actor({ operation: { action: "models", vision: true } }). If your current
model is in the list, omit the model parameter — the subagent inherits
it, and visual QA runs on the model the user chose.Never hardcode a model id. Which models are servable varies per deployment and changes over time; only ids returned by the vision models query are guaranteed to work. A guessed id fails the subagent outright.
Exception — direct inspection in the main context: Only load slide images directly (without a subagent) when the user explicitly requests that the current model inspect a specific slide for fine-grained, interactive editing (e.g. "look at slide 5 and adjust the title position"). This requires the current model to be multimodal. If it isn't, inform the user and offer to spawn a vision subagent instead.
chart.chart_style or use
python-pptx's low-level access to set fill colors on series.notes_slide.notes_text_frame.text on every slide, even if just a
single sentence.create.md → Images).python-pptx does not embed fonts. If the deck
is opened on a machine without the chosen font, PowerPoint substitutes,
and layout drifts. For Latin text, prefer system-safe fonts (Calibri,
Arial, Segoe UI, Times New Roman, Consolas) or ship the .pptx alongside a
font install step.run.font.name only sets the
Latin typeface (a:latin); Chinese / Japanese / Korean glyphs come from the
East-Asian slot (a:ea), which python-pptx does not expose. Leave it unset
and CJK renders as tofu boxes or an inconsistent substitute. Set a:latin +
a:ea + a:cs to a CJK-capable font on every run that contains CJK text
(recipe in create.md → CJK / East-Asian text)..ppt (PowerPoint 97-2003 binary). Convert first:
soffice --headless --convert-to pptx old.ppt..pptm. This skill does not emit or execute macros.python-pptx cannot read
encrypted files; strip protection with PowerPoint or LibreOffice first..key files. Not a PresentationML format; use Apple's
Keynote or LibreOffice for round-trip.create.md — python-pptx recipes,
PptxGenJS recipes, layouts, text, tables, images, charts, icons,
backgrounds, speaker notes, palette and typography guidance.edit.md — placeholder fill, slide
duplication / reorder / delete, explode/assemble for XML surgery, comments,
cleanup of orphaned parts, common pitfalls.read.md — plain-text export
(including speaker notes), structural walk, metadata, thumbnails, image
extraction, conversion to PDF / PNG for QA.scripts/ — CLI utilities (some share a local
soffice_bridge.py helper; copy together when extracting).scripts/preview.ts — launcher
(start/stop); scripts/preview_server.ts —
background server that watches .pptx, converts to PDF, serves with
WebSocket hot-reload in the browser's native PDF viewer.© XiaomiMiMo, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 16 other files (scripts) in packages/cli/src/skill/builtin/.bundle/pptx-official of XiaomiMiMo/MiMo-Code.
Open the folder on GitHubat commit 6babeb0
PowerPoint PPTX Toolkit next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| PowerPoint PPTX Toolkit this skillXiaomiMiMo/MiMo-Code | 14k | — | ~6.8k | Automated safety check: Notes | Apache-2.0 | |
| PowerPoint Decksanthropics/skills | 180k | 6 repos | ~5.2k | Automated safety check: Pass | Proprietary | |
| Image to Editable PPTXYuan1z0825/nature-skills | 46k | — | ~2.5k | Automated safety check: Pass | MIT | |
| McKinsey-Style PPT Designlikaku/Mck-ppt-design-skill | 296 | — | ~2.1k | Automated safety check: Pass | Apache-2.0 | |
| PPTX Skill (Chinese)agentscope-ai/QwenPaw | 35k | — | ~1.3k | Automated safety check: Pass | Proprietary | |
| PPTX To Mdsammcj/agentic-coding | 162 | — | ~1.8k | Automated safety check: Pass | Apache-2.0 |
anthropics/skills
Creates, edits, reads and validates .pptx and .potx files, using pptxgenjs for new decks and direct XML edits for existing ones, with helper scripts for thumbnails and checks.
Yuan1z0825/nature-skills
Rebuilds slide images, screenshots, scanned PDFs or image-only PPTX files as PowerPoint with editable objects, using a local CLI with per-page manifests and QA.
likaku/Mck-ppt-design-skill
Builds consultant-style PowerPoint decks from scratch with the MckEngine python-pptx wrapper, through a five-stage flow with scripted quality gates.
agentscope-ai/QwenPaw
Chinese-language guide for reading, editing and building PowerPoint decks: text extraction, template editing and from-scratch creation with pptxgenjs.
sammcj/agentic-coding
Convert a PPTX slide deck into per-slide markdown that preserves both the verbatim text and the meaning of embedded screenshots, diagrams and charts in their original layout positions.
singula-ai/alego
Create, read, edit, and check PowerPoint presentations (.pptx), including slide text, tables, images, and charts.
XiaomiMiMo/MiMo-Code
Searches arXiv, fetches metadata, generates BibTeX, downloads PDFs and finds citations and related papers using a bundled Python script.
XiaomiMiMo/MiMo-Code
Interactive guide for creating, reviewing and fixing agent skills (SKILL.md folders), covering structure, frontmatter rules, trigger phrases and validation before sharing.
XiaomiMiMo/MiMo-Code
Produces, edits and reads Microsoft Word files through python-docx and lxml, with a decision table for picking the lightest workflow for a given task.
XiaomiMiMo/MiMo-Code
Lets one MiMoCode process drive another, headless with JSON events or interactively through tmux, to test behavior and visual regressions with parseable evidence.
XiaomiMiMo/MiMo-Code
Reads, transforms, composes and fills PDFs with Python scripts for extraction, merging, watermarking, encryption, OCR and form filling.
XiaomiMiMo/MiMo-Code
Builds, edits, cleans, recalculates and reads Excel workbooks and CSV files with openpyxl and pandas, plus LibreOffice for recalculation and PDF export.
Categories
Creates, edits and reads PowerPoint .pptx files with python-pptx or PptxGenJS, with scripts for XML edits, text dumps, PDF and image rendering, and thumbnails. A decision matrix in the skill maps each situation to a path. New decks are authored with python-pptx for structured, repeatable output or PptxGenJS for design-heavy work, a template is filled by replacing placeholders so its master and layouts survive, and deep changes such as reordering slides or adding unusual objects go through an explode, edit XML, assemble cycle.
PowerPoint PPTX Toolkit fits situations like: building a slide deck or pitch deck as a .pptx from a prompt or dataset; filling a PowerPoint template with values while keeping its look; extracting text, speaker notes or structure from an existing .pptx; converting a deck to PDF or PNG images for visual checks.
Run `npx skills add XiaomiMiMo/MiMo-Code --skill pptx-official -a claude-code`. Or copy the skill folder (packages/cli/src/skill/builtin/.bundle/pptx-official in XiaomiMiMo/MiMo-Code) into .claude/skills/pptx-official in your project. Claude Code loads it when a task matches its description.
Run `npx skills add XiaomiMiMo/MiMo-Code --skill pptx-official -a codex`. Or copy the skill folder (packages/cli/src/skill/builtin/.bundle/pptx-official in XiaomiMiMo/MiMo-Code) into .agents/skills/pptx-official in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add XiaomiMiMo/MiMo-Code --skill pptx-official -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pptx-official, .gemini/skills/pptx-official, .github/skills/pptx-official and .opencode/skills/pptx-official in your project.
Going by SKILL.md and its folder, PowerPoint PPTX Toolkit needs Python and TypeScript for the scripts in its folder and the command-line tools its instructions call (uv, bun, curl, brew, python and sh). Our summary lists: Python with python-pptx, Pillow and lxml; LibreOffice (soffice) for PDF and image rendering; Node.js with PptxGenJS for the JavaScript authoring path.
SKILL.md names 3 domains. In commands or code: astral.sh and bun.sh; the agent is likely to contact these when it follows the instructions. As links in the text: ecma-international.org. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pipes a well-known installer script into a shell; runs commands with sudo), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
PowerPoint PPTX Toolkit is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.8k tokens (SKILL.md is roughly 27k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with PowerPoint PPTX Toolkit: PowerPoint Decks (anthropics/skills, 180k stars), Image to Editable PPTX (Yuan1z0825/nature-skills, 46k stars), McKinsey-Style PPT Design (likaku/Mck-ppt-design-skill, 296 stars) and PPTX Skill (Chinese) (agentscope-ai/QwenPaw, 35k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
XiaomiMiMo (a GitHub organization) maintains it in XiaomiMiMo/MiMo-Code, which has 13,601 GitHub stars. The repository holds 22 skills in this directory. The repository was last updated on October 3, 2026.
Source: XiaomiMiMo/MiMo-Code on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.