Skip to content

React localization that stays connected to product delivery.

Add OTA translations with @rerune/react 1.9.0. Replace native initialization and the root provider, keep options, resources, and useTranslation() calls, and restore native startup when removing ReRune. Apps with plugins retain their own instance.
ReRune projects list showing real localization projects in a workspace
ReRune dashboard showing localization workspace activity and project statusReRune dashboard showing localization workspace activity and project statusReRune dashboard showing localization workspace activity and project status
ReRune OTA demo mobile app landing screen with live localization status

Common challenge

Files and hooks handle runtime translation, but growing React teams still need shared status, review, terminology, and release coordination.

Best fit

React teams using i18next that want @rerune/react@1.9.0, runtime variants, OTA delivery, immediate fallback, read-only browser credentials, and crawler-visible rendering.

How ReRune helps

ReRune.setup(..., nativeOptions) initializes the existing i18next instance, and ReRuneProvider replaces I18nextProvider. Your resource files, plugins, and native translation calls stay in place.

SDK technical reference

React Web

@rerune/react 1.9.0 creates i18next from your native options and replaces the root provider. Keep translation calls and resources, with browser caching and a separate SSR preload flow.

Version-pinned guidance from the published package README. Follow the linked README for the complete API and current release notes.

Package
@rerune/react
Current release
1.9.0
Requirements
React 18+, i18next 23.2.3+, react-i18next 14+

Install command

npm install @rerune/react@1.9.0 i18next react-i18next

The linked example apps use SDK 1.9.0. They include native setup, language and variant controls, and manual refresh. Use the package README for the API reference.

Quick Start

@rerune/react@1.9.0

View on npm

Install command

npm install @rerune/react@1.9.0 i18next react-i18next

Keep native configuration

Keep your existing native options and JSON resources. These imports use example paths; keep your own paths and settings. The object can stay in your current startup or be inlined. No new file or exported options object is required. Both alternatives use these same options, including escapeValue: false.

Keep native configuration

import type { InitOptions } from 'i18next'
import en from './locales/en/translation.json'
import de from './locales/de/translation.json'

const nativeOptions = {
  lng: 'en',
  fallbackLng: 'en',
  ns: ['translation'],
  defaultNS: 'translation',
  resources: { en: { translation: en }, de: { translation: de } },
  interpolation: { escapeValue: false },
} satisfies InitOptions

Alternative setups: replace Before with After. Do not run both.

Replace initialization

Keep imports at module scope. The Before ReRune version awaits i18n.init in your async startup. ReRune.setup returns the client synchronously, so call it once at module scope. nativeOptions is your unchanged configuration above. Await client.ready only where native initialization is asynchronous. Run setup once, never during each render.

After ReRune

import { ReRune } from '@rerune/react'

const client = ReRune.setup({
  otaPublishId: '<READ_ONLY_OTA_PUBLISH_ID>',
}, nativeOptions)

SDK 1.9.0 creates an isolated i18next instance from your native options and returns the client synchronously; client.ready resolves when native initialization has finished. Setup reads no storage and sends no requests: ReRuneProvider restores the cache and checks for updates after its first commit. First-run offline startup needs locally available resources; previously fetched OTA needs retained cache.

Replace the root provider

In your existing root, use i18n from the native startup after it resolves, or the client that setup returned. App is your existing component. Preserve defaultNS when used. ReRuneProvider includes native context; do not nest both providers. External translation or language-switching code can use client.i18n.

After ReRune

import { ReRuneProvider } from '@rerune/react'

<ReRuneProvider client={client} defaultNS="translation">
  <App />
</ReRuneProvider>

Browser startup only. SSR still needs request-local initialized i18next, awaited ReRune.preload(...), matching native base resources, and transferred initialHydrationState. OTA targets the literal translation namespace; a dashboard-only language outside native supportedLngs is not downloaded.
Existing instances, plugins, and attachment

For backend loaders, detectors, .use(...) plugins, or global-instance wiring, retain your app-owned i18n instance and pass it to ReRune.setup with the same nativeOptions. App-owned options keep their native defaults. For an instance that is already initialized or still initializing, omit the second argument; passing options again throws. With a backend loader or detector, await client.ready where you awaited i18n.init. Hooks outside ReRuneProvider need your existing global wiring. Native HTTP loaders keep their startup and offline requirements. SDK-created instances default escaping to false; explicit options win, and raw HTML still needs appropriate handling.

Setup with your existing instance

import { ReRune } from '@rerune/react'

const client = ReRune.setup({
  i18n,
  otaPublishId: '<READ_ONLY_OTA_PUBLISH_ID>',
}, nativeOptions)

Keep your existing application component and native translation calls. This example reads the headline key from your resources.

Translation code stays the same

import { useTranslation } from 'react-i18next'

export function App() {
  const { t } = useTranslation()
  return <h1>{t('headline')}</h1>
}

Removing ReRune

Restore both Before ReRune blocks with the same options and resources. Remove optional ReRune refresh, status, and variant controls, then uninstall the SDK. Keep i18next, react-i18next, and your plugin chain. Replace client.i18n references with your native instance. Native bundles or loaders must cover the messages you need: OTA and variants stop and ReRune’s cache is no longer consumed. Apply this source change and restart the app; unmounting a provider is not live rollback.

Uninstall the SDK

npm uninstall @rerune/react

Workflow

From app copy to release-ready localization.

ReRune connects translation management to the delivery path developers already use: dashboard work, AI assistance, CLI/API sync, and OTA updates where a supported SDK is installed.

Install the SDK

Connect the supported app runtime to a ReRune publish ID while keeping native or framework localization behavior in place.

Publish approved text

Approve translation changes in the workspace, then publish runtime updates without turning every text fix into a full store release.

Refresh visible copy

Let supported SDK hooks check for updates and refresh text when new approved localization payloads are available.

Keep fallbacks intact

When runtime updates are unavailable, the app keeps reading bundled resources so localization failures do not break the product.

Setup WizardAI Coding Agent

One command. A wizard sets the stage, your AI agent ships it.

Run the onboarding command from the root of your Git repository. The wizard inspects the app and confirms the plan with you, with no AI involved and nothing changed yet. Then it opens the coding agent you already use with a complete migration workflow.

Run inside your Git repository

curl -fsSL https://rerune.io/onboard.sh | sh

The script runs locally. ReRune does not receive your source code or list of installed agents.

Coding agent integrations

11 integrations: 4 available now, 7 planned.

  • Claude CodeReady
  • CodexReady
  • OpenCodeReady
  • PiReady
  • GitHub Copilot CLIPlanned
  • GoosePlanned
  • Qwen CodePlanned
  • Cursor AgentPlanned
  • Kiro CLIPlanned
  • Cline CLIPlanned
  • Factory DroidPlanned

Coverage

App-first does not mean mobile-only.

Start where localization creates release friction, then keep web, mobile, and cross-platform products in one shared workspace as your surface area grows.

Developer delivery

Sync through the CLI. Publish through OTA SDKs.

Use the ReRune CLI locally or in CI/CD to manage project translations, then deliver approved runtime updates through the SDK built for your app.

Companion CLI

Install the ReRune CLI

Use the ReRune CLI to sync, validate, and manage translations right from your terminal. Run syncs in CI/CD or locally whenever you need to push a new language.

Homebrew (macOS/Linux):

brew install BasalBit/tap/rerune
  • Downloadable builds for macOS, Linux, and Windows
  • Uses the API keys you generate in the dashboard
  • Fits scripted CI/CD workflows through CLI and API access
rerune

Connect the project

Create the project config and connect the repository to its ReRune workspace.

rerune pull

Pull approved updates

Bring current dashboard translations into the app or its build workflow.

rerune push

Push local changes

Send local translation updates back to ReRune for the team to manage and publish.

Questions

Questions teams ask before choosing a localization platform.

Contact the ReRune team

Share an idea, report a problem, or ask for help with ReRune.

Does ReRune replace i18next or react-i18next?

No. Keep i18next, react-i18next, native options, resources, and translation calls. SDK 1.9.0 can create an isolated instance with ReRune.setup({ otaPublishId }, nativeOptions). Replace I18nextProvider with ReRuneProvider and preserve defaultNS. Apps with plugins or global wiring retain their instance and pass i18n. OTA targets only the literal translation namespace.

How do React SSR pages preload OTA translations?

Create and initialize a request-local i18next instance, await ReRune.preload(...), then render translated HTML and metadata. Transfer its hydrationState into browser setup as initialHydrationState, with the same original native resources, locale, variant, and syntax. Render ReRuneProvider with the client that setup returns; it restores the cache and checks for updates after hydration. Delayed hydration also needs hydrationReady. Browser-only setup does not replace this SSR flow.

Is the ReRune React SDK publicly available?

Yes. @rerune/react@1.9.0 is published on npm for React apps that use i18next and react-i18next.

Can I preview draft translations in a running app before publishing?

Yes. Enable OTA staging for the project and opt a development or QA client into staging mode. The client receives saved, enabled draft snapshots on its next sync from a cache kept separate from published content. Production clients stay on the published path by default.

Explore next

Go deeper into the developer, platform, and delivery workflows connected to this page.

Web app localization connected to the same product workflow.

Manage web app localization with translation keys, AI assistance, CLI/API sync, and OTA delivery through ReRune SDKs for React and Angular.

React Native localization for cross-platform app teams.

Adopt React Native OTA localization with SDK 1.9.0. Keep native options and hooks, use AsyncStorage caching, and restore native startup when removing ReRune.

Developer localization platform for product teams that ship fast.

Keep localization in your engineering workflow with ReRune: CLI sync for releases, API keys for automation, and SDKs for runtime text updates in your apps.

One workspace

Start with one product workflow and expand from there.

Create projects, manage keys, use AI assistance with context, sync through CLI/API, and publish approved runtime updates when your app uses a supported ReRune SDK.