Skip to content

Compare · Lingui

For React or Solid teams already committed to source-derived messages and PO catalogs, but now feeling the drag of their extraction and catalog workflow.

The same idea, on an engine 30× faster.

Lingui got the authoring model right, and we are not going to pretend otherwise — write the message where the UI happens, let the source string be the identity, keep catalogs translators already know. Palamedes agrees with every part of that, then replaces the machinery underneath: one Rust core instead of a JS plugin stack, one runtime access model instead of several.

Licence
MIT
Identity
Source-derived or explicit IDs
Catalogs
.po, native
Checked benchmark
30× slower

Lingui figures: @lingui/core 6.5.0, researched July 2026. Projects move; re-check before you decide.

01 — Decide

Choose the model that leaves you with less recurring work.

For the audience above, we recommend Palamedes. The alternative is not a disclaimer: if the right column describes your constraint, choose Lingui and do not think twice about it.

Pick Palamedes when…

  • Extraction has become a real cost in CI or your pre-commit hook — 30× on the checked realistic extract + catalog-update workflow is the difference between a pause and a coffee break.
  • You want exactly one runtime access model across server components, client islands and backend code.
  • You want catalog semantics, audits and ICU diagnostics from one engine instead of several layers that can disagree.
  • You are on React or Solid and expect to change meta-framework at some point.

Pick Lingui when…

  • You need Vue or React Native. Palamedes has neither and will not fake it.
  • You depend on a Lingui plugin or TMS integration with no Palamedes equivalent yet.
  • You want the option of explicit message IDs for part of your catalog.

02 — Daily work

What changes after the choice is made.

These are workflow consequences, not a feature inventory: fewer conventions to maintain, one catalog boundary to review, and one runtime model to carry through the supported hosts. Each point maps back to an inspectable artifact.

One runtime model, not several entry points

Palamedes exposes exactly one way for transformed code to reach the active instance: getI18n(). No provider tree to thread, no second hook for server components, no separate path for RSC. The same call works in a Next.js server component, a Solid island, and an Express handler — which means the runtime chapter of your onboarding doc is one paragraph long.

Inspect the checked extract-and-update result

Catalog semantics in one native engine

Parsing, updating, auditing, ICU diagnostics and artifact compilation all live in one Rust core, not spread across JS plugins. The speed is the visible consequence; the useful one is that the same catalog semantics apply no matter which adapter called them, so an audit result cannot depend on which side of the toolchain asked.

Inspect the checked extract-and-update result

One identity convention, permanently

Lingui lets you choose between source-derived IDs and explicit custom IDs. Palamedes does not offer the second path, on purpose: identity is the source string plus optional context, full stop. That is one fewer decision at the start and one fewer schism at year three, when half the catalog has drifted into a naming convention nobody wrote down.

Inspect the checked extract-and-update result

03 — Lingui

Where the competitor is the stronger fit.

The strengths and trade-offs below are sourced from the dated research for Lingui. They explain why the right decision can genuinely be Lingui, even when Palamedes is our recommendation for the audience above.

Competitor strength

What Lingui earned

  • Macro-based authoring, source-derived identity and native PO catalogs form a coherent client-to-catalog workflow.
  • Genuinely broad framework support: React, React Native, Vue 3, SolidJS and vanilla JS are first-party, not community ports.
  • Native ICU MessageFormat and first-class .po catalogs, so translator tooling works without adapters.

Trade-off

What that history costs you

  • v6 was a hard cut — ESM-only, Node ≥22.19, YAML config removed, and a changed auto-ID encoding that forces manual catalog rewrites. The former @lingui/macro entry point is no longer maintained.
  • Breadth thins out per target: Astro has been requested since 2023 and is still not first-party, and the App Router dynamic-route extraction limitation has been open since 2025.
  • The performance ceiling is architectural. Worker threads and an experimental Rolldown extractor are real engineering aimed at a JS-toolchain constraint that a native core does not have.

04 — Proof in code

Authoring barely changes. That is the point.

Lingui

import { t } from "@lingui/core/macro"
function checkoutLabel(seats) {
return t`Buy ${seats} seats`
}

Palamedes

import { t } from "@palamedes/core/macro"
function checkoutLabel(seats) {
return t`Buy ${seats} seats`
}

If your Lingui code already avoids explicit IDs, most of it reads identically after the import swap. Your components are not the migration — the catalogs and the runtime wiring are, and the playbook covers both.

05 — Side by side

The comparison, without the adjectives.

Where a row cites a measurement, it comes from the checked benchmark report in the repository. Where nothing was measured, the row says so.

CriteriaLinguiPalamedes
AuthoringMacros, JSX-firstMacros, JSX-first — deliberately familiar
Message identitySource-derived IDs or explicit custom IDsmessage + context only, no second convention
Runtime accessi18n object, hooks, macrosgetI18n(), one model everywhere
Catalog engineJS tooling with a plugin ecosystemNative Rust core, semantic merge and audits
Extract + update, realistic corpus2200 ms vs 73 ms30.32× faster on realistic extract + catalog update¹
Framework coverageReact, React Native, Vue, Solid, vanillaReact and Solid across Next.js, TanStack Start, SolidStart, Waku, React Router and Remix v3; no Vue, no React Native
Verified host coverageBroad UI-framework packagesSmoke-verified examples; browser-capable examples checked weekly

¹ Median of 7 runs on the realistic corpus (1,500 files, ~400k lines, 6,000 messages — half the files carry no i18n marker), one machine-local run, same semantic validation for every tool. The full report and the harness are in the repository, and the site build fails if these numbers drift from it.

06 — The trade-off

Lingui covers Vue and React Native while Palamedes does not, and its plugin surface is broader. Palamedes instead verifies supported React and Solid hosts around one runtime model and native catalog engine. If an unsupported UI framework or Lingui-specific plugin is required, Lingui is the technical fit.

07 — Evaluate

Migrate one catalog boundary first

Keep the first change small: select one bounded feature, run the documented catalog and runtime migration there, then review the generated PO diff before changing the rest of the application. Explicit-ID-heavy catalogs need the guide's cleanup path; do not promise a mechanical import where one is not documented.

08 — Questions

Questions teams ask before leaving Lingui.

The migration, framework, catalog, runtime and trade-off boundaries are stated here and included in the page's structured data.

01Can we evaluate Palamedes without replacing Lingui everywhere?

Keep the first change small: select one bounded feature, run the documented catalog and runtime migration there, then review the generated PO diff before changing the rest of the application. Explicit-ID-heavy catalogs need the guide's cleanup path; do not promise a mechanical import where one is not documented.

02Does Palamedes make sense if we use only one framework?

Yes, if the source-string, catalog and runtime model is the fit. Framework breadth is proof that the supported adapters share one model, not a requirement that one application use several frameworks. Check the supported host and its documented boundary before adopting.

03Who owns the catalogs?

Palamedes keeps source-string-first PO catalogs in the repository. Extraction, catalog updates, audits, merging and compilation are local workflow steps; it does not provide a hosted TMS or machine translation service.

04What runtime code reaches the application?

Transformed code reaches the active Palamedes instance through getI18n(). The exact adapter and compiled artifact depend on the supported host; inspect the framework documentation and proof rather than treating this comparison as a bundle-size claim.

05What do we give up by choosing Palamedes over Lingui?

Lingui covers Vue and React Native while Palamedes does not, and its plugin surface is broader. Palamedes instead verifies supported React and Solid hosts around one runtime model and native catalog engine. If an unsupported UI framework or Lingui-specific plugin is required, Lingui is the technical fit.

Make the next step match the decision you still need to make.