Better i18n — Localization infrastructure for modern apps. CMS + TMS + CDN + AI + MCP.
- Dashboard: https://dash.better-i18n.com
- Docs: https://docs.better-i18n.com
- CDN: https://cdn.better-i18n.com
- API: https://api.better-i18n.com
- Canonical skill repo (keeps sub-references in sync): https://github.com/better-i18n/skills
Package versions
| Package | Install |
|---|---|
@better-i18n/next |
npm install @better-i18n/next |
@better-i18n/use-intl |
npm install @better-i18n/use-intl |
@better-i18n/core |
npm install @better-i18n/core |
@better-i18n/expo |
npm install @better-i18n/expo |
@better-i18n/sdk |
npm install @better-i18n/sdk |
@better-i18n/cli |
npx @better-i18n/cli |
@better-i18n/mcp |
npx -y @better-i18n/mcp |
@better-i18n/mcp-content |
npx -y @better-i18n/mcp-content |
Quick decision tree
| Scenario | Use |
|---|---|
| Next.js app (App Router or Pages) | @better-i18n/next + middleware + requestConfig |
| Vite / TanStack Router SPA | @better-i18n/use-intl with SSR messages prop |
| React Native / Expo | @better-i18n/expo with initBetterI18n() + MMKV storage |
| Hono / Node backend | @better-i18n/server singleton at module scope |
| Remix / Shopify Hydrogen | @better-i18n/remix |
| Headless content (localized CMS) | @better-i18n/sdk + createClient() |
| Agent workflows | MCP servers @better-i18n/mcp + @better-i18n/mcp-content |
| CI/CD translation sync | @better-i18n/cli scan/check/doctor/sync |
Canonical reference topics
The canonical skill on GitHub ships 11 reference docs that drill into each topic. Agents should fetch these as needed:
Non-negotiable rules
projectis always"org/project"format (e.g."acme/dashboard") — validated at runtime.- Default locale has NO URL prefix (
/about= English,/tr/about= Turkish). - CDN uses lowercase BCP 47 locale codes (
pt-BR→pt-br). UsenormalizeLocale(). createServerI18nand server-side factories must be SINGLETON at module scope — TtlCache is shared.- Agent MCP workflows: ALWAYS
listKeysfirst, then decide betweencreateKeysvsupdateKeys. Wrong namespace = phantom keys. - SSR pattern: Pass
messagesprop from server loader → provider skips client-side fetch.
Typical agent workflows
Add a language to a project
mcp__better-i18n__proposeLanguages({ projectSlug, languages: ["fr", "de"] })- Review proposal → agent approves
mcp__better-i18n__publishTranslations({ languages: ["fr", "de"] })
Translate pending keys
listKeys({ status: "missing", language: "fr" })→ get key listgetTranslations({ keyNames, language: "en" })→ source text- Model generates translations
updateKeys({ translations: [...], language: "fr" })publishTranslations({ languages: ["fr"] })
Integrate a new CMS entry
listContentModels()→ find target modelcreateContentEntry({ modelSlug, translations: { en: {...}, tr: {...} } })— include ALL languages in ONE callpublishContentEntry({ id })
Scan a repo for missing keys
npx @better-i18n/cli scan # extracts t() calls
npx @better-i18n/cli doctor # health report
npx @better-i18n/cli sync # pushes new keys to platform
Source: better-i18n/oss — distributed by TomeVault.