Payload
payloadcms.com- Category
- Developer Tools
- Rank
- No. 699Tools index
- Pricing
- Freemium
- Type
- TOOL
- Use case
- Productivity & Collaboration
- Interfaces
- Host Plugin
- Builder
- payloadcms
- GitHub
- 45.6k stars
- Latest release
- v4.0.0-beta.6
- Date
About
TypeScript-native headless CMS. Open-source TypeScript CMS that runs as a Next.js plugin or standalone. Brings the CMS into your code repo — no external dashboard.
What it does
Payload is a backend for structured content and data, distributed as a library you import directly into your own application code rather than a separately hosted product. You define collections in code, typed configuration objects describing fields, relationships and rules, and it generates an editing interface plus working data endpoints from that definition. Server-rendered pages can also read the database directly through an in-process function call, bypassing network requests entirely. Authentication, granular per-operation permissions, versioned drafts, and a block-based rich text editor come included rather than bolted on afterward.
Why it's ranked here
The verdict is positive. The codebase splits cleanly into independent packages for each database and each framework integration (Postgres, MongoDB, SQLite, a Next.js adapter, a GraphQL layer), which is what real multi-backend support looks like rather than one adapter bolted on. Access control defaults to deny and combines a top-level policy with per-document rules using explicit AND logic. The GraphQL layer ships query complexity limits and disables introspection in production automatically. Password hashing already has a migration path built in for rotating to a newer scheme without breaking existing logins, a detail that only shows up in software that has already run in production.
What's good
The Local API is a genuine advantage: server code can call collection operations as plain function calls, in-process, with full type inference, no HTTP round trip needed for the common case of reading your own data. Access control is unusually granular, covering not just collections but individual fields, and functions receive the current locale so behavior can vary by region. The official plugin set already covers Stripe billing, multi-tenancy, SEO, search, and import/export, so common product needs don't require custom integrations. Deploy templates exist for both Vercel and Cloudflare with database and storage wired up automatically.
Tradeoffs
The stateless JWT option cannot be revoked once issued and stays valid until it expires even after a password change, a real footgun for a team that reaches for it without reading the fine print. The top-level access-control helper explicitly does not extend to field-level rules, custom endpoints, or direct database adapter calls, so teams still have to write those checks by hand. The Local API skips all access control by default, so server code that forwards user input into it without explicitly opting back in can bypass permission checks entirely.
How to use it well
Reach for this when a Next.js project needs a real content or data backend and you want one deployable unit instead of a separate CMS service to run and pay for. Start from the official starter template rather than a blank config: it demonstrates drafts, live preview, and the block editor together, which is faster than assembling those patterns from documentation alone. Lean on the official plugin set for common needs like billing or search instead of writing custom integrations. It fits less well when the content layer must be shared across services written in different languages, since its strongest advantages are JavaScript-side.
Technical notes+
package.json defines a monorepo named payload-monorepo, driven by pnpm and turbo, with workspaces spanning packages/* and test/* and dozens of package-filtered build scripts. packages/next/src/index.js is a one-line re-export of withPayload, the Next.js integration point. packages/db-postgres/src/index.ts and packages/db-mongodb/src/index.ts each wrap a lower-level driver (drizzle-orm and mongoose respectively) behind Payload's own createDatabaseAdapter interface, so the two adapters differ mainly in the options object they accept rather than in the operations Payload calls against them. packages/graphql/src/index.ts builds the GraphQL schema from the sanitized config and adds a query complexity rule plus a validation rule that blocks __schema and __type introspection fields when NODE_ENV is production. docs/access-control/overview.mdx documents baseAccess, a top-level config merged into every collection and global access check with AND semantics, and notes that Local API calls skip all access control by default unless they explicitly set overrideAccess to false.
Observed
- Language
- TypeScript, distributed as an npm package with separate framework and database adapter packages under the @payloadcms scope
- Packaging
- pnpm/turbo monorepo split into packages by concern: core, Next.js adapter, database adapters, GraphQL layer, rich text editor, CLI scaffolder
- Installation
- Scaffolded via a CLI generator or added directly as a dependency inside an existing application
- Interfaces
- In-process Local API, auto-generated REST API, and auto-generated GraphQL API, all built from the same collection config
- Database adapters
- Official adapters for Postgres, MongoDB, SQLite, Vercel Postgres, and Cloudflare D1/SQLite
- Deployment targets
- One-click deploy templates for Vercel and for Cloudflare Workers with R2 and D1, plus standard self-hosting
- Auth strategies
- HTTP-only cookies, JSON Web Tokens, and API keys, usable together or independently per collection
- Access control model
- Per-operation access functions (create/read/update/delete) at the collection, global, and field level, plus an optional top-level policy combined with document-level rules using AND semantics
Read from README.md, package.json, packages/payload/src/index.ts, packages/next/src/index.js, packages/db-postgres/src/index.ts, packages/db-mongodb/src/index.ts, packages/richtext-lexical/src/index.ts, packages/graphql/src/index.ts, packages/create-payload-app/src/index.ts, docs/authentication/overview.mdx, docs/access-control/overview.mdx, docs/configuration/collections.mdx.
Tags
Tech Stack
Media

Comments (0)
No comments yet
Editorially curated, with community endorsements as a secondary signal. Corrections welcome.