Older posts

  1. A greedy regex that ate the leading major version digit

    A greedy wildcard in version string extraction stripped leading digits from major version numbers, causing pnpm 11.19.0 to be parsed as 1.19.0.

  2. Breaking a self-referential devcontainer script loop

    Invoking pnpm inside a container startup script re-triggered the pnpm binary wrapper itself. Guarding execution with environment flags broke the infinite loop.

  3. Deriving help text point values from the game engine

    Hardcoded point strings in UI translation dictionaries drifted when fruit values changed. Deriving help copy directly from EDIBLE_POINTS enforced a single source of truth.

  4. Collapsing the three-file translation triplet into one module

    Maintaining UI translations across three separate files created silent sync friction. Moving to a single per-key module enforced compile-time translation parity.

  5. Leaderboard chips learn to explain themselves on tap

    Native title tooltips were invisible on touch devices. Extracting LeaderboardChip brings tap-to-open DetailTooltip popups and scroll dismiss across all leaderboard tabs.

  6. The icon nobody recognized

    Player feedback from an iOS user led to updating the backspace key icon and moving it to the top row.

  7. Seven phases under one umbrella

    A complete visual redesign across 18 catalogued surfaces, guided by a token migration plan, oklch contrast math, and a seven-phase base branch umbrella.

  8. The skill does not watch the other repo

    A required tag taxonomy and a paginated post listing both changed on the blog side the same day, and the skill only found out because someone filed an issue about it.

  9. Rejected was not final

    A closed draft becomes published after all, exposing one missing transition in the blog registry's state model.

  10. The lock arrived late

    Seventeen blog-registry commits expose the small race between opening a draft and publishing its concurrency lock.