PowerPoint Default Active

.pptx create, edit, analyze — from single-slide fixes to full investor decks with morph transitions and data-driven generation.

This skill is default active and triggers automatically when your request mentions PowerPoint, PPTX, presentations, slides, or decks. No manual loading required.

Trigger Keywords

PowerPoint PPTX presentation slides deck

Quick Reference

TaskAction
Format like existing deckcp source.pptx target.pptx && officecli open target.pptx — inherit theme/layouts/masters
Read / analyze contentofficecli view and officecli get commands
Edit existing presentationReference-based editing workflow (copy → modify)
Create from scratchofficecli create → add slides → add elements
Pitch deck (Seed / Series)Subskill: officecli-pitch-deck
Morph transition animationsSubskill: morph-ppt
3D morph effectsSubskill: morph-ppt-3d
JS programmatic fallbackpptxgenjs for 50+ data-driven slides
Color palette / typographyDesign system: 20 palettes, 8 font pairings
Thumbnail grid / visual QApython3 scripts/thumbnail.py deck.pptx grid.png
Unpack / repairpython3 scripts/pptx_cli.py {open|save|validate|repair}
Execution model: Run commands one at a time. Check exit code before proceeding. Non-zero = stop and fix. Do not run parallel commands against the same .pptx file.

"~해줘" Examples

Natural language requests that activate this skill. Works in Korean, English, or mixed.

"회사 소개 PPT 만들어줘 — 10장짜리, 우리 브랜드 컬러(네이비+화이트) 써줘"
Creates a 10-slide company intro deck using a navy + white color palette. The skill picks a matching design-system palette, sets up slide masters, and generates slides with varied layouts (hero, split, grid, chart).
"이 PPTX 파일 분석해줘 — 어떤 내용인지 요약하고 디자인 문제 있으면 알려줘"
Reads all slide content with 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).
"기존 템플릿(Brand.pptx) 기반으로 Q4 실적 보고서 만들어줘"
Copies the source file to inherit theme/layouts/masters, removes sample slides, then builds new content slides using the existing brand layouts. Never recreates themes from scratch.
"이 데이터로 차트 슬라이드 추가해줘 — 월별 매출 바 차트"
Adds a new slide with a column chart element using officecli add with chart properties. Data is passed inline and the chart is positioned with proper margins.
"발표자료 만들어줘 — 모프 전환 효과 넣고, 다크 테마로"
Activates the 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

Always run 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
Warning: Do NOT run 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

  1. Copy the source: cp source.pptx target.pptx — inherits theme, slide masters, layouts, fonts, colors
  2. Open: officecli open target.pptx — daemon returns immediately
  3. Remove slide content but keep /slideMaster, /slideLayout, /theme
  4. Add new slides using existing layouts (--prop layout=Title+Content) — they auto-inherit theme

Template Sources (Priority Order)

PrioritySourceWhen to Use
1User-provided source fileFirst-class template — always preferred
2tests/fixtures/*.pptxPre-built examples shipped with skill
3officecli-pitch-deck/ templatesPitch/investor context
4morph-ppt/reference/styles/*48 curated style definitions
5officecli create blankOnly 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.

LevelWhenTool
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


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.

DialRangeDefaultMeaning
DESIGN_VARIANCE1–1041 = symmetric grid, 10 = asymmetric art-directed
VISUAL_DENSITY1–1051 = gallery whitespace, 10 = dashboard dense
MOTION_INTENSITY1–1031 = static cuts, 10 = cinematic morph

Presets by Deck Type

Deck TypeVarianceDensityMotion
Investor pitch634
Internal review371
Conference keynote827
Workshop / training462
Product launch746

Recommended Palettes

Choose colors that match your topic — don't default to generic blue.

ThemePrimarySecondaryAccentTextMuted
Midnight Executive1E2761CADCFCFFFFFF3333338899BB
Slate Professional2C3E50ECF0F1E74C3C3333337A8A94
Forest & Moss2C5F2D97BC62F5F5F52D2D2D6B8E6B
Coral EnergyF96167F9E7952F3C7E3333338B7E6A
Warm TerracottaB85042E7E8D1A7BEAE3D2B2B8C7B75
Ocean Gradient065A821C729321295C2B3A4E6B8FAA
Charcoal Minimal36454FF2F2F22121213333337A8A94
Berry & Cream6D2E46A26769ECE2D03D22338C6B7A

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.

Avoid: Purple gradient on white (AI slop), rainbow multi-accent, FFFFFF bg + 000000 text (zero personality).

Typography

Header FontBody FontBest For
GeorgiaCalibriFormal business, finance
Arial BlackArialBold marketing, launches
Trebuchet MSCalibriFriendly tech, startups
ConsolasCalibriDeveloper 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.

ElementSize
Slide title36–44pt bold
Section header20–24pt bold
Body text16–20pt (min 16pt)
Caption / source10–12pt muted
Key metric60–72pt bold, accent color
Body text minimum 16pt. If text overflows, reduce content or split slides — never shrink font.

Slide Rhythm

A 10-slide deck should have at minimum 4 distinct layout types:

  1. Full-bleed hero — title or key metric
  2. Split layout — text + visual
  3. Grid or comparison — 2–3 items
  4. Data visualization — chart, diagram, or infographic

Content-to-Layout Guide

Content TypeRecommended Layout
Pricing / plan tiers2–3 column cards (comparison)
Team / peopleIcon grid or 2x3 cards
Timeline / roadmapProcess flow with arrows / numbered steps
Key metrics / KPIsLarge stat callouts (3–4 big numbers)
Testimonials / quotesFull-width quote with attribution
Feature comparisonTwo-column before/after or table
Architecture / systemShapes + connectors diagram
Financial dataChart + summary table side-by-side

Subskills

Load only the one subskill matching your task. Do not load all of them.

officecli-pitch-deck — Pitch Deck (Seed / Series)

Specialized templates and structure for investor pitch decks. Handles problem/solution/market/traction/team/financials flow.

morph-ppt — Morph Transition Animations

Cinematic morph transitions between slides. Includes 48 curated style definitions, decision rules (Pyramid Principle, SCQA), canvas spec, and quality gates.

morph-ppt-3d — 3D Morph Effects

3D model integration with morph transitions for advanced visual presentations.

pptxgenjs — JavaScript Programmatic Generation

PptxGenJS API for bulk generation of 50+ data-driven slides with composable factories and loop logic.


Reference Materials

Design References

FileRead WhenContains
references/design-system.mdBefore picking colors/fonts20 palettes, 8 font pairings, 4 Korean fonts
morph-ppt/reference/styles/INDEX.mdPicking a distinct visual style48 style definitions with spec + example
morph-ppt/reference/decision-rules.mdPlanning content-heavy decksPyramid Principle, SCQA, page types
morph-ppt/reference/pptx-design.mdCanvas spec, ghost position mathCanvas, fonts, spacing tokens
morph-ppt/reference/quality-gates.mdPhase 4–5 QA gatesQA checklist for morph decks
recipes.mdQuick repair patternsSection divider z-order, KPI overflow, timeline spacing

Python Scripts (scripts/)

ScriptPurposeCommand
pptx_cli.pyUnified CLI: unpack, save, validate, repair, thumbnail, search, TOC, add-slide, clean, export-pdfpython3 scripts/pptx_cli.py {open|save|validate|repair|...}
thumbnail.pySlide thumbnail grid or individual PNGs for visual QApython3 scripts/thumbnail.py IN.pptx grid.png
clean.pyFind/remove orphaned media from unpacked PPTXpython3 scripts/clean.py work/ [--delete]
add_slide.pyAdd or duplicate slides on unpacked dir (legacy OOXML)python3 scripts/add_slide.py work/ --blank
run_tests.pyRun skill regression testspython3 scripts/run_tests.py

QA (Required)

Assume there are problems. Your job is to find them. Your first render is almost never correct. Approach QA as a bug hunt, not a confirmation step. If you found zero issues on first inspection, you weren't looking hard enough.

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

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


Common Pitfalls

PitfallCorrect Approach
Unquoted [N] in zshAlways quote: "/slide[1]" or '/slide[1]'
--name "foo"Use --prop name="foo" — all attributes through --prop
Guessing property namesRun 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 tablesUse view annotated for full text
Chart series after creationCannot add — delete and recreate the chart
Korean filename + residentCJK causes resident UTF-8 corruption. Use ASCII, then copy
Resident zombiepkill -9 -f "resident-serve", wait 1s, retry
Recreating theme/masters that existcp source.pptx target.pptx first. Keep masters/layouts/theme
officecli open as background shellRun foreground — returns immediately, daemon runs in bg automatically
Batch JSON parse errorShell syntax leaked. Use heredoc: cat <<'EOF' | officecli batch FILE.pptx
Picking colors/fonts blindlyRead references/design-system.md before picking

Anti-Patterns


Accessibility (WCAG 2.1 AA)


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

ToolPurposeStatus
officecli (PATH)Primary PPTX CLIRequired
python3 + python-pptxScripts for L3/L4 operationsRequired for scripts
pptxgenjsLarge programmatic generation (L5)Optional
soffice (LibreOffice)PDF conversion, thumbnails for QAOptional (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)"