Engine Log
Progress on the racer and the room around it, then a city of rooms, live boards and a set of looks that belong together, then games on the city's floor, fifty-two looks, new voices for the sound engine and a coding game under the basement. Screenshots from headless Chrome on the development desktop. Newest first.
Kobolds in the boiler room
Under the basement, Kobold is a coding game after EXAPUNKS. Up to four people sit at terminals round a sunken machine floor and write kobolds, programs in a small assembly language. Kobolds walk a network of hosts, carry files, read and write ports and pass values over a one-value bus. The machine (protocol::kobold) is integer only, so a run is the same on the server and in every browser from its job, its case and the programs. The room sends only those, and every client draws the run itself: hosts as plinths, links as beams with pulses, kobolds as small horned imps hopping along a link between cycles. The network is painted every frame into the same dynamic fills Commando uses; one game a room uses them.

The same machine runs four games. Heists check a solution over 100 cases off the room task (spawn_blocking). Duels play two games with the homes swapped, so neither program gains from where it starts. Relay shifts are their line, seed and swaps, played half a second behind the room and replayed from the start when a swap comes late. Light shows drive a rig of 32 lamps that light the room through the same light list as Commando's blasts, beating to the disco's tempo, which the deck now shares on the directory.

#RAND.A battlefield on a sand table
The basement holds Commando on a table sunk into the floor. Its level scrolls, so it cannot live in the static scene: the room's own painter paints it every frame into a new buffer of dynamic fills, beside the dynamic lines. The ground goes first and stamps the stencil as floor, so the shadows of soldiers, palms and trucks fall on it like on any floor. Soldiers, prisoners and you are the world's avatar instances in uniform. What comes onto the table at the far edge rises out of it, what leaves at the near edge sinks back in. Blasts get a white-hot core, a fireball, shock rings, debris, smoke and a scorch with embers, light the room through the avatar light list and shake the camera. While nobody plays, the table plays itself.
The game is lockstep: one input byte a world tick, stepped by the runner's browser, every onlooker's and the room, which so keeps the score without taking anyone's word for it (protocol::commando, only + − × ÷, sqrt, min, max, abs).
A SID, and a drum machine in the engine
Two sources are code rather than .snd files now. A SID after the C64's chip (three voices with pulse width, ring modulation and LFSR noise, its ADSR and rate table, a resonant 12 dB filter, a 50 Hz player) plays Commando's march and every effect, the effects taking voice 3. The disco's machine synthesises the drums (a swept kick with a click, a two-mode snare, six-oscillator hats), a 303 bass through a saturating ladder at twice the rate, and the DJ's mixer with an 80s chain: ADAA saturation, a Juno-style chorus, a ping-pong delay that always listens, an eight-line FDN reverb, a limiter.
| The machine, native, every effect on | Result |
|---|---|
| Whole mix, faster than real time | about 56× |
| Bass at 1.5 kHz wide open: aliasing against harmonics | under −45 dB |
| An effect switched on or off: heard within | 40 ms (the delay took 375 ms before it always listened) |
| Peak after the limiter, eight bars through the chain | 0.90, nothing clipped |
Photo mode at its best, and the whole world
While the photo camera moves it draws a light picture (0.6 resolution, no traced light, shafts, MSAA or mirror); held still for 0.3 s it draws everything at its best, past the Quality setting and the Auto governor. A capture waits for the traced light to settle. A tick box fetches every room on the world map once and draws each whole at its world position and height, through the same neighbour path that draws the walls along a seam.
Fifty-two looks, and lines with weight
Ten looks that set every graphics property and thirty traditional ones (times of day, film stocks, materials, clean wireframes) join the twelve; U steps through them all. Lines can carry three widths, detail, edges and silhouettes, decided in the shader from the two faces each edge joins. The Fine edge theme draws dark pen lines in those three widths with hidden lines hidden, and two face themes lay stone courses and brushed metal panels in each face's own plane. The beam pass had clamped every theme to the old ten, which silenced Fine; that is fixed (GLITCHES G17).
| Part | Themes now |
|---|---|
| Vertices | None, Glow, Ink blob, Ring, Square, Cross, Diamond, Sparkle, Pencil knot, Pulse |
| Edges | Neon, Ink, Pencil, Sketch, Blueprint, Chalk, Marker, Dashed, Electric, Off, Fine |
| Faces | Look, Paper, Phong, Hatching, Mosaic, Jitter, Halftone, Toon, X-ray, Void, Stone, Metal |
A tree of words
The lexicon is an 80-tile hall. Every word said there that GloVe knows walks as a Brownian bridge from the middle of the floor to where the room's own principal axes put it, white at the trunk and coloured by the fourth axis at the end; words said one after another are joined by dotted lines. The server refits the axes as words arrive and keeps their signs, so the tree shifts rather than flips, and every client applies the same fold.
Games on the city's floor
- Light cycles on the grid, breakout on the court (one player, or two taking turns), Spindizzy's marble on a floating level, Bomberman for one to four with walking predicted on your screen, football in the stadium, a half pipe in the skate park and Paradroid's transfer on Deck 1: each one's rules shared code in
protocol. - Arcade cabinets play a vector Scramble on a 2D canvas with phosphor fade.
- The skyscraper: a landmark every room sees, a plaza at its foot, a glass lift corkscrewing up to the sky bar and the roof, a paternoster.
- The disco: a DJ booth as hardware, eight drum patterns, an acid bass, lights and lava lamps on the beat, a bar.
- Only the room you are in is drawn now: rooms next door are blacked out but for the walls, doors and windows along the seam, so the light volume no longer reaches into them (it did on 2 Oct, below).
- Boss mode, eight sceneries besides the city, Auto quality that steps down while frames stay slow, run mode (Shift+click or a double click).
Known costs, 6 Oct
- The battlefield's fills and lines are rebuilt and uploaded every frame while a run or the demo shows.
- The lexicon redraws its whole tree while words walk or the fold glides; past a few thousand words that is many lines a frame.
- Photo mode's whole world tessellates every room on the map in one rebuild.
One lit world
Rooms next door used to be drawn unlit: walk up to a seam and the light changed under your feet. Now the light volume is baked over your room and 16 tiles of each neighbour as one plan, so their lamps, shadows and neon reach across. The bake grows with the neighbours but stays off the frame.

| Light bake, native | Time |
|---|---|
| 24×24 room, 240 objects, alone | 1.39 ms |
| The same with a dense neighbour on every side | 6.7 ms |
On joining or when a neighbour changes; an edit in your own room still rebakes only the cells around it.
Looks that belong together
Every look in the menu is now a complete preset: the six shader looks became profile files, and choosing any look sets every display setting, so nothing lingers from the last one. A Quality setting (Low, Medium, High; Auto picks by backend) caps what a look may switch on; the raw switches moved under Fine-tune. Six new looks ship beside the shader ones.






Geometry with more to it
Floors can be raised or sunken in parts; a step of up to half a tile is walked, a taller edge is not, and balls bounce off it. Diagonal walls, striped awnings and cables strung overhead with lanterns and little signs give rooms something above eye level.



A city of rooms
Central sits east of the street with a gate to every room. The rest came from pictures through the room-from-image skill, each with a style of its own (prairie, market, lab).



A lava lamp, and charts on glass
The mezzanine has a lava lamp nearly as tall as its ceiling: a chrome base and cap, a glass that swells low and tapers up, and ten blobs of wax rising and sinking at their own pace, moved on the GPU (anim::LAVA), lighting the room around it. The CPU and memory charts moved off their panels onto panes of glass: woven from faint lines of light so they are see-through in every look, a pink rim breathing, the curves hanging in front of the glass with their echo on it and drop lines between, the labels turned toward the camera.


Live boards
A billboard whose text is a keyword draws live data: #latency the round trips between players, measured client to client; #server the server's CPU and memory; #clients every player's; #departures who is in which room.


Known costs
- Latency checkpoints run in every room, whether anyone looks or not, and spend the players' command budget: gate them on the panel or a #latency board.
- Text mode runs the composite five times per pixel and the streak takes 20 bloom taps per pixel: both want a pre-pass at low resolution.
- Board lines re-upload every second whether they changed or not.
The race over WebRTC
Race traffic now runs on an unordered, no-retransmit WebRTC data channel, and the room traffic on a reliable one. A lost packet no longer holds back the snapshots behind it. The status line (top right) shows the transport.
What moved, measured
From the F3 overlay and the server's race log, localhost, a 50 Hz display, WebGPU unless noted.
| Measure | Before | After | What did it |
|---|---|---|---|
| Input → server ack | 89 ms; 28–73 elsewhere | 20–38 ms | Snapshots every tick, queue trimming, redundant inputs, TCP_NODELAY, WebRTC |
| Key → GPU done, vsync | 20–28 ms | 12–16 ms | At most 2 frames in flight |
| Key → GPU done, GPU-bound 4K | 940 ms | ≈ 30 ms | Same cap: frames no longer pile up in the GPU queue |
| Game allocations per frame | 4 + 3 per snapshot | 0 | Reused HUD buffers, in-place snapshot decoding |
| Server race tick | 10 µs | 10 µs, allocation-free | Pre-sized buffers; asserted by a test |
| Snapshot send, per tick | one encode per racer | one encode, 5 µs | Ack moved last and appended per racer |
| Wasm bundle | 3.47 MB (size-optimized) | 3.11 MB (opt-level 3) | Fat LTO, panic=abort, SIMD128 |
| Allocations inside wgpu | 27 WebGPU, 307 WebGL2 | unchanged | Out of reach without fewer passes |
Timers: the server now advertises cross-origin isolation, so performance.now() resolves 5 µs instead of 100 µs.
Thin lines
Beams thinner than a pixel had a glowing core about 0.4 px wide, which fell between pixel centres and broke into beads. Now no core is drawn narrower than 0.75 px; a line meant to be thinner is drawn that wide and dimmed by the ratio, so it keeps its light. Crops at 2× from the lobby view:
Vertices, edges, faces
Each is styled on its own, ten themes apiece, chosen in the ⚙ menu or through a preset. Edge themes also decide what happens to hidden lines (faint for pencil, dashed for blueprint, crackling for electric), and the X-ray face is a screen door that lets what is behind show through.
| Part | Themes |
|---|---|
| Vertices | None, Glow, Ink blob, Ring, Square, Cross, Diamond, Sparkle, Pencil knot, Pulse |
| Edges | Neon, Ink, Pencil, Sketch, Blueprint, Chalk, Marker, Dashed, Electric, Off |
| Faces | Look, Paper, Phong (dithered), Hatching, Mosaic, Jitter, Halftone, Toon, X-ray, Void |










| Preset | GPU ms at 2400×1800 | Beams |
|---|---|---|
| Neon | 3.07 | 0.50 |
| Glow wire | 3.25 | 0.73 |
| Pencil | 3.40 | 0.99 |
| X-ray | 3.77 | 1.21 |
Face themes cost no measurable time; vertex dots and hidden lines are extra draws, built and run only when a theme asks for them.
Light
Every lamp and glowing thing (signs, screens, holograms, arcades, candles, the bar) now fills a 3D light volume over the room, shadowed by walls. Surfaces are lit by which way they face, colour spills from signs onto walls and floors, and people pick up the light of what they walk past. The tone mapping keeps neon pink as it saturates. Light shafts in the haze are a setting.




| At 2400×1800, 4× MSAA | GPU ms |
|---|---|
| Lounge, flat tile light (before) | 3.07 |
| Lounge, light volume | 3.17 |
| Diorama, light volume (32-light loop gone) | 3.32 |
| Lounge + light shafts | 4.09 |
Traced light
On WebGPU, the Lighting setting adds a compute pass that traces rays through a voxel copy of the room. Neon lights the walls beside it, light bounces off lit surfaces, corners and the floor around people darken, floors and glowing furniture get highlights, and on Ultra the floor reflects the neon. WebGL2 keeps the baked lighting.



Graphic and Comic
Two looks drawn from reference images instead of lit: colour blocks, a triangulated wire across every face, mosaic patches and scribbles in a black void (Graphic), or a blue comic palette with ink hatching under a navy sky (Comic).


Next
- On a real laptop GPU: read F3 at 1080p and 1440p in both WebGPU and WebGL2, with Quality on Auto.
- Open UDP 8080 in the Windows firewall so other machines get the WebRTC channels.
- Blend palettes across seams; tune Off-World for indoor rooms.