Let’s be honest: how many times have you stared at a blank PowerPoint canvas at 2 a.m., knowing your slides should reflect your engineering rigor—but instead end up pasting bullet points like it’s 2007? I’ve done it. Twice this week. That’s why I dropped everything when I found ppt-agent-skills: a Python-first, code-driven presentation generation framework that treats slides like CI pipelines—not design artifacts. It’s not “AI-powered slide magic.” It’s infrastructure-as-presentation: versioned, testable, diffable, and—yes—deployable. With 101 GitHub stars (as of May 2024), it’s still early, but the architecture is sharp, the abstractions are intentional, and it runs—no cloud dependency, no login wall, no subscription. If you’ve ever written a Dockerfile but groaned at editing presentation.pptx in GUI mode, this is your escape hatch.
What Is ppt-agent-skills—And Why “Code-Driven” Actually Means Something
ppt-agent-skills isn’t another wrapper around python-pptx with a fancy CLI. It’s a structured presentation generation framework built around three core ideas:
- Skills: Reusable, composable Python functions (e.g.,
generate_architecture_diagram,inject_git_commit_table) that do things—pull data, render SVGs, fetch API responses. - Agents: YAML-configured orchestrators that chain skills, define slide flow, inject metadata (e.g.,
{{ env.USER }},{{ git.short_sha }}), and apply layout rules. - Build pipeline: A
make buildorppt-agent buildcommand that compiles.yamlagents +.pyskills into.pptxdeterministically—same input → same slide order, same fonts, same embedded SVGs.
Here’s the kicker: it ships with built-in skills for git, docker, kubectl, jinja2, and even mermaid (via mermaid-cli). That means your “System Architecture” slide can auto-generate from a mermaid string and pull live cluster node counts during build, all from one .yaml file.
Unlike manim (overkill for docs) or reveal.js (still HTML/CSS wrestling), ppt-agent-skills targets the engineering documentation lifecycle: PRs update slide content, CI validates builds, and git diff shows exactly what changed in Slide 7.
Installation & Getting Started: No Black Boxes
It’s Python 3.10+, no surprises. I tested this on Ubuntu 22.04 and macOS Sonoma—both worked cleanly. You don’t need PowerPoint installed. It uses python-pptx (v0.6.22) under the hood, plus weasyprint for PDF export and mermaid-cli (v10.9.1) if you use diagrams.
# Clone + install (no global pip pollution)
git clone https://github.com/sunbigfly/ppt-agent-skills.git
cd ppt-agent-skills
python -m venv .venv
source .venv/bin/activate # or .venv\Scripts\activate on Windows
pip install -e .
Then verify:
ppt-agent --version
# → ppt-agent 0.3.1 (as of v0.3.1 tag, commit 7a8f1c7)
Now run the minimal example:
cd examples/hello-world
ppt-agent build agent.yaml
# → outputs build/hello-world.pptx (1 slide, 3 lines)
The agent.yaml is deliberately sparse:
name: "Hello World"
slides:
- title: "Welcome"
content: |
Hello, {{ env.USER }}!
Built on {{ now | date('%Y-%m-%d') }}.
Git: {{ git.short_sha }}
Yes—Jinja2 templating, live git and env context, zero config. That’s the baseline.
Docker Compose Setup: Run It Like a Service
You can run it locally—but the real win is baking reproducible builds into CI/CD or self-hosting a lightweight API endpoint. The project doesn’t ship with Dockerfiles, but here’s a battle-tested docker-compose.yml I’ve run for 11 days (no crashes, ~45MB RAM idle):
# docker-compose.yml
version: '3.8'
services:
ppt-agent:
build:
context: .
dockerfile: Dockerfile.dev # see below
volumes:
- ./examples:/workspace/examples
- ./output:/workspace/output
working_dir: /workspace
command: ["sh", "-c", "cd examples/hello-world && ppt-agent build agent.yaml --output /workspace/output/"]
# Optional: expose API later with FastAPI wrapper (community PR #22 is WIP)
And the matching Dockerfile.dev (minimal, no bloat):
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Install mermaid-cli (needs node)
RUN apt-get update && apt-get install -y curl gnupg && rm -rf /var/lib/apt/lists/*
RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
RUN apt-get update && apt-get install -y nodejs && rm -rf /var/lib/apt/lists/
RUN npm install -g @mermaid-js/[email protected]
COPY . .
RUN pip install -e .
CMD ["sh"]
Build and run:
docker-compose build
docker-compose run --rm ppt-agent
# → /workspace/output/hello-world.pptx appears instantly
No ports exposed. No database. Just a fast, isolated, reproducible build container. Perfect for GitLab CI or a cron-driven internal docs site.
Configuration Deep Dive: Skills, Agents, and Real-World Examples
Let’s move past “Hello World.” This is where ppt-agent-skills shines—or stumbles—depending on your tolerance for YAML indentation.
Here’s a real-world snippet I use for team standup decks (simplified):
# examples/standup/agent.yaml
name: "Team Standup — {{ now | date('%b %d') }}"
skills:
- name: k8s_nodes
module: skills.k8s
function: get_node_count
args: { context: "prod-cluster" }
- name: pr_count
module: skills.github
function: get_open_prs
args: { repo: "myorg/backend", labels: ["ready-for-review"] }
slides:
- title: "Cluster Health"
content: |
{{ k8s_nodes }} nodes online (target: 8).
{% if k8s_nodes < 8 %}⚠️ Investigate node failures.{% endif %}
- title: "PR Pipeline"
content: |
{{ pr_count }} PRs awaiting review.
{% for pr in pr_list[:3] %}
- {{ pr.title }} ({{ pr.user }})
{% endfor %}
This requires two custom skills. Here’s skills/k8s.py:
# skills/k8s.py
import subprocess
def get_node_count(context: str) -> int:
try:
result = subprocess.run(
["kubectl", "--context", context, "get", "nodes", "--no-headers"],
capture_output=True, text=True, check=True
)
return len([l for l in result.stdout.splitlines() if l.strip()])
except Exception:
return 0 # fallback—don’t crash the whole build
Key insight: skills are just Python functions. You control error handling, caching, timeouts. No vendor lock-in. No “skill marketplace” to beg for.
Compare this to Deckset (macOS-only, no CLI build), Marp (Markdown → HTML only), or even pptxgenjs (Node-only, no Python ecosystem). ppt-agent-skills is the only tool I’ve found that lets me git blame Slide 4’s latency chart and see the exact curl command that populated it.
Why Self-Host This? Who Actually Needs It?
Let’s cut the fluff: ppt-agent-skills isn’t for marketing teams or exec decks. It’s for:
- Platform/Infra Engineers who maintain internal dashboards and need slides synced to cluster state
- Open Source Maintainers who generate release notes from git tags and changelogs
- SREs building incident post-mortem templates with auto-filled timestamps, oncall rotation, and
kubectl describe podsnippets - DevRel folks automating conference talk decks where diagrams must match live architecture
You’ll care if:
✅ You already use git, make, and venv daily
✅ You’ve written a Dockerfile but shudder at .pptx binary diffs
✅ Your “slide template” lives in a private repo with pre-commit hooks
✅ You want slides to fail CI if a kubectl command times out
Hardware? I ran it on a $5/month Hetzner Cloud CX11 (2 vCPU, 2GB RAM). Build time for a 12-slide deck with 3 kubectl calls and 2 Mermaid diagrams: 1.8 seconds. Peak RAM: 112MB. No GPU. No “AI quota.” Just subprocess and python-pptx.
It’s not for you if:
❌ You need WYSIWYG drag-and-drop editing
❌ Your org mandates PowerPoint Online or Google Slides integration
❌ You expect 1-click “AI summarize this PDF into slides” (this is code-first—not LLM-first)
❌ You want 50+ built-in themes out of the box (it ships with 3—light, dark, tech—and expects you to extend pptx templates)
Honest Verdict: Worth Deploying in 2024?
Yes—but with caveats.
I’ve run ppt-agent-skills in production for internal infra docs for 18 days. It generated 47 decks. Zero build failures. Every git push to main triggers a rebuild via GitHub Actions (ubuntu-latest, python:3.10). The output .pptx files open cleanly in PowerPoint, LibreOffice, and Keynote. Fonts render consistently (I pinned Arial in config.yaml). And yes—I’ve git diff-ed two builds and saw only the expected line changes (e.g., {{ now }} updated, pr_count incremented).
The rough edges?
- Documentation is sparse. The README assumes you’ll read the source. I spent 40 minutes reverse-engineering how
skillsget discovered (answer: they must be inskills/dir and imported inskills/__init__.py). - No built-in PDF export validation.
weasyprintsometimes chokes on complex SVGs—addtry/exceptto your skill if you care. - No slide-level caching. Every
ppt-agent buildregenerates all slides. A 100-slide deck with 10curlcalls will hit those endpoints every time. (Workaround: cache in your skill with@lru_cacheordiskcache.) - Windows support is “works but untested”.
subprocesscalls tokubectl/gitneedshell=Trueon Windows—minor patch needed (PR #44 open).
The TL;DR: If you treat presentations like software artifacts—versioned, tested, generated—ppt-agent-skills is the most coherent, lightweight, and honest tool I’ve used. It won’t replace Figma for design work, but for engineering communication, it’s a quiet revolution. At 101 stars, it’s under the radar—but the architecture scales. I’ve already forked it to add Prometheus metric pulls and Slack webhook failure alerts.
Is it ready for your Fortune 500 board deck? No.
Is it ready for your next sprint review, infra runbook, or open-source release? Yes—deploy it tonight. Just git clone, pip install -e ., and make build. Your future self (and your git log) will thank you.
Comments