Directus vs Strapi vs Payload
All three are TypeScript headless CMSs with REST and GraphQL. Directus wraps an existing SQL database and generates its APIs from the live schema, with a Vue admin; Strapi defines content types as JSON schema files and syncs the database to them, with a React admin on Koa; Payload installs into your own Next.js app and reaches Postgres, SQLite or MongoDB through adapters.
- Directus
- TypeScript · NOASSERTION
- Strapi
- TypeScript · NOASSERTION
- Payload CMS
- TypeScript · MIT
- Updated
- 2026-09-26
Which one should you pick?
- You already have a SQL database and want APIs and an admin on top of it
- You need a less common database such as SQL Server, Oracle or CockroachDB
- You want user-written extensions to run in a separate V8 isolate
- You want content models as JSON files versioned in Git
- You want editors to build content types visually without writing migrations
- You want a plugin system that can add models, GraphQL types and admin tabs
- Your site is a Next.js app and you want the CMS in the same process
- You want MongoDB or Cloudflare D1 as an option alongside Postgres and SQLite
- You prefer the MIT license
Side by side
| Attribute | Directus | Strapi | Payload CMS |
|---|---|---|---|
| Written in | TypeScriptVue | TypeScriptJavaScriptHandlebars | TypeScriptCSSJavaScript |
| License | NOASSERTION | NOASSERTION | MIT |
| Frontend | VueVitePiniaVue Router | ReactTypeScript | ReactNext.js |
| Backend & APIs | ExpressKnex.jsGraphQLisolated-vm | Node.jsKoaGraphQL | TypeScriptNext.jsGraphQL |
| Data & persistence | PostgreSQLMySQL / MariaDB / SQLite / MSSQL / Oracle / CockroachDBRedis | PostgreSQLSQLiteMySQL | MongoDBPostgreSQLSQLiteDrizzle |
| Infrastructure & deploy | DockerStorage drivers (S3, GCS, Azure, Cloudinary, Supabase, local)pm2 | Docker | pnpmTurborepoVercel |
| Key decisions |
|
|
|
| Audited | 5cf557b · 2026-09-17 | 3cd7dba · 2026-09-17 | 9a2cdcb · 2026-09-17 |
How they differ
Where the content model lives
Directus reads the connected database and generates REST and GraphQL endpoints from its schema, so the database is the source of truth. Strapi keeps content types as schema.json files and creates tables, foreign keys and join tables to match them. Payload is configured in code inside a Next.js project and talks to the database through an adapter.
Server and admin
Directus runs an Express API next to a Vue 3 Studio built with Vite and Pinia; user extensions run in an isolated-vm sandbox, and Redis handles schema-cache invalidation across instances. Strapi runs on Koa with a React admin that includes a visual Content-Type Builder and a media library. Payload’s React admin, REST API and Local API are wired into Next.js route handlers by packages/next.
Hosting
Directus ships a two-stage Alpine image that runs as a non-root user under pm2 and defaults to SQLite until you point it at another database. Strapi is built with yarn build and run behind a reverse proxy against an external PostgreSQL or MySQL. Payload deploys like a normal Next.js app and offers host-specific starters for Vercel Postgres, Vercel with MongoDB and Cloudflare D1.
Architecture diagrams
Frequently asked questions
Which databases do Directus, Strapi and Payload support?
Directus uses Knex with drivers for PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle and CockroachDB; its Docker image defaults to SQLite. Strapi uses its own Knex-based layer for PostgreSQL, MySQL, MariaDB and SQLite. Payload uses adapters: MongoDB through Mongoose, and PostgreSQL, SQLite, Vercel Postgres and Cloudflare D1 through a shared Drizzle layer.
Does Payload need its own server?
No. Payload installs into an existing Next.js app: its admin UI, REST API and Local API run as Next.js route handlers in the same process, so it deploys like any Next.js project.
Is GraphQL built in?
Directus derives a GraphQL schema from the same data model as its REST API, with subscriptions over WebSockets. Strapi generates REST endpoints for each content type and adds GraphQL through an optional plugin. Payload keeps GraphQL in an optional package, so REST-only projects do not pull it in.
More architecture comparisons
View allAFFiNE vs AppFlowy
AFFiNE vs AppFlowy compared on architecture: React + Yjs vs Flutter + Rust, local-first storage, sync servers, native code and local AI.
Appsmith vs ToolJet vs Budibase
Appsmith, ToolJet and Budibase compared on architecture: Java vs NestJS vs Koa, MongoDB vs PostgreSQL vs CouchDB, sandboxing, plugins and deployment.
Authelia vs authentik vs Logto
Authelia, authentik and Logto compared on architecture: Go vs Django vs Koa, storage, OIDC providers, protocol support and how each fits a self-hosted stack.
Axum vs Actix Web
Axum vs Actix Web compared on architecture: Hyper and Tower vs an own HTTP stack, routing, middleware, crates in the workspace and who uses each.