
Automating Weekly Status Reports With Plain Text Slides
Every Monday for a while I built the same deck. Open last week’s file, save it as this week’s, click into six text boxes, replace six numbers, glance at whether anything moved enough to need a new bullet. Ten minutes, every week, for a deck almost nobody read closely and everybody expected to exist.
Ten minutes a week is nothing on its own. It’s the fact that it was ten minutes of the same clicking, in the same tool, for a task that was really just “put four numbers into a known shape.” That’s a script’s job, not mine.
The template
A .slaide file with placeholders where the numbers go:
theme:
palette: ink
font: IBM Plex Sans
# Weekly report - {{week}}
MRR: ${{mrr}}, {{growth}}% week over week
# Pipeline
{{deals_open}} open deals, ${{pipeline_value}} total value
# What changed
{{changes}}
Four placeholders, one repeating block for whatever changed that week. That’s the entire template, and it stays the same from week to week, which is the whole point of having one.
The fill script
import subprocess
from pathlib import Path
TEMPLATE = Path("template.slaide").read_text()
def fetch_numbers():
# pulls from billing API, CRM API, whatever actually holds the truth
return {
"week": "Sep 15",
"mrr": "19,200",
"growth": "4.3",
"deals_open": "14",
"pipeline_value": "88,000",
"changes": "- Closed the Meridian deal\n- Onboarding time down to 2 days",
}
data = fetch_numbers()
deck = TEMPLATE
for key, value in data.items():
deck = deck.replace(f"{{{{{key}}}}}", str(value))
Path("weekly.slaide").write_text(deck)
subprocess.run(["slaide", "render", "weekly.slaide", "--out", "weekly.pdf"])
Run it Monday morning, cron or by hand, and the deck exists before I’ve finished coffee. The numbers come from the billing API and the CRM, not from me remembering what I typed last week and eyeballing whether it’s still right, which is a real failure mode of the manual version - old numbers surviving into a new report because nobody rewrote that box.
What I actually send
The PDF, most weeks, straight into an email. When someone wants to add a note before a meeting, .pptx:
slaide render weekly.slaide --out weekly.pptx
Real text boxes, opens normally, edits normally. Nobody receiving it needs to know it started as a text file with placeholders in it.
Where this breaks down
If a week needs a chart, a real one, plotted from data rather than a number in a sentence, the template above doesn’t cover it. I generate the chart image separately and reference it in the slide rather than trying to make the templating layer draw graphs, because that’s not what it’s for. Keep the template doing the thing it’s good at, which is filling known slots in a known shape, and reach for a real charting tool the moment the report needs one.
And if the report’s shape genuinely changes week to week, more slides some weeks, fewer others, a rigid placeholder template fights you. That’s fine, that’s not what a weekly status report usually is. Mine hasn’t needed a new slide in months. The value here isn’t clever automation, it’s recognizing that a report which looks the same every week should cost the same ten seconds every week, not ten minutes.