postgres-native, not postgres-backed
your content lives in real Postgres tables you can query, index, and back up. no proprietary store, no lock-in — point psql at it and read.
keep the editor calm, move content into tables you own, and use SQL alongside the delivery API. Apache-2.0 core, self-host free forever.
pepper migrate --from sanity
reading sanity schemas and dataset shape
mapping portable text fields for review
writing chili.config.ts + migrations
generated an import plan for review
done. your content is ready for Postgres.
Sanity stores your content in their Content Lake. ChiliCMS stores it in your Postgres, so you can query, index, and back it up yourself.
your content lives in real Postgres tables you can query, index, and back up. no proprietary store, no lock-in — point psql at it and read.
REST is the stable delivery path today. GraphQL covers the built-in content graph, and the SDK gives a typed helper while generated per-model clients mature.
Apache-2.0 core, no feature paywall. one container plus your Postgres. deploy it on a $40 box and keep your data.
tenant isolation is enforced in Postgres with FORCE ROW LEVEL SECURITY, not in app code you have to trust.
a real rich-text editor on Tiptap. every save is a draft; nothing goes live until you publish it.
the Studio keeps gradients out of data surfaces so repeated editing stays calm. your content path is one app container plus Postgres.
green check = we have it, habanero x = we lose this one, dash = limited or behind a tier. we kept our losses in the table.
| capability | ChiliCMS | Sanity |
|---|---|---|
| where your content livesreal Postgres tables you own vs Sanity's hosted Content Lake | ||
| self-host the full product, freeApache-2.0 core, no feature paywall vs Sanity's hosted-only backend | ||
| query content with SQLpoint psql at your tables vs GROQ against the hosted API | ||
| delivery APIs from one schemaREST today, GraphQL for built-ins, and a generic SDK while generated clients mature | ||
| row-level security per tenantFORCE ROW LEVEL SECURITY in Postgres, not app code you trust | ||
| price scales with workspace shape, not API callsmembers, environments, locales, entries vs metered API requests + bandwidth | ||
| published Pro priceper project, flat | $29/mo | $15/seat |
| real-time collaborative editing todaySanity ships live multiplayer now; our CRDT collab lands in v1.5 | ||
| GROQ-style queriesSanity's query language is genuinely good; we bet on SQL + GraphQL instead | ||
| years of production hardeningSanity has shipped since 2017; we are younger and say so | ||
| structured portable-text editor maturityTiptap is solid; Sanity's Portable Text tooling is deeper today |
one command migrates your Sanity dataset into your own Postgres. after that, your content is a table you can query with SQL, REST, or the generic SDK helper. GraphQL covers built-in content types today.
# one command reads your Sanity dataset and writes
# chili.config.ts + Postgres migrations with RLS policies
pepper migrate --from sanity --dataset production-- your content is a real table. point psql at it.
select id, title, published_at
from posts
where status = 'published'
order by published_at desc
limit 10;import { createClient } from "@chilicms/sdk"
const chili = createClient({ baseUrl: "https://api.chilicms.dev" })
const posts = await chili.list<{ title: string }>("posts")we charge for workspace shape — members, environments, locales, entries. no per-call metering, no surprise bills. self-host the Apache-2.0 core free, always.
self-host or evaluate, no card
solo devs and small product teams
funded startups and mid-market teams
regulated and 50+ seat orgs
enterprise features (SSO, audit log, SAML) are BSL-licensed — free to self-host under 10 seats, paid above. the core stays Apache 2.0.
No. Sanity is a hosted backend with GROQ and a great real-time editor. ChiliCMS is a Postgres-native CMS you run on your own infrastructure under Apache-2.0. The split is ownership: Sanity keeps your content in their Content Lake, we keep it in your database.
If you want real-time multiplayer editing today, lean on GROQ, or prefer a managed backend with years of production scale behind it, Sanity is the safer call right now. Our collaborative editing lands in v1.5, and we are younger. We would rather you read that here than find it after migrating.
Run pepper migrate --from sanity. It reads your dataset, writes a chili.config.ts schema, and generates Postgres migrations with row-level security. Portable Text maps to Tiptap content; we flag any field that needs a manual review instead of dropping it silently.
Sanity meters API requests and bandwidth, so a traffic spike can move your bill. ChiliCMS charges for workspace shape: members, environments, locales, and entries. The Enterprise floor is printed publicly at $1.5k per month, with no contact-us wall under that.
This is a place Sanity beats us today. Sanity ships live multiplayer editing now; our CRDT collaboration on Tiptap and Yjs is scheduled for v1.5. Until then, every save is a draft and publishing is explicit, so two editors will not silently overwrite each other.
Migrate your Sanity dataset with one command, keep your data in a database you own, and self-host the Apache-2.0 core free forever.