Vai al contenuto
Better Content

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 models

Content model · blog-posts

One chainable call per screen
.from("blog-posts").language("tr")

Ask for a language and get that language — fallbacks handled for you.

Relations & expand
.expand(["author", "category"])
Draft → published

One entry · three languages

Per-field localization

blog-posts · tr

localized

blog-posts · de

localized

blog-posts · ja

localized

MCP for agents
createContentEntry()

Better Content

Edge delivery

Content model · blog-posts

titletextlocalized
bodyrichtextlocalized
localized_slugtextlocalized
authorrelation → authors
publishedAtdatetime

One entry · three languages

EnglishShipping i18n without a TMSpublished
TürkçeTMS olmadan i18n yayınlamakpublished
Deutschi18n ausliefern ohne TMSdraft

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.
app/blog/page.tsx
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.

Better I18N

UI strings

Keys scanned from code, translated with glossary context, published to the edge.

Better Content

Long-form entries

Modelled content with per-field localization, drafts, and relations.

Better Analytics

What readers actually open

Views by entry, language, and country — so you translate what earns attention.

La pubblicazione tramite CDN è incredibile. Carichiamo le traduzioni e sono online all'istante: nessun deploy, nessuna invalidazione della cache.

Tevfik Can Karanfil

Fondatore, 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.