Understanding Connection Pooling in Go

Mar 22, 20268 min read

Connection pooling is one of those things that most developers take for granted until something goes wrong. In this post, I'll walk through how Go's database/sql package manages connection pools internally, common pitfalls like connection leaks, and how to tune MaxOpenConns and MaxIdleConns for production workloads.

GoDatabasePerformance

A Practical Guide to Linux Cgroups v2

Mar 8, 202612 min read

Cgroups v2 has been the default in most distributions since 2022, yet many tutorials still reference the legacy v1 hierarchy. This guide covers the unified hierarchy, how to set memory and CPU limits for your services, and how systemd integrates with cgroups under the hood. We'll also look at how container runtimes like runc leverage cgroups v2.

LinuxContainersSystems

Debugging TLS Handshake Failures

Feb 19, 20266 min read

Last week I spent half a day tracking down a TLS handshake failure between two internal services. The root cause turned out to be a certificate chain ordering issue that only manifested with certain client libraries. Here are the tools and techniques I used: openssl s_client, Wireshark filters, and a quick Go test harness.

TLSDebuggingNetworking

Notes on Migrating from Webpack to Vite

Jan 30, 202610 min read

Our team finally migrated a 200k LOC React app from Webpack 5 to Vite. Build times dropped from 45s to 3s for dev and 90s to 12s for production. The migration wasn't painless though — here's a log of every issue we hit, from CommonJS compatibility to CSS module differences and environment variable handling.

FrontendViteReact

Why I Switched to Neovim Full-Time

Jan 12, 20265 min read

After ten years of VS Code (and Sublime Text before that), I finally committed to Neovim as my daily driver. The tipping point was LazyVim — it provides a sensible default config that made the initial setup surprisingly quick. Here's my current setup and the plugins I can't live without.

ToolingNeovimProductivity