Skip to content

Compare · fbtee

For React or Solid teams deciding whether a grammar-specific FBT surface or a portable PO and ICU workflow is the better long-term boundary.

Grammar in JSX, or standards through the pipeline.

fbtee and Palamedes start from the same useful instinct: keep the sentence beside the interface and let a compiler do the bookkeeping. They disagree about where localization grammar should live. fbtee puts a purpose-built FBT language into JSX and compiles it into hashed JSON tables. Palamedes uses ICU messages, source-readable catalogs and one native engine from extraction through compilation.

Licence
MIT
Grammar model
FBT primitives and IR
Catalogs
Hash-keyed JSON
Checked benchmark
100× slower

fbtee figures: fbtee 3.0.1 / @nkzw/fbtee-cli 3.0.1 / @nkzw/babel-preset-fbtee 3.0.1 / @nkzw/swc-plugin-fbtee 3.0.1, researched August 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 fbtee and do not think twice about it.

Pick Palamedes when…

  • Your durable translation interface should be source-readable PO or FCL rather than hash-keyed JSON.
  • ICU interoperability matters across languages, tools or systems outside this JavaScript application.
  • You want extraction, merging, audits, diagnostics and compilation to share one native catalog engine.
  • You need one request-local runtime model across every supported server framework.
  • The checked local collect-and-update path matters: 100× on the realistic fixture separates the two workflows on the measured machine.

Pick fbtee when…

  • You ship React Native or Expo. Palamedes has no adapter there and fbtee documents the path.
  • FBT's dedicated gender, pronoun, enum and list primitives fit how your team wants developers to express grammar.
  • You are migrating an existing Facebook FBT codebase and want a modern continuation rather than an authoring-model change.
  • Required descriptions at every callsite are a discipline you actively want to enforce.

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.

Two different homes for grammar

fbtee makes grammatical intent visible through dedicated source primitives. That is excellent when developers should model gender, pronouns and enums explicitly. Palamedes writes plural and select semantics as ICU, so the same message grammar survives in a standard catalog vocabulary translators and non-JavaScript systems already understand.

Inspect the checked local workflow result

Readable catalogs versus opaque identity

fbtee derives identity from source text plus a required description, then stores the entry under a hash. Palamedes keeps the source message itself as the PO msgid, with optional context. Both avoid invented application keys; only one leaves the durable catalog readable without knowing the compiler's hash scheme.

Inspect the checked local workflow result

A transform is not the whole workflow

fbtee offers both Babel and a Rust/Wasm SWC transform, which is a real integration advantage. Palamedes puts extraction, semantic catalog merging, audits, ICU diagnostics and artifact compilation in the same Rust core, then keeps framework adapters focused on request scope, routing boundaries and rendering.

Inspect the checked local workflow result

03 — fbtee

Where the competitor is the stronger fit.

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

Competitor strength

What fbtee earned

  • A grammar-first message model with dedicated plurals, gendered pronouns, enums, lists and nested React elements — not conventions layered onto a string lookup.
  • A credible modern continuation of Facebook FBT, with React 19, TypeScript, Vite, Next.js, Babel, SWC and an explicit Expo path rather than an archival compatibility fork.
  • A practical repository-local translation flow: missing work is added to locale JSON with a status marker that coding agents can complete and reviewers can inspect in a normal diff.

Trade-off

What that model asks you to adopt

  • The grammar is an FBT-specific JSX and function vocabulary. It is expressive, but the authoring model and compiled IR are tied to this toolchain rather than shared with ICU implementations outside JavaScript.
  • Editable locale files are keyed by hashes of source text and required descriptions. The source remains available in each record, but the durable catalog interface is not a source-readable gettext catalog.
  • The local catalog path is still a JavaScript CLI pipeline: collect writes an intermediate source file, prepare-translations updates locale files, and translate compiles runtime payloads. The optional Rust/Wasm component handles source transformation, not the full catalog lifecycle.

04 — Proof in code

Both make the plural explicit. They standardize different languages.

fbtee

<fbt desc="Seat purchase button">
Buy{' '}
<fbt:plural
count={seats}
many="seats"
name="seatCount"
showCount="yes"
>
a seat
</fbt:plural>
</fbt>

Palamedes

import { plural } from "@palamedes/core/macro"
plural(seats, {
one: "Buy one seat",
other: "Buy # seats",
})

fbtee's source is more prescriptive and gives translators mandatory context; that is a strength when the team wants the FBT grammar discipline. Palamedes uses an ICU plural that remains visible in a standard catalog, with context available when the source sentence alone is insufficient.

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.

CriteriafbteePalamedes
Source authoringInline <fbt>, fbt() and fbs() with required descriptionsInline macros and JSX; context is optional
Grammar modelFBT IR: plural, pronoun, enum, list and rich-text primitivesICU MessageFormat plural, select and formatter semantics
Durable catalogHash-keyed source and locale JSONSource-readable PO or opt-in FCL
ToolchainBabel or Rust/Wasm SWC transform plus JavaScript CLINative extraction, catalog operations, validation and compilation
React NativeDocumented Expo setup and templateNot supported
Server integrationReact locale context plus explicit server setupRequest-local runtime across the supported server frameworks
Agent translationStatus-marked JSON workflow documented for coding agentsRepository-owned catalogs with source-readable context and audits
Collect + catalog update, realistic corpus7263 ms vs 73 ms100.12× faster on the checked same-inventory workflow¹

¹ 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

fbtee supports Expo and gives developers a richer dedicated grammar vocabulary than Palamedes. If React Native or FBT's explicit pronoun and gender model is central to the product, fbtee is the better fit. Palamedes instead chooses ICU portability, source-readable catalogs and a native end-to-end catalog engine; the checked speed result applies to that local workflow only, not runtime rendering or bundle size.

07 — Evaluate

Evaluate one disposable feature boundary

Use a small, isolated feature branch to rewrite one representative message flow, then inspect the generated PO catalog and the source-to-runtime proof. This tests the authoring and catalog boundary without presenting a mixed-runtime migration as a supported path.

08 — Questions

Questions teams ask before leaving fbtee.

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 fbtee everywhere?

Use a small, isolated feature branch to rewrite one representative message flow, then inspect the generated PO catalog and the source-to-runtime proof. This tests the authoring and catalog boundary without presenting a mixed-runtime migration as a supported path.

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 fbtee?

fbtee supports Expo and gives developers a richer dedicated grammar vocabulary than Palamedes. If React Native or FBT's explicit pronoun and gender model is central to the product, fbtee is the better fit. Palamedes instead chooses ICU portability, source-readable catalogs and a native end-to-end catalog engine; the checked speed result applies to that local workflow only, not runtime rendering or bundle size.

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