Blog

Technical notes on systems architecture, infrastructure, and the tradeoffs behind them.

Reversing Sleeping Dogs with Ghidra and Claude

Sep 25, 2026

Why I abandoned reverse engineering two years ago, why I refuse to use copy-pasted trainers, and how digging into Ghidra and Claude finally broke the entry barrier.

Migrating to Kotlin with Claude Code

Sep 22, 2026

Escaping IntelliJ's auto-convert traps, surviving Jackson serialization breakages, and finishing a 4-year Java-to-Kotlin migration in 3 days with Claude Code.

Double-Encoded Strings and the Normalization of Stupidity

Sep 20, 2026

Trimming 10k-line controllers, banishing three competing JSON libraries, and the soul-crushing battle against JSON strings escaped inside JSON payloads.

Modernizing a 4-Year-Old GitHub Actions Pipeline

Sep 20, 2026

Cleaning up my 4-year-old CI/CD setup: ditching the delete-and-reupload cache hack, splitting checks cleanly, and getting release builds down to 6 seconds.

Decoupling Blobs: A Zero-Downtime Migration from MongoDB to GCS

Sep 19, 2026

How I migrated gigabytes of in-database Base64 image payloads to Google Cloud Storage with zero downtime, shrinking database size by 54x and memory footprint by 89%.

The 100ms Password

Sep 19, 2026

How an innocent internal service using HTTP Basic Auth turned password hashing into an accidental denial of service that pinned my CPU at 100%.

The Cargo Cult of LinkedIn Engineering

Sep 13, 2026

From AI-generated carousels of Cloudflare postmortems to bragging about 20ms wins with zero observability: how LinkedIn replaced real systems engineering with performative theater.

The Ghost Connection II: The Poisoned Pool

Sep 4, 2026

Right after fixing the infamous conntrack -F bug, deployments started throwing 408s and 503s. Here is how conntrack took the fall for a desynchronized Redis buffer and a poisoned connection pool.

Local Development with Strapi: The Three-Way Sync Problem

Sep 3, 2026

Strapi is hailed as an industry standard headless CMS, but local development is fundamentally broken. Here is how I tackled syncing code, DB dumps, and assets with hard links and diffs.

Another Russian Doll, in Go

Aug 26, 2026

Chased duplication out of my Go assertion library and landed on Hamcrest's Matcher interface without going to look at it.

Singleton Services and the Russian Doll Pattern

Aug 25, 2026

Splitting a bloated service into single-purpose Creator, Editor, and Finder objects, and realizing the domain object they used to protect doesn't actually exist anymore.

Negotiating with Jool

Aug 23, 2026

Getting a fixed IPv6-to-IPv4 mapping out of Jool's stateful NAT64 - which doesn't actually support one.

Exorcising a Haunted Keyboard

Aug 22, 2026

My laptop keyboard ghost-types the delete key, so I tear it apart to unplug it, learn the power button lives there too, and disable it via the registry instead.

Betting on NAT64 Over a Proxy

Aug 21, 2026

A $5 shared vCPU, and a backend that only speaks IPv4 while a chunk of my users apparently don't.

Shopping for a VM

Aug 20, 2026

Continuing the UDP load balancer saga by shopping for a VM

Hunting for a UDP Load Balancer

Aug 19, 2026

Going looking for a managed L4 load balancer that speaks UDP, coming away empty-handed from GCP, Cloudflare, and everyone else, and ending up less sure what "load balancer" even means.

Why I Don't Like MongoDB

Aug 16, 2026

MongoDB pushes schema failures from write time to read time, and that's a much bigger problem.

Premature Abstraction, Code Review and AI

Aug 16, 2026

Working with Claude has changed how I revert, review, and think about abstraction and duplication.

The Ghost Connection: How conntrack -F Broke Redis Pub/Sub

Aug 13, 2026

A four-year debugging saga into why Redis pub/sub silently stopped working after every deployment — and how a flushed conntrack table was the real culprit.

WHAT is Ratelimiting??

Jun 15, 2026

Deciphering rate limiting without using the word rate limit.

Avoid - A Void Linux Distribution

Jun 9, 2026

Creating a minimalist, server-oriented Linux distribution based on Void Linux to escape the bloat of systemd and unnecessary firmware.

Optimizing Hex Formatting

May 17, 2026

How a simple change from String.format to JDK 17's HexFormat removed a significant bottleneck in a high-throughput backend.

How Smart is AI?

Apr 18, 2026

Can it design, or is it even good at pairing?

Ai, Agents and the Refactoring Loop

Apr 16, 2026

After spending quite some time with ai tools; here are my takes. How it helps and how it slows down;

Zero-Downtime Deployments with Iptables

Apr 6, 2026

A technical walkthrough of achieving zero-downtime deployments using iptables and conntrack for a performance-critical backend.

ThreadLocal Optimizations and Project Loom

Mar 29, 2026

An optimization journey from identifying high-allocation hot paths with Async Profiler to leveraging ThreadLocal, and why Project Loom is forcing us to rethink these classic patterns.

Java Exceptions Swallowed: The ThreadPool Trap

Mar 22, 2026

Debugging silent failures in asynchronous Java code and understanding why ThreadPools might be swallowing your exceptions.

A Low-Level UDP Echo Server for NAT Traversal

Mar 17, 2026

Exploring XDP, iptables, and nftables to build a high-performance UDP echo server in the Linux kernel.

Choosing Blog CMS

Feb 28, 2026

Choosing the CMS for this blog