Localize your app's UI without corrupting its logic.
vibe-lingual is the i18n-retrofit layer for vibe-coded apps. It classifies every user-facing string by kind, audits the stack for the gotchas that bite localization retrofits, then runs a confidence-routed extract → wire → translate → guard loop that mutates only with per-file backups and idempotent re-runs — deep on next-intl + App Router, honest about the rest.
Includes5 commands · 10 skills
Five commands across the localization retrofit.
From a read-only readiness scan to the guarded mutation loop, every step is a direct call. It mutates only with per-file backups — and every re-run is idempotent.
Classify every user-facing string.
Reads the codebase and tags every user-facing string by kind — JSX text, placeholder, aria-label, title, alt, toast, locale-sensitive date — then emits a six-block readiness brief. Read-only; nothing is changed.
Reach for it before you commit to a localization pass, to see the real surface.
Catch the i18n gotchas first.
Audits the stack for the traps that bite retrofits: firebase-admin in SSR, structural-vs-presentational Intl, the timeZone decision, RTL surfaces, dynamic-route guard globs. Names them before they corrupt a render.
Reach for it when the stack is non-trivial and you want the landmines mapped.
Extract, wire, translate, guard.
The confidence-routed mutation loop: extracts strings to catalogs, wires the components, translates, and guards the result. Mutates only with per-file backups; re-runs are idempotent. Deep on next-intl + App Router.
Reach for it when the scan looks right and you're ready to move strings safely.
Health-check the localization.
Catalog parity, the jsx-no-literals ratchet, and the guards that keep the localization honest as the app grows — so a new untranslated string shows up as a failed check, not a shipped bug.
Reach for it on every PR after the first localization pass lands.
State-aware router.
Reads where you are — scanned, wired, translated, guarded — and recommends the right next command. Asks before launching anything.
Reach for it when you're not sure where in the retrofit you are.
Scan, audit, localize, guard — codemod-safe.
The loop runs left to right: scan classifies every user-facing string read-only and writes a six-block readiness brief, audit names the stack-specific gotchas that corrupt i18n retrofits, localize runs the confidence-routed extract → wire → translate → guard codemod, and vitals holds the line afterward with catalog-parity and jsx-no-literals guards. Every mutation writes a per-file backup first, and every re-run is idempotent — run it twice and nothing doubles.
It is deep on next-intl + App Router: cookie-driven locale, a catalog parity guard, a jsx-no-literals ratchet that tightens as you translate, and the ESM jest patch the stack needs. For everything else there is a real adapter seam that reports an honest not-yet-implemented rather than mishandling a stack it doesn't fully understand — a decline you can trust beats a silent corruption.
It earned that trust by dogfooding on Celestia3: localizing most of a live app — 720 strings across ~67 components — surfaced four of vibe-lingual's own codemod bugs, and the safety rails caught every one before it reached a green branch. Structural-green ≠ works is the throughline — the tests passing is necessary, not sufficient; the dogfood on a real app was the truth at every scale.
Two channels.
Stable marketplace
Tagged releases, promoted via the Vibe Plugins marketplace.
/plugin marketplace add estevanhernandez-stack-ed/vibe-plugins /plugin install vibe-lingual@vibe-plugins
Canary bleeding edge
Latest main from this repo.
/plugin marketplace add estevanhernandez-stack-ed/Vibe-Lingual /plugin install vibe-lingual
Read-only scan + audit by default; the localize codemod mutates only with per-file backups and idempotent re-runs. Deep on next-intl + App Router; honest not-yet-implemented for other stacks.
One plugin in a family.
Vibe Plugins are a coordinated family — installed independently, composed when present.