Devlog

// what actually happened

A running log of what got built here, what broke, and what it cost to find out. No code, no commit hashes. Just the progress, the decisions, and the things that turned out to be wrong.

Newest first.

18 September 2026

Telling Google about the site, and a fix that was itself the bug

The site went into Google Search Console with a sitemap listing every page. Submitting it is the easy part. The useful part was auditing what a search engine would actually make of those pages first, which turned up three separate problems.

Almost every page was missing the tag that says "this page is the original". Without it, the same page reached by two slightly different addresses can be read as two pages with identical content, which splits whatever credit either one earns. Sixteen page descriptions ran long enough to be cut off mid-sentence in search results. Two pages shared a single title.

Then the part worth writing down. Three pages already had that tag, and all three pointed somewhere else rather than at themselves. That looked exactly like a bug, so it was "fixed" to point each page at itself.

It was not a bug. Those three pages are not pages. They are stubs left behind when something moved, whose entire job is to bounce a visitor to the new address, and pointing at the destination is precisely what a stub should do. The fix broke three things that were right, and worse, it told Google to go ahead and index three nearly empty pages that each carried an ad tag. Empty pages carrying ads is the exact thing an ad network's reviewer is looking for.

The real answer was that none of them should have existed. A redirect belongs in the server configuration, where the server answers "moved permanently" and nobody ever loads a page at all. All three are now configured that way and the stub files are archived. The tool that builds the sitemap now refuses to list a stub, so one coming back cannot quietly reintroduce the problem.

One trap on the way out. The folder behind one of those old addresses still holds thirty images, including the preview picture that every page on the site uses when shared. A redirect rule one character broader would have redirected the images too and silently broken every link preview on the site.

The lesson: before correcting something that looks wrong, find out what it is for. An inconsistency is not automatically a defect, and a confident fix applied to something that was already correct is more expensive than the inconsistency, because now nobody is looking at it any more.
17 September 2026

The arcade launched, got renamed, and grew a leaderboard. All in one day.

Three games went live at once, which was the plan. The rest of the day was not the plan.

Within an hour of launch the controls in one game turned out to be backwards. Pressing left moved right. The cause was not the input code, which read perfectly correctly: the chase camera looks down the positive Z axis, and a camera aimed that way is rotated a half turn, which mirrors left and right on screen. The fix was to write the lane positions in screen order instead of world order, which looks wrong written down and is right on screen.

Then the fix appeared not to work. It had worked. The site was serving an hour-old cached copy, because a new section of a site needs its own caching rules and nobody had written them. The symptom of that mistake is indistinguishable from a broken fix, which is what makes it expensive.

Mid-afternoon the character got renamed from Nox to Voro. The name collided with a very large Android emulator brand, which is a search problem you pay for forever. That rename went through the character, the brand, the game titles, the 3D model files, the browser storage keys and the web address. The models had to be rebuilt rather than renamed, because material names live inside the model file, and a mismatch there does not throw an error, it just quietly stops the eyes glowing.

Then the leaderboard. Anonymous accounts, so nobody ever sees a login prompt, and a three letter arcade tag instead of a name. Three letters was not nostalgia: it is the only length at which a blocklist is worth anything, because the offensive set is short enough to actually write down. Free text on a public board on a site teenagers use is a different problem entirely.

A review pass a few hours later found four real faults in that leaderboard. The worst was that the database library will cheerfully show you a score that never left the browser. Reading it back looked fine. Asking the server directly returned nothing at all.

The lesson: check the server, not the client. A local cache that optimistically shows you what you just wrote is a feature until it is the thing you are using to verify that the write happened.
16 September 2026

A kart that reads as a vehicle, and scoring that rewards the actual verb

The first kart was a box with cylinders attached. At about forty pixels tall on screen, surface detail is invisible and only mass and silhouette survive, so it read as a slab rather than a vehicle. Two rules came out of rebuilding it: the wheels have to sit outside the body, and there has to be one dominant volume. A pile of separate shapes reads as scattered parts no matter how carefully each one is made.

The scoring took longer. The first idea paid out for hugging the edge of the track. Measuring how close the car actually got showed careful driving never came near the threshold and reckless driving only reached two thirds of it. The bonus had never once fired. It was replaced with something that pays for sliding, which is the thing the single button actually does.

The lesson: tune from measurement, not from taste. A mechanic that sounds good and never triggers is worse than no mechanic, because it looks like it is working.
14 September 2026

The mascot stopped being a box

The character started as a placeholder cube and went through six design variants before settling. Every one of the first six had the same flaw for the same reason: the glowing visor was a panel placed on the front of the body, and a panel on a surface always reads as a part bolted on. The fix was to cut an actual recess into the shape and sit the visor inside it.

He is generated by a script rather than sculpted by hand, so changing a proportion means changing a number and running it again. That also means the source of truth is the script, not the model file, which is a habit worth keeping.

The lesson: when six attempts fail the same way, the problem is the approach, not the execution.
13 September 2026

A weather map, and 53 MB of clutter leaving the website

The weather map shipped: radar, satellite, models and official warnings on one screen, free, with no account. Every data source was checked for whether a browser is even allowed to fetch it before it went in the plan, which sounds obvious and is the step people skip.

Two things it refuses to do. It never presents a computer model as a forecast of record, because the official text always gets the last word. And it never prints a timestamp it cannot defend: one radar provider labels frames slightly into the future, so the map shows when the image was published and how old it is right now, rather than a number that looks authoritative and is not.

Same day, the website itself went on a diet. Development history, old drafts and superseded versions had accumulated inside the folder that actually gets uploaded. 53 MB of it moved one level up, out of the published folder but not deleted.

The lesson: nothing here ever gets deleted, it gets archived. Every cleanup on this site has been a move, never a removal, and that rule has already saved work more than once.
9 to 11 September 2026

Six islands rebuilt from paintings

A long-running 3D world got its outer islands rebuilt, one at a time, each one from a concept painting approved before any geometry existed. Building to an approved image rather than to a description removed almost all of the back and forth.

One instruction turned out to be too literal. "Nothing the painting does not show" emptied all six islands, because a painting shows a composition, not an inventory. They had to be re-dressed afterwards. The painting sets the mood and the materials; something else has to decide how much stuff is in the world.

The lesson: a reference tells you what it should feel like. It does not tell you how full it should be.
4 September 2026

Everything went under version control

Five separate projects got proper history, with the large binary files deliberately left out. Multi-gigabyte 3D working files do not belong in version control, but they do need a backup, so they get a different one.

The reason matters more than the mechanics. Working quickly with an AI pair means a lot of changes land fast, and the safety net is not trusting the output. It is being able to see exactly what changed and put it back if it was wrong.

The lesson: speed is only safe when reversing is cheap.

More entries as things happen. The oldest work on this site predates this log by years.