When we started building Modulo CMS, we had a simple question: where will the content live?

We could have taken the classic route — WordPress, Strapi, or another monolith where content and presentation are intertwined. But we chose headless.

What Is a Headless CMS?

In a traditional CMS, content is tightly coupled with how it is displayed. WordPress renders HTML directly. Change the template and the entire website changes.

A headless CMS separates content from presentation. The CMS only handles content and API. The frontend (Nuxt, React, Next.js) fetches the content via API and displays it however it wants.

Advantages for the Dev Team

Frontend freedom — you can use any technology. Nuxt, Next, SvelteKit, Astro — the CMS does not care.

Better performance — a statically generated frontend without server-side logic is fast.

Simpler scaling — you can scale frontend and backend independently.

Content versioning — content in D1 has timestamps and author tracking.

Modulo CMS Approach

Our headless approach is slightly atypical: content lives in Cloudflare D1 (SQLite on the edge), not in Markdown files. The reason: dynamic content (reservations, contact forms, e-shop) requires a database.

The admin panel is a separate Nuxt app at admin.domain.com. The public website is another Nuxt app at domain.com. Both run on Cloudflare Pages, both share the same D1 database.

Conclusion

Headless is not for everyone. For a simple blog, WordPress might be faster to set up. But for a product like Modulo CMS — where admin and web must be independent but share data — headless is the only sensible choice.