One deck, three readers
You are writing for three people
The room, right now
Wants a sparse slide behind a talking human. Six words and a picture. Anything more competes with you.
UsuallyThis one you get right — it’s the only reader most decks are designed for.
Someone opening the link in six weeks
Wants prose that explains itself. There is no narrator. They weren’t there, and they never will be.
UsuallyThey get a deck of orphaned bullet points that meant something once.
“Can you send me the slides?”
Wants one file they can keep, forward, and search. Probably wants to print two of the pages.
UsuallyA 40MB attachment that bounces, or a link to a login screen.
The normal options are both bad: serve all three badly from one artefact, or maintain three
artefacts and let two of them rot. The next two slides are how one file serves all
three — and the mechanism is about four lines of code, which is the point.
Density
The same slide, twice
stage
−66.7 → +4.5
That’s AILANG’s LoCoBench delta against Python between v0.6 and v0.9 — the point where an AI‑first language stopped being a toy.
What the projector shows. You supply the sentence out loud.
guide
−66.7 → +4.5
That’s AILANG’s LoCoBench delta against Python between v0.6 and v0.9 — the point where an AI‑first language stopped being a toy.
What the link shows a stranger. The sentence is written down.
/* the entire hiding mechanism */
html[data-density="stage"] .detail { display: none }
// and the line that picks the default for you
root.setAttribute('data-density', embedded ? 'stage' : 'guide');
press D now — every slide in this talk has both
Take‑home prose lives in class="detail", and the default is chosen by
context: inside the presenter it’s stage, opened directly by a stranger
it’s guide. Same file, same URL, no second artefact to maintain.
The paragraph you are reading right now only exists because you pressed D
— on the projector, this slide is a comparison and nothing else.
The handover
The PDF is generated, not exported
It can’t be a print stylesheet. Slides are stacked absolutely with only one visible, revealed by animation from opacity:0, and some build up over several presses. A static print captures none of that.
So drive the real deck. Headless Chrome opens it, walks every slide to its final revealed state, screenshots at 1920×1080, and assembles the pages.
Order comes from the same PLAYLIST as the live talk — so the PDF cannot drift from what you actually presented. That’s not a nice‑to‑have; it’s the thing that makes it survive.
$ node export-pdf.mjs death-by-powerpoint --density=guide
→ death-by-powerpoint.pdf — with the take-home prose included
And note what --density=guide does for the person who emailed you: they asked
for the slides and they get the slides plus the sentences you said out loud.
Better than what they asked for, from the same source file, for free.
Where it lives
The deck doesn’t get attached.
It gets deployed.
sunholo.com/presentations/death-by-powerpoint/
It’s a static site, so it costs nothing to host and it will still open in ten years
— no runtime to patch, no database, no login. This one will be live before the
Q&A finishes, which is a promise I can make because publishing is a git push
and nothing else.