ALMOST

A weekend of work, and real gaps remain.

Translation management: strings extracted from your repository, translated by people or machines, and merged back — with the context and the history a translator needs.

Promptfree, for everyone, and the only version there is
Build the translation workflow I actually need instead of Crowdin — and know what makes this ALMOST.

**Translation memory.** Every sentence you have already paid to translate, reused automatically the next time it appears. That is what makes the second language cheaper than the first, and it is a real asset that lives in this kind of tool. Losing access to it is the migration risk, not the software.

STACK
- Node 20+ with Fastify, server-rendered HTML
- SQLite through better-sqlite3, WAL mode, with FTS5
- Caddy in front

THE DATA MODEL
- strings: id, key, source_text, context, file, line, screenshot_path, is_plural, max_length, first_seen_at, removed_at
- translations: id, string_id, locale, text, status, translator_id, reviewed_by, updated_at — draft, translated, reviewed, approved
- memory: id, source_text, locale, text, source_project, used_count — **the asset, and it is exportable in a standard format or it is not yours**
- glossary: id, term, locale, translation, note, is_forbidden — the product names that must never be translated and the ones that must be translated one way
- Everything append-only enough that a translation's history is readable

GETTING STRINGS IN AND OUT
- Extract from the repository on every merge: the key, the source text, **the file and line**, and any comment the developer left
- Push translations back as a pull request rather than committing directly. That review step is what stops a broken placeholder reaching production
- Support the string formats you actually use — one per framework — with a fixture and a test each. This is the dull part and it is where the bugs are
- A string removed from the code is marked removed, never deleted. It comes back, and its translation with it

WHAT A TRANSLATOR ACTUALLY NEEDS, AND MOST TOOLS UNDERSERVE
- **Context.** The same English word is a noun and a verb, and 'Post' is either. A screenshot of where the string appears, or at minimum the developer's comment, is the difference between a good translation and a guess
- The maximum length, when the string sits in a button that cannot grow
- **Placeholders shown as placeholders**, and a check that refuses a translation which dropped one or renamed it. That single validation prevents most translation-caused crashes
- Plurals as the target language defines them — several languages have more than two forms, and a system with only singular and plural is broken in them from the start

MACHINE TRANSLATION, HONESTLY
- Useful as a first draft and labelled as one, in the data as well as the interface
- **Never published without a person clearing it**, and never for legal or safety text at all
- Translate with the surrounding strings as context rather than line by line, or pronouns and formality fall apart

THE MEMORY
- Every approved translation goes in. A new string matching one already there is offered with its match percentage
- **Exportable in a standard interchange format.** That is what makes the asset yours, and it is the first thing to check about any tool in this category, including this one

WHAT MATTERS MOST
Context for the translator and placeholder validation. The first decides the quality of what you get back; the second decides whether it crashes the application.

What you lose

  • A workflow professional translators already use, which matters when you hire them
  • Translation memory and glossaries that make the second language cheaper than the first
  • Integrations that open a pull request with the translations in it
  • File format handling for every framework’s idea of a string file

If you would rather not build

  • GNU gettext and its tooling, which predates all of this and still works
  • A folder of JSON files and a pull request, for two languages

The escape hatch

open source · no votes, no paid placement

Weblate

$0

Self-hosted translation management with memory, glossaries and repository integration.

WeblateOrg/weblatefree · open source

Tolgee

$0

Open-source localisation with in-context editing.

tolgee/tolgee-platformfree · open source

Why this verdict

our own opinion · changed only by a person

47/100

Verdict kinda at 47: the workflow is a fortnight, the file-format handling is the dull half, and the translation memory is the asset — which is why exportability is the thing to check first.

History

tracked since 14 Aug 2026 · nothing is ever overwritten

Interest · last 30 days

Nothing recorded yet. This chart fills in once the page has visitors, votes or prompt copies — it will not draw a flat line to look busy.

Questions about Crowdin

answered from the record above

Is Crowdin free?

No — the plan we track is $50 a month. Pro from around $50/month billed monthly, priced on hosted strings and seats.

Can you replace Crowdin by building your own?

ALMOST. A weekend of work, and real gaps remain. Replacement score 47 out of 100, build time a weekend. Read what you lose before you decide.

How much does Crowdin cost?

$50 a month on Pro — $600 a year. Recorded 14 Aug 2026.

What do you lose by replacing Crowdin?

A workflow professional translators already use, which matters when you hire them; Translation memory and glossaries that make the second language cheaper than the first; Integrations that open a pull request with the translations in it; File format handling for every framework’s idea of a string file. If any of those carry weight for you, keep paying.

Is there an open-source alternative to Crowdin?

Yes: Weblate, Tolgee. The prompt on this page is for when you want it your way instead.

Related entries

same category first, most replaced first

All 54 in Dev tools

Not sending yet

Every week, something stops being worth paying for.

New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.

free forever · no tracking pixel · stored here, never passed to anyone

Esc