Morndur is an asynchronous storytelling RPG: players submit free text — a few sentences, an action, a rumor, the weather turning — and at 20:00 CET an AI game master reads everything and packs it into one illustrated chapter of a continuing dark-fantasy serial. It never publishes anything on its own: no submissions, no chapter. A single voice is enough; with many, the engine has to sweat, weaving clashing intentions into one coherent plot.
Things that turned out harder than the writing model itself:
- Fairness. One loud reader must not dominate a chapter. An audit counts how much page-time each cluster of intents got versus how many voices backed it, and the chapter regenerates once if it is skewed.
- Continuity. Characters persist across chapters with secrets and beliefs; the world tracks unresolved hooks (“loose threads”) and pays them off chapters later. Keeping a dead character dead is a database problem, not a prompt problem.
- Illustrations. The image model kept adding crowds of distant figures to empty establishing shots, and hands grew extra fingers. There is now a vision judge that scores every image and rejects retries up to three times.
- The boring 90%. Making a nightly unattended pipeline survive timeouts, partial failures and its own retries without ever publishing a half-baked chapter — that took longer than everything else combined.
Stack: FastAPI + Postgres; the writing model, image model and vision judge all run locally on my own hardware. Free, no account, and the story only moves when someone writes: https://morndur.com/



Fair pun. But the post is a list of the parts that were actually hard, and the model was the easy one, so the slop was never the bottleneck. On “real coding”: building it this way did not replace an engineer, it let a thing exist that would otherwise need a budget I do not have. That is the honest version of vibecoding. Not skipping the craft, just reaching something that used to be gated by money instead of talent. If you read it and the mechanic or the writing breaks somewhere, I would genuinely take that note.