A headless CMS that speaks every language
Model your content once, query it with a chainable SDK, and serve each locale from the edge — no separate translation pipeline, no duplicated entries per language.
Content model · blog-posts
One entry · three languages
3 locales · 2 published · 1 draft
01 · Query
One chainable call per screen
The SDK reads like a database client: pick a model, filter it, expand its relations, and ask for a language. What comes back is already localized.
- Filter, sort, and paginate without writing an API layer.
- Ask for a language and get that language — fallbacks handled for you.
- Expand relations in the same round trip instead of N+1 requests.
const { data } = await client
.from("blog-posts")
.language("tr")
.expand(["author", "category"])
.eq("status", "published")
.order("publishedAt", "desc")
.limit(10)200 OK · 41ms · edge cache HIT
10 entries · tr · author + category expanded
02 · Capabilities
Everything a localized CMS actually needs
Content modelling, per-field localization, and publishing states — with the same MCP and CDN plumbing the translation platform uses.
Content models
Define fields once in the dashboard; every entry inherits the schema and its validation.
Per-field localization
Mark a field localized and it stores one value per language — including URL slugs.
Relations & expand
Link authors, categories, or products and pull them in one request with expand.
Draft → published
Entries carry a status, so unfinished translations never reach production readers.
MCP for agents
AI agents create, translate, and publish entries through typed MCP tools instead of scraping an admin UI.
Edge delivery
Reads are served from the same CDN as your translations, with stale-while-revalidate resilience.
03 · Adapters
Drop it into the framework you already ship
One provider, one hook. The adapters differ only in how they hook into each framework's lifecycle.
Next.js
@better-i18n/content/adapters/nextjs
React
@better-i18n/content/adapters/react
Expo
@better-i18n/content/adapters/expo
Vue
@better-i18n/content/adapters/vue
Svelte
@better-i18n/content/adapters/svelte
Vanilla JS
@better-i18n/content
04 · Better together
Content and translations on one CDN
Entries and UI strings publish through the same pipeline, so a release never ships half-translated: the copy in your interface and the content in your CMS go live together.
UI strings
Keys scanned from code, translated with glossary context, published to the edge.
Long-form entries
Modelled content with per-field localization, drafts, and relations.
What readers actually open
Views by entry, language, and country — so you translate what earns attention.
“CDN 게시 기능이 정말 놀라워요. 번역을 푸시하면 즉시 라이브로 반영됩니다 — 배포도, 캐시 무효화도 필요 없어요.”

Tevfik Can Karanfil
창업자, Carna
Get started
Model your content once, publish it everywhere
Create a model, add your first entry, and read it back in three languages — free while you evaluate.