A PR guard that fails the build before the regression ships
A GitHub Action that fails a pull request when a regression sneaks in, starting with untranslated UI strings. Free and live today; flaky tests and bundle-size checks are next if the demand is there.
An English string shipped to Japanese users because nobody caught it in code review. It happens the same way every time: someone writes "Save" instead of t("save"), the diff looks fine, the PR merges, and a user finds the bug before you do.
The check has to live where the mistake happens — the pull request, before it merges. Not a dashboard you remember to look at afterward.
The first check: untranslated strings
i18n-swarm is a GitHub Action that runs on every PR, diffs the change, and fails CI when a new hard-coded or untranslated UI string appears, or when translation keys drift out of sync between locales. It is a release gate, not another report to read later.
# .github/workflows/i18n.yml
- uses: greymoth-jp/i18n-swarm@v1What it catches:
- new un-keyed UI strings introduced in the diff
- missing translation keys, or a key that exists in one locale and not another
- (opt-in) files that shouldn’t contain user-facing text at all
If the codebase already has hard-coded strings scattered through it, i18n-swarm retrofit keys them for you. It parses the components with a real AST, rewrites the strings to translation keys, scaffolds the i18n runtime, and verifies the result with an actual build and test run — not a regex pass that guesses.
It’s free, MIT-licensed, self-serve. No account, no dashboard to sign into.
What comes after this one
The same shape — diff the PR, fail the build, comment inline — works for regressions that have nothing to do with translation. A test that only flakes on main. A bundle that grew 40kb because someone imported the wrong entry point. Those checks are next, and whether I build them depends on whether the first one turns out to be worth anything to the people running it.
Install the free check if you want it. And if a paid gate — flaky-test quarantine, bundle-size budgets, the same PR-blocking pattern — is something you’d use, say so below. The click is the only form it takes right now; there’s nothing behind it yet but a note that someone asked.