Missing translation catcher for locale files
The idea
Teams that localise with plain JSON files all hit the same failure: someone adds checkout.discountBanner to en.json, ships, and German users see the raw key string in production. The gap is invisible in review because nobody diffs five locale files by hand, and it is invisible in staging because everyone tests in English. Full translation platforms like Lokalise fix this by taking over your whole workflow, which is exactly why small teams do not adopt them.
The wedge is living inside the PR instead of beside it. A CI check that fails on drift is a two-minute install, and machine-drafted placeholder translations mean the check never blocks shipping, it just makes the debt explicit and reviewable. Now is the right time because LLM translation drafts are finally good enough to ship behind a review marker.
Who pays
The buyer is a developer or team lead at a SaaS company selling into Europe, where a broken German UI costs real deals. Pricing is 9 to 29 dollars a month per private org, sold through GitHub Marketplace so billing rides the existing GitHub invoice. Distribution: free for public repos, which seeds the Action into open-source projects that maintainers then bring to work.
MVP scope
- CLI that deep-diffs locale JSON files against the source locale
- GitHub Action failing PRs on missing keys, orphaned keys and empty values
- One sticky PR comment with a per-locale gap table
- ICU placeholder mismatch detection
- Optional Claude-drafted translations committed with a review marker
- Skip for v1: YAML/gettext formats, a web dashboard, translator accounts, glossary management
Build i18n-guard, a Node.js CLI plus a GitHub Action that stops locale-file drift in the PR. Stack: Node.js (TypeScript, published to npm), a composite GitHub Action wrapping the CLI, Claude API for draft translations.
Core flow: the repo has a source locale (default en.json) and sibling locale files (de.json, fr.json, etc), flat or nested JSON. On every PR, the Action runs the CLI, which deep-diffs each locale against the source and reports three classes of problem: keys missing from a locale, orphaned keys that no longer exist in the source, and empty-string values. Any finding fails the check and posts a single sticky PR comment with a table per locale (update the same comment on subsequent pushes, do not spam new ones).
Optional autofix mode: with a CLAUDE_API_KEY secret set and autofix: true, the Action calls Claude to draft translations for missing keys, writes them into the locale files wrapped with a configurable marker suffix like " [MT]" or a parallel needs-review manifest, and pushes a commit to the PR branch. Send the surrounding keys of the same namespace as context in the prompt so terminology stays consistent.
Config lives in i18nguard.config.json: source locale, glob for locale files, ignored key patterns, ICU placeholder validation on or off. Validate that ICU placeholders like {count} match between source and translation; mismatches fail even when the key exists.
No web app, no dashboard. Free for public repos; 15 dollars a month per private org via GitHub Marketplace.
// More Dev tool ideas
-
Deprecation countdowns for the APIs you use
Stripe and Shopify deprecations hide in changelogs until things break; this scans your code for affected calls and gives you a countdown.
Dev tool 1 month -
App store reviews filed as GitHub issues
Bug reports buried in app store reviews never reach the tracker; this clusters new reviews and files deduped GitHub issues nightly.
Dev tool 1 week -
Nightly restore drills for database backups
A backup you've never restored is a guess; this restores your Postgres dump to a scratch instance nightly and proves the data is intact.
Dev tool 1 week -
Hosted monitoring and alerts for BullMQ queues
A stuck BullMQ queue can silently eat jobs for days; hosted dashboards, dead-letter alerts and retry controls without running Grafana.
Dev tool 1 week