Skip to content
STACK IT FAST

Directus vs Strapi vs Payload

Architecture comparison 3 projects Built from source-audited deep dives

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?

Pick Directus if…
  • 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
Pick Strapi if…
  • 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
Pick Payload CMS if…
  • 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
  • The database layer is Knex-based, not a heavier ORM
  • Studio, API, and SDK are separate pnpm workspace packages that compose into one server
  • Extensions execute inside an isolated-vm sandbox, not the main process
  • Modular plugin architecture with dynamic schema composition
  • Database abstraction via Knex query builder layer
  • Declarative Content-Type Schema Builder
  • Four database adapters share one export contract
  • Payload installs into an existing Next.js /app folder, not a standalone server
  • GraphQL ships as an optional package, not a core dependency
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

Directus Open SVG
Directus architecture diagramStudio → @directus/api (REST); Apps & SDK → @directus/api (REST); Apps & SDK → GraphQL (GraphQL); AI clients → @directus/api (MCP); GraphQL → @directus/api (resolvers); @directus/api → Your database (Knex); @directus/api → Redis (schema cache); @directus/api → Extensions (hooks · endpoints); @directus/api → Asset storage (files)CLIENTSSERVICESWORKERS & JOBSDATA & STORAGEEXTERNALStudioVue · PiniaApps & SDKREST · GraphQLAI clientsMCP@directus/apiExpress · KnexGraphQLgraphql-compose · wsExtensionsisolated-vmYour databasePostgres · MySQL · SQLite …Rediscache · pub/subAsset storageS3 · GCS · Azure · localresolversRESTRESTGraphQLMCPhooks · endpointsKnexschema cachefiles
Strapi Open SVG
Strapi architecture diagramAdmin panel → Strapi server (admin API); Frontends & apps → Strapi server (REST); Frontends & apps → Plugins (GraphQL); Strapi server → Plugins (extend); Strapi server → Database (Knex); Plugins → Media library (files)CLIENTSSERVICESDATA & STORAGEAdmin panelReact · content-type builderFrontends & appsREST · GraphQLStrapi serverNode.js · KoaPluginsGraphQL · upload · RBACDatabasePostgres / MySQL / SQLite (Knex)Media libraryuploadsextendadmin APIRESTGraphQLKnexfiles
Payload CMS Open SVG
Payload CMS architecture diagramAdmin panel → Next.js app (admin routes); Your frontend → Next.js app (REST); Your frontend → GraphQL (GraphQL); Next.js app → Payload core (Payload API); GraphQL → Payload core (resolvers); Payload core → Database adapter (Drizzle · Mongoose); Payload core → Upload storage (uploads)CLIENTSSERVICESWORKERS & JOBSDATA & STORAGEEXTERNALAdmin panelReact (packages/ui)Your frontendREST · GraphQLNext.js appPayload route handlersPayload corecollections · hooksGraphQLoptional packageDatabase adapterPostgres / SQLite / MongoDBUpload storageS3 · Azure · GCS …Payload APIadmin routesRESTresolversGraphQLDrizzle · Mongooseuploads

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.