devlog
Devlog
Notes on building. For one-line “what shipped” entries see /changelog; for “what's next” see /roadmap. Both are short. The pieces below are the longer “why.”
2026-11-06
Three bugs a real browser found before you did
Everything from the last week went to the live site today. Running the real build in a real browser first caught three bugs that every automated check had passed.
read on →2026-11-06
A plan, and the first step is people
The game now has a written plan. Everything from the last week is going to the live site, and the first build step is moving residents to the places you can reach.
read on →2026-11-05
A second eye at six metres, and what comes next
The visibility table that left blank patches now knows about camera height, so skipping hidden splats is back, checked at one spot so far. Also, a game mechanism is now being built.
read on →2026-10-31
A sharper frame beats a faster one
Two things I shipped to the preview on 30 October made the numbers look better and the places look worse, so both came back off the next day.
read on →2026-10-31
The benchmark that never started
The first version sat at 0% forever. The reason was one wrong event name, and the fixes after it made the score more honest.
read on →2026-10-31
The shadow follows the sun in the photograph
In the two captures with a measurable sun, the runtime light now points where the capture’s sun was, and the splats take its shadow. Then why it is off again for now, and a frame-rate win I also had to switch back off.
read on →2026-10-30
Thank you, and what the surge broke
A site that saw a few hundred visits a day had 250k+ page views in October. Thank you. Here is what that taught me, mostly through things breaking.
read on →2026-10-30
Neon blue, and one typeface
The site moved off amber onto neon blue with a blue-black ground, and three typefaces became one. The logo stayed amber.
read on →2026-10-30
Ludlow stood on its head
Making streaming the default turned one town upside down. The file was fine, and the two versions of that town disagreed about which way was up.
read on →2026-10-25
What the analytics were spending
The analytics allowance ran out during the surge. Most of it had gone on noise, so the next build sends a sample and each repeat once.
read on →2026-10-25
Where people actually sign up
During the surge, the form on the home page got 4 signups and the identical form on the browser-not-supported screen got 1,457.
read on →2026-10-20
A market demo with no server behind it
The market demo kept going down, so it became static pages. That also showed how expensive a single careless query had been.
read on →2026-10-20
Leave within fifteen seconds and it crashes
A streamed town outlived the page that owned it. About 1,100 sessions hit it in two days.
read on →2026-10-20
A daily limit spent on JavaScript files
A small piece of code that should have run on pages was running on every file. In the surge that used up a limit the whole account shares, and took the market demo down.
read on →2026-10-16
The word ads in a hostname
The ad manager demo moved to admanager.wascape.com, because ad blockers kill every script on any ads. address. Then the ads on the wall stopped jiggling.
read on →2026-10-16
A town that never settles
One failing file could hold the loading screen up forever, and the message on screen blamed the wrong thing. Three bugs, one card.
read on →2026-10-15
A market you can click through
market.wascape.com went up as a working demo of what a marketplace for places could feel like. Play money, made-up traders.
read on →2026-10-15
The sky that read as dots
A rule that fixed one problem caused another. The sky was being cut down into dots, and on top of that it was being drawn in the wrong order.
read on →2026-10-10
The first piece of capture repair: dropping the Gaussians that cannot be geometry
The changelog said the real fix was upstream in the capture step, and that nothing in that step looked at splat size. Now something does. It also caught a rule I had invented, within one run.
read on →2026-10-10
A level-of-detail rule that measures better than the shipped one, and has never drawn in a browser
Someone sent me a splat demo that loads more smoothly than mine. Taking its manifest apart turned out to be a long way round to finding out what is wrong with my own.
read on →2026-10-09
Four places a learned model goes in a splat pipeline, and one it does not
Nothing here uses a model yet. Writing down where one would go, strand by strand, with the numbers each would have to beat and the part of the stack I would keep deterministic.
read on →2026-10-08
A phone was downloading 1.9 MB of a page it is never shown, and the bytes were the smaller problem
The landing ships two front pages and CSS shows one. The hidden one was still fetching its photographs, all at once, in front of the ones the visible one was waiting for.
read on →2026-10-08
Honoring reduced motion by freezing a carousel was the less accessible choice
The phone front page held still under prefers-reduced-motion. That was defensible right up until the arrows came off it, and then it quietly was not.
read on →2026-10-05
Splitting trajectory from deformation: one captured fall against every impact
The method behind the captured-motion work. Let the simulation own where the object goes and let the capture own how the surface behaves while it goes there.
read on →2026-10-05
Band 0: what these captures record about light, and what they cannot
Four of the published captures carry no spherical harmonics past the DC term. That sets a ceiling no renderer work can lift.
read on →2026-10-05
Streaming a place that changes: sort order, node visibility, and the cost of a second of motion
Occlusion over frustum is worth 70 to 94 per cent of the splats drawn. Adding time to the scene makes sort, storage and residency all harder.
read on →2026-10-05
A post-animation stack that integrated itself: two writers on one bone
The body folded into itself for the first seconds of a walk. Every layer involved was correct on its own.
read on →2026-10-04
The jump that froze the walk: one word, three layers of cover
A recovery path that had never executed, in any browser, since the day it shipped — and the three things that each independently hid it.
read on →2026-10-03
Sun estimation across ten captures: eight are overcast
A directional-sun search over the arena set returns a usable sun in one place, a hazy one in another, and nothing in the other eight.
read on →2026-10-03
SHLS own-stack benchmarks: decode, runtime, renderer
The measurements behind replacing the format, the streaming runtime and the splat renderer: PSNR, frame times on two GPUs, and the scenario that loses.
read on →2026-10-03
4DGS playback against rigid-body physics: one clip, many trajectories
Replacing authored animation with 4D Gaussian splatting, and the trajectory problem that falls out of it.
read on →2026-10-02
Landing hand-off: a 367 ms worst frame inside a 98 px crossfade
A lag at the end of the front page turned out to be one fact wearing three costumes.
read on →2026-10-01
A second splat scene inside a captured town: sort order and collision
Putting a small captured object inside a captured town is harder than capturing either.
read on →2026-10-01
Walk speed: an authored value off by 65 per cent, measured from the clips
Feet skated for months because a number nobody measured was treated as a fact.
read on →2026-09-30
Landing page rebuild, progressive scan draw, and sun and shadow work
The front page stops looking generated, the scan draws while it loads, and the work underneath is sunlight and shadow.
read on →2026-09-27
Muggia added, a car park retired, Reddit threads on the landing page
Muggia arrives on foot, a car park leaves, the Reddit threads get a proper home on the front page, and a word about Wascape Studio.
read on →2026-09-24
Taking the format, the streaming runtime and the renderer in-house
Why the format, the runtime and the renderer all had to become ours.
read on →2026-09-24
Carousel pause-on-interaction reads as broken; four hero frames re-picked
A carousel that stops the moment you touch it sounds considerate and reads as broken. And four hero frames, re-chosen by eye.
read on →2026-09-20
Relighting captured scenes in a browser, aiming past DLSS 5
DLSS 5 teaches a game to look photographed. We are starting from the photograph and teaching it to take new light, in a browser tab.
read on →2026-09-20
Touch controls live: what a phone gets, and the two unfinished parts
The phone work from this month is on the live site. What a phone gets now, and the two parts that are not finished.
read on →2026-09-19
Render scale below native: every preset softened by upscaling
Every picture setting below the highest was soft for a reason that had nothing to do with how much detail it was given.
read on →2026-09-11
Pointer capture leak: controls dead after five to ten minutes
The controls stopped working after five or ten minutes. Not on the first drag, which is exactly why it took so long to find.
read on →2026-09-11
Baked lighting in a capture against light added at runtime
A photographed street comes with real light for free. Everything we add to it arrives with none, and that is the whole problem.
read on →2026-09-10
Sun direction aimed along -Z instead of -Y for months
Months of judging light on a capture, all of it against a sun in the wrong place.
read on →2026-09-04
Look-around yaw sign inverted across four camera modes
Four ways of looking around, all turning the wrong way, all doing the same sum. Two more places are still doing it.
read on →2026-09-04
SEO: the product outranked by near-empty marketing pages
The product was being outranked by pages that only talk about the product. One of them shipped seventeen characters of text.
read on →2026-09-03
Touch controls made visible after the device gate was lifted
Phones stopped being turned away on their name. Then the controls had to become controls, which took being told so plainly.
read on →2026-09-02
Ludlow: the heightfield disabled instead of baking a ground surface
Last week nine places stopped driving on the roofs. The tenth was the one already fixed, and it was the worst of them.
read on →2026-08-31
Music inaudible: one volume bug and two others with the same symptom
Reported as a volume problem. It was a volume problem, and also two other problems wearing the same symptom.
read on →2026-08-30
Drone auto-takeoff: two correct fixes, neither of them executing
A drone that took off by itself, reported twice, fixed twice. Both fixes were correct. Neither one ran.
read on →2026-08-28
Heightfield envelope against ground: the car driving on roof surfaces
One bug that presents as three, found once before and fixed in one place out of nine. Solving the instance instead of the class.
read on →2026-08-27
Splat count on the home page: three corrections, two of them wrong
The home page claimed 99 million. Each correction was wrong in a new way, and only the third one stopped being a guess.
read on →2026-08-24
A capture with one locomotion mode, and declaring it in the registry
One of the five new captures offers a single way through it. Deciding to say that out loud was the harder half.
read on →2026-08-20
Aix softness traced to near-fade, after two wrong diagnoses
Of the four captured towns, one always looked blurrier than the rest. I had a confident explanation, then a better one, and the thing that actually fixed it was neither.
read on →2026-08-15
Device tier caps derived from one May measurement, applied too broadly
A measurement taken honestly in May became a rule about a whole class of computers, and outlived every condition it was taken under.
read on →2026-08-09
Bicycle dynamics: lean and fall rather than car-like stability
The first version was a car with two wheels, and it was bad in a specific way: it was fine.
read on →2026-08-06
HUD map coverage: separating no-data from not-checked
Which sounds like the careful choice, and is the opposite: a reader cannot tell nothing is here from I did not check.
read on →2026-08-03
A flat backstop plane under every arena, and walking on it in mid air
One flat plane under every place, set at the height a car needs. Invisible in a courtyard, and a quarter of a hill town walked in mid air.
read on →2026-07-30
Lourmarin undrivable for two days: a collision mesh of two triangles
Lourmarin went in as the fourth place you could drive, and for two days it was the fourth place you could not.
read on →2026-07-14
Four product framings for a splat driving demo
Somebody asked and I gave them the technical answer, which is a fine reason to start building something and a poor reason for anyone else to care.
read on →2026-06-27
NPC pedestrians in Ludlow Square: behaviour trees and physics walkers
Ludlow Square was convincing for about eight seconds, which is roughly how long it takes to notice that nothing in it is alive.
read on →2026-06-16
Five weeks, 531 commits: 30 FPS photoreal driving in a browser tab
I started on the 9th of May with one claim to prove or kill: a scanned real place, photoreal, drivable at 30 FPS in a browser tab on a laptop with no graphics card. This is the log of getting there.
read on →2026-06-06
Canvas backing store collapsing to a quarter of the tab: one CSS call
An integrated GPU was rendering the whole scene into the top-left quarter of the tab. I spent an hour blaming the GPU. It was one CSS call, and Firefox had been hiding it the whole time.
read on →2026-05-20
HLS for point clouds: why splat streaming looks like video streaming
Captures got too big to ship as one file. The fix wasn't a new compressor. It was borrowing the delivery protocol that already solved this for video.
read on →2026-05-18
Unit test suite: 98 pure-logic checks and the two defects they caught
The test suite is 98 pure-logic checks, about five seconds wall-clock end to end. Most just pin behaviour that's already correct. Two of them found bugs nobody had noticed.
read on →2026-05-18
Reading the 3DGS trainer source before documenting the prune pipeline
I had a recipe for validating a splat-pruning step on my own captures. Building the tool to run it turned up the fact that the recipe named the wrong trainer.
read on →2026-05-16
Splitting a monolithic module: four days of refactor, no features
I spent four days not shipping a single feature, just breaking one giant file into small ones. Best trade I made all month.
read on →2026-05-16
Photoreal-first: the post-process features rejected
The photoreal-first stance is easy to state. It only matters at the points where I said no to something that would have shipped in another engine. Here are the concrete ones.
read on →2026-05-16
Collision feedback: audio and haptics, not only visuals
v3 looked great and felt dead. A crash should reach your ears and your hands, not just your eyes, so feel and sound were the next thing I went after.
read on →2026-05-16
Why Gaussian splats over conventional geometry
Gaussian splats are the moat. Everything else (post-process, audio, mode design) is in service of not getting between the capture and the eye.
read on →2026-05-14
Three workers, one main thread
The streaming pipeline is the engineering proof of concept. Why three workers, and why not one or seven.
read on →