React Native localization for cross-platform app teams.

Use @rerune/react-native 1.6.0 for OTA translation delivery. Replace native i18next initialization and the root provider, keep translation hooks and resources, and use default AsyncStorage persistence.

ReRune dashboard showing localization workspace activity and project status
ReRune projects list showing real localization projects in a workspace
ReRune project keys view for managing software translation keys
ReRune OTA demo mobile app landing screen with live localization status
ReRune OTA demo mobile app story screen showing runtime translation content

Common challenge

Cross-platform teams need one localization workflow without giving up control over native release behavior.

Best fit

React Native teams that want shared project context, runtime variants, and OTA delivery through @rerune/react-native@1.6.0.

How ReRune helps

ReRune connects the public React Native SDK to the broader app localization strategy: one workspace for web, native, and cross-platform text with approved OTA delivery.

React Native specifics

The shared i18next model, adapted to a device runtime.

@rerune/react-native keeps the same i18next and react-i18next rendering model as the web package, but uses device persistence and has no browser SSR requirement.

Keep existing i18next behavior

Pass unchanged native options as the second argument to awaited ReRune.setup(...). Replace I18nextProvider with ReRuneProvider after startup, preserve defaultNS, and keep native hooks, interpolation, plurals, language switching, and fallbacks. OTA targets the translation namespace.

Restore through AsyncStorage

AsyncStorage persistence is enabled by default. Its native module must already be installed in the app binary. Native initialization completes before the provider mounts; cached or remote text arrives asynchronously over the native resources. Native HTTP loaders retain their own offline requirements.

Expose dashboard languages in the app

After a manifest fetch, availableLocales includes configured app locales and published dashboard locales. A language must have been fetched and cached before it can be selected offline without a bundled resource.

Limit OTA to i18next-rendered UI

Dashboard-only languages affect React Native UI rendered through i18next. Native platform strings, operating-system language listings, app-store metadata, new keys, and new code paths still require app work or a release.

SDK technical reference

React Native

@rerune/react-native 1.6.0 creates i18next from your native options and replaces the root provider. Keep translation calls and resources, with default AsyncStorage persistence.

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

Package
@rerune/react-native
Current release
1.6.0
Requirements
React Native 0.74+, React 18+, i18next 23+, react-i18next 14+
Install command
npm install @rerune/react-native@1.6.0 i18next react-i18next

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

Quick Start

@rerune/react-native@1.6.0

View on npm

Install command

npm install @rerune/react-native@1.6.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 and put the awaited call in your existing async startup. nativeOptions is your unchanged configuration above. Keep loading and error handling, then mount after initialization resolves. Run setup once, never during each render.

After ReRune

import { ReRune } from '@rerune/react-native'

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

SDK 1.6.0 creates an isolated i18next instance and copies bundled resources. Setup waits for native initialization; AsyncStorage restoration and OTA run asynchronously. Keep your existing loading and error flow. First-run offline startup needs locally available resources; previously fetched OTA needs retained cache.

Replace the root provider

In your existing root, use i18n or client from the chosen startup after it resolves. 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-native'

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

AsyncStorage persistence is the default; its native module must already be in your app binary. A translation update cannot install it. OTA targets the literal translation namespace. Native supportedLngs limits selectable languages, not OTA downloads.
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 already initialized instance, omit the second argument; passing options again rejects. 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-native'

const client = await 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 { Text } from 'react-native'
import { useTranslation } from 'react-i18next'

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

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-native

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.

Agent-assisted setup

Run one command. Your coding agent integrates ReRune.

Run the onboarding command from the root of your Git repository. The wizard detects the app and compatible coding agents already installed, then launches the agent you choose to move static UI text into localization, connect ReRune when cloud setup is selected, and validate the result.

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.

  1. Run the onboarding command

    Start it from the repository root. It stays in the terminal and detects the app, existing localization, and supported coding agents already installed.

  2. Confirm the detected setup

    Review the source locale, Git branch, and whether to connect ReRune cloud and add supported OTA delivery. Nothing changes until you confirm.

  3. The agent completes the integration

    The selected agent migrates user-facing strings into the app's localization system, connects ReRune when cloud setup is selected, adds supported OTA setup when requested, and runs the relevant validation.

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.

Is ReRune React Native OTA support available now?

Yes. React Native OTA integration is publicly available as @rerune/react-native@1.6.0.

Does React Native use the same integration model as React?

Yes. Both replace native initialization with awaited ReRune.setup(..., nativeOptions) and I18nextProvider with ReRuneProvider. Run setup once in the existing startup flow, then mount the returned provider. Translation hooks stay unchanged. React Native defaults to AsyncStorage, whose native module must already be in the app binary.

How does React Native localization work offline?

The package restores previously committed manifest and locale data from AsyncStorage. Bundled i18next resources remain the baseline when no matching cache is available or a network update cannot be applied.

Can React Native add dashboard languages at runtime?

Yes. After the manifest and locale payload are fetched, availableLocales can include dashboard-only languages. Offline selection requires that the language was fetched and cached earlier.

Does ReRune update native iOS and Android strings in a React Native app?

No. The React Native package updates UI rendered through the app's i18next setup. Native platform strings, operating-system language listings, app-store metadata, and new code paths stay outside that runtime overlay.

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.