Everybody Lies

When It Started Breathing

By Joey Bess··3 min read·
Win

There is a strange moment in building something with AI when it stops feeling like a project and starts feeling like a little world.

I do not mean it becomes polished. Mine certainly did not. I mean there is a moment when you tap around and think, oh — this thing has a pulse.

That happened with Everybody Lies, the AI mystery simulation game I have been making. The idea is simple enough to say out loud: every town, every citizen, every secret, every crime is created by AI. You investigate. People lie. You try to figure out what happened.

Simple to say. Much less simple to build.

The first version I aimed for was modest: a mobile-first mystery loop, an investigation board, everything stored locally on the device, and simple stylized monogram avatars instead of fancy character art. I was trying very hard not to build a cathedral when what I needed was a shed with a working door.

But even the shed fought me.

At one point, town generation broke. The AI was supposed to create a town with people and secrets and the basic mystery ingredients. Instead, things jammed up because the rules for what counted as a valid town were too strict. In normal-person language: I had made the app too picky about what the AI was allowed to hand back.

The fix involved something called z.any and “coerce,” which sounds like I briefly joined a spy agency. My understanding is still plain: loosen the rule enough to accept the messy AI output, then shape it into what the app needs. That was one click.

Then came images.

I added unique images for each town using an AI image model. Suddenly the town was not just a name on a screen. It had a look. A mood. A little postcard from a place that did not exist five seconds earlier.

That was probably the first time I sat back and smiled.

Then came voices.

Each citizen got a unique text-to-speech voice. This part was more emotional than I expected. Reading a suspect statement is one thing. Hearing it spoken is another. Even when the voice was imperfect, even when the timing was not quite right, the whole game moved one step closer to being alive.

Of course, it broke.

The voice system did not work at first because the app needed a fallback voice — basically, a backup plan for when the perfect voice was not available. Then autoplay ran into browser rules. I learned that browsers often block sound until the person taps something first. Fair enough, honestly. Nobody wants a mystery game yelling at them from their pocket without permission.

The fix involved unlocking audio after a user action and reusing one shared audio player behind the scenes. Again, I am not pretending I could explain every wire. But I understood the shape of the problem: ask politely before making noise, and stop creating a new little music player every time someone talks.

Another bug was less glamorous but very real: local storage filled up. That is the phone or browser’s little cupboard where the app keeps things. I had been saving too much, especially image data. The answer was to stop stuffing giant image blobs into that cupboard.

That one felt painfully practical. Less magic, more cleaning the garage.

But after all that, something clicked. A town could be generated. It could have its own look. Citizens could speak. The investigation board gave me a place to make sense of the mess. Moving between pages still needed smoothing, and I eventually asked for a final gap analysis to see what stood between this and something App Store-ready.

But the breakthrough was not that it was finished.

It was that I could finally feel the shape of the finished thing.

For weeks, I had been staring at broken parts. After this, I was staring at a world with rough edges.

That is a very different feeling.

Small takeaway: sometimes the breakthrough is not when everything works — it is when enough works that you can believe again.