Writing
Longer pieces on building software, contributing to open source, and the developer workflow as it changes.
- go / yaml / parsers
A comment-only YAML document made the next document disappear
A goccy/go-yaml user filed a bug where parsing a multi-doc YAML stream silently dropped one document. The cause was three lines in the token grouper that returned early when they should have recursed. The interesting part is the shape of the bug, not the fix.
- go / security / integer-overflow
A pagination bug that returned zero rows, and the saturating add that fixes it
A live Cosmos RPC endpoint returned zero results for a query that obviously had rows. The cause was a uint64 overflow in the pagination loop. The fix is one of those tiny patterns that's easy to forget when you're working with user-supplied numbers.
- nextjs / leaflet / gtfs
Live mapping SEPTA, and the small ways the data fights you
SEPTA publishes plenty of realtime data. Putting all of it on one map turned up the kind of small, specific data problems that don't show up until you actually try.
- postgresql / postgis / civictech
What it took to put six cities' affordable housing data on one map
I wanted to compare affordable housing per capita across NYC and San Francisco. Their open-data portals had other ideas. Six cities, one PostGIS schema, and the year-long work of making other people's work possible.
- opensource / beginners / career
What I learned opening my first sixty open source pull requests
Twelve days ago my GitHub account had zero contributions on it. Today there are about sixty PRs across twenty-something repos. Here's what I got wrong, in the actual order I got it wrong.
- go / ai / opensource
Building a linter for the bugs AI agents actually make
I lost an hour last Tuesday to a function that didn't exist. Then I noticed it had a shape, and so did most of the other bugs I'd been hitting. So I wrote a Go CLI that catches them.