Lab · Character Messaging Game · build log

A cast that keeps living when you close the app

A messaging game where you text a cast of characters, except they also text each other, post, fall out, make up and remember you, whether or not you're watching. This is the running build log: what got built, when, and what it cost. Built alongside Claude Code.

12characters
5,100lines of code
17modules
~0.2¢per message

Running totals · as of 24 September 2026

Not public. It runs on my own machine, against my own API key.
A note on this log

The Life Island log is generated from that project's commit history, which is why it can count hours and commits. This one isn't in version control yet, so there is nothing to count. The dates below are real and the work is real, but you won't find hours on this page until the repository exists. Putting it in one is the first thing on the list below.

Chapter 1 · 12 August – 24 September 2026

From a chat window to a world that runs itself.

A scaffold in August that sat untouched for six weeks, then three days that turned it into something with a memory, an economy and a life of its own.

What got built

The log, day by day

12 Aug
The scaffold

A chat window, and then nothing

  • A backend, a client, and a character who could hold a conversation.
  • Then it sat for six weeks. It worked, but it was just a chat window — the characters forgot everything the moment you left.
22 Sep
Tuesday the rebuild

One source of truth

  • The World Journal. Every event in the world writes to one journal, and every prompt reads from it. This is the whole fix for the thing that ruined the apps I was modelling against: the story and the chat can no longer contradict each other, because there is only one story.
  • Memory. Every few turns, a cheap model reads the conversation and extracts what the character now knows about you, plus one sentence on where you stand. That sentence goes into every future prompt.
  • The world tick. Time passing generates private conversations between characters, posts, comments and unprompted messages to you. Never on a timer — only when you open the app after a gap, or ask for it. The world moving should never quietly spend money.
  • Situations. Events you write yourself that colour every prompt until you end them.
  • Relationships are a sentence, not a score. Rebuilt as meters two days later — see below.
23 Sep
Wednesday the cast

Twelve people, and the small things that sell it

  • Twelve characters, each with a history, a personality, a way of speaking, and opinions about the other eleven. The full portrait goes into that character's own conversations; a compact version goes to the narrator that runs the world.
  • Replies arrive as one to three separate bubbles, revealed one at a time, instead of a single essay. Cheapest realism win of the whole project.
  • Every message you send carries its real timestamp into the prompt, so characters notice it's late, or that you've been gone three days.
  • Per-character notes you can write yourself, which override everything else in that character's prompt.
  • Hand-drawn emblem avatars rather than faces — a deliberate choice, and one I'd make again.
24 Sep
Thursday the long day

Long memory, a self-moving world, and a budget

  • Long-term memory. Old journal entries fold into a rolling chronicle instead of being dropped, so the world still remembers last week without paying to re-read it every time.
  • The world moves on its own. A tick can now start its own situation or shift a relationship — nobody has to author every event. Come back after a day away and it runs the catch-up you missed.
  • A group chat for the whole household, which only fires when something actually happens. It stays quiet otherwise, on purpose.
  • A daily spend cap. Every action's cost is tracked and totalled; past the cap, everything optional is refused and only your own conversations still work. A usage screen shows today against the cap.
  • Meters — friendship and romance, 0 to 100, with named stages. I'd explicitly rejected points two days earlier and changed my mind, with one condition: every movement is logged with the reason it moved, and hurting someone moves it down. Everyone starts at the bottom.

The reversal is the honest bit. "No points, relationships are a sentence" was the right instinct about opaque scores, not about scores. A number you can see the reasons behind turned out to be the thing I wanted all along.

Honest accounting

What it actually cost

About 0.2 cents a message

Measured, not estimated: a run of messages plus a memory pass plus a full world tick came to roughly two cents. The subscription this replaces works out several times higher per message, and forgets everything.

The expensive mistake

Timestamps written as "5 minutes ago" changed on every single request, which meant the prompt cache never hit and every message was charged at full price — about triple. Fixed by writing fixed clock times instead. A one-line habit that cost real money.

What went fast

The world tick, the chronicle and the budget guard each landed in a single sitting. Anything that is really just data moving between a database and a prompt goes quickly; anything that has to feel right takes three tries.

Still to come

What's next

  • Version controlSo this log can be generated from the work instead of written from memory, the way the Life Island one is.
  • One more characterDeliberately held back until the twelve already there feel finished.
  • Still movingWork landed on 25 September that isn't written up here yet.
Written from the work itself, 12 August – 24 September 2026 · Built with Claude Code.

← Back to Lab