Same names, new values underneath
A font and color rewrite that touched zero component files, a layout pass built on the tokens it introduced, and a leaderboard that started checking its own math.
The game’s whole look changed one morning without a single component file being edited. IBM Plex Mono and IBM Plex Sans replaced the original font stack, and every --color-* token moved into the oklch color space: deeper backgrounds, a coral-red accent, richer hues for both snakes. Hours later the same day, a layout pass spent those new tokens on the actual screens: a duel header carrying the score inline with the mode badge, thinner progress bars, rounded corners and a drop shadow on the nav bar, pill-shaped leaderboard tabs. The next day, a much quieter change arrived: the leaderboard learned to check whether a submitted score could have been earned honestly at all.
Values change, names don’t#
The font and color rewrite kept every existing --color-* name in place and changed only what they pointed at, so nothing downstream needed to know a redesign had happened:
--color-snake-head: oklch(62% 0.22 18);
--color-snake-body: oklch(32% 0.08 230);
--color-bg: oklch(12% 0.02 258);
--color-surface: oklch(17% 0.025 258);
A second, newer set of tokens rode along as parallel aliases rather than replacements, --bg-*, --border-subtle/default/strong, --radius-pill, --shadow-card, named for what Design System v2 calls things rather than what the original day-one system did, and the layout pass a few hours later was the first thing to actually spend them.
A harder line on what a leaderboard entry can prove#
The leaderboard has taken submissions since the first day the game existed, on nothing more than a player’s own claim of what they scored. The next day it started asking each submission to prove three things: that the challenge being scored is one the server actually issued, that it’s recent enough to still be today’s or yesterday’s puzzle rather than a stale one replayed from a cached page, and that the client submitting it is running code the server recognizes, checked by comparing the page’s own build number against the one the server reports and reloading once if they disagree. The build number itself now comes from a label applied to each merged pull request rather than a hand-edited version file.
The URL that couldn’t decide where it belonged#
The day before the palette rewrite, a bug that had been fixed backwards finally closed. navigator.share() takes both a text field and a dedicated url field, and the original share code passed the game’s URL in both, once embedded in the message and once again in url; on Android, WhatsApp appends the url field to whatever text already contains, so the link appeared twice. The first fix removed the dedicated field entirely and left the URL only inside the text, which quieted WhatsApp and broke iOS Safari instead: Safari extracts any URL it finds inside text and renders it a second time as its own clickable line. The fix that actually held, landing that same night as the layout pass, was the reverse of the first one: pull the URL back out of the text body and hand it to url, the field built for exactly this.
Two platforms wanted the URL in two different places, and satisfying one had broken the other.
Everything else these three days touched#
A demo-exit bug left the game unplayable, timer hidden, keyboard disabled, whenever a player opened the how-to-play demo from a game already paused for some other reason; the fix stopped guarding the resume behind a flag that was never set in that path. The on-screen keyboard picked up Escape and Ctrl/Cmd+Backspace as shortcuts for clearing a word in progress, careful to step aside when the key press originates inside an open dialog instead of eating its own Escape-to-close behavior. And the project’s GitHub Actions workflows moved to Node 24-compatible action versions ahead of the older ones being deprecated in June.
Where this leaves things#
The palette and the layout pass are both live, spent on the screens players actually see. The trust check is quieter: it changes nothing about how the leaderboard looks, only what it will accept. Both kinds of change shipped in the same few days, one visible immediately and one that only shows up the first time somebody tries to cheat it.