RSSAmplifier

Blog

Articles — brandur.org

brandur.orgRSS feed ↗20 posts

Latest posts

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.

The Second Wave of the API-first Economy

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.

Eradicating N+1s: The Two-phase Data Load and Render Pattern in Go

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.

The Notifier Pattern for Applications That Use Postgres

Maximizing Postgres connection economy by using a single connection per program to receive and distribute all listen/notify notifications.

Web APIs: Enriched DX By Disallowing Unknown Fields

Using Go’s DisallowUnknownFields option to improve an API’s integration experience by making paramter naming mistakes faster to resolve.

River: a Fast, Robust Job Queue for Go + Postgres

Introducing River, a Postgres-based job queue designed for resilience and correctness through strong transactional guarantees.

On Using Go's `t.Parallel()`

How and why we started annotating all our Go tests with t.Parallel() , and why you might want to consider doing so too.

Soft Deletion Probably Isn't Worth It

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.

Postgres: Boundless `text` and Back Again

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.

How We Went All In on sqlc/pgx for Postgres + Go

Touring the ORM and Postgres landscape in Go, and why sqlc is today’s top pick.

Minimally Invasive (and More Accurate) Analytics: GoAccess and Athena/SQL

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.

Feature Casualties of Large Databases

Databases shed important RDMS features as they get big. Examining why this tends to be the case, and some ideas for preventing it.

Doubling the Sorting Speed of Postgres Network Types with Abbreviated Keys

Making the sorting speed of network types in Postgres twice as fast by designing SortSupport abbreviated keys compatible with their existing sort semantics.

Sequences: A Modest, Contra-garden Travel Project

In the spirit of the continued production of independent content, I’m running a two-week photography and writing project in Berlin called Sequences .

Building a Robust Live Reloader with WebSockets and Go

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.

SortSupport: Sorting in Postgres at Speed

How Postgres makes sorting really fast by comparing small, memory-friendly abbreviated keys as proxies for arbitrarily large values on the heap.

How to Manage Connections Efficiently in Postgres, or Any Database

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.

A Missing Link in Postgres 11: Fast Column Creation with Defaults

How a seemingly minor enhancement in Postgres 11 fills one of the system’s biggest operational holes.

Tweeting for 10,000 Years: An Experiment in Autonomous Software

Using the design principles of a 10,000 year clock to build a program that’s intended to run on a macro timescale.

Living APIs, and the Case for GraphQL

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.