WRITING
We build in the open.
Notes on building AI-native software. What's working, what breaks, and what we're learning in production. The same thinking that goes into the products goes into the writing.
- 6 min read
The failure mode isn't bad code
Bad code gets caught. What doesn't get caught is plausible code with a confident summary, written by the same process that wrote the code. Four things that passed review, passed their tests, and were wrong anyway.
Read → - 4 min read
proacl IS NULL means PUBLIC EXECUTE, not no grants
The catalog records PostgreSQL's default grant as NULL, and NULL reads as nothing, so the obvious audit comes back empty on a database full of world-callable functions. What we changed, and the rule underneath it.
Read → - 3 min read
Our lint rule kept passing because it had stopped checking anything
A lint rule that strips string literals before matching can never see an import, because the module specifier is itself a string literal. Ours ran on every commit, passed every time, and was checking nothing. The tests that caught it were written to fail.
Read → - 8 min read
I got tired of logging out of Claude twelve times a day, so I built Lanes
A work account and a personal account, one desktop app, and no way to run both. The fix was one command-line flag. Getting there meant finding out which AI desktop apps actually honor it, and two of the three don't.
Read → - 5 min read
AI-native, not AI-enabled
Most "AI software" is old software with a chat box bolted on. Here's the difference between AI-native and AI-enabled, and why we started a company on the other side of it.
Read →