Weblog / Engineering

Why I built my own CMS in 2025

After fifteen years of WordPress, Drupal and Astro, I started over.

Marten · 12 Apr 2025 · 3 min read

For the last 23 years almost every public-facing site I built lived on WordPress, Drupal , CMS Made Simple, Joomla, or, more recently, Strapi, Directus, Storyblock and Astro. None of them were wrong. All of them, eventually, were in the way.

I did not wake up one morning and decide to reinvent content management, it just piled up. A client wanted a small change and I had to explain why that meant a developer. A page shipped four megabytes of JavaScript for a contact form. Auth sat in one SaaS, search in another, analytics in a third. Each piece worked, but together they felt like a tax on every project.

I wanted one runtime I could still read in five years. PHP for templates. MySQL for storage. A bit of Vue where the page actually needed to move. Nothing more.

What kept breaking

WordPress got me through a decade of client work. I still respect it. But the gap between "edit this page" and "deploy this site" kept growing. Plugins fought each other. Updates broke custom fields. The admin filled with menus nobody asked for. Drupal was denser and more correct, and for many teams that density was the problem. Astro was a relief for marketing sites until the content model had to grow past Markdown folders and a headless CMS bolted on the side.

None of that is a moral failure of those tools. They serve millions of sites. My problem was different. I build products and platforms that need to stay owned. EU-hosted. Self-hostable when a client asks, and no surprise invoice from a managed headless plan when traffic spikes.

What I kept

I did not throw away everything I learned. Modular CMS keeps a real hook system. Roles and capabilities that mean something. Custom post types and fields as first-class pieces of the model, not a plugin afterthought. The admin is a SPA where that helps, and plain PHP templates where that is faster to ship.

Content is still content. Editors should not need a pull request to change a heading. Developers should not need a plugin marketplace to add a field. That middle ground is what I was chasing.

A tool you own ages with you. A tool you rent ages against you.

Something I kept saying until it stuck.

What I left out on purpose

No page builder that stores layout as unreadable blobs. No marketplace of themes that all look the same in six months. No auth vendor that owns your session cookies. If a feature does not earn its place in the core, it stays out. That sounds obvious, but leaving htings out is the hard part.

Every CMS gets fat because each request looks reasonable alone. A calendar. A slider. A "just one more" integration. The job is to say no to most of them, and to make the rest solid enough that you do not miss the rest.

Building in 2025 instead of 2000

The stack is kinder now. CSS covers layouts that used to need libraries. PHP 8 is fast enough that I stop apologising for it. MySQL does what we ask. Vue can sit on one screen without swallowing the site. That combination did not exist when I started. Waiting for a perfect moment would have meant never starting.

I still do not think everyone should build their own CMS. Most teams should pick something proven and get on with the work. I do think the math has shifted for studios that ship the same patterns over and over, and for products that need to stay under your roof. For us, starting over was cheaper than another year of workarounds.

Modular is live on our own sites and on client platforms. It is not finished but it does not need to be. It needs to stay small enough that I can still open a file and know what it does. And if we're being honest, webdevelopment is never really done, right?

Marten Timan writes from Utrecht. Reply via email: info@atypisch.nl

Also worth reading

Other posts from the studio.