PowerPoint Default Active
.pptx create, edit, analyze — from single-slide fixes to full investor decks with morph transitions and data-driven generation.
Trigger Keywords
Quick Reference
| Task | Action |
|---|---|
| Format like existing deck | cp source.pptx target.pptx && officecli open target.pptx — inherit theme/layouts/masters |
| Read / analyze content | officecli view and officecli get commands |
| Edit existing presentation | Reference-based editing workflow (copy → modify) |
| Create from scratch | officecli create → add slides → add elements |
| Pitch deck (Seed / Series) | Subskill: officecli-pitch-deck |
| Morph transition animations | Subskill: morph-ppt |
| 3D morph effects | Subskill: morph-ppt-3d |
| JS programmatic fallback | pptxgenjs for 50+ data-driven slides |
| Color palette / typography | Design system: 20 palettes, 8 font pairings |
| Thumbnail grid / visual QA | python3 scripts/thumbnail.py deck.pptx grid.png |
| Unpack / repair | python3 scripts/pptx_cli.py {open|save|validate|repair} |
.pptx file."~해줘" Examples
Natural language requests that activate this skill. Works in Korean, English, or mixed.
officecli view text, checks for design issues with officecli view issues, runs validation, and reports a summary plus any problems (overflow, missing alt text, low contrast).officecli add with chart properties. Data is passed inline and the chart is positioned with proper margins.morph-ppt subskill. Selects a dark style from the 48 curated style definitions, applies morph transitions between slides, and runs visual QA with thumbnails.Primary Tool: OfficeCLI
officecli handles approximately 80% of PPTX tasks: slide add/set/remove, validation, queries, and visual inspection. It is the primary interface — always try OfficeCLI first before escalating to other tools.
Discovery Rule
officecli --help and officecli help pptx ... --json before inventing element or property names. The CLI is the source of truth for available properties and syntax.officecli --help
officecli help pptx
officecli help pptx add slide --json # exact property list
officecli help pptx add shape --json
officecli help pptx set slide --json
officecli help pptx set shape --json
officecli view --help # all view modes
officecli help pptx query
Core Workflows
Reading & Analyzing
# Text extraction
officecli view slides.pptx text
officecli view slides.pptx text --start 1 --end 5
# Structural views
officecli view slides.pptx outline
officecli view slides.pptx annotated
officecli view slides.pptx stats
Element Inspection (PATH Syntax)
Paths are 1-based: /slide[1], /shape[1]. Always quote paths in zsh to prevent glob expansion.
officecli get slides.pptx '/slide[1]' --depth 1
officecli get slides.pptx '/slide[1]/shape[1]'
officecli get slides.pptx '/slide[1]/chart[1]'
officecli get slides.pptx '/slide[1]/table[1]' --depth 3
CSS-like Queries
officecli query slides.pptx 'shape:contains("Revenue")'
officecli query slides.pptx "picture:no-alt"
officecli query slides.pptx 'shape[fill=#4472C4]'
officecli query slides.pptx "shape[width>=10cm]"
Visual Inspection
officecli view slides.pptx html --browser # recommended
officecli view slides.pptx svg --start 1 --end 1 --browser
Resident Mode
Resident mode keeps the file open as a background daemon for faster sequential edits. The open command returns immediately — do not run it as a background shell job.
officecli open slides.pptx # returns IMMEDIATELY; daemon in bg
officecli add slides.pptx ...
officecli set slides.pptx ...
officecli close slides.pptx # always close explicitly
officecli open as a background shell job. It returns immediately and the daemon runs in the background automatically. Background shell spawn creates zombies and file locks.Batch Mode
Execute multiple operations in a single call using JSON. Use a heredoc with single-quoted delimiter to prevent shell syntax leaking into JSON.
cat <<'EOF' | officecli batch slides.pptx
[
{"command":"add","parent":"/slide[1]","type":"shape","props":{"text":"Title","x":"2cm","y":"2cm","width":"20cm","height":"3cm","size":"36","bold":"true"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{"text":"Body","x":"2cm","y":"6cm","width":"20cm","height":"10cm","size":"16"}}
]
EOF
Batch supports: add, set, get, query, remove, move, swap, view, raw, raw-set, validate.
Reference-Based Editing
When the user provides a source file or says "format like X.pptx" — always start from the source. Never rebuild themes from scratch.
Why This Matters
Slide master and theme definitions (fonts, colors, placeholder geometry) are document-specific. Recreating them from scratch loses consistent branding across slides, breaks existing placeholder positions, and takes 5-10x longer than modifying a copy.
Workflow
- Copy the source:
cp source.pptx target.pptx— inherits theme, slide masters, layouts, fonts, colors - Open:
officecli open target.pptx— daemon returns immediately - Remove slide content but keep
/slideMaster,/slideLayout,/theme - Add new slides using existing layouts (
--prop layout=Title+Content) — they auto-inherit theme
Template Sources (Priority Order)
| Priority | Source | When to Use |
|---|---|---|
| 1 | User-provided source file | First-class template — always preferred |
| 2 | tests/fixtures/*.pptx | Pre-built examples shipped with skill |
| 3 | officecli-pitch-deck/ templates | Pitch/investor context |
| 4 | morph-ppt/reference/styles/* | 48 curated style definitions |
| 5 | officecli create blank | Only when nothing else applies |
Example — Inherit Existing Brand
# CORRECT: inherit theme and layouts
cp CompanyBrand.pptx Q4Report.pptx
officecli open Q4Report.pptx
officecli remove Q4Report.pptx "/slide[1]"
officecli add Q4Report.pptx / --type slide --prop layout=Title
officecli add Q4Report.pptx '/slide[1]' --type textbox \
--prop text="Q4 Report" --prop placeholder=title
officecli close Q4Report.pptx
# WRONG: recreate theme (loses brand)
officecli create Q4Report.pptx
# ... add all fonts, colors, masters from scratch ...
Creation Workflow
# 1. Work in /tmp/ with ASCII filenames (Korean filenames cause resident corruption)
officecli create /tmp/deck_work.pptx --type pptx
# 2. Add slide, set background, add shapes/textboxes/charts
officecli add /tmp/deck_work.pptx /slide --type slide
officecli set /tmp/deck_work.pptx '/slide[1]' --prop background=1E2761
officecli add /tmp/deck_work.pptx '/slide[1]' --type textbox \
--prop 'text=Title Here' --prop x=2cm --prop y=3cm --prop w=30cm --prop h=4cm \
--prop fontsize=44 --prop bold=true --prop color=FFFFFF --prop fontFamily=Pretendard
# 3. Explicitly close resident after edits
officecli close /tmp/deck_work.pptx
# 4. Copy to final filename (Korean OK for final output)
python3 -c "import shutil; shutil.copy2('/tmp/deck_work.pptx', 'final.pptx')"
Escalation Ladder
When OfficeCLI cannot do the job, escalate in order. Most tasks stay at L1.
| Level | When | Tool |
|---|---|---|
| L1 officecli high-level | Typical slide/shape add/set/remove | officecli add/set/remove/query/view |
| L2 officecli raw-set | XML injection — custom animations, chart XML, theme tweaks | officecli raw-set FILE PATH --xpath X --action A --xml ... |
| L3 Python script | Thumbnail generation, orphan cleanup, unified CLI ops | python3 scripts/*.py |
| L4 Unpack → edit XML → repack | Morph transitions beyond officecli, custom p:transition XML, macro handling |
scripts/pptx_cli.py open → edit XML → save |
| L5 pptxgenjs | 50+ slides from datasets, composable factories, heavy loop logic | npm install pptxgenjs + JS pipeline |
Escalation Signals
- officecli shows "silently ignored" or unsupported prop → L2
- Need morph/custom transitions beyond high-level → L4
- Bulk generation from data (50+ slides) → L5 (pptxgenjs)
- Unpacked workflow for cleanup/reorg → L3 (
pptx_cli.py clean) - Design pick (color, font, style) → Read
references/design-system.md+morph-ppt/reference/styles/INDEX.mdfirst
Element Types & Commands
OfficeCLI supports a rich set of element types. Use these actively — text-only slides are forgettable.
Shapes as Content Containers
officecli add deck.pptx '/slide[1]' --type shape --prop geometry=roundRect \
--prop fill=1E2761 --prop x=1cm --prop y=4cm --prop w=15cm --prop h=12cm
Tables
officecli add deck.pptx '/slide[2]' --type table \
--prop rows=4 --prop cols=3 --prop x=1cm --prop y=3cm \
--prop width=24cm --prop height=6cm
Charts
officecli add deck.pptx '/slide[3]' --type chart \
--prop chartType=column --prop title='Revenue' \
--prop 'data=Q1:12,Q2:15,Q3:18,Q4:20'
Pictures
officecli add deck.pptx '/slide[1]' --type picture \
--prop path=photo.png --prop x=14cm --prop y=3cm \
--prop width=8cm --prop height=5cm --prop alt='Team photo'
Video / Audio
officecli add deck.pptx '/slide[4]' --type video --prop path=demo.mp4 \
--prop x=2cm --prop y=3cm --prop width=20cm --prop height=12cm --prop autoplay=true
OLE Embed (Excel, Word, PDF)
officecli add deck.pptx '/slide[5]' --type ole --prop path=data.xlsx \
--prop x=2cm --prop y=3cm --prop width=20cm --prop height=12cm
Connectors / Arrows
officecli add deck.pptx '/slide[2]' --type connector \
--prop startShape=1 --prop endShape=2 --prop lineColor=4472C4 --prop tailEnd=arrow
Speaker Notes
officecli add deck.pptx '/slide[1]' --type notes --prop 'text=Key talking point here.'
Animations
officecli set deck.pptx '/slide[1]/shape[2]' --prop animation=fadeIn --prop delay=500
Theme Colors
# Use theme tokens instead of hex for theme-aware decks
officecli set deck.pptx '/slide[1]/shape[1]' --prop fill=accent1
# Available: accent1..accent6, dk1, dk2, lt1, lt2, tx1, tx2, bg1, bg2
Additional Operations
# Hyperlinks
officecli set deck.pptx '/slide[1]/shape[2]' --prop link='https://example.com'
# Flip / rotate
officecli set deck.pptx '/slide[1]/shape[2]' --prop flipH=true
officecli set deck.pptx '/slide[1]/shape[2]' --prop rotation=45
# Slide master / layout editing
officecli set deck.pptx '/slideMaster[1]/shape[2]' --prop text='Company Name'
officecli set deck.pptx '/slideLayout[2]/shape[1]' --prop fill=1E2761
# Template merge with data
officecli merge template.pptx output.pptx --data '{"title":"Q4 Report","revenue":"$5.1M"}'
# Watch mode (live preview)
officecli watch deck.pptx --port 3000
# Slideshow settings
officecli set deck.pptx / --prop show.loop=true --prop show.narration=false
Design System
Design Dials
Before creating, decide these three parameters. Present to user if ambiguous.
| Dial | Range | Default | Meaning |
|---|---|---|---|
| DESIGN_VARIANCE | 1–10 | 4 | 1 = symmetric grid, 10 = asymmetric art-directed |
| VISUAL_DENSITY | 1–10 | 5 | 1 = gallery whitespace, 10 = dashboard dense |
| MOTION_INTENSITY | 1–10 | 3 | 1 = static cuts, 10 = cinematic morph |
Presets by Deck Type
| Deck Type | Variance | Density | Motion |
|---|---|---|---|
| Investor pitch | 6 | 3 | 4 |
| Internal review | 3 | 7 | 1 |
| Conference keynote | 8 | 2 | 7 |
| Workshop / training | 4 | 6 | 2 |
| Product launch | 7 | 4 | 6 |
Recommended Palettes
Choose colors that match your topic — don't default to generic blue.
| Theme | Primary | Secondary | Accent | Text | Muted |
|---|---|---|---|---|---|
| Midnight Executive | 1E2761 | CADCFC | FFFFFF | 333333 | 8899BB |
| Slate Professional | 2C3E50 | ECF0F1 | E74C3C | 333333 | 7A8A94 |
| Forest & Moss | 2C5F2D | 97BC62 | F5F5F5 | 2D2D2D | 6B8E6B |
| Coral Energy | F96167 | F9E795 | 2F3C7E | 333333 | 8B7E6A |
| Warm Terracotta | B85042 | E7E8D1 | A7BEAE | 3D2B2B | 8C7B75 |
| Ocean Gradient | 065A82 | 1C7293 | 21295C | 2B3A4E | 6B8FAA |
| Charcoal Minimal | 36454F | F2F2F2 | 212121 | 333333 | 7A8A94 |
| Berry & Cream | 6D2E46 | A26769 | ECE2D0 | 3D2233 | 8C6B7A |
Use Text for body copy on light backgrounds, Muted for captions, labels, and axis text. On dark backgrounds (brightness < 30%), all body text must be white (FFFFFF) or near-white. Off-black: 0A0A0A not 000000.
FFFFFF bg + 000000 text (zero personality).Typography
| Header Font | Body Font | Best For |
|---|---|---|
| Georgia | Calibri | Formal business, finance |
| Arial Black | Arial | Bold marketing, launches |
| Trebuchet MS | Calibri | Friendly tech, startups |
| Consolas | Calibri | Developer tools, engineering |
Korean: Pretendard, Noto Sans KR, Wanted Sans. Avoid Malgun Gothic as sole font — acceptable only as CJK fallback in a:ea font stack.
| Element | Size |
|---|---|
| Slide title | 36–44pt bold |
| Section header | 20–24pt bold |
| Body text | 16–20pt (min 16pt) |
| Caption / source | 10–12pt muted |
| Key metric | 60–72pt bold, accent color |
Slide Rhythm
A 10-slide deck should have at minimum 4 distinct layout types:
- Full-bleed hero — title or key metric
- Split layout — text + visual
- Grid or comparison — 2–3 items
- Data visualization — chart, diagram, or infographic
Content-to-Layout Guide
| Content Type | Recommended Layout |
|---|---|
| Pricing / plan tiers | 2–3 column cards (comparison) |
| Team / people | Icon grid or 2x3 cards |
| Timeline / roadmap | Process flow with arrows / numbered steps |
| Key metrics / KPIs | Large stat callouts (3–4 big numbers) |
| Testimonials / quotes | Full-width quote with attribution |
| Feature comparison | Two-column before/after or table |
| Architecture / system | Shapes + connectors diagram |
| Financial data | Chart + summary table side-by-side |
Subskills
Load only the one subskill matching your task. Do not load all of them.
Specialized templates and structure for investor pitch decks. Handles problem/solution/market/traction/team/financials flow.
Cinematic morph transitions between slides. Includes 48 curated style definitions, decision rules (Pyramid Principle, SCQA), canvas spec, and quality gates.
3D model integration with morph transitions for advanced visual presentations.
PptxGenJS API for bulk generation of 50+ data-driven slides with composable factories and loop logic.
Reference Materials
Design References
| File | Read When | Contains |
|---|---|---|
references/design-system.md | Before picking colors/fonts | 20 palettes, 8 font pairings, 4 Korean fonts |
morph-ppt/reference/styles/INDEX.md | Picking a distinct visual style | 48 style definitions with spec + example |
morph-ppt/reference/decision-rules.md | Planning content-heavy decks | Pyramid Principle, SCQA, page types |
morph-ppt/reference/pptx-design.md | Canvas spec, ghost position math | Canvas, fonts, spacing tokens |
morph-ppt/reference/quality-gates.md | Phase 4–5 QA gates | QA checklist for morph decks |
recipes.md | Quick repair patterns | Section divider z-order, KPI overflow, timeline spacing |
Python Scripts (scripts/)
| Script | Purpose | Command |
|---|---|---|
pptx_cli.py | Unified CLI: unpack, save, validate, repair, thumbnail, search, TOC, add-slide, clean, export-pdf | python3 scripts/pptx_cli.py {open|save|validate|repair|...} |
thumbnail.py | Slide thumbnail grid or individual PNGs for visual QA | python3 scripts/thumbnail.py IN.pptx grid.png |
clean.py | Find/remove orphaned media from unpacked PPTX | python3 scripts/clean.py work/ [--delete] |
add_slide.py | Add or duplicate slides on unpacked dir (legacy OOXML) | python3 scripts/add_slide.py work/ --blank |
run_tests.py | Run skill regression tests | python3 scripts/run_tests.py |
QA (Required)
Step 1 — Machine QA
officecli validate output.pptx
officecli view output.pptx issues
officecli view output.pptx text | grep -iE 'xxxx|lorem|ipsum|placeholder|TODO|click to'
officecli view output.pptx stats
Step 2 — Visual QA
officecli view output.pptx html --browser
# Thumbnail grid for quick scan
python3 scripts/thumbnail.py output.pptx grid.png
Use subagents for visual inspection — even for 2–3 slides. You will see what you expect, not what is actually there. Fresh eyes catch more bugs.
Visual QA Checklist
- Overlapping elements (text through shapes, stacked elements)
- Text overflow or cut off at box boundaries
- Elements too close (< 0.3" gaps) or nearly touching
- Uneven gaps (large empty area vs cramped)
- Insufficient margin from slide edges (< 0.5")
- Columns or similar elements not aligned
- Low-contrast text or icons
- Leftover placeholder content
- Text boxes too narrow causing excessive wrapping
Step 3 — Fix and Re-verify
Fix with officecli set, rerun QA. Do not declare success until you have completed at least one fix-and-verify cycle.
Pre-Delivery Checklist
- Speaker notes on all content slides
- At least one transition style applied
- Alt text on all pictures:
officecli query deck.pptx 'picture:no-alt' - Layout variety ≥ 3 types across slides
- No overflow:
y + height ≤ 19.05cm,x + width ≤ 33.87cm - No placeholder text remaining
- Body text ≥ 16pt everywhere
- Chart titles contain actual values (no TBD, empty parens)
Common Pitfalls
| Pitfall | Correct Approach |
|---|---|
Unquoted [N] in zsh | Always quote: "/slide[1]" or '/slide[1]' |
--name "foo" | Use --prop name="foo" — all attributes through --prop |
| Guessing property names | Run officecli help pptx set shape --json for exact names |
Hex colors with # | Use FF0000 not #FF0000 |
$ in --prop text= | Use single quotes: '$15M' |
view text misses tables | Use view annotated for full text |
| Chart series after creation | Cannot add — delete and recreate the chart |
| Korean filename + resident | CJK causes resident UTF-8 corruption. Use ASCII, then copy |
| Resident zombie | pkill -9 -f "resident-serve", wait 1s, retry |
| Recreating theme/masters that exist | cp source.pptx target.pptx first. Keep masters/layouts/theme |
officecli open as background shell | Run foreground — returns immediately, daemon runs in bg automatically |
| Batch JSON parse error | Shell syntax leaked. Use heredoc: cat <<'EOF' | officecli batch FILE.pptx |
| Picking colors/fonts blindly | Read references/design-system.md before picking |
Anti-Patterns
- Never use example data from subskill files (FitPulse, LearnFlow, etc.)
- Never leave placeholder text:
lorem,ipsum,XXXX,TODO - Every slide must have a title (accessibility)
- Speaker notes on all content slides
- Max 2 font families per deck
Malgun Gothicas sole font = rejectedview issues"(untitled)" for blank-layout is expected, not a defect- Accent lines under titles — hallmark of AI-generated slides; use whitespace instead
- Decorative web-UI elements (thin sidebar lines, ornamental circles) — PPT is a projector medium, not a web app
- Same layout on every slide — vary columns, cards, callouts
- Center-aligned body text — left-align paragraphs; center only titles
- Insufficient size contrast — titles 36pt+ vs body 16pt
- Text-only slides — add shapes, charts, color blocks, pictures
Accessibility (WCAG 2.1 AA)
- Every slide has a title:
officecli view deck.pptx outline - Alt text on images:
officecli query deck.pptx 'picture:no-alt' - Reading order = shape order (title first)
- Contrast ≥ 4.5:1 normal, ≥ 3:1 large
- Information not conveyed by color alone
CJK / Korean Support
The cli-jaw fork auto-detects Korean content and applies language tags + default fonts. Use ASCII filenames during resident mode editing to avoid UTF-8 corruption; copy to Korean filenames as a final step.
Prerequisites
| Tool | Purpose | Status |
|---|---|---|
officecli (PATH) | Primary PPTX CLI | Required |
python3 + python-pptx | Scripts for L3/L4 operations | Required for scripts |
pptxgenjs | Large programmatic generation (L5) | Optional |
soffice (LibreOffice) | PDF conversion, thumbnails for QA | Optional (auto-install on demand) |
# Check prerequisites
python3 -c "import pptx" || echo "MISSING: pip install python-pptx"
which officecli >/dev/null 2>&1 || echo "INFO: OfficeCLI not installed"
which soffice >/dev/null 2>&1 || echo "INFO: LibreOffice not installed (optional)"