Archives
2026
- TIL: sqlite3 .backup is way better than .dump note
- nix-shell for reproducing bugs from five years ago
- CI dependency graph for a monorepo that doesn't run everything
- TIL: pytest's xfail strict flag fails if the test unexpectedly passes note
- First Roll Through the Pentax photos
- The fzf shell setup that finally stuck
- git worktree as a daily driver, not a party trick
- We tried buildpacks. I don't recommend them for most teams.
- TIL: Go race detector can cause tests to pass that would fail in production note
- Justfile patterns for a crowded monorepo
- SLO math for tired engineers
2025
- Structured logging lessons from four years of zerolog
- Head vs tail sampling: the mental model I wish I'd had
- A Heisenbug in a Go channel close that took me two weeks
- Three Hours at SFO photos
- TIL: GitHub Actions concurrency.cancel-in-progress note
- Tuning pgvector HNSW without giving up
- strace revealed our libc mismatch
- Debugging a remote core dump without losing your mind
- A workflow for flaky tests that doesn't involve retry-until-green
- Dev containers at 30 engineers: the unglamorous middle
- Homelab rack fans at 90% load (a short clip)
- GitHub Actions cache lied to us
- Migrating to SQLite STRICT tables: mostly boring, sometimes not
- Ring Road, Eight Days photos
- TIL: DuckDB's COPY reads from S3 URLs directly note
- Redis maxmemory, eviction, and the day we served stale for 20 minutes
- We culled 40% of our alerts and nothing bad happened
- Autovacuum tuning, one table at a time
- Logical replication slot lag ate our WAL
- Ocean drift, with a short loop photos
- When GIN on JSONB is wrong
- Postgres 12 changed my CTEs and nobody told me
- TIL: pg_try_advisory_lock for cheap, per-key mutual exclusion note
- Flamegraphs in production without the fear
- The label that killed Prometheus
- Tail sampling that actually saved money
- A Macro Experiment in the Kitchen photos
- pgbouncer transaction pooling broke our prepared statements
- Partition attach locks and the bloat we didn't see coming
- What they don't tell you about SQLite WAL in production
- The bitmap heap scan that ate our p99
- Switching to TCP BBR on the edge
- GitOps with Flux vs Argo on a small team
- Running a Proxmox cluster of two (don't)
- TIL: SQLite has RETURNING now note
- Capabilities bounded the wrong way
- Snow Day photos
- Shaving 40W off my homelab rack
- DNS-01 challenges with a split-horizon DNS
- Testing routers with Linux network namespaces
2024
- CRD design mistakes I made early on
- Four kubectl plugins I keep coming back to
- io_uring surprised me in a benchmark
- TIL: Grafana has a 'custom all value' for variables note
- BGP in a small network: worth it?
- Still Lifes, Black and White photos
- Sizing a UPS for a quiet homelab rack
- Baking Hetzner images with Packer and cloud-init
- Ansible at scale: where it breaks for us
- Debugging DNS in a kind cluster
- btrfs scrub found what smartctl missed
- TIL: histogram_quantile needs a rate, not a raw counter note
- The OOM killer picked postgres. Here's why.
- MTU, MSS, and a VPN that couldn't stream video
- Autumn, on Two Wheels photos
- A TLS SAN quirk that broke mTLS
- When journald ate my disk
- Nomad vs k8s for a homelab in 2024
- TIL: span events are the right place for timestamped annotations note
- ndots:5 and the DNS tax in Kubernetes
- An admission webhook that crashed my cluster
- Putting IPv6 on my home network, finally
- Cafes, Morning Light photos
- Finding TCP retransmits with bpftrace
- Terraform state locks and the S3 bucket that wouldn't let go
- Tuning ZFS ARC on my Proxmox box
- TIL: OpenTelemetry has a separate 'Baggage' concept note
- Why I finally switched from nginx to Caddy
- WireGuard vs Tailscale in my homelab after a year
- A TCP RST that took a week to track down
- An operator reconcile loop that wouldn't quit
- The Rack, Unflatteringly Photographed photos
- TIL: pg_stat_user_tables.n_mod_since_analyze is a thing note
- systemd timers and the clock drift that ate our backups
- Why my homelab Pi-hole kept forgetting its DNS override
- Three days of debugging a cgroup memory accounting bug
- nftables rule ordering surprised me
- TIL: just has variadic positional arguments note
- A compiler optimization I didn't know existed until it broke
- SIMD in Rust without losing my mind
- Fog on Burnside photos
- TIL: fzf's --preview can run arbitrary shell commands note
- PLT and GOT: the indirection I never noticed
- Stack vs heap: what escape analysis taught me
- TIL: direnv layout_python just works note
- Moving a service from Go to Rust, an honest report
- The panic in a goroutine that took down prod
- TIL: git bisect run automates the bisect note
- CPU caches explained through a slow hash table
- Linking errors on Linux: an afternoon with ld
- One Day in Tokyo photos
- TIL: git reflog doesn't keep things forever note
- Unsafe code boundaries I drew and regretted
2023
- http.Client tuning for a flaky upstream
- The branch predictor ate my microbenchmark
- TIL: ltrace is strace for library calls note
- tokio::sync vs std::sync in a real service
- Build tags are the quiet power tool of Go
- TIL: strace -k gives you syscall backtraces note
- Error wrapping conventions I settled on
- One Sunset at Cannon Beach photos
- Generics in Go, eighteen months later
- TIL: perf-map-agent for JVM flamegraphs note
- The day I learned Mach-O segments matter
- Atomic ordering made sense after I drew it on paper
- TIL: Go pprof labels for attributing CPU time note
- go.sum conflicts during merges are always my fault
- Pin, Unpin, and why async Rust made me read a paper
- Concrete, Weather-Stained photos
- TIL: jq's recurse operator finds things in arbitrarily-nested JSON note
- The GC knob that actually helped
- httptest.Server is better than you think
- Notes: pgvector HNSW m parameter rule of thumb note
- Trait objects vs generics: when I finally picked a side
- Benchmarking gotchas I learned the hard way
- TIL: temp_buffers is a thing and default is tiny note
- Tokio's block_in_place is a footgun
- The io.Reader pattern I keep getting wrong
- A Mission Afternoon photos
- TIL: EXPLAIN (ANALYZE, BUFFERS) shows cache hit ratio note
- Result and Option ergonomics after six months
- TIL: redis-cli MONITOR is still a footgun, not a tool note
- When interfaces in Go bite you at the allocation level
- Cargo workspaces saved our monorepo
- TIL: sqlite3 CLI has a .mode box note
- The pprof graph that taught me to read assembly
- sync.Pool is not a memory pool
- TIL: pg_stat_statements_reset can take a userid note
- Reading the Go scheduler traces for the first time
- Moss, Ferns, Forest Park photos
- context.Context is not a cache
- TIL: psql's \gexec runs the output of your query as SQL note
- A bad day with Rust lifetimes in Axum middleware
- TIL: generate_series is the most underrated Postgres function note
- Why I stopped reaching for sync.Map
- The goroutine leak I didn't notice for six weeks