skills/pptx/SKILL.md
Use when creating new PowerPoint presentations from scratch, editing existing .pptx files, working with slide templates, extracting or replacing slide text, analyzing slide layouts, or generating thumbnail grids. Use when the user mentions .pptx, PowerPoint, slides, or presentations. NEVER for PDF-only workflows, slide conversion to images as the primary goal, or reading presentation text when markitdown alone suffices.
npx skillsauth add sharkitect-solutions/sharkitect-claude-toolkit pptxInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| File | Purpose |
|---|---|
| html2pptx.md | MANDATORY read before creating presentations from scratch |
| ooxml.md | MANDATORY read before editing existing presentations |
| scripts/html2pptx.js | Converts HTML slides to PowerPoint |
| ooxml/scripts/unpack.py | Unpacks .pptx to editable XML directory |
| ooxml/scripts/validate.py | Validates XML after edits |
| ooxml/scripts/pack.py | Repacks edited XML directory to .pptx |
| scripts/thumbnail.py | Generates thumbnail grid images from presentations |
| scripts/rearrange.py | Duplicates, reorders, and deletes slides from a template |
| scripts/inventory.py | Extracts all text shapes and properties to JSON |
| scripts/replace.py | Applies text replacements from JSON to a working presentation |
| Rule | Why It Exists | |---|---| | Read html2pptx.md in full before creating | The library has non-obvious constraints on dimensions, element ordering, and gradient handling that cause silent layout errors if skipped | | Read ooxml.md in full before editing | OOXML relationship files must stay consistent; editing slide XML without understanding relationships corrupts the file | | Validate immediately after each XML edit | OOXML errors are cumulative -- a single bad relationship reference makes the entire file unreadable in PowerPoint | | Rasterize gradients and icons to PNG before HTML | html2pptx renders via headless browser; CSS gradients and SVG icons frequently produce corrupt or invisible output when converted | | State design approach before writing code | Forces intentional palette and layout choices before code structure locks them in; eliminates rework caused by unsatisfying visual results | | Use thumbnail.py for visual validation | Text cutoff, overlap, and contrast failures are invisible in code and only caught visually | | Two-column layout preferred for charts/tables | Vertically stacked charts below text produce compressed, unreadable layouts at standard slide dimensions | | Shapes not in replacement JSON are auto-cleared | replace.py clears ALL inventory shapes before applying replacements; omitting a shape removes its text entirely, which is intentional behavior |
html2pptx.md or ooxml.mdreplacement-text.json without first confirming they exist in text-inventory.json"bullet": true handles them automaticallyhtml2pptx.md, ooxml.md, template-content.md, or text-inventory.json"bullet": true is set -- they are added automaticallyFor reading text content only:
python -m markitdown path-to-file.pptx
Required for: comments, speaker notes, slide layouts, animations, design elements, and complex formatting.
python ooxml/scripts/unpack.py <office_file> <output_dir>
If the script is not at the expected path: find . -name "unpack.py"
Key file locations inside unpacked directory:
| Path | Content |
|---|---|
| ppt/presentation.xml | Main metadata and slide references |
| ppt/slides/slide{N}.xml | Individual slide content |
| ppt/notesSlides/notesSlide{N}.xml | Speaker notes |
| ppt/comments/modernComment_*.xml | Slide comments |
| ppt/slideLayouts/ | Layout templates |
| ppt/slideMasters/ | Master templates |
| ppt/theme/theme1.xml | Colors and fonts |
| ppt/media/ | Images and media |
When emulating an existing design, analyze first:
ppt/theme/theme1.xml for <a:clrScheme> (colors) and <a:fontScheme> (fonts)ppt/slides/slide1.xml for actual <a:rPr> font usage<a:solidFill> and <a:srgbClr> across all XML files for color referencesUse the html2pptx workflow to convert HTML slides to PowerPoint with accurate positioning.
Before writing any code, state your design choices:
Color palettes (choose one, adapt it, or build your own):
| Name | Colors |
|---|---|
| Classic Blue | #1C2833 #2E4053 #AAB7B8 #F4F6F6 |
| Teal & Coral | #5EA8A7 #277884 #FE4447 #FFFFFF |
| Bold Red | #C0392B #E74C3C #F39C12 #F1C40F #2ECC71 |
| Warm Blush | #A49393 #EED6D3 #E8B4B8 #FAF7F2 |
| Burgundy Luxury | #5D1D2E #951233 #C15937 #997929 |
| Deep Purple & Emerald | #B165FB #181B24 #40695B #FFFFFF |
| Cream & Forest Green | #FFE1C7 #40695B #FCFCFC |
| Pink & Purple | #F8275B #FF574A #FF737D #3D2F68 |
| Lime & Plum | #C5DE82 #7C3A5F #FD8C6E #98ACB5 |
| Black & Gold | #BF9A4A #000000 #F4F6F6 |
| Sage & Terracotta | #87A96B #E07A5F #F4F1DE #2C2C2C |
| Charcoal & Red | #292929 #E33737 #CCCBCB |
| Vibrant Orange | #F96D00 #F2F2F2 #222831 |
| Forest Green | #191A19 #4E9F3D #1E5128 #FFFFFF |
| Retro Rainbow | #722880 #D72D51 #EB5C18 #F08800 #DEB600 |
| Vintage Earthy | #E3B448 #CBD18F #3A6B35 #F4F1DE |
| Coastal Rose | #AD7670 #B49886 #F3ECDC #BFD5BE |
| Orange & Turquoise | #FC993E #667C6F #FCFCFC |
Geometric patterns: diagonal dividers, asymmetric columns (30/70, 40/60), rotated headers at 90/270 degrees, overlapping shapes for depth
Border treatments: single-side thick borders (10-20pt), L-shaped borders (top+left or bottom+right), underline accents under headers (3-5pt)
Typography: extreme size contrast (72pt headline vs 11pt body), all-caps wide-tracked headers, Courier New for data/stats, oversized display numbers for key metrics
Chart and data styling: monochrome charts with single accent, horizontal bar charts, dot plots, data labels on elements (no legends), minimal or no gridlines
Layout options: full-bleed images with text overlays, 20-30% sidebar column for navigation, modular grid (3x3, 4x4), magazine-style multi-column
Backgrounds: solid blocks covering 40-60% of slide, split backgrounds (diagonal or vertical), edge-to-edge color bands
html2pptx.md in full. NEVER set range limits. Read every line before touching code.<p>, <h1>-<h6>, <ul>, <ol>class="placeholder" for chart/table areas (gray background for visibility)scripts/html2pptx.js:
html2pptx() for each HTML filepptx.writeFile()python scripts/thumbnail.py output.pptx workspace/thumbnails --cols 4
Inspect for: text cutoff by header bars or slide edges, overlapping text/shapes, positioning too close to boundaries, contrast failures. Fix HTML and regenerate until all slides pass.Work directly with the OOXML format: unpack, edit XML, validate, repack.
ooxml.md in full. NEVER set range limits. Read every line before touching XML.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>Duplicate and rearrange template slides, then replace placeholder text.
python -m markitdown template.pptx > template-content.md
python scripts/thumbnail.py template.pptx
Read template-content.md in full (NEVER set range limits). Review the thumbnail grid to understand layout patterns, image placeholder counts, and visual structure.
Save template-inventory.md:
# Template Inventory Analysis
**Total Slides: [count]**
**IMPORTANT: Slides are 0-indexed (first slide = 0, last slide = count-1)**
## [Category Name]
- Slide 0: [Layout code] - Description/purpose
- Slide 1: [Layout code] - Description/purpose
[... list every slide individually with its index ...]
Rules for selecting layouts:
Save outline.md including the template mapping:
# Template slides to use (0-based indexing)
# WARNING: Verify indices are within range (e.g., 73-slide template = indices 0-72)
template_mapping = [
0, # Title/Cover
34, # B1: Title and body
34, # B1: second copy
50, # E1: Quote
54, # F2: Closing + Text
]
python scripts/rearrange.py template.pptx working.pptx 0,34,34,50,52
python scripts/inventory.py working.pptx text-inventory.json
Read text-inventory.json in full (NEVER set range limits).
Inventory JSON structure:
{
"slide-0": {
"shape-0": {
"placeholder_type": "TITLE",
"left": 1.5, "top": 2.0, "width": 7.5, "height": 1.2,
"paragraphs": [
{
"text": "Paragraph text",
"alignment": "CENTER",
"bold": true,
"bullet": true,
"level": 0,
"font_name": "Arial",
"font_size": 14.0,
"color": "FF0000",
"theme_color": "DARK_1"
}
]
}
}
}
Key behaviors:
level is always present when bullet: true"color" for RGB, "theme_color" for theme referencesBefore writing replacement content:
{
"slide-0": {
"shape-0": {
"paragraphs": [
{ "text": "Presentation Title", "alignment": "CENTER", "bold": true },
{ "text": "First bullet item", "bullet": true, "level": 0 },
{ "text": "Red colored text", "color": "FF0000" },
{ "text": "Theme colored text", "theme_color": "DARK_1" }
]
}
}
}
Formatting rules:
"bold": true, often "alignment": "CENTER""bullet": true, "level": 0 -- NEVER add bullet symbols to the text stringdefault_font_size or more appropriate placeholder_typereplacement-text.jsonpython scripts/replace.py working.pptx replacement-text.json output.pptx
The script validates all referenced shapes against inventory, clears all inventory shapes, then applies replacements. Validation errors are shown all at once:
ERROR: Invalid shapes in replacement JSON:
- Shape 'shape-99' not found on 'slide-0'. Available shapes: shape-0, shape-1, shape-4
- Slide 'slide-999' not found in inventory
ERROR: Replacement text made overflow worse in these shapes:
- slide-0/shape-2: overflow worsened by 1.25" (was 0.00", now 1.25")
python scripts/thumbnail.py template.pptx [output_prefix]
python scripts/thumbnail.py template.pptx analysis --cols 4
thumbnails.jpg (or thumbnails-1.jpg, thumbnails-2.jpg for large decks)workspace/my-griddevelopment
When the user wants help with paid advertising campaigns on Google Ads, Meta (Facebook/Instagram), LinkedIn, Twitter/X, or other ad platforms. Also use when the user mentions 'PPC,' 'paid media,' 'ad copy,' 'ad creative,' 'ROAS,' 'CPA,' 'ad campaign,' 'retargeting,' or 'audience targeting.' This skill covers campaign strategy, ad creation, audience targeting, and optimization.
testing
--- name: using-sharkitect-methodology description: Use when starting any conversation in a Sharkitect workspace OR before any task involving NEW pricing, positioning, proposal, strategy, plan-execution, or schema-design work — mandates invocation of Sharkitect-specific methodology skills (pricing-strategy, marketing-strategy-pmm, smb-cfo, hq-revenue-ops, executing-plans, brainstorming) under the same anti-rationalization discipline as using-superpowers. Documentation has failed 4 times across H
testing
Use when user says 'end session', 'wrap up', 'stop for the day', 'done for today', 'close out', 'save session', 'wrapping up', or invokes /end-session. Runs the full 9-step end-of-session protocol: resource audit, MEMORY.md update, lessons capture, plan status, pending items, workspace checklist, .tmp/ audit, git commit+push, Supabase brain sync, session brief, summary. Final step schedules a detached self-kill of the current session ONLY (3s delay) so the window closes cleanly. Other claude.exe processes (active workspaces) are NOT touched -- orphan cleanup is handled separately by Claude-Orphan-Cleanup-Hourly with proper age safeguards. Do NOT use for: mid-session quick saves (use session-checkpoint), skill syncing (use sync-skills.py), brain memory queries (use supabase-sync.py pull), document freshness reviews (use document-lifecycle), resource gap detection (use resource-auditor).
testing
Remove signs of AI-generated writing from text. Use when editing or reviewing text to make it sound more natural and human-written. Based on Wikipedia's comprehensive "Signs of AI writing" guide. Detects and fixes patterns including: inflated symbolism, promotional language, superficial -ing analyses, vague attributions, em dash overuse, rule of three, AI vocabulary words, passive voice, negative parallelisms, and filler phrases.