BlogRSS →

Writing

Notes and longer pieces on ML systems, distributed systems, and infrastructure.

2026-08-29CVE remediation at monorepo scale: a practical playbookA playbook for clearing CRITICAL and HIGH CVEs across a monorepo: severity-plus-reachability triage, per-service fix batching, transitive dependency overrides, a trivy CI gate, and an accepted-risk register with expiry dates.2026-08-29Shipping a three-environment CI/CD pipeline from zeroBuilding dev, staging, and prod from an empty repo: per-env Terraform state, separate cloud accounts, deployable PR previews, trunk-based promotion, and expand-migrate-contract for database changes.2026-05-01A $22/Year VPS Running Three Self-Hosted ServicesRunning Obsidian LiveSync, Matrix Synapse, and Calibre-Web on a $22/year VPS — nginx reverse proxy, Docker Compose, Cloudflare tunnels, and what actually fits in 2.9GB RAM.2026-04-21Three Useful Services on a $22/Year VPSA minimal self-hosting stack on a budget VPS — three useful services (sync, chat, library) running on Docker Compose behind nginx, for under $22 a year.2026-02-17From Manual Deploys to SHA-Tagged Containers: CI/CD for a K8s PlatformSHA-tagged Docker images replace mutable latest tags, eliminating silent overwrites in CI/CD pipelines. Docker Buildx, multi-arch builds, and dynamic workflow generation for a Kubernetes platform.2026-02-16Hunting OOMKilled in Kubernetes: Four Memory Leaks That Almost Took Down Our PlatformFour memory leaks inside OOMKilled Kubernetes pods — slow async accumulation in Python services, unclosed client sessions, unbounded caches, and how to track each one down without a profiler.

Machine Learning

All 6

Systems

All 16
2026-05-02The Bulkhead Pattern: Isolating Failures Before They SpreadHow the bulkhead pattern isolates failures in distributed systems — partition thread pools, connection pools, and resources so one degraded dependency cannot sink the whole service.2026-05-02CRDTs: Conflict-Free Replicated Data TypesCRDTs eliminate merge conflicts by design — commutative, associative, idempotent data structures that converge to the same state regardless of operation order. G-Counters, OR-Sets, and LWW registers explained.2026-05-02Multi-Paxos: From Single Decree to a Replicated LogMulti-Paxos extends single-decree Paxos into a replicated log by electing a stable leader, skipping Phase 1 for subsequent entries, and batching proposals for throughput.2026-05-02Raft Log Compaction: Keeping the Log from Growing ForeverRaft logs grow forever if left unchecked. Log compaction via snapshots lets nodes discard old entries, transfer state to slow followers, and recover quickly after a restart.2026-05-02The Saga Outbox Pattern: Reliable Event Delivery Without Two-Phase CommitThe outbox pattern solves the dual-write problem in event-driven systems: persist events to a local outbox table in the same transaction as your domain change, then relay them reliably.2026-05-02How Spanner Does Distributed Transactions Without Classic 2PCGoogle Spanner achieves globally consistent distributed transactions using TrueTime — bounded clock uncertainty instead of classic 2PC, enabling external consistency at planetary scale.