Localization on autopilot.
Nothing broken lands.
Add a key and the loop runs to the end. Every locale is checked against the rules its format requires, and only what passes reaches your files.
14-day trial, no email · The CLI is free, no key needed
- deGerman{count} Elemente ausgewähltwritten
- frFrench{count} éléments sélectionnéswritten
- jaJapaneseアイテムを選択しましたrefused
placeholder_mismatch{count} dropped - ukUkrainian{count} елементів вибраноrefused
missing_keyno "many" form, so that count reads in English
Two ways
Same engine. Two ways to run it.
Pick the one that fits how you work. Most people end up using both.
Your agent, guarded
The loop runs where your agent already works, and it cannot quietly hand-edit a locale file.
$npm install -g @stringlane/cli$stringlane mcp .Install it, then point any MCP host at your project. Claude Code and Codex CLI take a plugin, Gemini CLI an extension, and the other five a config StringLane prints for you.
- Ten MCP tools, five of them write
- An exit code your CI can branch on
- Free. No key, no activation, no account
You in the seat
The same loop with a window: every locale side by side, every decision yours.
- Add a key into every locale file at once
- Problems flagged on the cell that caused them
- One-time licence, 14-day trial, no card
The guard
An MCP server cannot see this. A hook can.
Your agent has its own file tools, and the protocol never tells StringLane when one of them writes a locale file.
Before the write
Write · Edit · MultiEdit · NotebookEditthe guardYou are askedwith the sanctioned route named
After any tool runs
Basha session baselineYou are toldthe write already happened
Where a human can be asked, it asks and never refuses on its own; anything it cannot decide is allowed. Prevention covers the file-writing tools only. A shell write is caught after the fact, and no completeness is claimed for it.
| Host | Install | Write guard |
|---|---|---|
| Claude Code | Plugin | Asks you first |
| Codex CLI | Plugin | Asks you first |
| Gemini CLI | Extension | Refuses, and says how to lift it |
| Cursor | Config you paste | Refuses, and says how to lift it |
| Zed | Config you paste | Confirms, from Zed’s own permissions |
| OpenCode | Config you paste | Confirms, from OpenCode’s own permissions |
| VS Code Copilot | One command | Installs, but guards nothing yet |
| Windsurf | Config you paste | None |
Every host gets the real configuration, printed for the exact file it belongs in. Claude Code is the one host StringLane writes it for you. What each host gets, and what it does not.
Autopilot
Five stages. One of them says no.
It starts when you start it and stops when the files are written. Nothing watches your project.
- 01
Open
It finds every locale file, works out the format and the base language, and reads them in place.
- 02
Add
In the app a key lands in every locale file at once. From the CLI and your agent it lands in the base locale, and the next pass carries it to the rest.
- 03
Translate
Only what is missing or stale, sent with its description, its placeholders and your never-translate terms.
- 04
Check
Every locale, against the rules its format and its language require. As you type in the app, as an exit code everywhere else.
- Missing keys: per locale, and per plural form that locale requires.
- Placeholders: a dropped {name}, an invented one, a %@ where the source had %d.
- ICU and plurals: against what the target language requires under CLDR, not what the source had.
- Your own rules: never-translate terms and per-key length limits, from stringlane.yaml.
- Keys nothing calls: read from your source code, reported at info level, and never deleted for you.
Not checked: whether it reads well. Whether a German string fits its button is not a rule, and StringLane does not pretend it is. That is the human step, in the app’s side-by-side view.
- placeholder_mismatch
- missing_key
- untranslated
- markup_mismatch
Four of the codes it emits. Every one of them
Real output, abbreviated where marked. - 05
Ship
Written back in that format’s own conventions, so what you review is an ordinary git diff.
Or nothing is written at all.
From the command line and over MCP, every file the run would write is built in memory and parsed back before a byte lands. One structural error anywhere and the whole run is refused: your files are exactly as they were. In the app the same rules run as you type, flagged on the cell that caused them.
And again when you reword a source string: the moment translations go stale, with nothing else to tell you which.
Ten MCP tools, five of them write: apply_translations · add_key · add_locale · describe_keys · set_project_context
Pricing
One price for the app. Nothing for the CLI.
Two commercial answers, and no bundle in either direction.
Desktop app
Yours to keep, with updates inside the major version and three machine activations. Early-adopter price; $79 after launch.
Download the appCLI & agents
No key, no activation, no account, and no limit on machines, projects or CI runs. Licensed separately: buying one grants nothing on the other, in either direction.
AI translation is billed by your own provider: StringLane sells no credits. Full comparison
FAQ
Frequently asked questions
Does StringLane upload my localization files anywhere?
stringlane CLI both read and write the files already in your repository, so every change lands in your working tree and shows up in an ordinary git diff. Two deliberate exceptions, both opt-in and both yours: AI translation sends the strings being translated to the provider whose key you configured (or to a local model, in which case nothing leaves the machine), and the MCP server hands your strings to the coding agent that started it, running on your machine over stdin and stdout.What is the difference between the desktop app and the CLI?
stringlane check mean the same thing. The app is where you look: every locale side-by-side, issues clickable, edits made with full context. The CLI is where the loop runs without you: a report and an exit code in your terminal or CI, and through stringlane mcp the same loop inside a coding agent, which can add keys, translate and write back through the same checks. Most people end up using both. Compare them.Can I keep using Claude Code or another agent to do the translating?
stringlane mcp serves your project to any agent that speaks the Model Context Protocol: the agent's own model writes the translations, and StringLane does the reading, the validating and the writing, including creating the keys a new component references. No provider key is involved. Claude Code and Codex CLI install it as a plugin, which brings a write guard with it; Gemini CLI takes an extension; and for Cursor, Zed, OpenCode, VS Code Copilot and Windsurf, stringlane setup mcp --host <host> prints the entry in that host's own shape and names the file it goes in. Set up your agent.What if my files changed while a run was in progress?
stringlane.yaml, comparing each one to what was there when the plan was made. Edit any of them in between and the run stops and names what changed, so you re-plan against the files as they are now. Two runs cannot interleave for the same reason, and a lock left behind by a killed run is reclaimed with a warning, never silently. How that gate works.Does "autopilot" mean something runs in the background?
Does it check how a translation looks in the app?
Which file formats are supported?
.strings with its companion .stringsdict, Xcode .xcstrings String Catalogs, Flutter/Dart ARB, Android XML, and i18next JSON. Each parser was built and tested independently rather than shimmed on top of a JSON converter, and plurals work in each format's native shape.What does each one cost?
stringlane CLI is free: no key, no activation, no limit on machines or pipelines. They are licensed separately and neither includes the other. AI translation, when you use it, is billed by your own provider. StringLane sells no credits. Full comparison.Still have questions? Email us at support@stringlane.app
Start where you already work.
14-day trial, no email · The CLI is free, no key needed