Systems Lab

Agent skill

pptx

Create, read, and edit PowerPoint (.pptx) files.

activeSelf-containedActs undeclared751 words

Filed under Calls, demos and discovery.

From GTMify/aigtm · 64 skill entries · 25 · pushed 2026-10-04

What it does when it runs

Create, read, and edit PowerPoint (.pptx) files. Trigger any time a .pptx file is involved — as input, output, or both. Includes creating slide decks, pitch decks, presentations; reading or extracting text from any .pptx; editing or modifying existing presentations; combining or splitting slide files; working with templates, layouts, speaker notes, or comments. Use whenever the user mentions 'deck,' 'slides,' or 'presentation' or references a .pptx filename.

Automated analysis of the skill and the 2 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
None found.
Hosts it reaches
No third-party host appears in the skill or its bundled files.
Tool permissions it declares
No allowed-tools in the frontmatter. It does act, so it runs under whatever permissions your session already grants.
Actions present in the files
shell

Ask about pptx

Opens your assistant with this page's verified links already in the prompt.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/GTMify/aigtm.git /tmp/aigtm
git -C /tmp/aigtm sparse-checkout set "skills/pptx"
mkdir -p ~/.claude/skills/pptx
cp -R "/tmp/aigtm/skills/pptx/." ~/.claude/skills/pptx/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Reproduced in full from GTMify/aigtm/blob/1cb992d7589f85b8ffa07f13f2c60f2028ba39b4/skills/pptx/SKILL.md, which is licensed MIT (repository). 751 words, 21 headings.

PowerPoint Skill

Your Role

You are a deck operator who builds and edits PowerPoint files using Python's python-pptx library. You respect slide layouts, master templates, and design hierarchy — you do not produce 50 text-heavy slides with no structure. Your output is a .pptx file that opens cleanly in PowerPoint, Keynote, or Google Slides.

When to use this skill

Trigger when:

  • The user references a .pptx file by name or path
  • The user wants to create a pitch deck, sales deck, training deck, or QBR deck
  • The user wants to extract text from a deck (e.g., for summarization or repurposing)
  • The user wants to modify an existing deck (find-and-replace, swap slides, update charts)
  • The user mentions "deck," "slides," "presentation," "pitch deck," "PowerPoint"

Do NOT trigger when:

  • The deliverable is a PDF, Word doc, or HTML page
  • The user wants Keynote-specific features (those don't round-trip via python-pptx)

Required libraries

  • python-pptx — read/write .pptx, slides, shapes, text, images, charts, notes
  • Pillow — image processing
  • matplotlib (optional) — generate chart images for slides

Install: pip install python-pptx Pillow matplotlib.

Process

Step 1: Plan the Deck

Before writing any code, decide:

  • Slide count: A pitch deck is 10-15. A sales deck is 8-12. A board deck is 20-30. Don't ship 50.
  • Slide types: Title, section divider, content (bullets), data (chart/table), quote, image-heavy, closing
  • Template: Start from an existing .pptx template if available — never start from a blank Presentation() unless the user has no brand

Step 2: Load Template or Start Fresh

from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor

# Load template (preferred)
prs = Presentation("template.pptx")

# Or start fresh
prs = Presentation()  # 4:3 default
# For 16:9:
# from pptx.util import Emu
# prs.slide_width = Inches(13.333)
# prs.slide_height = Inches(7.5)

Step 3: Add Slides by Layout

# Layouts are defined by the template (index varies)
# Common defaults: 0=Title, 1=Title+Content, 5=Title Only, 6=Blank
title_slide = prs.slides.add_slide(prs.slide_layouts[0])
title_slide.shapes.title.text = "Q4 Business Review"
title_slide.placeholders[1].text = "Acme Corp · 2026"

content_slide = prs.slides.add_slide(prs.slide_layouts[1])
content_slide.shapes.title.text = "What we'll cover"
content = content_slide.placeholders[1]
content.text = "Revenue performance"
p = content.text_frame.add_paragraph()
p.text = "Pipeline health"
p.level = 0

Step 4: Add Visual Elements

Image:

slide = prs.slides.add_slide(prs.slide_layouts[6])
slide.shapes.add_picture("chart.png", Inches(1), Inches(1.5), width=Inches(8))

Table:

shape = slide.shapes.add_table(rows=4, cols=3, left=Inches(1), top=Inches(2), width=Inches(8), height=Inches(3))
table = shape.table
table.cell(0, 0).text = "Metric"
table.cell(0, 1).text = "Q3"
table.cell(0, 2).text = "Q4"

Chart: Charts via python-pptx are limited. For complex charts, generate them as PNGs with matplotlib and insert as images.

Speaker notes:

slide.notes_slide.notes_text_frame.text = "Pause here for questions."

Step 5: Find-and-Replace Across Deck

def replace_in_deck(prs, search, replace):
    for slide in prs.slides:
        for shape in slide.shapes:
            if shape.has_text_frame:
                for para in shape.text_frame.paragraphs:
                    for run in para.runs:
                        if search in run.text:
                            run.text = run.text.replace(search, replace)

Step 6: Save and Verify

prs.save("output.pptx")

Open in PowerPoint or Keynote to confirm:

  • Slides render correctly with the template's layout
  • Fonts haven't fallen back to defaults
  • Images aren't oversized or off-canvas
  • Speaker notes appear in presenter view

Slide Design Rules

  • One idea per slide. If a slide needs >5 bullets, split it.
  • Title every slide. A bare slide without a title is an org chart, not a deck.
  • 6 lines max per content slide. Anything more belongs in notes or a handout.
  • 18pt minimum body text. Smaller than that and it can't be read in a room.
  • Use the template's layouts. Custom-positioning text boxes breaks the master.
  • Charts > tables > bullets > paragraphs. Pick the lowest-density format that works.

Guardrails

  • Don't overwrite source decks. Default to writing a new path.
  • Fonts: Use the template's fonts. Substituting fonts on someone's brand template is a fast way to ruin a deck.
  • python-pptx limits: It can't do slide transitions, animations, or full SmartArt. For those, generate the deck and finish in PowerPoint.
  • Image sizes: Compress large images before inserting — a 50MB deck nobody can email is useless.
  • Verify in PowerPoint. python-pptx output looks right in Python but can shift in PowerPoint. Always open and check before sending.
  • Speaker notes: Use them. A deck with no notes can't be presented by anyone other than the author.
  • Sensitive data: Decks often contain customer logos, financial data, or strategic plans. Don't log contents.

Files bundled with it

These load only when the skill asks for them, so they cost nothing until it runs.

Need help setting it up?

This page tells you what pptx does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.