Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Presentation toolkit (.pptx). Create/edit slides, layouts, content, speaker notes, comments, for programmatic presentation creation and modification.
.claude/skills/microck-pptx/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 223% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 437% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 570% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 212% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 330% | 0% |
A .pptx file is a ZIP archive containing XML files and resources. Create, edit, or analyze PowerPoint presentations using text extraction, raw XML access, or html2pptx workflows. Apply this skill for programmatic presentation creation and modification.
To read the text contents of a presentation, convert the document to markdown:
bash# Convert document to markdown python -m markitdown path-to-file.pptx
Raw XML access is required for: comments, speaker notes, slide layouts, animations, design elements, and complex formatting. For any of these features, unpack a presentation and read its raw XML contents.
python ooxml/scripts/unpack.py <office_file> <output_dir>
Note: The unpack.py script is located at skills/pptx/ooxml/scripts/unpack.py relative to the project root. If the script doesn't exist at this path, use find . -name "unpack.py" to locate it.
ppt/presentation.xml - Main presentation metadata and slide referencesppt/slides/slide{N}.xml - Individual slide contents (slide1.xml, slide2.xml, etc.)ppt/notesSlides/notesSlide{N}.xml - Speaker notes for each slideppt/comments/modernComment_*.xml - Comments for specific slidesppt/slideLayouts/ - Layout templates for slidesppt/slideMasters/ - Master slide templatesppt/theme/ - Theme and styling informationppt/media/ - Images and other media filesWhen given an example design to emulate: Always analyze the presentation's typography and colors first using the methods below:
ppt/theme/theme1.xml for colors (<a:clrScheme>) and fonts (<a:fontScheme>)ppt/slides/slide1.xml for actual font usage (<a:rPr>) and colors<a:solidFill>, <a:srgbClr>) and font references across all XML filesWhen creating a new PowerPoint presentation from scratch, use the html2pptx workflow to convert HTML slides to PowerPoint with accurate positioning.
CRITICAL: Before creating any presentation, analyze the content and choose appropriate design elements:
Requirements:
Choosing colors creatively:
Example color palettes (use these to spark creativity - choose one, adapt it, or create your own):
Geometric Patterns:
Border & Frame Treatments:
Typography Treatments:
Chart & Data Styling:
Layout Innovations:
Background Treatments:
For slides with charts or tables:
html2pptx.md completely from start to finish. NEVER set any range limits when reading this file. Read the full file content for detailed syntax, critical formatting rules, and best practices before proceeding with presentation creation.<p>, <h1>-<h6>, <ul>, <ol> for all text contentclass="placeholder" for areas where charts/tables will be added (render with gray background for visibility)html2pptx.js library to convert HTML slides to PowerPoint and save the presentationhtml2pptx() function to process each HTML filepptx.writeFile()python scripts/thumbnail.py output.pptx workspace/thumbnails --cols 4To edit slides in an existing PowerPoint presentation, work with the raw Office Open XML (OOXML) format. This involves unpacking the .pptx file, editing the XML content, and repacking it.
ooxml.md (~500 lines) completely from start to finish. NEVER set any range limits when reading this file. Read the full file content for detailed guidance on OOXML structure and editing workflows before any presentation editing.python ooxml/scripts/unpack.py <office_file> <output_dir>ppt/slides/slide{N}.xml and related files)python ooxml/scripts/validate.py <dir> --original <file>python ooxml/scripts/pack.py <input_directory> <office_file>To create a presentation that follows an existing template's design, duplicate and re-arrange template slides before replacing placeholder context.
python -m markitdown template.pptx > template-content.mdtemplate-content.md: Read the entire file to understand the contents of the template presentation. NEVER set any range limits when reading this file.python scripts/thumbnail.py template.pptxtemplate-inventory.md containing:markdown # Template Inventory Analysis Total Slides: count] IMPORTANT: Slides are 0-indexed (first slide = 0, last slide = count-1)
## Category Name]
... EVERY slide must be listed individually with its index ...]
outline.md with content AND template mapping that leverages available designs # Template slides to use (0-based indexing) # WARNING: Verify indices are within range! Template with 73 slides has indices 0-72 # Mapping: slide numbers from outline -> template slide indices template_mapping = [ 0, # Use slide 0 (Title/Cover) 34, # Use slide 34 (B1: Title and body) 34, # Use slide 34 again (duplicate for second B1) 50, # Use slide 50 (E1: Quote) 54, # Use slide 54 (F2: Closing + Text) ]
rearrange.py:scripts/rearrange.py script to create a new presentation with slides in the desired order:bash python scripts/rearrange.py template.pptx working.pptx 0,34,34,50,52
inventory.py script:bash python scripts/inventory.py working.pptx text-inventory.json
json { "slide-0": { "shape-0": { "placeholder_type": "TITLE", // or null for non-placeholders "left": 1.5, // position in inches "top": 2.0, "width": 7.5, "height": 1.2, "paragraphs": [ { "text": "Paragraph text", // Optional properties (only included when non-default): "bullet": true, // explicit bullet detected "level": 0, // only included when bullet is true "alignment": "CENTER", // CENTER, RIGHT (not LEFT) "space_before": 10.0, // space before paragraph in points "space_after": 6.0, // space after paragraph in points "line_spacing": 22.4, // line spacing in points "font_name": "Arial", // from first run "font_size": 14.0, // in points "bold": true, "italic": false, "underline": false, "color": "FF0000" // RGB color } ] } } }
default_font_size in points extracted from layout placeholders (when available)bullet: true, level is always included (even if 0)space_before, space_after, and line_spacing in points (only included when set)color for RGB (e.g., "FF0000"), theme_color for theme colors (e.g., "DARK_1")Based on the text inventory from the previous step:
alignment property on when "bullet": true"bold": true"bullet": true, "level": 0 (level is required when bullet is true)"alignment": "CENTER" for centered text)"font_size": 14.0, "font_name": "Lora")"color": "FF0000" for RGB or "theme_color": "DARK_1" for theme colorsreplacement-text.jsonExample paragraphs field showing proper formatting: json "paragraphs": [ { "text": "New presentation title text", "alignment": "CENTER", "bold": true }, { "text": "Section Header", "bold": true }, { "text": "First bullet point without bullet symbol", "bullet": true, "level": 0 }, { "text": "Red colored text", "color": "FF0000" }, { "text": "Theme colored text", "theme_color": "DARK_1" }, { "text": "Regular paragraph text without special formatting" } ]
Shapes not listed in the replacement JSON are automatically cleared: json { "slide-0": { "shape-0": { "paragraphs": [...] // This shape gets new text } // shape-1 and shape-2 from inventory will be cleared automatically } }
Common formatting patterns for presentations:
"bullet": true, "level": 0replace.py scriptbash python scripts/replace.py working.pptx replacement-text.json output.pptx
The script will:
Example validation errors: ERROR: Invalid shapes in replacement JSON:
ERROR: Replacement text made overflow worse in these shapes:
To create visual thumbnail grids of PowerPoint slides for quick analysis and reference:
bashpython scripts/thumbnail.py template.pptx [output_prefix]
Features:
thumbnails.jpg (or thumbnails-1.jpg, thumbnails-2.jpg, etc. for large decks)python scripts/thumbnail.py template.pptx my-gridworkspace/my-grid)--cols 4 (range: 3-6, affects slides per grid)Use cases:
Examples:
bash# Basic usage python scripts/thumbnail.py presentation.pptx # Combine options: custom name, columns python scripts/thumbnail.py template.pptx analysis --cols 4
To visually analyze PowerPoint slides, convert them to images using a two-step process:
bash soffice --headless --convert-to pdf template.pptx
bash pdftoppm -jpeg -r 150 template.pdf slide This creates files like slide-1.jpg, slide-2.jpg, etc.
Options:
-r 150: Sets resolution to 150 DPI (adjust for quality/size balance)-jpeg: Output JPEG format (use -png for PNG if preferred)-f N: First page to convert (e.g., -f 2 starts from page 2)-l N: Last page to convert (e.g., -l 5 stops at page 5)slide: Prefix for output filesExample for specific range:
bashpdftoppm -jpeg -r 150 -f 2 -l 5 template.pdf slide # Converts only pages 2-5
IMPORTANT: When generating code for PPTX operations:
Required dependencies (should already be installed):
uv pip install "markitdown[pptx]" (for text extraction from presentations)npm install -g pptxgenjs (for creating presentations via html2pptx)npm install -g playwright (for HTML rendering in html2pptx)npm install -g react-icons react react-dom (for icons)npm install -g sharp (for SVG rasterization and image processing)sudo apt-get install libreoffice (for PDF conversion)sudo apt-get install poppler-utils (for pdftoppm to convert PDF to images)uv pip install defusedxml (for secure XML parsing)| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 31,070 | 6,495 | -79% | 1 | 1 | 0% | 6,203 | 6,902 | +11% | 0 | 0 | — |
case-02 | fail→fail | 29,033 | 5,776 | -80% | 1 | 1 | 0% | 6,011 | 6,940 | +15% | 0 | 0 | — |
case-03 | fail→fail | 30,049 | 8,207 | -73% | 1 | 1 | 0% | 6,202 | 6,977 | +12% | 0 | 0 | — |
case-04 | pass→pass | 29,189 | 17,665 | -39% | 1 | 1 | 0% | 6,203 | 9,652 | +56% | 0 | 0 | — |
case-05 | fail→fail | 17,239 | 16,321 | -5% | 1 | 1 | 0% | 3,553 | 9,788 | +175% | 0 | 0 | — |
case-06 | fail→fail | 17,484 | 3,013 | -83% | 1 | 1 | 0% | 2,910 | 6,817 | +134% | 0 | 0 | — |
case-07 | fail→pass | 12,709 | 7,812 | -39% | 1 | 1 | 0% | 2,253 | 7,286 | +223% | 0 | 0 | — |
case-08 | fail→pass | 7,152 | 3,770 | -47% | 1 | 1 | 0% | 1,356 | 7,276 | +437% | 0 | 0 | — |
case-09 | pass→pass | 6,452 | 1,804 | -72% | 1 | 1 | 0% | 1,251 | 6,817 | +445% | 0 | 0 | — |
case-10 | fail→pass | 5,534 | 3,224 | -42% | 1 | 1 | 0% | 1,050 | 7,033 | +570% | 0 | 0 | — |
case-11 | fail→pass | 13,248 | 4,061 | -69% | 1 | 1 | 0% | 2,377 | 7,413 | +212% | 0 | 0 | — |
case-12 | fail→pass | 9,424 | 4,700 | -50% | 1 | 1 | 0% | 1,739 | 7,479 | +330% | 0 | 0 | — |
case-13 | pass→pass | 11,133 | 3,808 | -66% | 1 | 1 | 0% | 1,634 | 7,184 | +340% | 0 | 0 | — |
case-14 | fail→pass | 11,409 | 2,850 | -75% | 1 | 1 | 0% | 1,954 | 7,112 | +264% | 0 | 0 | — |
case-15 | fail→pass | 7,770 | 2,539 | -67% | 1 | 1 | 0% | 1,184 | 6,905 | +483% | 0 | 0 | — |
case-16 | fail→pass | 10,653 | 3,165 | -70% | 1 | 1 | 0% | 1,828 | 7,050 | +286% | 0 | 0 | — |
case-17 | fail→pass | 7,689 | 2,188 | -72% | 1 | 1 | 0% | 1,189 | 6,838 | +475% | 0 | 0 | — |
case-18 | pass→pass | 5,593 | 2,424 | -57% | 1 | 1 | 0% | 825 | 6,944 | +742% | 0 | 0 | — |
case-19 | pass→pass | 18,092 | 6,828 | -62% | 1 | 1 | 0% | 3,735 | 7,834 | +110% | 0 | 0 | — |
case-20 | pass→fail | 13,744 | 8,548 | -38% | 1 | 1 | 0% | 2,587 | 8,100 | +213% | 0 | 0 | — |
case-21 | pass→pass | 15,000 | 11,507 | -23% | 1 | 1 | 0% | 2,931 | 8,835 | +201% | 0 | 0 | — |
case-22 | pass→pass | 12,379 | 12,211 | -1% | 1 | 1 | 0% | 2,213 | 8,857 | +300% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +36 percentage points is the difference between those two pass rates over the 19 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.