Both teams at full speed. Neither waits, nothing breaks.
Marketing owns the content model. Engineering gets a typed client built from it.
Every CMS makes one side compromise.
Developer-first tools bury content teams in JSON and Git. Marketer-first tools hand engineers an untyped API and a prayer. The gap between the two is the whole job.
- Marketing owns the model.
- New collections, maps and fields in the interface, without a ticket and without a wait for the next release.
- Engineering gets a contract.
- A generated client that autocompletes the model marketing built and type-checks it at build time.
- Nothing breaks across the gap.
- Changes cross as information, never as breakage. A deleted field becomes a deprecation, not a failed build, and each team migrates on its own schedule.
Content
Content teams model it themselves.
Collections and maps, with the fields you actually need, designed in the interface the way you think about content. No ticket, no deploy, no waiting on another sprint.
- Collections and maps
- Twelve field types
- A table, not a form
Code generation
The model becomes an API your editor knows.
A Vite plugin reads the content model marketing built and writes a typed client into your repository. It keeps up as the model changes, and it never fails your build.
- Generated from the live model
- Autocomplete over real content
- Deletions arrive as deprecations
Analytics
Numbers that sit next to the words.
Product analytics routed through your own infrastructure and shown beside the content it belongs to. No consent banner, no blocked pixel, no fourth tab to go and check.
- Through your infrastructure
- No consent banner
- Attached to the content
AI
An assistant in the room, not in a side tab.
It reads your content model, drafts and rewrites copy, and can take a whole task. Anything that changes your content stops and waits for a human first.
- In the same session
- Approve before it writes
- Suggestions you accept or reject
Open source, and yours to run.
A CMS holds everything you have written. Being able to take it, host it and read how it works is not a feature we would want to charge for.
- Read the whole thing.
- The application, the client, the Vite plugin and the workers behind them are all public. Nothing that decides what happens to your content happens somewhere you cannot look at it.
- Self-host it for nothing.
- Deploy it to your own Cloudflare account and pay us nothing at all. The hosted cloud exists because most teams would rather not run it, not because it is a different product.
- Leaving is a supported path.
- Your content comes out through the same API it went in by, analytics already routes through your own infrastructure, and the content model is a file you can read.
Built for both sides of the gap.
The same product, read from whichever side of it you happen to sit on.
For marketing teams
Add the field, write the page, watch the numbers. No ticket.
For engineers
A typed client you did not write, that cannot break your build.
For publishers
A room full of writers, and one place the work happens.
For agencies
Hand over a CMS the client can extend without calling you.
For startups
The whole product, ten dollars a seat, no sales call.
For enterprises
Self-host it, with roles, permissions and an audit log.
Coming from somewhere else?
Honest comparisons against the CMSes teams actually weigh Stet against, including what each of them does better.
- W
Stet vs WordPress
The incumbent. Everyone can use it; nothing is typed.
- S
Stet vs Sanity
Structured content with the schema in your repository.
- C
Stet vs Contentful
The enterprise headless CMS, priced accordingly.
- P
Stet vs Payload
A code-first CMS that lives inside your Next.js app.
- S
Stet vs Storyblok
A visual editor over your own rendered pages.
- W
Stet vs Webflow
Design, host and edit in one place, if you build it there.
- S
Stet vs Strapi
Open source, UI modelling, deploys to change the schema.
- P
Stet vs Prismic
Page building from slices, priced per repository.
- D
Stet vs Directus
A data platform wrapped around your own SQL database.