Look man, I’m a normal human guy just like the rest of you tryna get rich without deleting myself from the planet from all the BS we have to go through to build the biggest, fastest, coolest websites, apps, and other garbage crap online (I love my job).
And while I’m not some 10x rockstar dev, I’m also not some vibe-coder shipping SaaS with no auth, no API protection, and no idea what CORS is. I know what’s up. I’ve banged my head against every wall these CMSs built for us — and I’ve got thoughts.
I’ve used them all — Strapi, Payload, Directus, and (unfortunately) KeystoneJS. After building real projects, hitting every limitation, and rewriting half my database structures like three times, here’s my no-fluff, no-corporate-BS breakdown of the best headless CMS in 2025.
🏆 My Rankings (From Best to Worst)
- Directus – Feature-rich, gorgeous UI, flexible, no paywalls, just works.
- Payload – Code-first powerhouse, but UI is mid and often frustrating.
- Strapi – Plugin king, but locked-down features (Paying for SSO????? PAYING FOR REVISIONS??????) and terrible on mobile.
- KeystoneJS – Like Payload but worse. Feels like suffering.
Let’s break it all down.
Directus: The Dashboard King 👑
Directus is what Payload wants to be — beautiful admin panel, instant REST + GraphQL APIs, dynamic layouts, and built-in stuff like maps, TinyMCE, revisions, flows, and granular roles. And it actually works on mobile (Strapi could never).
I’ve been using Directus on one of my business websites for like 2 years… I really like it a lot. I originally tried to use Strapi for that project and switched to Directus.
Pros:
- Admin UI is god-tier (mobile too)
- Fieldsets, tabs, repeaters, JSON blocks = super flexible
- TinyMCE for rich text = easy HTML rendering
- Blows Lexical Editors back out… RIP payload lexical.
- This is one of my MAIN reasons for choosing to go with Directus from now on (For now)
- The current app im developing needed titles with 2 colors. Lexical takes a lot to do that garbage. But its built into the TinyMCE editor and i can just limit the colors!!!!
- Instant APIs (REST + GraphQL) with no code
- Visual Flows, permissions, dashboards
- This is cool but also kinda not cool. I do enjoy living in the code more than I like navigating through UI to do stuff.
- No paywalls.
Cons:
- No real plugin system yet (but hooks/custom interfaces exist)
- This is only kinda true. One of my main concerns was SEO and they have an SEO plugin that actually seems pretty good.
- But this was an absolute pain to do on docker… Install, didn’t show up. Uninstall, restart, install, Failed because already in the database…
- Remove from database, install, works, can’t see fields…
- Open docker container go to the extensions folder. run npm install…
- Clear the cache a whole bunch… Still doesnt show up… Break website… Open private tab… Thing Appears…
- Finally got this working by disabling browser cache on my host, clearing my computers cookies, local storage on website, etc, etc.
- Now i can install plugins and they work pretty good!! not great but… pretty good.
- This is only kinda true. One of my main concerns was SEO and they have an SEO plugin that actually seems pretty good.
- All config done via UI (no code-based schema)
- No deep nesting or inline blocks in RTE (unlike Payload)
- You manage the database directly (mistakes can be painful)
If you want to move fast, support non-dev editors, and never look back — Directus wins.
🔥 Real talk: I’d take Directus over anything else right now. It lets me move fast and build clean stuff for clients and editors. Even if it’s not code.
Payload: The Dev Playground ⚒️
Payload is a TypeScript-first, code-defined CMS built for developers who like control. You write schemas in code, create layout blocks, and handle access logic inline. It’s powerful… but painfully dev-centric.
Pros:
- Code-first (TS) schema and access control
- Powerful layout blocks (If you build them right)
- Built-in auth, media library, GraphQL
- Media Library is garbage… No nested folders…
- Works great with Next.js, especially for structured pages
Cons:
- Admin UI is basic and not customizable
- Can’t group fields easily or have nested nav/folders
- No media folders or submenus in admin
- Rich text blocks can’t have inline embeds
- No plugins, everything is DIY (zero ecosystem)
Payload is for devs who want max control. But be warned: You’ll be writing everything yourself and explaining why the admin panel has no folders to your client.
Payload Rich Text: Cool Until It’s Not 💀
You ever just want to store some rich text inside a group in your schema and then Payload hits you with:
Color Pickers? In Lexical? LOL No 🎨🚫
TinyMCE lets you restrict a color palette in the UI.
Lexical? Nah. Want to give your editors the ability to make a heading two colors? Add foreground/background colors?
You have to build that yourself. Not configure. Not toggle. Build.
Inline styles = not supported. Color pickers = not built in. You’re either hacking around it or crying.
Wait… You Want HTML from Lexical?
Payload: “Sure! Just call lexicalHTMLField() and we’ll generate it.” or you can handle it on the front end!
So instead of getting HTML when you want it, you’re stuck doing extra work, scoping everything, and wondering why you’re not just using Directus with TinyMCE in the first place.
TL;DR: payload’s Lexical sucks…
Strapi: Powerful, But Paywalled (Kinda) 🔒
Strapi looks great on paper: plugin system, custom logic in Node.js, decent admin UI. But the more serious your use case, the faster you run into enterprise-only features. You want SSO? Revisions? Granular admin roles? Sorry, pay up.
It’s not that its necessarily paywalled and a deal breaker end of the world its everything else PLUS paying for SSO or post revisions… for Gods sake, Oauth and revisions cost me a monthly subscription??
Pros:
- Real plugin ecosystem (GraphQL, SEO, Sentry, etc)
- Like REALLY real. Directus plugins took me like 2 hours to figure out… While I was writing this.
- Code-defined models + logic (custom routes, middleware)
- i18n is first-class with great admin UX
- Great for building eCommerce APIs (ehhh… Nothing open source and free is great at ecommerce except for wordpress. This is a problem for another day…)
Cons:
- Admin UI is awful on mobile (literally unusable)
- Unusable and bad. mega mega bad. I like to control things from anywhere at any time.
- SSO, audit logs, workflows, field-level roles = 💰
- PAYING FOR SSO AND REVISIONS…
- Too much boilerplate for basic tasks
- Modals and sidebars are janky
- Preview features are manual and clunky
If you need plugins and backend code logic in a project with dev-only editors, Strapi is solid. But for modern teams with editors, designers, and clients — it’s frustrating.
KeystoneJS: Painful from the Start 😬
Keystone is for developers who like writing everything from scratch and hate convenience. Want to use a .env file? Install dotenv and wire it manually. Need rich text? Hope you enjoy Markdown or wiring up a custom field. Out of the box? It gives you almost nothing.
Pros:
- TypeScript-first schema with Prisma
- Full control over GraphQL
- Code-only logic (no magic)
Cons:
- No plugin system
- No folders in admin
- No good rich text editor
- Doesn’t load .env by default (why??)
- Admin panel is minimal, not visual
Payload is just better in every way. Never mention Keystone to me again.
Rich Text & Layout Blocks Comparison
| CMS | Rich Text Editor | HTML Output | Inline Blocks | Best For |
|---|---|---|---|---|
| Directus | TinyMCE/Quill | ✅ Yes | ❌ No | Blog-style content, easy UX |
| Payload | Lexical | ✅ Yes (using another field and a function to generate HTML on server) | ✅ Yes | Structured pages, app UIs |
| Strapi | Draft.js/Tiptap | ✅ Messy | ❌ No | Basic content editing |
| Keystone | Markdown | 🟡 Needs parsing | ❌ No | Devs writing docs |
Payload wins for inline blocks. Directus wins for WYSIWYG + clean output. Strapi and Keystone… try their best.
SEO, Live Preview, and eCommerce
SEO Support:
- Strapi: Best plugins, great i18n
- Directus: Manual setup, flexible
- Payload: DIY fields, no plugin help
Live Preview:
- Strapi: Works, iframe view possible, not real-time
- Directus: Webhooks, SDK, real-time possible with effort
- Payload: Works via custom preview URL, great with Next.js
eCommerce Compatibility
-
All platforms are viable for API-based eCommerce, but none match the out-of-box functionality of dedicated platforms like Shopify or WooCommerce.
Final Verdict 🧠💥
| Use Case | Best CMS | Why |
| Dynamic pages with layout blocks | Payload | Structured, code-first, dev-friendly |
| Rich WYSIWYG content | Directus | TinyMCE + HTML output = clean + simple |
| Mobile-friendly admin for clients | Directus | UI is responsive and beautiful |
| Building APIs with backend logic | Strapi | Plugin system, Node.js backend |
| Drag-and-drop fields, real editor UX | Directus | Tabs, fieldsets, dashboards, visual everything |
| Structured content + TypeScript dev | Payload | TS-native schema, access, blocks |
| Want to suffer and hand-roll everything | Keystone | No, just no. Don’t do it. |
TL;DR: Who Should Use What?
Directus probably… Yeah that sucks to hear doesn’t it. I get it, I also wanted to literally code everything myself. If i could take strapi’s plugins and add them to directus and take the ability to write my own collections in typescript like payload and roll it all together id be ecstatic. but we cant… We just can’t…
YES I Have Heard of <Insert CMS Name Here>
Bro… Yes.
Yes, I’ve heard of it. No, it didn’t make the cut. Why?
- Not open source / not self-hostable
- Requires special tooling to run
- Too small to be reliable
- Not a CMS (BaaS ≠ CMS)
This post is about headless CMSs only. Name a better one? I’ll wait.
