Open-source QA for your i18n locale files. No account, no server, no hosted API — bring your own LLM key, or use the structural checks with no key at all.
Your CI lints your JavaScript, typechecks your types, runs your tests — and then ships a de.json
nobody has read, produced by a model nobody audited.
en: "This will permanently delete your account"
es: "Esto guardará tu cuenta de forma permanente" ← "will save"
Every key present. Every placeholder intact. Build green. Key-diffing checkers pass that file. Only reading it catches it.
We run the check on public repos, verify every finding by hand against the source language, and send the fix upstream. In the first week: Solidus merged 13 pt-BR strings the same day, Plane merged a Czech fix in three hours, a nocodb maintainer swept all 39 locales off one issue, and an Excalidraw contributor added a placeholder-parity test suite off another. 64 repos scanned, 21 shipping a verified broken string, one row per repo with links: shipi18n.com/oss.
npx @shipi18n/cli check ./locales -s enStructural — deterministic, offline, no API key. Missing keys, dropped placeholders
({{name}}, %s, %1$s, $t(...), HTML), collapsed plurals, empty values, coverage.
Exit codes, SARIF for PR annotations, JUnit. JSON, YAML, gettext .po, XLIFF, Android strings.xml, Apple .xcstrings, Flutter .arb.
npx @shipi18n/cli check ./locales -s en --semanticSemantic — an LLM reads each source/translation pair and reports mistranslations, omissions and additions. Your key, changed keys only, 3-pass majority vote. Advisory by default: it warns, it does not fail your build.
Measured on a 228-pair corpus committed before the judge was written, thresholds fixed first: 54/54 planted errors caught, 12/168 false positives on clean pairs (7.1%), glossary 6/6. Label accuracy reproduced as a range, 98.1%–100%, across two runs. The harness is in the repo — run it against your own model.
Everything lives in one monorepo: Shipi18n/shipi18n
| Package | npm | What it does |
|---|---|---|
| @shipi18n/cli | check your locale files, translate them, lock hand-edited strings |
|
| @shipi18n/core | The engine — checks, LLM judge, translation. Use it as a library | |
| @shipi18n/mcp | MCP server — validators for Claude Code, Cursor and friends. No API key needed | |
| vite-plugin-shipi18n | Build-time translation for Vite | |
| shipi18n-github-action | — | check locale files in CI — SARIF PR annotations, no key; optionally translate what fails |
The MCP server's four validator tools (check_locales, check_glossary, diff_locales,
review_locales) make zero model calls — review_locales hands the pairs and the criteria back
to your agent, which does the judging with its own inference.
More: WordPress .po ↔ JED sync (wp-sync), a secret/PII pre-flight before any string reaches an LLM, and a --baseline mode to adopt on a catalog that already has findings. Runs without Node, too — the ghcr.io/shipi18n/cli Docker image, a pre-commit hook, or GitLab / Bitbucket CI.
Runnable examples live in the monorepo — examples/:
react (Vite + react-i18next),
nextjs (App Router),
vue (vue-i18n),
nodejs (@shipi18n/core).
Shipi18n used to be a hosted translation API with accounts and paid tiers. That service is shut down. There is no key to get and no bill to pay; the current tools run entirely on your machine against a provider you choose.
These packages are deprecated on npm and their repos are archived:
@shipi18n/api · i18next-shipi18n-backend · the standalone shipi18n-cli and
vite-plugin-shipi18n repos (the packages live on in the monorepo).
Apache-2.0 · shipi18n.com · Report a bug