All Entries
The Unreasonable Effectiveness of Writing Things Down
I brought a spiral-bound notebook to a system architecture review last week. Eight engineers with laptops open, and me with a pencil. They thought I was being contrarian. But by the end of the meeting, three people asked to photograph my pages. There's something about the physical act of drawing boxes and arrows that forces a different kind of thinking — slower, more deliberate, with room for the uncertain squiggly line that says "I'm not sure about this connection yet."
CONTINUE READING →SSH Keys, Git Identities, and the Multi-Org Developer
When you manage repositories across a dozen GitHub organizations — corporate, personal,
client, and open-source — the default git configuration falls apart quickly. I've
spent the last month perfecting an SSH config that maps each organization to its own identity
key, paired with a GitHub CLI profile-switching workflow. The trick isn't technical complexity;
it's discipline. Every gh command starts with verifying which profile is active.
Self-Hosting in 2026: A Field Guide
The math finally made sense. After years of paying per-app hosting fees across multiple platforms, I moved everything to a single $24/month VPS running Dokploy. The migration took a weekend. The learning curve was real but manageable. What surprised me wasn't the cost savings — it was the control. Wildcard DNS, custom reverse proxies, environment isolation between staging and production, all on hardware I understand.
CONTINUE READING →On Naming Things (Again)
Phil Karlton's famous quip about the two hard things in computer science keeps proving itself.
But I think naming repositories is harder than naming variables because the stakes are different.
A bad variable name causes confusion in one file. A bad repository name causes confusion across
teams, CI pipelines, documentation, and mental models. After years of iteration, I've settled
on a prefix-based taxonomy: docs-*,
poc-*,
iac-* —
boring, predictable, and that's exactly the point.
The Monorepo Question Nobody Asks
Every "monorepo vs. multirepo" debate I've witnessed focuses on tooling. Nx or Turborepo? Bazel? But the real question is about organizational coupling. A monorepo is a bet that your teams share enough context, cadence, and trust to deploy from the same source of truth. When that bet is right, it's beautiful. When it's wrong — and it's wrong more often than the blog posts admit — you get a ball of mud with excellent build caching.
CONTINUE READING →Node 22's Native Fetch Changed My Testing Story
I'd been carrying node-fetch and
nock as dependencies in every API
service for years. The migration to native fetch wasn't just about removing packages —
it fundamentally simplified how I mock HTTP in tests. No more monkey-patching a require'd
module. The global fetch is just there, and
mocking a global is straightforward.
Building CLI Tools That Feel Like Home
The terminal is where I live. Not because I'm nostalgic for the 1980s, but because text is the fastest interface for someone who types 120 words per minute. Over the past year, I've been building a collection of personal CLI tools — a DNS manager, a deployment watcher, a repo scaffolder — and the design principles are surprisingly similar to good API design: be predictable, fail loudly, and never surprise the user.
CONTINUE READING →Twenty Years of Shipping: What Actually Mattered
Two decades in, the patterns are clear. The technologies that defined my early career — jQuery, Backbone, early Angular — are footnotes. But the principles haven't changed: understand the problem before you write the code, name things with care, write for the person who will read this at 3 AM during an incident, and never confuse activity with progress. The tools are incidental. The thinking is everything.
CONTINUE READING →