PPT Generation
Overview
Generate professional PowerPoint presentations. Plan the structure with a
consistent visual style, generate slide content, and compose into a PPTX file.
Poirot note: The original deer-flow skill uses AI image-generation per
slide. Poirot may not have image-generation available. This version generates
text-based slides with python-pptx. Install: pip install python-pptx.
When to Use
- User requests to generate, create, or make presentations (PPT/PPTX)
- User wants slides for a topic with structured content
- User needs a visual presentation from research findings
Presentation Styles
| Style |
Description |
Best For |
| dark-premium |
Black bg, luminous accents, luxury aesthetic |
Executive presentations |
| gradient-modern |
Bold mesh gradients, contemporary typography |
Startups, brand launches |
| minimal-swiss |
Grid-based, bold negative space, timeless |
Consulting, architecture |
| keynote |
Apple-inspired, bold typography, dramatic imagery |
Keynotes, product reveals |
| editorial |
Magazine-quality layouts, sophisticated typography |
Annual reports, thought leadership |
Workflow
Step 1: Understand Requirements
- Topic/subject
- Number of slides (default: 5-10)
- Style: dark-premium / gradient-modern / minimal-swiss / keynote / editorial
- Aspect ratio: 16:9 (standard) or 4:3
- Content outline: key points per slide
Step 2: Research (if needed)
Use deep-research skill to gather content for the presentation.
Step 3: Create Presentation Plan
{
"title": "Presentation Title",
"style": "dark-premium",
"slides": [
{"number": 1, "type": "title", "title": "...", "subtitle": "..."},
{"number": 2, "type": "content", "title": "...", "bullets": ["...", "..."]},
{"number": 3, "type": "chart", "title": "...", "data": {...}},
{"number": 4, "type": "section", "title": "..."},
{"number": 5, "type": "content", "title": "...", "bullets": ["...", "..."]},
{"number": 6, "type": "closing", "title": "Thank You", "subtitle": "..."}
]
}
Step 4: Generate PPTX
python3 -c "
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
prs = Presentation()
prs.slide_width = Inches(13.333) # 16:9
prs.slide_height = Inches(7.5)
# Style: dark-premium
BG_COLOR = RGBColor(0x0A, 0x0A, 0x0A)
TEXT_COLOR = RGBColor(0xFF, 0xFF, 0xFF)
ACCENT_COLOR = RGBColor(0x00, 0xD9, 0xFF)
def add_slide(prs, layout_idx=6): # 6 = blank
slide = prs.slides.add_slide(prs.slide_layouts[layout_idx])
bg = slide.background
fill = bg.fill
fill.solid()
fill.fore_color.rgb = BG_COLOR
return slide
def add_text(slide, text, left, top, width, height, size=24, color=TEXT_COLOR, bold=False):
txBox = slide.shapes.add_textbox(Inches(left), Inches(top), Inches(width), Inches(height))
tf = txBox.text_frame
p = tf.paragraphs[0]
p.text = text
p.font.size = Pt(size)
p.font.color.rgb = color
p.font.bold = bold
return txBox
# Slide 1: Title
slide = add_slide(prs)
add_text(slide, 'Presentation Title', 1, 2, 11, 2, size=44, bold=True)
add_text(slide, 'Subtitle', 1, 4, 11, 1, size=24, color=ACCENT_COLOR)
# Slide 2: Content with bullets
slide = add_slide(prs)
add_text(slide, 'Key Points', 1, 0.5, 11, 1, size=36, bold=True)
for i, bullet in enumerate(['Point one', 'Point two', 'Point three']):
add_text(slide, f'• {bullet}', 1, 2 + i*0.8, 11, 0.7, size=24)
# Slide 3: Section divider
slide = add_slide(prs)
add_text(slide, 'Section Title', 1, 3, 11, 1.5, size=40, bold=True, color=ACCENT_COLOR)
# Save
prs.save('.poirot/outputs/presentation.pptx')
print('Saved to .poirot/outputs/presentation.pptx')
"
Step 5: Present
present_files([".poirot/outputs/presentation.pptx"])
Slide Types
| Type |
Content |
Layout |
| title |
Title + subtitle |
Centered, large font |
| content |
Title + bullets |
Left-aligned, 3-5 bullets |
| section |
Section title only |
Centered, accent color |
| chart |
Title + chart image |
Chart from chart-visualization skill |
| quote |
Large quote + attribution |
Centered, italic |
| closing |
Thank you + contact |
Centered |
Pitfalls
- Too much text per slide: max 5-6 bullets, max 2 lines each. Slides are
visual aids, not documents.
- Font sizes too small: title ≥36pt, body ≥24pt. If text doesn't fit,
split into more slides.
- Inconsistent style: all slides must use the same color palette, font
sizes, and layout patterns.
- No visual hierarchy: title > section headers > bullets > footnotes.
Use size + weight + color to establish hierarchy.
- python-pptx not installed:
pip install python-pptx first.
- Image slides: if you need chart images, generate them first with the
chart-visualization skill, then embed as slide.shapes.add_picture().
1---2name: ppt-generation3description: Generate PPTX presentations from slide plan + content.4license: MIT5---67# PPT Generation89## Overview1011Generate professional PowerPoint presentations. Plan the structure with a12consistent visual style, generate slide content, and compose into a PPTX file.1314> **Poirot note:** The original deer-flow skill uses AI image-generation per15 slide. Poirot may not have image-generation available. This version generates16 text-based slides with `python-pptx`. Install: `pip install python-pptx`.1718## When to Use1920- User requests to generate, create, or make presentations (PPT/PPTX)21- User wants slides for a topic with structured content22- User needs a visual presentation from research findings2324## Presentation Styles2526| Style | Description | Best For |27|-------|-------------|----------|28| **dark-premium** | Black bg, luminous accents, luxury aesthetic | Executive presentations |29| **gradient-modern** | Bold mesh gradients, contemporary typography | Startups, brand launches |30| **minimal-swiss** | Grid-based, bold negative space, timeless | Consulting, architecture |31| **keynote** | Apple-inspired, bold typography, dramatic imagery | Keynotes, product reveals |32| **editorial** | Magazine-quality layouts, sophisticated typography | Annual reports, thought leadership |3334## Workflow3536### Step 1: Understand Requirements3738- Topic/subject39- Number of slides (default: 5-10)40- Style: dark-premium / gradient-modern / minimal-swiss / keynote / editorial41- Aspect ratio: 16:9 (standard) or 4:342- Content outline: key points per slide4344### Step 2: Research (if needed)4546Use `deep-research` skill to gather content for the presentation.4748### Step 3: Create Presentation Plan4950```json51{52 "title": "Presentation Title",53 "style": "dark-premium",54 "slides": [55 {"number": 1, "type": "title", "title": "...", "subtitle": "..."},56 {"number": 2, "type": "content", "title": "...", "bullets": ["...", "..."]},57 {"number": 3, "type": "chart", "title": "...", "data": {...}},58 {"number": 4, "type": "section", "title": "..."},59 {"number": 5, "type": "content", "title": "...", "bullets": ["...", "..."]},60 {"number": 6, "type": "closing", "title": "Thank You", "subtitle": "..."}61 ]62}63```6465### Step 4: Generate PPTX6667```bash68python3 -c "69from pptx import Presentation70from pptx.util import Inches, Pt, Emu71from pptx.dml.color import RGBColor72from pptx.enum.text import PP_ALIGN7374prs = Presentation()75prs.slide_width = Inches(13.333) # 16:976prs.slide_height = Inches(7.5)7778# Style: dark-premium79BG_COLOR = RGBColor(0x0A, 0x0A, 0x0A)80TEXT_COLOR = RGBColor(0xFF, 0xFF, 0xFF)81ACCENT_COLOR = RGBColor(0x00, 0xD9, 0xFF)8283def add_slide(prs, layout_idx=6): # 6 = blank84 slide = prs.slides.add_slide(prs.slide_layouts[layout_idx])85 bg = slide.background86 fill = bg.fill87 fill.solid()88 fill.fore_color.rgb = BG_COLOR89 return slide9091def add_text(slide, text, left, top, width, height, size=24, color=TEXT_COLOR, bold=False):92 txBox = slide.shapes.add_textbox(Inches(left), Inches(top), Inches(width), Inches(height))93 tf = txBox.text_frame94 p = tf.paragraphs[0]95 p.text = text96 p.font.size = Pt(size)97 p.font.color.rgb = color98 p.font.bold = bold99 return txBox100101# Slide 1: Title102slide = add_slide(prs)103add_text(slide, 'Presentation Title', 1, 2, 11, 2, size=44, bold=True)104add_text(slide, 'Subtitle', 1, 4, 11, 1, size=24, color=ACCENT_COLOR)105106# Slide 2: Content with bullets107slide = add_slide(prs)108add_text(slide, 'Key Points', 1, 0.5, 11, 1, size=36, bold=True)109for i, bullet in enumerate(['Point one', 'Point two', 'Point three']):110 add_text(slide, f'• {bullet}', 1, 2 + i*0.8, 11, 0.7, size=24)111112# Slide 3: Section divider113slide = add_slide(prs)114add_text(slide, 'Section Title', 1, 3, 11, 1.5, size=40, bold=True, color=ACCENT_COLOR)115116# Save117prs.save('.poirot/outputs/presentation.pptx')118print('Saved to .poirot/outputs/presentation.pptx')119"120```121122### Step 5: Present123124```125present_files([".poirot/outputs/presentation.pptx"])126```127128## Slide Types129130| Type | Content | Layout |131|------|---------|--------|132| **title** | Title + subtitle | Centered, large font |133| **content** | Title + bullets | Left-aligned, 3-5 bullets |134| **section** | Section title only | Centered, accent color |135| **chart** | Title + chart image | Chart from `chart-visualization` skill |136| **quote** | Large quote + attribution | Centered, italic |137| **closing** | Thank you + contact | Centered |138139## Pitfalls140141- **Too much text per slide**: max 5-6 bullets, max 2 lines each. Slides are142 visual aids, not documents.143- **Font sizes too small**: title ≥36pt, body ≥24pt. If text doesn't fit,144 split into more slides.145- **Inconsistent style**: all slides must use the same color palette, font146 sizes, and layout patterns.147- **No visual hierarchy**: title > section headers > bullets > footnotes.148 Use size + weight + color to establish hierarchy.149- **python-pptx not installed**: `pip install python-pptx` first.150- **Image slides**: if you need chart images, generate them first with the151 `chart-visualization` skill, then embed as `slide.shapes.add_picture()`.