codex-ppt-skill
Skill by ara.so — Codex Skills collection.
A skill for generating image-based PowerPoint presentations where each slide is a complete 16:9 image generated by gpt-image-2. Converts articles, papers, reports, and notes into visually cohesive presentation decks with unified styling.
What This Skill Does
- Image-based slides: Each slide is a full 16:9 image, perfect for strong visual storytelling
- Multi-agent support: Works in Codex, Claude Code, OpenClaw, Hermes Agent
- Style library: Built-in visual styles (clean professional, scientific defense, e-ink magazine, hand-drawn technical, dashboard, etc.)
- Unified visual language: Maintains consistent styling while varying layouts per content
- Custom images: Insert specific figures, diagrams, or screenshots on designated slides
- Local assembly: Python script packages generated images into
.pptxwith speaker notes
Installation
For Codex
npx -y skills@latest add ningzimu/codex-ppt-skill \
--skill codex-ppt \
--agent codex \
--global
Restart Codex after installation.
For Claude Code
npx -y skills@latest add ningzimu/codex-ppt-skill \
--skill codex-ppt \
--agent claude-code \
--global
For OpenClaw
openclaw skills install codex-ppt
For Hermes Agent
npx -y skills@latest add ningzimu/codex-ppt-skill \
--skill codex-ppt \
--agent hermes-agent \
--global
Manual Installation
Clone and symlink to your agent's skills directory:
git clone https://github.com/ningzimu/codex-ppt-skill.git
mkdir -p ~/.codex/skills
ln -s $(pwd)/codex-ppt-skill/skills/codex-ppt ~/.codex/skills/codex-ppt
Image Generation Configuration
Important: Only configure if you need API/CLI fallback. If using Codex with GPT subscription and built-in image generation works, skip this section.
Configure only when:
- Using third-party OpenAI-compatible APIs
- Using Claude Code, OpenClaw, or Hermes Agent
- Codex built-in image generation is unavailable
Configuration Command
python3 ~/.codex/skills/codex-ppt/scripts/codex_ppt_runtime.py config \
--api-key "$OPENAI_API_KEY" \
--model gpt-image-2
With custom base URL (for third-party providers):
python3 ~/.codex/skills/codex-ppt/scripts/codex_ppt_runtime.py config \
--api-key "$OPENAI_API_KEY" \
--base-url "https://api.example.com/v1" \
--model openai/gpt-image-2
Configuration is stored in ~/.codex-ppt-skill/.env and shared across all agents.
Environment Variables
If configured, the .env file contains:
OPENAI_API_KEY=your-api-key-here
OPENAI_BASE_URL=https://api.example.com/v1 # optional
OPENAI_IMAGE_MODEL=gpt-image-2
Key Commands and API
Generate Image via CLI
python3 ~/.codex/skills/codex-ppt/scripts/codex_ppt_runtime.py generate \
--prompt "Clean professional slide: Introduction to AI, blue gradient background, large title, 3 bullet points" \
--output /path/to/slide_01.png \
--size 2048x1152
Assemble PPT from Images
python3 ~/.codex/skills/codex-ppt/scripts/assemble_ppt.py \
--project-dir /path/to/ppt-project \
--title "My Presentation" \
--speech-file /path/to/ppt-project/speech.md
Check Configuration
python3 ~/.codex/skills/codex-ppt/scripts/codex_ppt_runtime.py check-config
Output:
✓ Configuration file exists
✓ API key configured
✓ Model: gpt-image-2
✓ Base URL: https://api.openai.com/v1
Workflow and Usage Patterns
Basic Usage
# In agent conversation:
# "Use codex-ppt skill to create a 10-slide presentation from article.md"
The skill follows this workflow:
- Read content and create outline
- Generate
outline.mdwith slide titles and key points - Request confirmation on page count and structure
- Propose visual styles (2-3 options with recommendation)
- Confirm image generation backend before first generation
- Generate sample slide for style approval
- Create project directory structure
- Generate all slides with unified styling
- Quality check (text clarity, style consistency)
- Generate
speech.mdwith speaker notes - Assemble
.pptxusing local script
Project Directory Structure
{base_dir}/{ppt_name}/
├── origin_image/
│ ├── slide_01.png # Title slide
│ ├── slide_02.png # Content slides
│ ├── slide_03.png
│ └── ...
├── outline.md # Slide structure
├── speech.md # Speaker notes (## Slide 1: Title format)
└── {ppt_name}.pptx # Final presentation
Example: Article to Presentation
# Input: technical_article.md containing AI research summary
# Agent command: "Use codex-ppt skill to make this into slides"
# Step 1: Outline generation
outline = """
# AI Research Presentation Outline
## Slide 1: Title
- "Recent Advances in Large Language Models"
- Speaker name, date
## Slide 2: Background
- Evolution of NLP
- Pre-transformer era vs transformer era
- Key milestones timeline
## Slide 3: Architecture
- Transformer architecture diagram
- Attention mechanism
- Scaling laws
# ... (continues)
"""
# Step 2: Style selection
styles = [
"clean-professional", # Recommended for tech talks
"scientific-defense", # For academic presentations
"handdrawn-technical" # For approachable tech explanation
]
# Step 3: Sample slide generation (2K resolution)
sample_prompt = """
16:9 slide, clean professional style, blue gradient background
Title: "Recent Advances in Large Language Models"
Subtitle: "Dr. Jane Smith | May 2024"
Minimalist design, large readable font, subtle geometric accents
"""
# Step 4: Bulk generation (all remaining slides)
# Agent generates each slide with consistent style but varied layouts
Example: Inserting Custom Images
# Outline with custom figure specification
outline_with_figures = """
## Slide 5: Model Architecture
- Insert: /path/to/architecture_diagram.png
- Transformer architecture
- Multi-head attention
- Feed-forward layers
## Slide 8: Experimental Results
- Insert: /path/to/results_chart.png
- Benchmark comparison
- Performance metrics
"""
# The skill will:
# 1. Use provided image as background/focal element
# 2. Add consistent styling (borders, background, text overlays)
# 3. Maintain visual coherence with other slides
Example: Python Assembly Script Usage
#!/usr/bin/env python3
from pptx import Presentation
from pptx.util import Inches
import os
def assemble_presentation(project_dir: str, title: str, speech_file: str):
"""
Assemble PPT from images in origin_image/ directory.
Args:
project_dir: Path to PPT project directory
title: Presentation title
speech_file: Path to speech.md with speaker notes
"""
prs = Presentation()
prs.slide_width = Inches(10) # 16:9 aspect ratio
prs.slide_height = Inches(5.625)
image_dir = os.path.join(project_dir, "origin_image")
images = sorted([f for f in os.listdir(image_dir) if f.startswith("slide_")])
# Parse speaker notes
notes_map = parse_speaker_notes(speech_file)
for idx, img_file in enumerate(images, 1):
slide_layout = prs.slide_layouts[6] # Blank layout
slide = prs.slides.add_slide(slide_layout)
# Add image filling entire slide
img_path = os.path.join(image_dir, img_file)
slide.shapes.add_picture(
img_path,
Inches(0), Inches(0),
width=Inches(10), height=Inches(5.625)
)
# Add speaker notes
if idx in notes_map:
slide.notes_slide.notes_text_frame.text = notes_map[idx]
output_path = os.path.join(project_dir, f"{title}.pptx")
prs.save(output_path)
return output_path
def parse_speaker_notes(speech_file: str) -> dict:
"""Extract speaker notes by slide number from markdown."""
notes = {}
current_slide = None
current_text = []
with open(speech_file, 'r', encoding='utf-8') as f:
for line in f:
if line.startswith("## Slide "):
if current_slide:
notes[current_slide] = "\n".join(current_text).strip()
# Extract slide number
current_slide = int(line.split("Slide ")[1].split(":")[0])
current_text = []
elif current_slide:
current_text.append(line.rstrip())
if current_slide:
notes[current_slide] = "\n".join(current_text).strip()
return notes
Visual Styles Reference
Built-in styles in skills/codex-ppt/references/styles.md:
clean-professional
- Blue/gray gradients, sans-serif fonts
- Minimalist design, ample white space
- Subtle geometric accents
- Best for: corporate, tech talks
scientific-defense
- Academic journal aesthetic
- Structured layouts with clear sections
- Chart-friendly, equation-compatible
- Best for: research presentations, thesis defense
e-ink-magazine
- Black and white high contrast
- Editorial typography
- Grid-based layouts
- Best for: content-heavy, text-focused presentations
handdrawn-technical
- Hand-drawn diagrams and annotations
- Whiteboard aesthetic with digital polish
- Friendly, approachable
- Best for: tutorials, educational content
data-dashboard
- Dark background with bright data visualizations
- KPI-focused layouts
- Chart and metric emphasis
- Best for: business reviews, analytics presentations
retro-flat-illustration
- Flat design with vintage color palettes
- Illustrative icons and graphics
- Playful yet professional
- Best for: creative presentations, marketing
warm-handmade
- Textured backgrounds, craft-paper feel
- Handwritten fonts, natural colors
- Organic, human-centered
- Best for: storytelling, personal projects
Common Patterns
Pattern 1: Conference Talk from Paper
# Input: research_paper.pdf (converted to markdown)
# Command: "Create a 15-slide conference talk using scientific-defense style"
# Agent workflow:
# 1. Extract key sections (abstract, methodology, results, conclusions)
# 2. Create outline with 1 title + 2-3 intro + 6-8 technical + 2-3 conclusion slides
# 3. Insert paper figures on relevant slides
# 4. Generate slides with consistent academic styling
# 5. Add detailed speaker notes from paper content
Pattern 2: Business Quarterly Review
# Input: Q4_2024_metrics.md with KPIs and charts
# Command: "Make data-dashboard style slides, insert my 3 chart images"
# Outline example:
"""
## Slide 1: Q4 2024 Review
## Slide 2: Revenue Overview
- Insert: revenue_chart.png
## Slide 3: User Growth
- Insert: growth_chart.png
## Slide 4: Regional Performance
- Insert: regional_map.png
## Slide 5: Key Initiatives
## Slide 6: Q1 2025 Goals
"""
Pattern 3: Course Lecture Slides
# Input: lecture_notes.md (markdown with headings and bullets)
# Command: "Create handdrawn-technical style slides, about 20 pages"
# Agent approach:
# - 1 slide per major concept
# - Visual metaphors for abstract ideas
# - Step-by-step diagrams for processes
# - Summary slide every 5-6 slides
# - Consistent whiteboard aesthetic throughout
Resolution and Quality
Standard Resolution (2K)
# 2048x1152 (16:9, sufficient for most presentations)
python3 codex_ppt_runtime.py generate \
--prompt "..." \
--output slide.png \
--size 2048x1152
High Resolution (4K)
# 3840x2160 (16:9, for text-heavy slides or printing)
python3 codex_ppt_runtime.py generate \
--prompt "..." \
--output slide.png \
--size 3840x2160
When to use 4K:
- Slides with extensive text (>100 words)
- Complex diagrams or code snippets
- Presentations for large screens or printing
- Fine typography matters
Troubleshooting
Issue: Blurry text on slides
Solution: Increase resolution to 4K
# In agent: "Regenerate slides 3-5 at 4K resolution for better text clarity"
Issue: Style inconsistency between slides
Cause: Vague or varying style prompts
Solution:
- Lock style reference in first sample slide
- Reuse exact style description for all slides
- Only vary content/layout, keep color/font/theme identical
# Good: Consistent base prompt
base_style = "Clean professional, blue gradient (#1e3a8a to #3b82f6), Inter font, minimalist"
slide_2_prompt = f"{base_style}\nTitle: Introduction\n3 bullet points..."
slide_3_prompt = f"{base_style}\nTitle: Methods\nDiagram with 4 boxes..."
# Bad: Different styles per slide
slide_2_prompt = "Blue background, title and bullets"
slide_3_prompt = "Professional slide with diagram" # Too vague
Issue: Missing speaker notes in assembled PPT
Cause: speech.md format doesn't match parser
Solution: Use strict heading format
## Slide 1: Title Slide
This is the opening slide. Introduce yourself and the topic.
## Slide 2: Background
Explain the context. Mention key historical developments.
## Slide 3: Problem Statement
...
Parser expects ## Slide N: Title format exactly.
Issue: Image generation fails with API error
Check configuration:
python3 codex_ppt_runtime.py check-config
Common fixes:
- Verify API key in
~/.codex-ppt-skill/.env - Check base URL (must end with
/v1) - Confirm model name matches provider's requirements
- Test with direct curl:
curl https://api.openai.com/v1/images/generations \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-image-2",
"prompt": "Test slide",
"size": "2048x1152"
}'
Issue: Agent not using codex-ppt skill
Solution: Explicitly mention the skill
# Weak: "Make slides from this article"
# Strong: "Use codex-ppt skill to generate slides from this article"
Issue: Custom image not properly integrated
Correct outline format:
## Slide 5: Architecture
- Insert: /absolute/path/to/diagram.png
- Model architecture overview
- Key components
Agent should:
- Place custom image as slide background or main element
- Add styling overlay consistent with other slides
- Optionally add title/annotations matching theme
Advanced Usage
Modify Existing Slide
# Don't regenerate entire deck
# Command: "Regenerate slide 7 with darker background and larger font"
# Agent should:
# 1. Load slide_07 prompt from history or reconstruct from outline
# 2. Modify only specified parameters
# 3. Overwrite origin_image/slide_07.png
# 4. Re-run assembly script
Custom Style Reference
# Upload reference image
# Command: "Use this slide style for the entire presentation"
# Agent approach:
# 1. Analyze uploaded image (colors, fonts, layout, visual elements)
# 2. Create detailed style description
# 3. Apply to all slide prompts
# 4. Generate sample for confirmation
Batch Export Multiple Formats
from pptx import Presentation
import subprocess
def export_formats(pptx_path: str):
"""Export to PDF and images."""
base = os.path.splitext(pptx_path)[0]
# PDF (requires LibreOffice)
subprocess.run([
"libreoffice", "--headless", "--convert-to", "pdf",
"--outdir", os.path.dirname(pptx_path),
pptx_path
])
# Individual PNGs already in origin_image/
print(f"Exported: {base}.pdf")
print(f"Images: {os.path.dirname(pptx_path)}/origin_image/")
Best Practices
- Start with outline confirmation: Always review structure before generating images
- Generate sample first: Confirm style with 1-2 slides before bulk generation
- Use 4K for text-heavy slides: Don't compromise readability
- Keep style locked: Identical base prompt for all slides in a deck
- Semantic layout variation: Change layout to match content type (intro vs data vs summary)
- Speaker notes: Write detailed notes during generation, not after
- Custom images: Pre-prepare figures at high resolution (min 1920px width)
- Iterative refinement: Fix individual slides, don't regenerate entire decks
Environment Variables Reference
# Required only for API/CLI fallback
OPENAI_API_KEY=sk-... # Your OpenAI API key
OPENAI_BASE_URL=https://api.openai.com/v1 # Optional, for third-party providers
OPENAI_IMAGE_MODEL=gpt-image-2 # Model name
Never commit these to version control. Store in ~/.codex-ppt-skill/.env.