Case study
Demon Monster is a generative-media product I built from the first commit through to the payment. You read the day's news, and you can commission a personalised blessing: a short ritual video, rendered when you ask for it, paid through Stripe. I still call it doomscrolling with a purpose. It's live at demon.monster.
I have spent twenty years shipping work that has to survive contact with the public. This one taught me three things I now take into every AI engagement. It also cured me of the sentence "the demo is basically done."
Mar–Sep
first commit to still shipping
473
commits
99
API route directories
2–3 min
of CPU to render each video
On 23 May I wrote a go-live checklist. The last line, which I am happy to have on the record, was: "Estimated time to production: 40 minutes."
Production hardening took another three months. Two days from the fix log are enough to show the shape of it.
11 August. The free trial was turning real first-time users away. The eligibility check asked whether this person had ever had a row for this ritual, and it counted old subscription usage and past purchases along with trials. Anyone with history was silently disqualified and sent straight to the paid checkout. I fixed it that afternoon. The fix then broke production with a Postgres error, "inconsistent types deduced for parameter". I fixed that the same day. The celebration was staring at the ceiling.
14 August. Some rendered videos played back blank. Zero frames. The renderer was fine. I pulled a real file from production and counted 120 correct frames. The cause was a status code. My "not ready yet" response was a 503, and DigitalOcean's edge treats any 5xx as an infrastructure failure and replaces the response. The fix was one line: return a 404.
Neither bug can exist in a demo. They show up when accounts have a history, when a CDN sits between you and the person watching, and when someone other than you finds the edge. I don't tuck the last 10% onto the end of an estimate anymore. It gets its own phase. The forty minutes were a story I told because the demo played.
The MVP was a news feed and a vote. With today's tools I could build that in a weekend, and I would still be wrong about what the product was.
The product is a pipeline. One blessing passes through every step of this:
Every arrow is a place it can fail, and most of the failures are silent. Rendered videos lived on container disk that was wiped on every redeploy. Five scheduled jobs each had to be safe to run twice. Payment state had to agree with entitlement state, which had to agree with what the person on the other side actually saw.
A demo never has to survive a redeploy. The thing someone has paid for does. I see the same stall in a lot of AI work: the demo plays, and the pipeline has not been built. An MVP tells you someone wants the thing. A pipeline has to work at 3am with nobody watching. I estimate them as different kinds of work, and I staff them that way.
The bugs were solvable. So was the pipeline. Hours fix those.
Hours do not bring a person to the door.
The free-trial bug sat on the exact step where someone decides to try the product. The people most ready to start were the ones being turned away. A free tier, an example video on the shop page, a smoother checkout: all of that improves the visit for someone who has already arrived. None of it creates that someone.
Building is the part I control, so I stayed there longer than was useful. Demand is the part I don't, which is why the editor is such a comforting place to hide. If I started Demon Monster again I would put distribution on day one, beside the build. From the outside, a finished product nobody has heard of looks the same as one that isn't finished.
Most of the AI work I see is where Demon Monster was in May. A working demo, and an estimate you could fit in a lunch break.
What remains is the last ten per cent. Risk, provenance, governance, and the moment the system meets real people. For organisations that publish, that work now comes with obligations attached. It's the work I do.
The other long piece on here is a personal knowledge graph I built across the tools I actually talk to.