Writing

Long-form notes on building software, mostly from the trenches.

February 20, 2026 · 6 min read

ETS Beyond the Cache: Three Patterns That Survived Production

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.

January 28, 2026 · 5 min read

The Math Behind Sidekiq Retries

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.

January 10, 2026 · 3 min read

A Naming Convention for Analytics Events

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.

December 15, 2025 · 5 min read

GenServer Timeouts Are Not What You Think

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.