← writing

Why I built another CMS in 2026

The world already has WordPress, Strapi, Sanity, Payload, and 200 niche CMSes. Here is the founder-honest answer for why I built another one in 2026.

Erik, the world has WordPress, Strapi, Sanity, Payload, Ghost, Wagtail, Directus, Webflow, and 200 niche ones. Why?

That is the question I keep getting, usually with a raised eyebrow. It is a fair question. The content management space is not exactly starving for options. So let me answer it honestly, because I think the honest answer is more interesting than the marketing one.

1. I want the API surface to be the agent surface

Most CMSes treat AI as a bolt-on. You install a plugin, it adds a sidebar with a chat box, and that chat box calls some wrapped subset of the REST API. The agent is a tourist in a building that was not designed for it.

I wanted the opposite. I wanted a CMS where the same surface that a human admin uses, the same surface that an extension uses, and the same surface that an agent uses, is one surface. In Squilla, the CoreAPI is exposed through three adapters: internal Go calls, a gRPC service for plugins, and an MCP server for agents. Every method an agent can call is a method the kernel itself uses. There is no second-class API for robots.

This sounds like a small detail. In practice it changes what is possible. An agent can author a node, register a node type, attach a block, query content, and ship a theme, with the same primitives I use as a developer. No plugin glue, no shadow API, no "this works in the UI but not the agent."

2. Extensions should not be a religion

The extension model in most CMSes is still PHP-flavored hooks or JavaScript-only modules. If you want to write a fast image pipeline in Rust, or a CRDT sync engine in Go, you are basically out of luck. You shell out, or you give up.

Squilla extensions are gRPC plugins. The binary on the other side can be Go, Rust, Zig, or anything that speaks gRPC. Each extension owns its own database tables through SQL migrations, its own admin UI as an isolated micro-frontend, and its own business logic. Core does not care what language you wrote it in. Core only cares that you respect the capability contract.

This is a bet that the next decade of CMS work will be polyglot. Image processing, vector search, real-time collaboration, ML inference. None of those want to live inside a PHP request lifecycle.

3. The hard rule: core stays small

I have a rule taped to the inside of my skull. If removing an extension would leave dead code in core, that code belongs in the extension, not in core. Period.

That means image optimization is not in core. WebP conversion is not in core. Email template management is not in core. SEO defaults, sitemap generation, form handling, none of it. Core is a kernel. It does content nodes, rendering, auth, the CoreAPI, and the extension loader. That is it.

This is painful in the short term. It means I had to build a public route proxy in core just so extensions could own routes like /robots.txt. It means I had to ship a media provider contract so any extension can become the bytes-on-disk backend. But it pays off, because nothing rots. Disable an extension and what is left is still coherent.

4. I like Go, and I do not want to live in Node forever

This one is the most honest. I have spent years in Node and PHP. I respect both ecosystems. I do not want to spend the next decade there.

Go fits my brain. Static binaries, real concurrency, a standard library that does not lie to me, build times that finish before my coffee gets cold. Building a CMS in Go was partly an itch I needed to scratch, and partly a bet that the operational profile of a Go binary is what serious self-hosted CMS users actually want. One binary, plus extension binaries, plus a Postgres database. No runtime to babysit.

So is this the right bet?

Maybe not. Maybe the world really did want a 201st niche CMS, or maybe it wanted none of them. Maybe in two years I will look back and admit that WordPress was right all along, or that Payload had the answer, or that the whole category gets eaten by something I have not seen yet.

But it is a clean bet. The architecture is honest with itself. The kernel is small. The extensions are real. The agent surface is the same surface I use. If it fails, it will fail for reasons I can name, and that matters to me more than hedging.

So yes, the world has plenty of CMSes. This one is mine. 🐿️

Want more like this?

Occasional, opinionated, no listicles.
all writing →