itsjustalex/pptx-beautifier
✨ PPTX Beautifier
Upload a .pptx, get a tidier deck back — without breaking your corporate design. You get a downloadable beautified .pptx and a browser-viewable version, plus AI improvement notes added as PowerPoint comments.
What it does
Upload just the messy deck, or add a reference template (a second .pptx) and the app restyles the messy deck to match it.
When a template is supplied, fonts hard-coded in the messy deck are rewritten to the template's heading/body fonts ("template wins"), and theme colours re-skin to the template palette. Text, images and content are preserved.
Fonts, colours, font sizes and wording are never modified. Those carry your corporate identity, so they're left exactly as authored. Only positions, sizes and whitespace are adjusted, and AI feedback is purely advisory (it lives in the Comments pane).
Outputs
- Download `.pptx` — the cleaned deck with AI suggestions as comments. Opens in PowerPoint with no "repair" prompt.
- Open in browser — a self-contained HTML rendering of every slide. No PowerPoint or LibreOffice needed to view.
Run locally
cd pptx-beautifier
python -m venv .venv
# Windows: .venv\Scripts\activate
# macOS/Linux: source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8080Open http://127.0.0.1:8080 and drop in a .pptx.
Enable Claude-powered suggestions (optional)
Without a key, the app falls back to fast local heuristics (long-bullet / too-many-bullets checks). To use Claude:
export ANTHROPIC_API_KEY=sk-ant-... # Windows: $env:ANTHROPIC_API_KEY="sk-ant-..."
export ANTHROPIC_MODEL=claude-sonnet-4-6 # optional, this is the defaultDeploy to a public URL
The repo is container-ready. Two easy paths:
Fly.io
fly launch --copy-config --name <your-unique-name> # uses fly.toml
fly secrets set ANTHROPIC_API_KEY=sk-ant-... # optional
fly deployRender.com
- Push this folder to a GitHub repo.
- Render → New → Blueprint → pick the repo (uses
render.yaml). - Add
ANTHROPIC_API_KEYas a secret env var (optional).
Any host that runs a Docker container works (Cloud Run, Railway, etc.) — the container reads PORT from the environment and persists jobs under DATA_DIR.
How it's built
app/
main.py FastAPI routes: upload, status, view, download
beautify.py Safe geometry + whitespace cleanup (the brand-preserving part)
suggest.py Claude suggestions, with a heuristic fallback
comments.py Injects suggestions as native PowerPoint comments (OOXML)
render.py Renders the deck to standalone HTML (no LibreOffice)
store.py Filesystem-backed job store
static/ Upload UI + results pageNo database and no external converters — just Python, python-pptx, and lxml.
