Skip to content

iOS .strings · .xcstrings · Flutter ARB · Android XML · i18next JSON

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

Localizable.xcstrings · 13 locales$ xcodebuild archiveBUILD SUCCEEDED
and yet
Source{count} items selecteditems_count · en
AI wroteResult
  • de{count} Elemente ausgewähltwritten
  • fr{count} éléments sélectionnéswritten
  • jaアイテムを選択しましたrefusedplaceholder_mismatch{count} dropped
  • uk{count} елементів вибраноrefusedmissing_keyno "many" form, so that count reads in English
2 written·2 refused·nothing broken lands
Your build approves all 13. The same rule runs in the app, in stringlane check, and over MCP.

Two ways

Same engine. Two ways to run it.

Pick the one that fits how you work. Most people end up using both.

Your agentFree
You in the seat$49 once

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 app is what the window shows. This is one detail of it, at readable size; see the whole window.

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 asked

    with the sanctioned route named

  • After any tool runs

    Basha session baselineYou are told

    the 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.

The MCP server speaks a protocol, so it works in all eight. The guard is built out of whatever each host lets StringLane intercept, so it does not.
HostInstallWrite guard
Claude CodePluginAsks you first
Codex CLIPluginAsks you first
Gemini CLIExtensionRefuses, and says how to lift it
CursorConfig you pasteRefuses, and says how to lift it
ZedConfig you pasteConfirms, from Zed’s own permissions
OpenCodeConfig you pasteConfirms, from OpenCode’s own permissions
VS Code CopilotOne commandInstalls, but guards nothing yet
WindsurfConfig you pasteNone

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.

  1. 01

    Open

    It finds every locale file, works out the format and the base language, and reads them in place.

  2. 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.

  3. 03

    Translate

    Only what is missing or stale, sent with its description, its placeholders and your never-translate terms.

  4. 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

    $ stringlane check . xcstrings · single-origin · base en4 locales · 10 keys · 64% complete   de      9/11       2 missing  en      11/11      complete  fr      9/12       3 missing  uk      1/13       12 missing 8 errors · 3 warnings · 0 info  error  missing_key  fr/items_count[many]:         Plural quantity "many" for         "items_count" is missing in "fr"  …10 more
    Real output, abbreviated where marked.
  5. 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.

    > git statusOn branch mainChanges not staged for commit:        modified:   MyApp/Localizable.xcstrings > git add MyApp/Localizable.xcstrings> git commit -m "l10n: add missing translations"[main 4a2f91c] l10n: add missing translations 1 file changed, 24 insertions(+), 2 deletions(-)
  6. 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

$49once

Yours to keep, with updates inside the major version and three machine activations. Early-adopter price; $79 after launch.

Download the app

CLI & agents

Free

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?
No, and there is nowhere for them to go: StringLane has no server. The desktop app and the 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?
The surface, not the answer. Both run the same parser and the same validator, so a clean project window and a green 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?
Yes, and that is the intended shape. 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?
It refuses rather than overwriting you. From the command line and over MCP a run takes a per-project lock and re-reads every file its plan could touch, including 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?
No. Nothing watches your project and nothing runs on a schedule. Autopilot means that once you start it, from a command, a menu action or an agent's tool call, the loop runs to the end: it works out what is missing or stale, translates it, checks every result and writes what passes, without you stepping through each locale. Commands start, do their work and exit. The MCP server lives only as long as your agent session, and the desktop app saves what you change and nothing else.
Does it check how a translation looks in the app?
No. StringLane checks what can be checked without running your app or speaking the language: missing keys per locale and per plural form, placeholders, ICU and plural structure against CLDR, guarded terms and length limits. Whether a German string fits its button or a Japanese sentence reads naturally is the human step, and the desktop app's side-by-side view with its character-width preview is where you do it. What each badge means.
Which file formats are supported?
Five, identically on both surfaces: iOS .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?
The desktop app is a one-time purchase: $49 while it is early-adopter priced, $79 after launch, with a 14-day trial that needs no email and no card. The 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