Work · March 2026
Separate what the game contains from how the game works.
Writing · March 2026
The docs suggest one pattern. Production suggests another. Here's what actually survived.
Work · March 2026
Random events, herb consumption, and the chaos that makes every playthrough different.
Zuihitsu · March 2026
Crimson clover fixes nitrogen. Good test suites work the same way.
Work · March 2026
Rewind, inspect, and replay any previous game state.
Work · March 2026
A game loop without mutable variables — and why it's actually simpler.
Work · February 2026
Separating game logic from UI — the foundation of maintainable code.
Writing · February 2026
Everyone reaches for ETS as a cache. Fair enough — it's fast and it's there. But the interesting patterns show up when you stop thinking of it as a key-value store and start treating it as shared mutable state with read concurrency. Three patterns from real Elixir services that held up under load.
Zuihitsu · February 2026
When Redis restarts, you learn which promises were load-bearing.
Work · February 2026
Processing collections without a single for loop.
Work · February 2026
Structs, maps, and why nothing changing is actually a superpower.
Work · February 2026
Mix, your first module, and a terminal UI. The groundwork for everything that follows.
Writing · January 2026
Sidekiq's exponential backoff looks simple until your job fails at 2am and you're doing napkin math on when retry number fourteen will fire. The formula is public but the implications aren't obvious. Here's how to think about retry windows, dead queues, and when to just let a job die.
Writing · January 2026
Past-tense verbs, no abbreviations, one spreadsheet. A simple system that kept six teams from inventing six vocabularies for the same user actions. The convention matters less than having one at all.
Writing · December 2025
The timeout option in GenServer.call looks like a safety net. It isn't. It's a local-only timer that tells the caller to give up — the server keeps running, the work keeps happening, and now you have two problems. What to reach for instead.
Building event pipelines at a mortgage company. Training BJJ in the mornings. Planting cover crops on a small piece of land. Finishing a novel, very slowly.