Runs anything. Knows who’s in the room. Makes you a game.
A Mac Mini sits behind the television and the television stops being a
menu. Join the wifi, scan the code on the wall, and your phone is
already a controller, a buzzer, a private card only you can see.
The wall. Whatever is on, plus a door. The code is always in the
same place, at the same size, in every state — a guest who has to
be told how to join is a defect, not a feature.
Your hand. Scan it and you are in — no app, no account,
nothing left behind when you go home. The phone renders whatever
control scheme the thing on the wall asked for.
What it does
SEATS 00
Stop building a store. Build a place.
Four of the five things below are running on a television tonight.
The fifth is not, and this page says so where it gets to it.
01 The seat
Every phone is a private screen
Join the wifi, scan the code, and you have a seat. No app, no
signup, nothing left on your phone when you go home. Thirty-two
seats, each one its own web origin, each one showing something
different at the same instant. A shared wall plus N private
screens is a shape no console can make.
MAX_SEATS = 32 in packages/protocol. Four seats held on four different pictures at once with zero cross-seat press leak — fifty checks, all pass.
Running today
02 The night
Three party games, shipped
Traitor at Dinner: everyone is told what is on the plate, one of
you wasn’t. Night · Secret: dinner is safe,
one phone was told otherwise. Punchline: the wall gives the setup,
your phone holds the joke, the room votes. Nobody is eliminated.
Nothing goes negative. Last place still plays every round.
14,063 lines across three games, each with a manifest declaring its own capability grants, each installing through the same loader as anything else.
Running today
03 The house
The room is the speaker
Not smart-home control as a tile on a grid. A reveal drops the wash
to red across four light buses in forty milliseconds, buzzes the
phone that needs to feel it, and stings the room. All of it
precomputed. None of it decided in the moment.
21 named cues in the catalogue, addressed by gesture — wash_warm, hold_still, flash_hard, tick, punch, bed — never by what happens in a game.
Running today
04 The room
It knows who is here
Presence is participation, not association. A phone left on the
kitchen counter is nearby, and does not make the room seven years
old. Walk out mid-game and your seat is held, never renumbered —
because reshuffling seats is how a hidden-role game quietly tells
everyone who the traitor is.
Four presence values on the wire: playing, here, nearby, gone. The youngest person actually in the room sets the room’s rating.
Running today
05 The one that isn’t here yet
Ask for a game, get a game
Not shipping yet
Five gates, cheapest first: schema, compile, loader, capability ceiling, then probes that play the game through. There is no force flag, and no path that hands back an installable package alongside a list of failures.
Say what you want and something playable comes back: a
four-minute joke built for the six people here tonight, about
something that happened at dinner. Played twice, never again,
perfect. Most of them should be thrown away. That is not
failure, it is the format.
It’s wild we’re almost at the point where, instead of
buying a game on a console store and waiting for it to download,
you just describe a game and wait for it to generate.
Ryan Campbell
Traitor at DinnerEveryone will be told what is on the plate. One of you will not.
Night · SecretPhones in. The table is about to be set.
PunchlineThe TV gives the setup. Your phone holds the joke.
Where it lives
SEATS 00
Live · ten minutes leftA television first. This is the video surface the box owns end to end, which is the only place the room’s own light can sit over moving pictures.
The largest object in the room, doing nothing.
Every TV box shipped in the last fifteen years is a vending machine:
a grid of rectangles that launches other companies’ apps. It
knows nothing about you, nothing about the room, and it can only ever
retrieve — never make. Most of its life it is a dead black mirror
hanging on your wall.
So the answer is not a better store. The screen is never off; it is a
hearth. Real weather outside becomes weather inside it. Dusk falls
when dusk falls. It stirs when someone comes home, and it goes quiet
at midnight.
You do not open it. You walk past it, and it is already on.
06:48 · Parksville, BC · 12.8° and sunnyThe weather on the wall is the weather outside the window. The clock is the room’s clock. Nothing here was retrieved from a store.
The shape
SEATS 00
One wall. Thirty-two screens.
The television holds what everyone can see. Every phone in the room
holds something only that person can. They are separate origins on
the same wifi, so nothing on one phone can reach another, and the
house lights are wired to both.
Press the button. The cue below is the one the room fires when
something is revealed, at the speed it actually fires.
The wall3840 × 2160 · 32 seats joined
Six of thirty-two phones, at the same instant
Ryan · pad‑01
Decaf, but make it a secret.
writing
Nicole · pad‑02
writing
Alex · pad‑03
Sent. Waiting on four.
answered
Sam · pad‑04
It knows. It always knew.
writing
Jules · pad‑05
Sent. Waiting on four.
answered
Mo · pad‑06
You’re in the room. Nothing to do yet.
here
flash_red · 1 of 21 cues
Cues are addressed by gesture, not by event. The catalogue knows
what a reveal looks like; it has never been told there is a game on.
000 msCue fired. Expansion is local: light, haptics, audio and a glass event, with nothing on the path waiting on a network call.
040 msWash to #c62828 at 0.95. Front bus ramped.
060 msSide buses follow. Every phone that needed to feel it has buzzed.
144 msThe sting is audible in the room. Measured at 48 kHz through a microphone on the sofa, p50 and worst of seven fires.
bus 01 · wash40 ms
bus 02 · front40 ms
bus 03 · side60 ms
bus 04 · side60 ms
The room’s palette is not a mood board. It is the light packet, read back out of the cue catalogue.
#ffb060pulse_amber_left
#ffcc80wash_warm
#546e7awash_cool
#607d8bpulse inward
#c62828flash_red
On the wall
SEATS 00
12:34, the room fillsThirty-two initials in the corner. The join code has not moved a pixel.
Said out loud9.92 s from the end of the sentence to the picture on the panel.
Answers landingWhatever a guest types is rendered as text, always.
Between thingsTime, title, what is left. Nothing else asking to be clicked.
The build
SEATS 00
Measured, then written down.
Every number on this page came off an instrument, not an estimate.
The ones below are the ones that decide whether the room feels
alive or feels like software: how long a cue takes to reach your
ears, how long a sentence takes to reach the panel, and how much
of the surface is deny-by-default.
Status · honest
The last full gate is recorded as a fail: 53 things
measured and right, 4 measured and wrong, 18 not measured at all,
with multi-guest join and occupancy drain both falling over under
churn. Three games, the seat protocol, the light cues and the
presence model are running. The rest is mid-flight. That is why
the label at the top of this page says in development.
Flinch
144 ms
Cue fire to audible onset. p50 and worst across seven serial fires on the production path, at 48 kHz through a real microphone — comfortably inside the project’s own 400 ms flinch law.
Expansion
< 50 ms
A named cue expands into light, haptics, audio and a glass event with no model anywhere in the path, so a reveal never waits on a network call.
Tool surface
49 tools / 20 capabilities
The capability table is deny-by-default: a tool absent from it is refused to everyone, and the daemon’s catalogue throws at import if the two sets ever disagree.
Voice
9.92 s
End of “put the Jays on” to the streaming app live on the panel, hands-free. The mechanical half of that path — request to app frontmost — is 0.39–0.49 s. The rest is thinking time.
Own surface
83 ms to arm
HLS on the video surface the box controls end to end, measured on public test media — the only place the room’s own lights and composition can sit over live moving pictures.
Panel
3840 × 2160 at DPR 2
An UltraFine framebuffer behind a 1920 × 1080 CSS viewport, verified with a nonce marker in frame so a capture cannot quietly be of the wrong window.
Front door
Decoded at 32 people
The join code was captured and re-decoded at 0, 1, 3, 6, 12 and 32 occupants, and again at quarter scale to simulate a phone camera from across the room. The door may never be lost behind a crowd.
Vocabulary
16 named constants
A generated game is closed-schema JSON, not JavaScript, compiled by hand-debugged code. “Too floaty” edits one typed, range-checked number instead of regenerating anything.
Source
226,968 lines / 474 files
Hand-written TypeScript and ES modules across 13 packages and 3 games, excluding vendored three.js, postprocessing and hls.js.
Instruments
158 probes
Out of 204 tool scripts and 127 harnesses on disk. Every probe injects a known fault and has to go red on it — a self-test that did not execute is reported blocked, never green.
3Party games shipped
13Packages
49Tools on the surface
32Seats in a room
21Light cues
158Probes that must go red
Not finished. Running.
The screen is never off.
Homie is not a download and there is nothing to open yet. The four games
it will eventually hold are already playable in a browser tab.