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.
schema-as-code, draft-vs-published clarity, and content in plain Postgres tables. open source, Apache-2.0, self-host free forever.
pepper migrate --from hygraph
reading hygraph schema and fields
mapping to chili.config.ts (schema-as-code)
writing migrations + RLS policies
generated an import plan for review
done. your content runs on your Postgres now.
schema-as-code, REST-first delivery, and a Studio that stays out of your way.
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.
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.
curl https://api.chilicms.dev/v1/posts \
-H "Authorization: Bearer $CHILI_TOKEN"query Posts {
posts(status: PUBLISHED) {
id
title
publishedAt
}
}import { createClient } from "@chilicms/sdk"
const chili = createClient({ baseUrl: "https://api.chilicms.dev" })
const posts = await chili.list<{ title: string }>("posts")a teaser, not the whole story. the full vs-* pages mark every place we lose, not just where we win.
| capability | ChiliCMS | Contentful | Hygraph |
|---|---|---|---|
| self-host, free foreverApache-2.0 core, no feature paywall | |||
| your content in real Postgresquery it with psql, no proprietary store | |||
| schema-as-code in version controlchili.config.ts is canonical; the GUI is generated | |||
| starting priceper project, per month | $0 | $300 | $299 |
| visual page builderwe are structured-content only, on purpose |
Yes. The core is Apache-2.0 and self-host is free forever, with no feature paywall, no seat caps, and no CLA. Enterprise add-ons live under a separate BSL licence that auto-converts to open source after four years.
It runs on your Postgres 16+ with row-level security forced on every tenant table. No separate datastore, no Redis; the content path is one app container plus your database.
Run pepper migrate --from hygraph. It reads your models and fields, writes chili.config.ts plus the Postgres migrations and RLS policies, then generates an import plan you review before cutover.
Every save is a draft until you publish it. Published content carries a dedicated green state with a label, so editors always know what is live without reading colour alone.
Yes. Your schema is canonical in chili.config.ts and the Studio generates the editing UI from it. The GUI never owns the schema, so your content model stays in version control and ships in pull requests.
schema-as-code, draft-vs-published clarity, self-host free forever. Apache-2.0, no CLA, no feature paywall.