Between roughly 2013 and 2022 a set of systems appeared that treated the API as the product. They are lumped together as headless and they disagree with each other more than the label suggests.

Contentful is hosted, and the model is edited through their web UI. Everything is someone else's problem, including whether you can still get your content out on a Tuesday when their pricing changes. It made the category commercially real and demonstrated that companies will happily pay per API call for content they wrote themselves.

Sanity made two bets the others did not. The body is stored as structured blocks rather than markup, which is the right answer for content that appears in more than one place. And querying is a real query language of their own rather than filter parameters bolted onto REST. The consequence is a system that is more powerful and less portable, and content that requires their tooling to interpret.

Strapi is the self hosted Node option, and its main contribution was that self hosting became a normal choice again rather than an enterprise one. Model in an admin UI, content in your database, code you can read. The generated admin is the weak point and it is a hard thing to do well.

Payload is the one I keep thinking about. The model is a TypeScript config file. That one decision produces most of what is nice about it: the admin is generated from the config, the API is generated from the config, the types are generated from the config, and all of it is in version control and reviewed like code. Access control is functions rather than a permission grid, which means it can express rules a grid cannot. It went open source around 2022 and is the clearest expression of model as code that I have used.

Reading them together, the disagreements are the interesting part.

Where the model lives. Contentful and Strapi say a UI. Payload says a file. This decides who can change the shape of your content and whether that change is reviewable, and it is the single most consequential difference between them.

What the body is. Sanity says structure. Most of the others say markup or HTML and move on.

Where the boundary is. Contentful is a service. Payload is a library you build an application around. Strapi is in between and slightly uncomfortable about it.

What none of them do, and this is not a criticism because it was not their goal, is keep content in a form that outlives them. Export from any of them and you get JSON shaped by their internal model. It is a fine format for a machine and it is not a document.

The flat file people had that and gave up querying to get it. The API first people have querying and gave up the document. I do not think those are actually in tension, and the fact that no widely used system does both is the thing that keeps nagging at me.