The translation that arrived too early

Day two added a leaderboard page, a unified toolbar, and full Norwegian support. Two of those were deleted within weeks.

Day two ran twelve commits, all straight to main, and by the end the game had a leaderboard page, a unified toolbar, a subtle engine fix, full Norwegian bokmål support, and fuzzy word suggestions. Two of those would be ripped out within weeks. This is the post about a day spent building what was exciting rather than what the game was ready for.

A security patch that broke the build#

The morning went to security alerts, and to learning what a pnpm override actually does. Patching a path traversal advisory in vite meant pinning every resolution of it to the fixed line, since a transitive dependency still resolved to a vulnerable version otherwise. That worked, and it also triggered a full re-resolution of the lockfile, which deduped a build tool to a version that could no longer compile the project for its configured browser targets. The deploy failed.

A leaderboard, a toolbar, and a bug hiding in CSS order#

Midday brought the leaderboard its own page with day-by-day navigation, alongside a route swap that put the daily challenge at the root URL, on the reasoning that the daily is the product and the address should say so. The afternoon replaced the per-page navigation with a single fixed toolbar and taught it to catch mode switches mid-animation. One mobile bug from that batch says something about how CSS actually fails: the menu button was hidden by a base rule that a media query was supposed to override, and in the production bundle the ordering flipped, so the menu never appeared on phones at all. The fix went mobile-first, visible by default and hidden at desktop widths, an arrangement that does not depend on rule order to begin with.

The quiet fix that mattered more than the loud ones#

The most consequential change of the day was also the smallest. Apples were spawning in a pattern players could see, same row, opposite side, game after game, because the random generator’s state was frozen at game start: every replacement apple re-created the generator from the same seed and drew the identical value. The fix threads the generator’s state through each word submission instead of resetting it. At the time this read as a cosmetic fix for a visible pattern. It later became load-bearing, because the daily challenge depends on the server and the client running the identical random sequence to agree on where fruit lands, and that only holds if the state advances the same way through every call.

Norwegian, in one evening#

Then came Norwegian: a language config module as the single source of truth for direction letters, keyboard layout and valid characters per language, direction keys o, n, v and h, keyboard rows with å, æ and ø, a language dimension threaded through the database schema, a dictionary of Norwegian words, and roughly 80 UI strings translated across the app. As engineering it was a respectable evening.

As product it answered a question nobody had asked.

The game was one day old, its English core still had bugs from that morning, and the Norwegian word list was an unfiltered spell-check dictionary, not a curated set anyone had played against. It got built because building it was fun, and the day closed with one more feature in the same spirit: assisted mode, offering the nearest dictionary match when a typed word missed, flagged on the leaderboard when a player accepted the suggestion, fully translated into both languages, solving a problem no player had reported.

Where this leaves things#

The leaderboard page, the toolbar, and the random-state fix are staying. Assisted mode and the Norwegian layer are the two features built today that outran what the game needed today, and both are candidates for a second look once the parts people are actually asking for catch up.