An AI wrote the code. I decided what survives.

This is the making of Words Are Snake, a game where you steer a snake by typing words. Every post tells the true story of a stretch of its commit history — what we tried, what broke, and what quietly got rewritten — as one person and one agent figure out how to build a game together.

  1. Giving the logic a name

    Two days pulling shared logic out of stores and routes into small, named, independently tested modules, one of which immediately surfaced a real duel bug and got its own same-day fix.

  2. A reason to come back

    The daily challenge gets a real midnight boundary instead of an arbitrary UTC one, the wait for it becomes a countdown instead of a dead end, and web push notifications arrive, built around the one hard constraint the hosting platform imposes on anything running on a schedule.

  3. The clock comes off

    The thirty-second per-word timer added three weeks ago comes out entirely, scoring reverts to pure word length times rarity, and a UI freeze traced to backdrop-filter blur turns up in three more dialogs with a blunter diagnosis than the first time.

  4. Not like this

    The engine gets pulled apart into deep, single-purpose modules, and a day later the entire day-two Norwegian layer, carried for three weeks without a dictionary worth playing against, comes out for good.

  5. The week the game started watching itself

    A three-PR refactor trio makes the word-submission pipeline immutable and side-effect-free, then the newly-launched game gets its first stats page, a same-week AI tuning pass informed by it, docs finally caught up to the Postgres stack, and a WCAG 2.2 audit closes the week.

  6. Two kinds of ready

    A second design pass swaps oklch approximations for exact designer hex values and a machine-readable spec, then a seven-part bundle declares the game launch-ready: once-per-day enforcement, a streak counter, analytics, and a way to help pay the hosting bill.

  7. The boring stack, on purpose

    Render and Turso replaced by Railway and PostgreSQL in a single pull request, deleting the hand-written migrator Turso had forced into existence, plus a CI workflow retired in favor of agents bumping their own version.

  8. 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.

  9. The screen that would not respond

    A WCAG reflow fix that became a permanent layout rule, assisted mode deleted nine days after it shipped, and an end-game screen that froze the browser until profiling found why.

  10. Thirty seconds to decide

    A tuning pass over daily mode: a per-word timer with a speed bonus, a background-timer bug that punished new players for reading the tutorial, and a board size that flip-flopped within the same day.

  11. A second snake, same engine

    Duel mode lands in one day: a turn-based match against an AI opponent that shares the daily engine and a first, cautious idea of what a safe move looks like.

  12. Serving today's puzzle

    Three days of stale PWA caches, a Turso migration table that rejected its own tracking schema twice, and the first real players finding their way in.

  13. The first pull requests

    Two days of committing straight to main end in one day: a CI workflow, a licensing swap, a WCAG audit, and the design question the game keeps coming back to.

  14. 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.

  15. Someone else's phone

    The first production deploy, a snake that moved without appearing to, and what the first real players found within a day.

  16. Seven phases in one afternoon

    From an empty directory to a playable daily challenge in one day, and why the game engine never learned what a framework is.