Headless and themed
Render with PHP themes or pull through the JSON API. Same content model, no rebuild, no second system to keep in sync.
Modular is a security-first CMS for teams who outgrew WordPress but miss its flexibility. Built-in field management, relational models on MySQL, role-based access. No plugin roulette.
1// Fetch a published post through the headless API
2const res = await fetch(
3 'https://cms.acme.eu/api/v1/public/posts/field-notes?type=articles'
4)
5
6const post = await res.json()
7
8post.title //=> "Field notes, no. 7"
9post.slug //=> "field-notes"
10post.author.name //=> "Lena Vos"
11post.status //=> "published"
One core that ships with the parts most teams bolt on after the fact, modeling, access control, an API, and nothing you have to vet a marketplace for.
Render with PHP themes or pull through the JSON API. Same content model, no rebuild, no second system to keep in sync.
ACF-style field builder in the UI. Define types, validation and relations without a single plugin or YAML file.
Role-based permissions, hardened defaults and tracked schema migrations are in the core, not a paid add-on.
Your servers, your database, your data. GDPR-friendly by default and fully open source. No vendor lock-in.
Marketing site rendered server-side for speed and SEO. Mobile app and storefront fed by the API. You model it once, Modular handles both.
One schema powers themes and the API at the same time.
Go headless for a new channel without migrating anything.
Plain templates and a small helper API. No build step required.
We rebuilt our content model around relations instead of duplicated fields. Here is what changed for the editorial team.
The short version: fewer screens, fewer mistakes, and a single source for every channel.
{
"id": 142,
"title": "Field notes, no. 7",
"slug": "field-notes",
"status": "published",
"post_type": "articles",
"published_at": "2026-03-12T09:00:00",
"author": { "name": "Lena Vos" },
"content": {
"cover": { "type": "image", "data": { "url": "/media/fn-7.webp" } }
}
}
An ACF-style field builder backed by real relational tables in MySQL. Define a field, and it shows up in the editor, the validation layer and the API response, instantly.
{
"id": 142,
"title": "Field notes, no. 7",
"slug": "field-notes",
"post_type": "articles",
"author": { "id": 7, "name": "Lena Vos" },
"content": {
"cover": { "type": "image", "data": { "url": "/media/fn-7.webp" } },
"body": { "type": "wysiwyg", "data": "<p>…</p>" }
},
"published_at": "2026-03-12T09:00:00"
}
On the public post endpoint, relationship fields resolve to nested objects and the author is included. Each field keeps its type. Change the model in the admin and the editor, the stored data and the API response follow.
No marketplace to audit. No abandoned plugin holding a CVE. Security lives in the core, and it ships hardened.
Granular access per collection, field and action. Roles are first-class, not retrofitted onto a flat user table.
CSRF protection, scoped API tokens, rate limiting and secure headers on from the first request.
Every model change is a tracked, reversible migration. Promote from staging to production with confidence.
Plugins made WordPress endless, and impossible to trust. Modules are our answer: one curated, API-first extension per job, reviewed by us and supported in the core. Anyone can build one. Only the ones we approve ever show up in your install.
Browse all modulesNo twelve competing SEO plugins. We develop a single official module for each capability, held to one standard, so there is never a question of which one to trust.
Every module is built API-first and connected through the core, permissions, migrations and the headless API included. Not bolted on the side, part of the system.
Build your own freely. But until it meets our every demand and we sign off, it is unsupported and invisible to the platform. No marketplace, no surprise CVEs.
Meta tags, sitemaps, canonical URLs, structured data and redirects. Managed in the admin, served by your themes and the API alike.
Per-field localisation, language fallbacks and a translation workflow. One content model, every locale, resolved through the same API.
Accounts, comments, profiles and moderation. Add a members layer to any project without standing up a second system to keep in sync.
Commerce, forms, search and analytics are on the roadmap. Each one built to the same bar before it ever ships.
Some modules are commercial. Built and maintained by Atypisch, paid modules fund Modular's open-source core, so the platform itself stays free and open, for good.
Predictable queries, typed responses and a stack you already know, PHP on the server, Vue in the admin. Pick the client that fits the job.
Read a post or a list of a type. No query language and no client library to learn.
The public post endpoint resolves relationship fields and includes the author.
Helpers like get_posts() and get_post(). No build step, no SDK.
// List published articles over the headless API
const res = await fetch(
'https://cms.acme.eu/api/v1/public/posts?type=articles'
)
const { posts } = await res.json()
posts[0].title //=> "Field notes, no. 7"
posts[0].slug //=> "field-notes"
posts.length //=> up to 100 published posts
<?php
// Same content, rendered by a Modular theme
$posts = get_posts([
'post_type' => 'articles',
'posts_per_page' => 10,
'orderby' => 'published_at',
]);
foreach ($posts as $post): ?>
<h2><?= e($post['title']) ?></h2>
<?php endforeach; ?>
# a list of one post type
curl "https://cms.acme.eu/api/v1/public/posts?type=articles"
# a single post, relations and author resolved
curl "https://cms.acme.eu/api/v1/public/posts/field-notes?type=articles"
Modular is MIT-licensed and developed in the open. The roadmap is public, the code is auditable, and your data never leaves infrastructure you control.
No seats to count, no SaaS tier gating your API, no clause that turns the lights off if you stop paying. Self-host it, fork it, ship it.
A like-for-like look at what ships in the box. Headless-only tools skip themed rendering; classic CMSs bolt the API on later.
| Modular | WordPress | Directus | Storyblok | Payload | Drupal | Strapi | |
|---|---|---|---|---|---|---|---|
| Headless API, native | |||||||
| Themed (server-rendered) | |||||||
| Field management, no plugins | |||||||
| Role-based permissions | |||||||
| Self-hosted | |||||||
| EU data control | |||||||
| Open source | |||||||
| Field-level permissions | |||||||
| Headless and themed, one install | |||||||
| Versioned schema migrations | |||||||
| Security hardening in core, no plugins | |||||||
| Public RFC roadmap | |||||||
| Visual block editor | |||||||
| Advanced custom fields, built in | |||||||
| Built-in multilingual content | |||||||
| REST API in the core | |||||||
| Stack | PHP · Vue | PHP | Node · Vue | SaaS | Node · React | PHP | Node · React |
Comparison reflects out-of-the-box capabilities. indicates partial support or requires extra modules. Last reviewed May 2026.
Spin up Modular with Docker in minutes. Model your content, ship a theme, or point your app at the API. Self-hosted, open source, yours.