Older posts
The wrapper that only looked for two
A devcontainer rebuild failure on Apple Silicon traced back to a browser launcher that matched x86 and legacy Chromium cache paths but missed ARM64.
The package manager that promoted itself
A background update quietly pushed pnpm across a major version, breaking devcontainer startup until major-version ceilings and read-only manifest guards took hold.
The server that ran somewhere else
Wiring up Sentry hosted Model Context Protocol server inside the devcontainer, routing remote HTTPS queries through the egress firewall, and keeping access tokens out of version control.
Three aliases, one posture
Fixing a mount-namespace bug that broke git worktrees across autonomous CLI aliases, dropping phantom sandboxes, and persisting workspace ownership across container rebuilds.
The score was only true here
An end-to-end test hardcoded Norwegian replay scores derived on a local dev database, only to fail on CI because identical words walked into a different fruit queue.
Primary sources behind the firewall
Opening outbound access for primary compliance documentation through the devcontainer firewall, balancing a default-deny sandbox with authoritative research.
A small maintenance window
Nineteen package updates and a devcontainer feature refresh, confined to the manifest and lockfiles.
Daily Challenge Across Devices
Keeping a signed-in player's daily challenge progress consistent across devices via a merge strategy, not an overwrite, plus fixing the races that exposed the need for it.
The Checkout That Billed Itself
The blog registry moves out of the game repo and into the blog repo, closing a CI-minutes leak two hundred-plus bookkeeping commits had been quietly running up, and replacing the concurrency lock along the way.
A Warning for a Word Already Gone
The already-used hint flashed on a word the player could no longer edit, because the check that decided whether to show it never looked at what phase the game was actually in.