The Minimum Viable Unit of Saleable Software
LLMs made software cheaper to build, but not free. A look at the new buy-vs-build math of the LLM age, and the pricing zone where small software businesses can still survive.
LLMs made software cheaper to build, but not free. A look at the new buy-vs-build math of the LLM age, and the pricing zone where small software businesses can still survive.
APIs were meant to make the web programmable and interoperable. A combination of revenue chasing, security concern, and abuse reversed the trend for a decade as walls went up instead of down. Today, LLMs are changing the equation. People want agents that act on their behalf, and the services that ship APIs will have a decisive edge over those that don’t.
Using a two-phase data load and render pattern to prevent N+1 queries in a generalized way. Especially useful in Go, but applicable in any language.
Maximizing Postgres connection economy by using a single connection per program to receive and distribute all listen/notify notifications.
Using Go’s DisallowUnknownFields option to improve an API’s integration experience by making paramter naming mistakes faster to resolve.
Introducing River, a Postgres-based job queue designed for resilience and correctness through strong transactional guarantees.
How and why we started annotating all our Go tests with t.Parallel() , and why you might want to consider doing so too.
The traditional soft deletion pattern using deleted_at columns leaks into code, curbs the usefulness of foreign keys, and makes data removal difficult. Luckily, there’s an alternative.
The text type in Postgres, why it’s awesome, and why you might want to use varchar anyway. Also, a story about trying to get string parameters bounded at Stripe.
Touring the ORM and Postgres landscape in Go, and why sqlc is today’s top pick.
A privacy and GDPR-friendly approach to producing basic and complex site analytics, and one which is more accurate in an age when adblockers reign supreme.
Databases shed important RDMS features as they get big. Examining why this tends to be the case, and some ideas for preventing it.
Making the sorting speed of network types in Postgres twice as fast by designing SortSupport abbreviated keys compatible with their existing sort semantics.
In the spirit of the continued production of independent content, I’m running a two-week photography and writing project in Berlin called Sequences .
A walkthrough of the design of a live reload feature for the static site generator that builds this site, touching on fsnotify, WebSockets, and the curious case of file 4913.
How Postgres makes sorting really fast by comparing small, memory-friendly abbreviated keys as proxies for arbitrarily large values on the heap.
Hitting the limit for maximum allowed connections is a common operational problem in Postgres. Here we look at a few techniques for managing connections and making efficient use of those that are available.
How a seemingly minor enhancement in Postgres 11 fills one of the system’s biggest operational holes.
Using the design principles of a 10,000 year clock to build a program that’s intended to run on a macro timescale.
Why it makes sense to model APIs as graphs, and what GraphQL can do for us to help with discovery, batch operations, and gradual enhancement.