shipglot

Open-source QA gate · Apache-2.0 · no account

Catch broken translations before they ship.

Placeholders, ICU plurals, tags, missing keys and glossary terms, checked in CI across 13 file formats. The gate reads your files where they are and sends nothing anywhere.

npx shipglot check
Add the GitHub Action

Hosted AI translation: free up to 500 keys, then from $12 a month, prepaid. It is not open yet; the gate works today.

messages/fr/common.json  2:12     error   placeholder-mismatch fr title  placeholder mismatch: missing {name}; unexpected {nom}           source: Welcome, {name}           target: Bienvenue, {nom}  4:12     error   markup-mismatch      fr terms  markup mismatch: missing <link>, </link>           source: Read the <link>terms</link>           target: Lisez les conditions messages/pl/common.json  3:12     error   plural-forms         pl items  plural {count} is missing categories few, many required by pl           source: {count, plural, one {# matter} other {# matters}}           target: {count, plural, one {# sprawa} other {# spraw}} 3 errors, 0 warnings, 1 info (hidden; use --verbose) in 3 files, 3 source keys, 2 target locales.
Sample project. The gate's own output, generated when this page was built; shipglot check exits with code 1.

13 formats, read and written in place

All guides

What it catches

All 17 checks

Placeholders

enWelcome, {name}
frBienvenue, renamed placeholder: {nom}

A renamed or dropped placeholder shows raw braces to users, or crashes the formatter.

placeholder-mismatch

Plural forms per language

plone · missing: few · missing: many · other
arzero · one · two · few · many · other

CLDR categories for every locale, gettext Plural-Forms headers and Laravel pipe rules.

plural-forms

Tags and markup

enRead the <link>terms</link>
frLisez les conditions missing: (lost tag)

Lost, renamed or unbalanced tags, changed link targets, and added attributes such as onclick.

markup-mismatch

Missing and leftover keys

Keys a locale lacks, and keys left behind after the source renamed or deleted them.

missing-key orphan-key

Glossary and brand names

Approved terms used for each locale. Brand names kept as written, with grammatical endings allowed where a language declines them.

glossary do-not-translate

Stale translations

A committed shipglot.lock flags translations whose source text changed after they were done.

stale-translation

Hosted translation · not open yet

New keys translated in CI, then checked by the same gate.

Models are chosen per language group by our model test battery, each with a fallback on another provider. Every string gets a decision log. Included in the price: one full pass over your keys into each target language every month. Prepaid credits beyond that.

$ npx shipglot translate

Get an email when it opens

  1. 1The primary model translates, with your glossary and context from the code that uses each key
  2. 2The QA gate checks every string; a failure gets one retry, then the next model
  3. 3A model from another vendor back-checks the meaning
  4. 4Written into your files by the format's own writer, or sent as a pull request from the reviewer editor

One meter: source keys. Every feature on every plan.

Pricing detailsHow it compares

Per month, charged upfront. Annual billing: two months free. Unlimited seats, languages and projects. Public open-source repositories: free, with a README badge.