Documentation

Build with LexiSync

Cloud translation management for product teams. Sync keys from your repo, edit in the dashboard, publish immutable CDN versions, and load strings with lexisync or lexisync-react.

Dashboard

Projects, editor, publish, billing

npm CLI + backend

sync · pull · publish · i18next

CDN

Versioned JSON, no auth, edge-cache

Get started

LexiSync is a hosted SaaS. You don’t install a server — create an account, grab keys, and point your app at the cloud API / CDN.

1

Sign in

Sign in with GitHub, Google, or Microsoft. We create a personal workspace on first login.
2

Finish onboarding

Name your organization, create a project, copy your sk_… secret key and project id.
3

Push source strings

npx lexisync sync from CI or your laptop — or enable saveMissing in the app against version latest.
4

Translate & publish

Edit in Dashboard → project → Translate & publish, then publish a version (e.g. production). Apps load that version from the CDN.
npm install lexisync
# optional peers for React apps:
npm install lexisync-react i18next react-i18next

export LEXISYNC_API_KEY=sk_your_secret
export LEXISYNC_API_URL=https://lexisync.app

npx lexisync sync -p YOUR_PROJECT_ID -f ./locales/en.json -l en
npx lexisync publish -p YOUR_PROJECT_ID -v production

Dashboard UI (user guide)

Everything product managers and developers need lives under /dashboard.

Projects

  • List of projects in your org; click one to open the catalog editor.
  • Create a project from the dashboard (subject to plan limits).
  • Usage meters: keys, storage, project count vs plan caps.

Translate & publish (catalog editor)

  • Columns to show — toggle languages (e.g. en + nl) side by side. Blur a cell to save the working copy.
  • Add language — register a new locale code; fill translations then publish.
  • AI translate (Pro) — fills only missing/empty targets (or keys where source changed after a prior AI run). 60s cooldown bar between runs.
  • Publish catalog — freezes the entire catalog (all namespaces × all languages) into a named version such as production. Not just the visible columns.
  • CDN stats & audit — download hits per version; who published when.

Working copy vs published

Edits land on version latest (live working copy). CDN apps should pin production (or a semver tag) after you click Publish — that snapshot is immutable and long-cached.

API keys (Settings)

  • sk_… — secret, write + read. CLI, CI, server only.
  • pub_… — public, read-only (safe-ish for browser if you accept catalog exposure).

Billing

Upgrade to Pro via Stripe Checkout, manage cards/invoices in the Stripe Customer Portal. Failed payments get a grace window; then entitlements fall back to Free limits.

Language switcher (platform UI)

The LexiSync product UI itself is localized. The switcher loads available languages from the published catalog CDN for the dogfood project — same mechanism your apps use.

Concepts

TermMeaning
OrganizationYour workspace: plan, billing, API keys, members.
ProjectOne product or app (own keys, languages, CDN catalogs).
NamespaceBucket of keys — e.g. common, auth, marketing.
KeyStable id inside a namespace, e.g. nav.signIn.
TranslationString for a key in one language (en, nl, …).
Version latestEditable working copy (dev / saveMissing).
Published versionImmutable CDN snapshot (production, 1.2.0, …).

Locize-style publish workflow

StepWhereWhat
1. KeysDashboard / CLICreate project; copy projectId + sk_
2. SourceCLI sync / saveMissingPush en (or reference) into latest
3. TranslateDashboard editor / AIFill target languages
4. PublishUI or lexisync publishFreeze → production
5. ShipApp CDN clientversion: "production"
# 1) Source
npx lexisync sync -p $PROJECT_ID -f ./locales/en/common.json -l en -n common

# 2) Optional: more namespaces / languages
npx lexisync sync -p $PROJECT_ID -f ./locales/nl/common.json -l nl -n common

# 3) After UI review…
npx lexisync publish -p $PROJECT_ID -v production

# 4) App loads:
# GET https://lexisync.app/api/cdn/$PROJECT_ID/production/en/common

npm package: lexisync

Official package: CLI, i18next backend, and small HTTP client. Node.js ≥ 18.

npm install lexisync
# i18next peer when using the backend:
npm install i18next

npx lexisync --help
ImportUse
lexisyncDefault export = i18next backend class
lexisync/backendSame backend (explicit path)
lexisync/clientdiscoverApi, sync helpers, publish…
bin: lexisyncCLI on PATH via npx or global install

Config file: ~/.lexisync/config.json. Env overrides:

VariableDescription
LEXISYNC_API_URLAPI host (default https://lexisync.app)
LEXISYNC_API_KEYSecret key for write ops
LEXISYNC_PROJECT_IDOptional default project

CLI reference

lexisync init [-n name]     # bootstrap hints / org notes
lexisync sync  -p <projectId> -f <file.json> -l <lng> [-n namespace]
lexisync pull  -p <projectId> -n <ns> -l <lng> [-v latest|production] -o <file>
lexisync publish -p <projectId> -v <version>
lexisync versions -p <projectId>

# Global where supported:
#   --api-url  --api-key
#   env LEXISYNC_API_URL  LEXISYNC_API_KEY

sync

Uploads a nested or flat JSON locale file into the project working copy. Creates namespaces and keys as needed. Subject to plan limits (keys, source words, storage).

publish

Snapshots the full working copy to a named version. Overwriting the same version name replaces the CDN catalog for that tag.

pull

Downloads one namespace × language for offline builds or git commits.

i18next backend

Drop-in backend that reads from the LexiSync CDN (and can write missing keys to latest).

import i18next from 'i18next';
import LexiSyncBackend from 'lexisync';

await i18next.use(LexiSyncBackend).init({
  lng: 'en',
  fallbackLng: 'en',
  ns: ['common', 'auth'],
  defaultNS: 'common',
  backend: {
    projectId: process.env.LEXISYNC_PROJECT_ID,
    apiUrl: 'https://lexisync.app',
    // Use public or secret key for saveMissing; CDN reads need no key
    apiKey: process.env.LEXISYNC_API_KEY,
    version: process.env.NODE_ENV === 'production' ? 'production' : 'latest',
  },
  saveMissing: process.env.NODE_ENV !== 'production',
  saveMissingTo: 'current',
  partialBundledLanguages: true,
});

i18next.t('nav.signIn');

Production tip

Pin version: "production" in production builds. Keep saveMissing off in prod so random users can’t fill your catalog.

React SDK (lexisync-react)

npm install lexisync-react lexisync i18next react-i18next
import { LexiSyncProvider, useLexiSync, useT } from 'lexisync-react';

export function App() {
  return (
    <LexiSyncProvider
      projectId={import.meta.env.VITE_LEXISYNC_PROJECT_ID}
      apiUrl="https://lexisync.app"
      version="production"
      lng="en"
      ns={['common', 'marketing']}
      // apiKey + saveMissing only for local/dev against "latest"
    >
      <Page />
    </LexiSyncProvider>
  );
}

function Page() {
  const t = useT();
  const { changeLanguage, languages, status } = useLexiSync();
  return (
    <>
      <h1>{t('headline')}</h1>
      <select
        value={/* current lng */}
        onChange={(e) => void changeLanguage(e.target.value)}
      >
        {languages?.map((l) => (
          <option key={l.code} value={l.code}>{l.name || l.code}</option>
        ))}
      </select>
      <p className="text-xs opacity-60">{status}</p>
    </>
  );
}

Provider wires i18next + LexiSync backend, exposes language list (from CDN meta when available), reload, and status (loading / ready / error).

CDN

Public, Blob-backed JSON maps on a dedicated host — no API key, no database on the hot path. Floating tags (e.g. production) revalidate immediately after publish.

# Preferred (cdn.lexisync.app)
GET https://cdn.lexisync.app/{projectId}/{version}/{lng}/{namespace}.json
GET https://cdn.lexisync.app/{projectId}/{version}/languages

# Also on the app host
GET https://lexisync.app/cdn/{projectId}/{version}/{lng}/{namespace}

# Immutable content-hash URL (1y cache)
GET https://cdn.lexisync.app/{projectId}/immutable/{hash}/{lng}/{namespace}.json

# Examples
https://cdn.lexisync.app/cm_xxx/production/en/common.json
https://cdn.lexisync.app/cm_xxx/production/languages
https://lexisync.app/cdn/cm_xxx/latest/nl/auth
VersionCacheUse for
latestShort (≈30s)Dev, saveMissing, preview
productionTag: max-age=0 (live after publish)Production apps
immutable/{hash}1 year, immutablePin exact content in builds
semver / tagsSame as production tagStaged releases

Response shape: flat object { "nav.signIn": "Sign in", ... }. npm packages default to https://cdn.lexisync.app when using the production API host.

HTTP API

Machine-first surface under /api/v1. Discover endpoints:

curl https://lexisync.app/api/v1
curl https://lexisync.app/api/v1/openapi.json

# Auth
curl -H "x-api-key: sk_…" https://lexisync.app/api/v1/me
# or: Authorization: Bearer sk_…

Client helpers

const {
  discoverApi,
  getMe,
  listLanguages,
  downloadCatalog,
  reportMissing,
  publishVersion,
} = require('lexisync/client');

const apiUrl = 'https://lexisync.app';
const apiKey = process.env.LEXISYNC_API_KEY;
const projectId = process.env.LEXISYNC_PROJECT_ID;

await getMe({ apiUrl, apiKey });
await listLanguages({ apiUrl, apiKey, projectId });
await downloadCatalog({ apiUrl, apiKey, projectId, version: 'production', format: 'nested' });
await reportMissing({
  apiUrl, apiKey, projectId,
  namespace: 'common', languageCode: 'en',
  keys: { 'cta.try': 'Try now' },
});
await publishVersion({ apiUrl, apiKey, projectId, version: 'production' });

Useful routes

MethodPathNotes
GET/api/v1/meOrg + plan
GET/POST/api/v1/projectsList / create
POST/api/v1/projects/:id/versionsPublish
GET/api/v1/projects/:id/languagesLocales
POST/api/syncLegacy bulk sync (CLI)
GET/api/cdn/...Public catalogs

API keys & security

  • Secret sk_ — full write. CI secrets, server env, local CLI. Never ship to browsers in production.
  • Public pub_ — read-only API. CDN often needs no key at all.
  • Rotate keys from Settings if leaked.
  • Prefer env vars over committing ~/.lexisync/config.json.

AI translate (Pro)

In the catalog editor, pick a target language and run Translate dirty. Only missing/empty strings (or AI-stale after source edits) are sent to GPT-5 nano via Vercel AI Gateway. Manual translations without an AI fingerprint are left alone.

  • Max batch size per run (server-enforced).
  • 60-second regeneration cooldown with progress bar.
  • Free plan: feature locked — upgrade in Billing.

Errors

StatusMeaning
401Missing/invalid API key or session
403Plan limit, public key on write, or Pro-only feature
404Project / version / resource not found
413Translation value too large for plan
429CDN rate or monthly quota exceeded
503Checkout requested but Stripe not configured

Ready to ship copy?

Create a workspace in minutes

Sign in, create a project, sync your locale files, publish production — then load from the CDN in any stack.

Package docs also ship on npm: lexisync · lexisync-react. API base: https://lexisync.app