Writing

A party game, run like a business system

I own a small party game called AngryLips. You type words without seeing the story they go into, the story is revealed, and somebody has to read it out loud. This week I rebuilt it from scratch to run on the same Microsoft accounts as everything else in this company. It turned out to be the clearest example I have of how I build, so here it is.

Why it is on this site

Everything on the systems page runs in my own business before it runs in anyone else's. A game is a harder test than an office. Strangers use it, on phones, at parties, with no one to call. Some of them pay. If the way I build cannot carry that, it has no business carrying your payroll.

The old version could not carry it. It had grown to twelve game modes, a virtual currency, two hundred thousand lines of code and a database that a vendor had quietly paused for inactivity, which is why sign-in had been failing for weeks without anyone noticing. The rebuild is seven thousand lines, does one thing, and every part of it is somewhere I can see.

Where it runs

The pages themselves are served by Vercel, the same way this site is. Everything the game stores, thinks with or sends lives in this company's Microsoft accounts:

  • Its records (shared stories, party rooms, accounts, the day's usage counts) sit in Azure Table Storage, in a resource group named after the product, tagged with who owns it and which script created it.
  • Its AI is Azure OpenAI in that same resource group. One deployment writes new stories to order; another reads them aloud in six voices.
  • Its sign-in codes go out through Microsoft 365 as a shared mailbox, angrylips@cronkcompanies.com. The website is allowed to send as that one mailbox and nothing else, a right granted in Exchange and written down, exactly as this site's own contact form works.
  • Its domain name is answered by Azure DNS. I took it off a third-party DNS service in the process, so there is one fewer account that could go wrong or be taken over.
  • Money is Stripe, because that is what Stripe is for.

There is no password or key anywhere in this arrangement for the Microsoft side. The website proves who it is with a signed token from its host, and Microsoft trusts that token for one named identity with a short list of rights. Nothing to rotate, nothing that can leak from a laptop, and the identity cannot be used from a laptop at all. That is the same model I describe in Where it runs, and what I can see, applied to a product instead of a client.

Price from cost, not the other way around

This is the part I would have skipped a few years ago, and it is the part that matters. Before setting any price I measured what the expensive parts actually cost, per unit, from the meter rather than the brochure: one AI-written story, one narration, one shared link. The measurement took an afternoon and settled every argument that followed.

It showed that reading a story aloud costs many times what writing one does, which is not what I would have guessed, and it is the number that sets policy. So the paid tier is not "unlimited," a word that means "unmeasured." It has monthly caps, and the caps were chosen by working backward from the price: the most a single subscriber can cost me in a month, if they hit every limit every day, has to stay under what they pay after the card processor takes its share, on the yearly plan, not just the monthly one. Then the price is safe for every possible customer, which is the only kind of pricing I trust.

Free players are the larger exposure, because they pay nothing. Each gets a small daily taste, and the whole free tier has a ceiling per day, so that deliberate abuse from many addresses costs a known and boring amount rather than an unknown one. Under all of that sits a monthly budget alarm on the resource group that emails me at half, most and all of it. Alarms do not stop spending; the caps do. The alarm is there for whatever I failed to imagine.

None of this is clever. It is job costing. Know the unit cost while the work is happening, set the price from the cost rather than the other way around, and put an alarm under the number. I would not let a client price a ton of gravel any other way.

Support, with no ticket system

Every message lands in that one shared mailbox, which I already see in Outlook next to everything else. An automatic reply sets expectations and sends the two most common requests, cancel and refund, to the billing portal, where they take care of themselves. The things a person has to do (take a story down, delete an account, refund a charge) are each one command that takes two minutes. Nothing runs on a schedule.

I could have wired the mailbox into the same agents that triage mail for this company. I did not, and I wrote down when I would: more than about ten messages a week, or the same question three times. Agents need volume to pay for their upkeep. Until then, a mailbox that a person reads is the correct size, and pretending otherwise is how small products end up with more machinery than customers.

The television

The newest piece is the one I am most curious about. Open the game on any TV with a browser, type a five-letter code, and the screen fills with a QR code. Everyone in the room scans it and their phone becomes their controller. The blanks are dealt out, everyone types at once, and the finished story lands on the big screen, read aloud by the AI narrator through the TV's speakers in a movie-trailer voice. Nobody downloads anything.

That shape, the screen as the stage and phones as the controllers, is what a bar pays a trivia company a hundred dollars a night for, because it fills a slow Tuesday with people who stay for two hours. I have not built the bar version. Tables as teams, a vote for the funniest, a timer so it runs without a host: all of that is designed and none of it is written, on purpose. The right order is to put the plain version on one bar's TV on one slow night and watch what breaks. I expect the answer to be the sound system, not the software.

The sentence to keep

The product is a joke about reading the wrong word out loud. The way it is built is not a joke, and it is the same way I would build yours: in accounts you own, with an identity that holds one right and no secret, priced from measured unit cost, with an alarm underneath, and with no more machinery than the volume has earned.

Start a conversation Play it

Unfamiliar word? The glossary explains them in plain English. More notes on the work, or subscribe by RSS.