Skip to content
loclizr

A compiler that can fail your CI is a higher-trust dependency than a runtime that reads JSON. This page says in advance how it is run, and changes in the same commit as anything it describes.

Version 0.1.2 is on npm and the repository is public.

Topic Today
Maintainers One person holds commit and publish rights. Whether anyone is paid is not decided.
Cadence None promised, for patches or minors.
Succession No successor named. If that holds when the maintainer stops, the last release is marked as such on npm and the repository is archived, not left to look alive.
Where to look Open issues and their age, the last release date, and distinct committers in the last year, all public on the repository. Read them before you depend on this, and again a year in.

Everything but the checks: a missing translation is again something a person must notice.

You keep Why
Catalogs Plain JSON in ICU MessageFormat, or the i18next form you already had. Nothing in them refers to loclizr. An i18next catalog only converted in memory was never touched.
Converted catalogs ICU loads into i18next through i18next-icu, into FormatJS as is, and into any TMS that speaks ICU.
The generated tree Plain ESM with hand-printed .d.ts, importing only the locale store and the plural and Intl helpers from loclizr. Delete the self-ignoring .gitignore in outDir, commit the tree, pin the last version, and the app builds and typechecks with no compiler, as long as your runtime has Intl.
The context record JSON with a schema field and no tool version. A translator or a script can keep reading it.

Three surfaces carry a version, and each breaks visibly:

Surface Versioned by How a break shows
The CLI contract and the rule codes The package version. A rule’s code never changes. A severity entry naming a rule the tool no longer knows is LZ1001, not a silent no-op.
The four $ helpers the generated code imports The trailing digit, abi=1 in every generated header. A renamed helper keeps its old name exported for one minor. After that minor, a stale tree fails at link time on the missing $...1 export, in Vite dev, Rollup, esbuild and Node ESM alike.
The record Its schema field, 1 today. An older schema differs from what the tool would write, so check reports LZ5003 and the next build rewrites it. Every app’s check fails until that app rebuilds and commits.

A 0.x minor may add rules, or change the generated bytes, the abi digit or a rule’s default severity. It may also break an invariant, with a changelog entry for it. At 1.0 the specification’s invariants become the semver contract.

To upgrade a fleet, repeat per app:

  1. It regenerates the tree and the record.

  2. And the tree, if you commit it. Until this commit, the app’s CI fails LZ5003: that is the gate working.

  3. It passes once the committed record matches.

The changelog ships in the package. Security has its own page.

The compiler, the runtime and the catalog format are MIT and stay MIT. Closed source has no precedent in this category, and a licence change would delete the one advantage that holds here, distribution.

A paid layer, if one ever exists, sits at seats, governance, or a hosted place for non-engineers to read the context record. Never at the install, the CLI or the console: no build-time notice asking for money.