realkeep · the deep dive

how it actually works.

the front door shows you what it feels like. this page shows you the machine. everything here traces to a version tag, a decision record (an ADR), or a line of running code.

← back to the front door say hello ↓

1 · the spine: events all the way down

every world is an append-only log of events. everything you see — the town, the grudges, your dog — is a fold over that log. that one decision buys the rest:

2 · the dice are real

every game with an AI in it has to answer one question: who decides what happens? here, it is never the AI. a deterministic core resolves every fact, every roll, every outcome — first, in code — and the dice land on your screen with the math showing: 1d20+3 [15] = 18 vs AC 14 — hit. then, and only then, the narrator speaks — canon-locked to the entities and facts it's handed. the narrator cannot cheat. neither can the house. (which model holds that seat was decided the same way everything here is decided — on a bench, in the open.)

underneath the living world is a fair little RPG. a natural 20 crits: the weapon dice double and the modifier counts once (the RAW-5e rule, straight from the engine's decision records). a natural 1 fumbles, no matter who you are. and you don't fight alone: jo (another human, the one from the letter), kestrel (an AI guildmate with a soul and opinions of her own), and your dog — who doesn't fight, but holds the line anyway.

pick a setting. each one keeps its own kind of trouble. these are real dice:

▮ ▮ ▮ BRAWL
pick a world above, then press ▶. flat d20s, spells, edge, taunts — and no mercy. >

the roll grammar mirrors the game's own log format. edge is the game's advantage currency — spend it, and you roll two d20s and keep the better, both shown. if you drop, that's a soft ko — the engine's actual death physics — and the foe remembers; section 4 is why. every bit of this is shipped physics. the dice are real and rolled fresh every time; the chatter is the demo's script — in the game, those voices are alive.

3 · your dog can walk into the world

point a camera at something real, and it enters the game. photograph your dog and he's minted into the world as a companion: follows you room to room, sits for a portrait in every world's own paint, sees everything you see. the cat, the ugly vacuum, the houseplant with opinions — the world will have them too. this is the part you screenshot for a friend.

and the trick is a pipeline, not a filter:

receipts: this is the actual describe output for the dog on the front page, from the vision model we measured and picked for this seam (minicpm-v4.5 — 5/5 on the typed-field contract in the head-to-head), with the game's own prompt. the engine ships no default vision model: the setting is blank out of the box, and a deploy names one explicitly or the seam stays dark.

{"kind": "animal", "species_or_type": "dog", "size": "large",
 "colors": ["black", "white"],
 "markings": ["curly fur", "white chest patch"],
 "accessories": ["red collar"],
 "notable_features": ["floppy ears", "tongue out"],
 "pose_or_energy": "standing, happy",
 "art_phrase": "a black and white curly-haired dog with a red collar"}

and the barking? pets bark meaningfully all the time — the engine knows what they mean, you don't. the tonguelet tonic opens a bounded window (until dawn, enforced by the world clock) where the meaning renders as words. it's consumable, owner-only, and the only thing in the game that produces fluency.

and the vacuum: same intake, other exit. objects mint as foes with stats drawn from the engine's real difficulty bands — declared, never improvised.

status, plainly: all of this is built and lives in the engine (ADR-0131 — the vision seam, the moderation gate, the upload budget, the photo-foe difficulty bands). it is a per-deploy choice: the intake endpoint stays dark unless your deploy switches it on and names a vision model. the receipt above is real output from a real run.

4 · the world remembers

the log is append-only and never thrown away — and that's not a storage detail, it's the personality of the whole thing. nothing here is scripted, and nothing is forgotten:

the world clock is wall-clock: it keeps moving when you log off. that's why the letter on the front page took four days.

5 · every world hires its own painter

art is part of a world's physics. each campaign pins a checkpoint (its "painter"), a style bible, and a seed discipline; renders happen in tiers — the rare permanent stuff gets the slow expensive pass, in-play scenes go faster, sketches faster still. persisted forever, like the prose.

this site runs on that same machinery: the bloomvale scene and both dogs on the front page came off the game's own render graphs — photo checkpoint in, painter checkpoint out, seeds locked, every one reproducible.

pick a setting, then tap a style — or hit ⟳ random. every render has receipts — prompts, seeds, steps, timings, and which painter held the brush: the diffusion research →

strata deep · the sealed return door · painterly
● placeholder
choose a world
show me this in…

and the portraits that have been greeting visitors here since day one — style studies, one per painter. of the five, strata deep is the one that is also a campaign you can play today:

Generated portrait: a red-haired princess in a sunlit meadow with a distant mushroom cloud and wrecked war-mechs
the bloomvale
Generated portrait: a deep diver in a cracked brass helm leaking light
the sunken choir
Generated operative portrait: a woman with chrome cheek-plating, lit CRT-green
strata deep
Generated portrait: a hexslinger in a road-dust duster with a hex-iron revolver
perdition flats
Generated portrait: a bronze-clad oracle-champion crowned in gold laurel
the bronze heaven

and the painter doesn't sit idle between commissions — art here is a running commentary on your own story, painted locally, while you play:

and every image is kept exactly as first painted — replay the world, get the same gallery.

every painter on this easel earned its seat on a bench first — the diffusion research, receipts included →

6 · bring your own brain and brush

realkeep ships with zero AI models. not one. the narrator's brain (a chat model, via ollama) and every world's painter (a diffusion model, via comfyui) are yours to choose and download — on your machine, under each model's own license. the first-run picker we're building shows you each license in plain language before a single byte arrives: no silent defaults, no fine print sprung later.

why: model licenses bind whoever runs the model. some excellent models are free for you at home and not free for a company selling access — so we don't resell anyone's weights. we hand you the choice, the license, and the download button. your machine, your agreement, your models. (it also keeps the game itself small enough to carry.)

we read the licenses so you don't have to. our own art pipeline changed when we read one closely: flux-dev paints beautifully, but its license grants its outputs in one clause and restricts them in another, so our worlds' painter of record moved on — and on a second, closer read of that output clause, we're re-painting the commercial art too, because when a license cuts both ways we take the conservative road. that's the reading every model gets before it goes on our blessed list.

the licence reading lives on its own page now — the licence ledger on our research hub: every model we run or benched, its licence read first-hand, each row stamped with the date of its last read, re-read as models and licences move. one page holds the law so every other page can cite it instead of restating it. the head-to-heads themselves live on the research bench — the diffusion research, receipts under every image — and some of our chat-model research is published too: the voice trials, how the narrator earned its voice. today's credits, gladly given: our worlds speak through gemma4 (apache 2.0 — read first-hand from the license file the weights ship with; yes, we checked, because earlier gemma generations carried custom terms), see through qwen-vl (apache 2.0), remember with nomic-embed (apache 2.0), and their painter of record is albedobase xl, by albedobond (an SDXL merge whose CreativeML Open RAIL++-M base and civitai terms permit commercial use but ask for credit — and this is it, with the full reading in the licence ledger).

7 · plays anywhere the tide takes you

the whole thing runs on one machine, and we mean it specifically: the narrator is a local model on a GPU — sized to the card you have, not to someone's cloud — the art is a local diffusion pipeline on the same box, and the world itself is an append-only event log you can open and read. no cloud AI service, no api meter, no phone-home, no analytics — the browser client is fenced by a build test that fails if anything it serves reaches an outside origin, so there is no third party between you and your world. which machine "local" means is the one thing worth being exact about: your world runs on your hardware, and it's yours — never a cloud vendor's, and never a tracker's.

and the floor is measured where it says measured. 24GB is the card this game is built and playtested on, daily — gemma4:12b speaking, nomic-embed remembering, the vision model watching and the painter's diffusion weights all co-resident on one card, no swapping — and every loaded size we quote is read off that run. that fit is the whole reason the voice trials ran so deep: the best voice on the bench lost the seat twice to residency, and the seat that ships is the one that holds its voice and leaves the painter room to breathe. the smaller rungs are derived from those same measured loads — same model tags, not re-probed per card — and at 16GB the locked default chat model still fits, with the painter sharing what's left. above 24GB the extra room buys a bigger mind and a finer painter — the research bench has measured that rung on a 96G workstation (a 26B narrator at 0.75s warm; the render ladders on the diffusion bench) — but we haven't measured the cards in between, so we don't print a rung table for them. that buys three things most games can't have at once:

the code is closed for now — that choice gets made deliberately, once the path is clear. your worlds are yours regardless: one host runs many worlds, each one scoped, replayable, and portable — because a world is just its log, on your disk.

8 · where it actually is — the ledger

this is a real, running thing, and this section is its odometer. numbers below are read from the repository, not from optimism.

engine v0.815.1 · 922 version tags · 228 decision records · 45 event-log consumers (4 still stubs) · M0–M1 shipped · M2 largely complete · M3 mostly live · M4 well underway
thirty-four landings · v0.793 → v0.815 — four days, and the game grew a face
  • the party learned to move as one — companions wade into your fights, the marching order holds below deck, and a unique lost in the ruin stays exactly where it fell (v0.795–v0.801 · ADR-0223/0224/0225).
  • the anchor watch: the whole game re-staged as one calm, fixed instrument panel for a hand-held screen — a panel registry, a director's band, a five-slot dock, the narrator finally owning the system's voice — and the entire device fleet measured to fit with zero pixels over (v0.802–v0.810 · ADR-0226).
  • twenty-five review agents and two real-device passes ground on it; every confirmed finding landed before the arc closed (v0.809–v0.813).
  • the drowned tiers opened: the dive remembers its door, every boss waits on its own terminal, ten layers and six mouths of authored dark (v0.811–v0.813 · ADR-0227).
  • a floor may be somebody's home — the denizen axis, and dorrie callow's lamp at the first landing (v0.814–v0.815 · ADR-0228).
  • and the instruments stopped lying: the fences that guard all of it grew fences of their own (v0.815.1).
thirty-eight landings · v0.740 → v0.792 — seven days in august
  • the cove learned to talk back. every soul now deals you a small hand of questions, an opener that knows whether you have met, and a follow-up chip built from the sentence they just said to you, so a conversation goes somewhere instead of ending (v0.762–v0.777 · ADR-0213/0214/0218/0219).
  • combat learned to breathe. the server keeps one clock now: turns land at a paced beat, the fight opens on its own stinger before the model says a word, and the round summary — switched off entirely in party fights — now closes every round, with the dice still on screen (v0.749–v0.779 · ADR-0210/0211).
  • the town found its tongue. the ferry casting off, a carrier coming up off the causeway, your own story overheard in someone else's mouth across the room — all of it derived from movement and gossip that were already happening, adding not one row to the log (v0.780).
  • the dungeon got hand-sized. floors re-cut for a thumb on an iPad — a 39-step traverse down to 24 — denser encounters to match, and foes that pick their target from everyone still standing instead of always the human (v0.768–v0.769 · ADR-0215/0216).
  • then we stopped adding and got it ready to be played. a week of audits found — and fixed — a claim door that checked your password but never counted the guesses, text on a stock iPad rendering at 1.31:1 contrast against a 4.5:1 floor, a reconnect that showed you a town screen while your fight was still running, and one curious look that could quietly wall three quests forever. the database now reads 98% fewer rows to answer a repeat of the same question, and the frame it answers with is byte-identical to the one before (v0.781–v0.792 · ADR-0220/0222).
the summer ledger · v0.653 → v0.739 — the season in five strokes
  • companions became party members in full. AI guildmates and pets follow you room to room, take visible combat turns on their own dice, and speak when it's earned (v0.678–v0.737).
  • the world learned mail. sealed, defanged, capped letters between real players' characters — server-side end to end, crew-only, and on their own near-instant lane rather than the npc carrier's slow roads; the compose screen is still owed (v0.701 · ADR-0202).
  • every item wears its own art and knows its worth. per-drop painting, a 162-item rarity economy, and a wall of firsts every world keeps — each entry tracing to the event that earned it (v0.717–v0.735 · ADR-0205/0206).
  • the game grew a touch language. selection chips, tap-to-play verbs, honest movement — the iPad half of the household plays full-handed, and everything still types (v0.736–v0.739 · ADR-0207).
  • two humans, one world, proven live. a desktop and an iPad in one party at one table, AI companions rolling beside both (31 jul 2026).
M0–M1 · the foundation + the first minute — shipped
  • event-sourced engine, rebuildable projections, two-plane memory, YAML worlds.
  • canon-locked dialogue, quests, movement, progression, worldgen oracle.
  • the gate that shipped it: a stranger reaches a living world in under 60 seconds.
M2 · the vertical slice — largely complete
  • combat with an effect-VM, visible dice, multi-foe fights, boss phases (ADR-0024/0025).
  • walked dungeons with fog-of-war (ADR-0030); loot, equipment, economy — and now every item wears its own art and knows its worth (ADR-0047/0205/0206).
  • death that means something: the foe that fells you remembers it (ADR-0040).
  • trust-gated reveals (ADR-0022), faction standing (ADR-0046), scene galleries.
  • open: full moderation pass, dream consolidation.
M3 · the living world — mostly live
  • a wall-clock world driver — days, phases, seasons (ADR-0011/0012/0014).
  • NPC letters that spend real days on roads (ADR-0072/0073); crew mail between players on its own near-instant lane, read-only in the client so far (ADR-0202); news that walks (ADR-0071).
  • an NPC relations web, ambient region chatter (the engine calls these "barks" — not the dog kind), and fights the whole town hears about (ADR-0104/0121/0125).
  • AI guildmates with souls and voices of their own — fighting beside you as themselves, on their own visible dice (ADR-0116/0126 · v0.737).
  • open: the director brain, guilds.
M4 · multiplayer + the tools — well underway
  • parties, /join, shared brawls — two humans in one coherent world, proven across devices at one table (ADR-0091/0103/0109 · 31 jul 2026).
  • the keeper's console (operator surface) and the campaign editor's CLI kit, pulled forward from the roadmap because building worlds should not require the repo (ADR-0114/0119).
  • the beta gate: invite codes, an account join flow, and packaged deploy — the machinery that turns a hello into a seat.
  • open: many-worlds-at-scale, moderation hardening.
and the household arc — the reason the front page exists
  • photo pets, the voice-and-mask system, the tonguelet tonic (ADR-0132/0138).
  • the vision seam: moderate → describe → defang → mint (ADR-0131).
  • photo foes with band-honest stats; render tiers; the ambient sketch limner (ADR-0139/0140).