Stacks / Backend
Payload / Strapi
A headless CMS you host. Payload and Strapi are MIT. Directus is source-available (MSCL) — not the OSI path.
The problem
Contentful Lite is $300/month. Sanity Growth is $15/seat/month. Strapi Cloud Starter is $35/project/month. You wanted a content API and an admin you can move. Payload is MIT (Node + Postgres or Mongo). Strapi's self-hosted Community Edition is MIT — Cloud is the hosted meter this page replaces. Directus is MSCL-1.0-GPL (internal use OK; Competing Use is forbidden; GPL-3.0 after four years) — do not call it open source.
Replaces
Contentful / Sanity / Strapi Cloud
Estimated SaaS saved
$3,600
per year, small team, before lock-in
Start on RailwayGhost / WordPress if this is a site, not a headless API
Placeholder: Payload (Node + Postgres) or Strapi Community + a database and a volume for uploads. No one-click template in this repo yet — Start on Railway. Do not deploy Directus and call it open source.
The stack
Cost table
| You stop paying | Typical / year | Self-host instead |
|---|---|---|
| Contentful Lite | $3,600 | Payload or Strapi + Postgres |
| Strapi Cloud Starter / Pro | $1,200 | Strapi Community on the same box |
Agent setup prompt
Replace Contentful, Sanity, or Strapi Cloud with Payload (preferred) or self-hosted Strapi Community. Do not install Directus and call it open source — it is MSCL (source-available, Competing Use forbidden). - Payload: Node + Postgres (or Mongo), bind HTTP to 0.0.0.0:$PORT, uploads on a volume. - Strapi Community: Node + a database. This is not Strapi Cloud. - Rebuild the three content types you actually query. Lock the admin. Write AGENT_PROMPT.md.
Also as markdown: /stacks/directus-cms.md
FAQ
- Why not Directus?
- Directus is useful, and it is not OSI open source. The current license is MSCL-1.0-GPL: internal use is fine, selling a competing hosted Directus is not, and GPL-3.0 only kicks in after four years. Payload and Strapi Community are MIT today.
- Payload or Strapi?
- Payload if you want TypeScript collections next to a Next.js app. Strapi if the team already knows that admin. Ghost is a publisher, not a headless API — /replace/wix.