A minimal, reproducible Docker setup for ML experiments

Pin everything, mount data, never bake it. The boring setup that stopped me losing runs.

March 11, 2026 · 1 min · mc

KV cache, and why LLM inference is memory-bound

The cache that makes autoregressive decoding fast also makes it the thing that runs out of memory first.

February 8, 2026 · 2 min · mc

eBPF: tracing syscalls without a kernel module

Attaching a verified program to a tracepoint, and why this beats strace under load.

January 12, 2026 · 2 min · mc

Tuning TCP BBR and fq on a high-latency link

Switching off loss-based congestion control on a long-fat path, and the fq gotcha for UDP.

November 3, 2025 · 1 min · mc

WireGuard: why it's so small

~4k lines, one cipher suite, no negotiation. The design choices that make it auditable.

September 14, 2025 · 2 min · mc

The TLS 1.3 handshake, in plain terms

One round trip instead of two, and why the ServerHello already carries a key share.

July 18, 2025 · 2 min · mc

A first, honest look at io_uring

Two ring buffers, one syscall, and the mental model that finally made it click.

May 22, 2025 · 2 min · mc

Notes on cgroups v2: memory limits that actually hold

Why my OOM kills moved around after switching to the unified hierarchy, and the three knobs that matter.

March 9, 2025 · 2 min · mc