Skip to content- Every Abstraction I RegretApr 8, 2026 · 6 min readA short list of abstractions I added too early, why they got worse over time, and the heuristics I use now to avoid repeating it.
- How Pyscn Analyzes Python with Go and tree-sitterApr 8, 2026 · 4 min readHow Pyscn uses Go and tree-sitter to analyze Python code quickly for dead code, clone detection, and dependency insight.
- kitty's Parallel Test Runner Said OK While Its Workers CrashedOct 6, 2026 · 9 min readA missing addSubTest and an ignored exit status let kitty's new parallel test runner report success after failures. Fixing that exposed seven segfaulting workers on my Mac, and Kovid Goyal fixed those his own way.
- LangChain in Production: What the Tutorials Leave OutFeb 1, 2026 · 3 min readWhere LangChain is worth using, where it gets in the way, and the defaults that stop our AI features failing silently: timeouts, validation, persistent state, tracing and pinned versions.
- Taking Obelisk's Backend Deploy From 54 Minutes to 32Oct 6, 2026 · 10 min readOur backend deploys had crept up to almost an hour. Docker was fine. Most of the time went to migration tests waiting on one Postgres advisory lock, and to five Cloud Run services promoted one at a time.
- Most of My Pull Requests Started as an AnnoyanceApr 8, 2026 · 3 min readDrive-by fixes in qBittorrent, Dokploy and django-hijack: which ones merged, which didn't, and what the rejections taught me about scope.
- Smart Dustbin: IoT with Arduino, Python, Kotlin & AzureFeb 16, 2025 · 2 min readAn IoT garbage monitoring system built with Arduino sensors, ESP8266 WiFi, a Python desktop dashboard, and a Kotlin Android app, plus what it taught me about hardware constraints.