← Blog

Case study

What I learned building Demon Monster

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

The last 10% takes as long as the first 90%

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.

An MVP and a full-featured app with a pipeline are different species

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:

Stripe checkout→webhook→entitlement→server-enforced free trial→render job (headless Chrome and ffmpeg inside the production container)→storage→a player polling every four seconds→CDN edge→email (its own workaround, because the host blocks outbound mail)

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.

Getting customers will always be the hardest hurdle

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.

Where I still find the work

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.