A dark slide with a bar chart titled 'Spot price by GPU ($/hr)' from the Vela pitch example deck.
From the Vela pitch example deck, rendered with slaide.

Automating Weekly Status Reports With Plain Text Slides

A weekly status deck is a familiar chore. Open last week’s file, save it as this week’s, click into six text boxes, replace six numbers, check whether anything moved enough to need a new bullet. It is ten minutes of the same clicking, in the same tool, for a deck that people expect to exist and rarely read closely.

Ten minutes a week is nothing on its own. But the task is really “put four numbers into a known shape.” That is a script’s job, not yours.

The template

A .slaide file with placeholders where the numbers go. The file structure docs describe the format. The @@name@@ markers are my own convention, so they do not collide with the {{placeholder}} syntax that Slaide itself uses:

---
title: Weekly report
---
## Weekly report - @@week@@
MRR: $@@mrr@@, @@growth@@% week over week
---
## Pipeline
@@deals_open@@ open deals, $@@pipeline_value@@ total value
---
## What changed
@@changes@@

Four numbers, one block for whatever changed that week. The template stays the same from week to week, which is the point of having one.

The fill script

All values below are made up:

import subprocess
from pathlib import Path

TEMPLATE = Path("template.slaide").read_text()

def fetch_numbers():
    # pull from your billing API, CRM API, whatever 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",
    }

deck = TEMPLATE
for key, value in fetch_numbers().items():
    deck = deck.replace(f"@@{key}@@", str(value))

Path("weekly.slaide").write_text(deck)
subprocess.run(["slaide", "export", "weekly.slaide", "--pdf", "weekly.pdf"], check=True)

Run it Monday morning with cron or by hand. The numbers come from the billing API and the CRM, not from someone remembering what they typed last week. That matters, because the manual version has a real failure mode: old numbers surviving into a new report because nobody rewrote that box.

The CLI reference lists the export commands. Export uses headless Chromium, so run npx playwright install chromium once.

What to send

The PDF, straight into an email. When someone wants to add a note before a meeting, send a .pptx:

slaide export weekly.slaide --pptx weekly.pptx

The CLI reference says this is an editable PowerPoint file with real text, shapes and images. Nobody receiving it needs to know it started as a text file.

Where this breaks down

If a week needs a real chart, plotted from data rather than a number in a sentence, the template above does not cover it. Generate the chart image separately and reference it in the slide. Do not make the templating layer draw graphs, because that is not what it is for. Keep the template doing what it is good at, which is filling known slots in a known shape.

And if the report’s shape changes every week, with more slides some weeks and fewer others, a rigid placeholder template fights you. A weekly status report usually keeps its shape, so that is often fine. The value here is not clever automation. A report that looks the same every week should cost seconds, not ten minutes. If you want to try it, start at getslaide.com.