| name | codex-ppt-skill |
| description | Generate image-based PowerPoint presentations using gpt-image-2, converting articles, papers, and reports into visual slide decks |
| triggers | ["create a powerpoint presentation from this document","generate slides from this article","make a ppt deck with images","convert this paper to presentation slides","build a slide deck using codex-ppt","generate visual presentation from content","create image-based slides for this report","make a ppt with gpt-image-2"] |
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
.pptx with 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
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
The skill follows this workflow:
- Read content and create outline
- Generate
outline.md with 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.md with speaker notes
- Assemble
.pptx using 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
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)
"""
styles = [
"clean-professional",
"scientific-defense",
"handdrawn-technical"
]
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
"""
Example: Inserting Custom Images
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
"""
Example: Python Assembly Script Usage
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)
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_")])
notes_map = parse_speaker_notes(speech_file)
for idx, img_file in enumerate(images, 1):
slide_layout = prs.slide_layouts[6]
slide = prs.slides.add_slide(slide_layout)
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)
)
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()
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
Pattern 2: Business Quarterly Review
"""
## 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
Resolution and Quality
Standard Resolution (2K)
python3 codex_ppt_runtime.py generate \
--prompt "..." \
--output slide.png \
--size 2048x1152
High Resolution (4K)
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
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
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..."
slide_2_prompt = "Blue background, title and bullets"
slide_3_prompt = "Professional slide with diagram"
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
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
Custom Style Reference
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]
subprocess.run([
"libreoffice", "--headless", "--convert-to", "pdf",
"--outdir", os.path.dirname(pptx_path),
pptx_path
])
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
OPENAI_API_KEY=sk-...
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_IMAGE_MODEL=gpt-image-2
Never commit these to version control. Store in ~/.codex-ppt-skill/.env.