<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>m0no.xyz</title>
    <link>https://m0no.xyz/</link>
    <description>Posts from m0no.xyz</description>
    <atom:link href="https://m0no.xyz/rss.xml" rel="self" type="application/rss+xml" />
    <lastBuildDate>Mon, 27 Apr 2026 14:01:00 GMT</lastBuildDate>
    <item>
      <title>Virtual Game Master (VGM) postmortem</title>
      <link>https://m0no.xyz/posts/001_vgm_postmortem.html</link>
      <guid isPermaLink="true">https://m0no.xyz/posts/001_vgm_postmortem.html</guid>
      <pubDate>Mon, 27 Apr 2026 14:01:00 GMT</pubDate>
      <description>&lt;h1&gt;Virtual Game Master (VGM) postmortem&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://m0no.xyz/upload/logo_dark.webp&quot; alt=&quot;VGM Logo&quot;&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#39;ve been running a VGM (Virtual Game Master) service for a while,
and I want to share some insights and reflections on the experience.&lt;/p&gt;
&lt;p&gt;A year ago, me and my friend were thinking of a &amp;#39;text-based dnd-like experience&amp;#39; for those, who has either very little time to attend IRL
TTRPG events, or no friends (&amp;gt;__&amp;gt;) to play with.&lt;/p&gt;
&lt;p&gt;I said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Hold my San Miguel!&lt;/em&gt; (beer)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;It&amp;#39;s April 2025 and AI Era is upon us - it&amp;#39;ll work beautifully&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Spoiler: it kinda did.&lt;/p&gt;
&lt;h2&gt;But first&lt;/h2&gt;
&lt;p&gt;We explored other options available,
because, obviously, we are not the ones who decided to make AI Dungeon Master.&lt;/p&gt;
&lt;p&gt;All of them sucked, in one way or another. But ultimately, it&amp;#39;s
Overly Aggressive Monetization + Cheapest Possible LLM (paired with
lousy system instructions).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some results were particularly hilarious, like the one where the too trusting AI DM was acting surprised when in Harry Potter-ish quest, I first put on my Emerald Jetpack, and then gave some NPC a million dollars straight from my pocket, and flew out of the window to Narnia.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://medium.com/@m0nochr0mex/virtual-game-master-eb3ebef75627&quot;&gt;my article about VGM on Medium&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;so I started building my own game master, hoping it would..&lt;/p&gt;
&lt;h2&gt;Suck less&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://m0no.xyz/upload/Screenshot_20250831_231321_Chrome.jpg&quot; alt=&quot;PWA Screenshot&quot;&gt;&lt;/p&gt;
&lt;p&gt;What makes a Table-top Role Playing Game an enjoyable experience:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;em&gt;captivating story&lt;/em&gt; and the chance to be someone you cannot be IRL.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Other players&lt;/em&gt; to interact with, scheme against, or save from their own bad ideas.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Written rules&lt;/em&gt; making fantasy adventures in unknown lands of magic
more stable and predictable than the actual world outside your window.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;A Dungeon Master&amp;#39;s experience and charisma&lt;/em&gt; on top of those rules —
to say &amp;quot;yes, but&amp;quot; instead of just &amp;quot;no&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Am I making a system that could induce a massive Dungeon Masters layoffs in boardgaming clubs around the world, rendering human component obsolete?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;No. So TTRPG Purists and AI haters should STFU, because the result was
a totally different experience from regular games.&lt;/p&gt;
&lt;p&gt;A few observed cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Regular normal everyday solo adventure to do instead of doomscrolling.&lt;/li&gt;
&lt;li&gt;Bizarre experimental chaotic neutral multiplayer run that no human DM
could endure and remain sane.&lt;/li&gt;
&lt;li&gt;Inspiration well to draw from and use in regular human-only adventures.&lt;/li&gt;
&lt;li&gt;Second life to return to for many days — see below, this one deserves
its own section.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The architecture (delta edition)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://m0no.xyz/upload/card4.png&quot; alt=&quot;Club Deviant&quot;&gt;&lt;/p&gt;
&lt;p&gt;I won&amp;#39;t repeat what I covered in the &lt;a href=&quot;https://medium.com/@m0nochr0mex/virtual-game-master-eb3ebef75627&quot;&gt;previous article&lt;/a&gt;.
The stack moved a fair bit since (Gemini 2.5, Imagen4 alongside
FLUX.1-schnell, vector embeddings switched to &lt;code&gt;gemini-embedding-001&lt;/code&gt; at
3072 dimensions, ASR via Groq-hosted Whisper3 Turbo), but the &lt;em&gt;concepts&lt;/em&gt;
are more interesting than the exact bills of material.&lt;/p&gt;
&lt;p&gt;A few things worth flagging that arrived after the first article:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HyDE for retrieval.&lt;/strong&gt; Naïve vector search worked, but predictably
picked the most generic neighbours from the references DB. Switching to
&lt;em&gt;Hypothetical Document Embeddings&lt;/em&gt; — generate a fake plausible passage
in the target style, &lt;em&gt;then&lt;/em&gt; search by its embedding — produced way more
characterful NPC, item and location pulls. The system goes &amp;quot;I think the
answer would look like &lt;em&gt;this&lt;/em&gt;&amp;quot;, embeds &lt;em&gt;this&lt;/em&gt;, and lets the vector DB
fight back with the closest real entries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A &amp;quot;preface&amp;quot; to preheat the world.&lt;/strong&gt; Before the player ever types
anything, the Story AI writes a short setting preface that the rest of
the pipeline reads. This sounds tiny but it dramatically reduced the
GM&amp;#39;s tendency to drift towards generic Tolkien-default-fantasy in turn
one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thought signatures and tool calls in the DB.&lt;/strong&gt; Long sessions used to
lose continuity once the history rolled over. Persisting the GM&amp;#39;s
reasoning traces and tool calls (not just user/assistant text) gave the
next-turn agent something better to reattach to than a stack of
dialogue lines.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A multiplayer agent on the bigger model.&lt;/strong&gt; Co-op was the single
biggest jump in complexity — the GM has to address &lt;em&gt;the party&lt;/em&gt;, juggle
interleaved actions, keep four characters in scope. I bumped multiplayer
specifically to &lt;code&gt;gemini-2.5-pro&lt;/code&gt; and ate the cost. Obvious quality
improvement, obvious budget hit, both expected.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A Loot tool.&lt;/strong&gt; Items used to be hand-waved by the narrator — and per
the design pillars (rules system fixed, randomness externalized), that&amp;#39;s
a sin. So loot became a tool call: input the situation, output a
structured item, narrator describes it. Same shape as dice rolls.
Artifacts got their own variant, with one given to the PC at session
start so the inventory has something interesting from minute one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A 300-message history window.&lt;/strong&gt; Today I learned that a 1400-message
session tops out the 1M-token input limit. So now history gets
summarized aggressively. The AI may forget that you got blackout-drunk
in the tavern two in-game weeks ago, but a human DM would too.
Probably.&lt;/p&gt;
&lt;p&gt;The agent cast itself is the same as before — Adventure Architect,
Character Concept Assistant, GM/Narrator, Visual Describer, Translator,
Summarizer. Each has a different objective function (consistency,
creativity, fairness, faithfulness), which is the whole reason they&amp;#39;re
separate. Trying to make a single prompt good at &lt;em&gt;all&lt;/em&gt; of those at once
is how you end up with the previous generation of AI DMs that get
talked into giving you an Emerald Jetpack.&lt;/p&gt;
&lt;h2&gt;Total random vs contextual integrity&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://m0no.xyz/upload/Screenshot_20250806_113345.png&quot; alt=&quot;Randomized Adventure&quot;&gt;&lt;/p&gt;
&lt;p&gt;This was the hardest balance.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;whole&lt;/em&gt; point of VGM is to surprise the player. Genre is rolled,
prefixes are rolled (&lt;code&gt;Grimdark Sexy Post-Cyberpunk&lt;/code&gt; is a real label that
came out of the box one evening), the reference work is sampled from a
vector hit list, NPC names are pulled from a setting-aligned shortlist.
Vector search was used to populate the game world with semantically
aligned NPCs, items and locations — so a High Fantasy world has &lt;em&gt;less&lt;/em&gt;
probability of laser rifles and neural implants but &lt;em&gt;never zero&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;That part works. The harder part is that the underlying model has
&lt;em&gt;opinions&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Gemini, it turns out, has favourite words and favourite names. &amp;quot;Smell of ozone&amp;quot; gets described in approximately every cyberpunk scene. &amp;quot;Oakhaven Village&amp;quot; was every second rural setting until I forced name lookups through the vector DB. And then there is &lt;strong&gt;Elara&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Elara is Gemini&amp;#39;s favourite name. She showed up in roughly every second
adventure as either a quest-giver, a love interest, an antagonist, or
all three at once. I kept fighting it. v0.3.1 was literally titled
&lt;em&gt;&amp;quot;Elara&amp;#39;s retirement&amp;quot;&lt;/em&gt; — I added a &lt;code&gt;name_search_tool&lt;/code&gt; and forced the GM
to consult the vector DB instead of inventing names from the void.&lt;/p&gt;
&lt;p&gt;She came back anyway.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://m0no.xyz/upload/elara.png&quot; alt=&quot;Elara&quot;&gt;&lt;/p&gt;
&lt;p&gt;At some point I gave up and made her the project mascot. Generated a
bunch of Stable Diffusion portraits of &amp;quot;Not An Actual Elara&amp;quot;, attached
them to changelog posts. If the model insists, you might as well lean
in.&lt;/p&gt;
&lt;p&gt;Sometimes the contamination runs the &lt;em&gt;other&lt;/em&gt; way — the model picks up
the player&amp;#39;s vocabulary and refuses to drop it. A friend played a
session committed to doing everything &lt;em&gt;cunningly&lt;/em&gt;. By turn ten the GM
was producing lines like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;...you cunningly pick the cunning lock and cunningly open the cunning door, only to find a cunning ogre behind it, cunningly waving a huge cunning wooden club.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Contagious adjectives. The model caught his vibe and would not let go.&lt;/p&gt;
&lt;h2&gt;The guardrails problem&lt;/h2&gt;
&lt;p&gt;A more uncomfortable version of &amp;quot;the model has opinions&amp;quot; is &lt;em&gt;the model
has guardrails&lt;/em&gt;, and sometimes they fire mid-game.&lt;/p&gt;
&lt;p&gt;Players occasionally tried things the safety layer was not going to
allow — most often: &amp;quot;I shoot myself&amp;quot;. The AI refused. A couple of
players were genuinely frustrated; one or two felt it broke immersion.&lt;/p&gt;
&lt;p&gt;I&amp;#39;m on the AI&amp;#39;s side here, and I think most experienced human DMs would
be too. I ran DnD 4e and Pathfinder tables for years before this
project, and &lt;em&gt;&amp;quot;no, your character does not in fact pull the trigger on
themselves to skip the boss fight&amp;quot;&lt;/em&gt; is a perfectly reasonable thing for
a DM to say. The fiction is the game; ending it abruptly because the
rules technically allow it is not a feature.&lt;/p&gt;
&lt;p&gt;The frustrating part is that I cannot always tell, from the logs,
whether a refusal was the model genuinely doing the right thing, or the
model being prudish about something it didn&amp;#39;t need to be. That is a
tuning problem I never fully solved.&lt;/p&gt;
&lt;h2&gt;The 1400-turn player&lt;/h2&gt;
&lt;p&gt;This is the part of the postmortem I keep coming back to.&lt;/p&gt;
&lt;p&gt;One player ran a session past 1400 messages. The actual quest finished
a long time before that. They then chose to &lt;em&gt;just keep living a normal
life&lt;/em&gt; inside the game world — wife, kids, day-to-day stuff, the whole
sitcom. The PC&amp;#39;s wife, by the way, was named Elara. Of course she was.&lt;/p&gt;
&lt;p&gt;The system was never designed for this. There is no &amp;quot;domestic life&amp;quot;
mode; the GM was just continuing because the player kept writing.
Summarization eventually swallowed most of the original quest details —
at some point the AI definitely could not have told you what the
opening hook was. The player did not seem to mind.&lt;/p&gt;
&lt;p&gt;I don&amp;#39;t know what to do with this story. It is the most surprising
emergent thing the project produced, and possibly the saddest. For one
person, somewhere, that second life mattered enough to come back to for
many days. The project closing means that save file is gone too.&lt;/p&gt;
&lt;h2&gt;Why it&amp;#39;s closed&lt;/h2&gt;
&lt;p&gt;I quietly turned the Telegram bot off in December 2025 and stopped
shipping releases. A few reasons compounded.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Access.&lt;/strong&gt; Most of my friends are still in Russia. The censorship
pressure there has been climbing steadily; Telegram is now fully
inaccessible without a VPN, and the project&amp;#39;s web app at &lt;code&gt;vgm.lol&lt;/code&gt; is
likely block-listed too — probably &lt;em&gt;just in case&lt;/em&gt;, since &amp;quot;AI&amp;quot; +
&amp;quot;foreign-hosted&amp;quot; + &amp;quot;user-generated content&amp;quot; ticks every box on the
&amp;quot;forbid this&amp;quot; form. So the people I most wanted to play it had to hop a
VPN to even reach the front page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The social aspect.&lt;/strong&gt; I tried showing it to my newer friends in the
Philippines. The response was uniformly &amp;quot;wow, cool project, I&amp;#39;ll check
it out&amp;quot;, followed by &lt;em&gt;never actually checking it out&lt;/em&gt;. Posts on social
media went unnoticed; mentioning AI in the description seemed to
&lt;em&gt;reduce&lt;/em&gt; visibility rather than help — like the algorithm has been
trained to suppress that exact word in self-published indie posts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expenses.&lt;/strong&gt; Inference + infra was about twenty bucks a month. Not a
lot.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Twenty bucks is twenty bucks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Especially when you&amp;#39;re the only person playing, and I never seriously
thought about how to make the project profitable in the first place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Burnout.&lt;/strong&gt; The previous three points converge here. I was the last
remaining active user. Maintaining a multi-agent pipeline plus Flutter
app, FastAPI backend, and vector DB stack for an audience of one is,
eventually, just unpaid work.&lt;/p&gt;
&lt;h2&gt;What I actually got out of it&lt;/h2&gt;
&lt;p&gt;A list, in no particular order:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The most advanced Flutter app I have ever built. (I am, at heart, a
backend person; this project dragged me through enough mobile UI to
actually be useful at it.)&lt;/li&gt;
&lt;li&gt;A working multi-agent design that survived being re-implemented twice
(n8n → FastAPI → Pillbug, see below).&lt;/li&gt;
&lt;li&gt;Concrete confirmation that &lt;em&gt;the role split is the real load-bearing
idea&lt;/em&gt;. Every time the system got worse, it was because I had asked one
agent to do two things.&lt;/li&gt;
&lt;li&gt;Evidence that vector search + HyDE meaningfully beats naïve retrieval
for &lt;em&gt;flavor&lt;/em&gt; tasks, not just factual ones.&lt;/li&gt;
&lt;li&gt;A pile of player logs that I will probably keep on a hard drive
forever.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the lessons:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Social connections are the limiting reagent for indie project success. You can build the thing, but if your network won&amp;#39;t actually try it, it doesn&amp;#39;t matter how good it is.&lt;/p&gt;
&lt;p&gt;You cannot control everything. Forces of nature, idiotic government censorship, and the social media algorithm&amp;#39;s allergy to the word &amp;quot;AI&amp;quot; are all outside your repo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Pillbug, or: an undead VGM&lt;/h2&gt;
&lt;p&gt;I have been working on
&lt;a href=&quot;https://github.com/m0nochr0me/pillbug&quot;&gt;&lt;code&gt;Pillbug&lt;/code&gt;&lt;/a&gt; — an async AI agents
framework, my own take on the problem, written for projects shaped
exactly like VGM. As an experiment, I recently re-implemented the core
VGM loop on top of it.&lt;/p&gt;
&lt;p&gt;It works.&lt;/p&gt;
&lt;p&gt;It needs &lt;em&gt;a lot&lt;/em&gt; of polishing — the framework still has rough edges
where I haven&amp;#39;t decided which abstraction wins. But the fact that the
entire VGM design ports cleanly to a different runtime is, in
retrospect, the strongest validation of the original architecture I
could have asked for. The role split, the data contracts between agents,
the externalized randomness — they all survived the move.&lt;/p&gt;
&lt;p&gt;So VGM is closed, but not necessarily dead. Probably. We&amp;#39;ll see.&lt;/p&gt;
&lt;p&gt;In the meantime: thank you to the handful of people who actually played
it. Especially the one with the 1400-turn save.&lt;/p&gt;
&lt;p&gt;I hope your in-game family is doing well.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://m0no.xyz/upload/20250809_194911_1.jpg&quot; alt=&quot;Atlas helping&quot;&gt;&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Initial post</title>
      <link>https://m0no.xyz/posts/000_initial.html</link>
      <guid isPermaLink="true">https://m0no.xyz/posts/000_initial.html</guid>
      <pubDate>Mon, 27 Apr 2026 03:38:00 GMT</pubDate>
      <description>&lt;h1&gt;Initial post&lt;/h1&gt;
&lt;p&gt;This is the initial post on the web.&lt;/p&gt;
&lt;p&gt;I plan to write &amp;#39;articles&amp;#39; here, while keeping fleeting updates in the gemini capsule or social media.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>
