Upgrade to v2
v2 of the React Native SDK is in beta. This page tracks what you have to change when moving from v1: new minimum versions, the removal of APIs that were deprecated in v1, a leaner Expo config plugin, and a translation layer change that affects you only if you translated the SDK.
Install the beta
v2 publishes to the beta npm tag. v1 keeps latest, so an unpinned install stays on v1.
yarn add @stream-io/video-react-native-sdk@betaThe optional native packages are on their own beta line and need the tag too:
yarn add @stream-io/noise-cancellation-react-native@beta
yarn add @stream-io/video-filters-react-native@beta
yarn add @stream-io/react-native-callingx@betaInstalling the latest build of any of those alongside the v2 beta pulls the v1 line and
reports an unmet peer dependency. That is the most common way to get a confusing install
error while trying the beta.
@stream-io/react-native-webrtc is versioned independently and is not part of this split,
so it has no beta tag. Install it without one.
What has changed so far
The 2.0 major was opened so the v2 line could release independently of v1. Since then it has raised its minimum versions, removed APIs that were deprecated in v1, and moved translations to a shared runtime. Each is covered below.
The design-token work currently landing in the React SDK does not touch React Native theming, which has its own theme layer.
Translations moved to a shared runtime
The SDK now uses @stream-io/i18n, the
translation runtime shared with Stream Chat, and translation keys are namespaced
identifiers instead of the English text:
t("Incoming Call..."); // v1
t("ringingCall.incoming.title", "Incoming Call..."); // v2The second argument is the English copy, written at the call site. That is why the SDK no
longer ships an en.json or a translations export: a key missing from your dictionary
renders that inline English rather than a raw key.
If you never touched i18n, there is nothing to do. English is unchanged - every string renders exactly as it did in v1.
If you did translate the SDK
Re-keying is not optional, and it fails quietly. An old key never matches, so your override
silently stops applying and the SDK's English renders instead - no error, no warning,
nothing in the console. Type your dictionaries as TranslationDictionary to turn that into
a compile error.
| Removed | Replacement |
|---|---|
translationsOverrides |
translations - registers over the defaults instead of replacing |
fallbackLanguage |
removed - use i18nextConfigOverrides: { fallbackLng } |
StreamI18n |
Streami18n - different class, different options |
StreamI18nProvider |
removed - StreamVideo mounts the translation context |
TranslationsMap |
Record<string, LooseTranslationDictionary> |
TranslationLanguage, TranslatorFunction |
removed - use string and StreamTFunction |
the translations export, en.json |
removed - English is inline at each call site |
useI18n().i18n |
removed - useI18n() returns { t, tDateTimeParser } |
The old-to-new key mapping is published as
i18n-2.0-key-map.json
in the SDK repository, split by platform - use the reactNative half. Most rows are a
straight rename; a handful are not, and those carry a note explaining what to do.
Note that translationsOverrides replaced the SDK's dictionary in v1 rather than
merging with it, so supplying one German string dropped the rest. If you worked around that
by spreading the SDK's translations.en back into yours, delete the spread - translations
merges, and a partial dictionary is safe.
The i18n guide covers the new API in full.
New minimum versions
| Requirement | v2 |
|---|---|
| React Native | 0.79 or newer |
| React | 18 or newer |
| Expo | SDK 53 or newer |
@react-native-firebase/* |
23 or newer |
| iOS | 15.1 or newer |
The iOS deployment target now follows React Native's own minimum.
Removed APIs
These were deprecated in v1, or never did anything, and are gone in v2. TypeScript flags
each of them, except StreamVideoReactNative.setup(), which fails the native build.
| Removed | Replacement |
|---|---|
logger and logLevel client options |
logOptions: { default: { level, sink } } |
call.publishVideoStream(), call.publishAudioStream(), call.publishScreenShareStream() |
call.publish(stream, TrackType.VIDEO) (or TrackType.AUDIO, TrackType.SCREEN_SHARE) |
secret and allowServerSideConnect client options |
Use @stream-io/node-sdk for server-side work |
ThemeProvider, ThemeProviderInputValue |
StreamTheme, StreamThemeInputValue |
push.isExpo in StreamVideoRN.setPushConfig() |
Remove it. Expo is detected automatically |
firebaseDataHandler() |
Remove the call. The SDK handles ring pushes natively |
size prop on CallControlsButton, HangUpCallButton and RejectCallButton |
style.container (width, height, borderRadius) |
ResolvedStreams type |
LoopbackTracks |
CallContent's initialInCallManagerAudioMode prop |
callManager.start({ audioRole, deviceEndpointType }) |
useAndroidKeepCallAliveEffect, useScreenShareAudioMixing, usePushRegisterEffect |
Nothing to call. StreamVideo and StreamCall already run them |
StreamVideoReactNative.setup() (Android and iOS) |
Remove the call from MainApplication and AppDelegate. It did nothing |
react-native-incall-manager is no longer used
v1 still started react-native-incall-manager alongside its own audio handling if your app
had it installed. v2 doesn't: the SDK's call manager owns audio routing. Uninstall the
library and configure audio with callManager.
Expo config plugin
The plugin now targets the Swift AppDelegate and the Kotlin MainActivity and
MainApplication that Expo SDK 53 and later generate. If your project still has an
Objective-C AppDelegate or Java Android files, prebuild fails with an error that names
the file to migrate. The plugin also no longer adds a compileOptions block to
android/app/build.gradle.
What to expect during the beta
Breaking changes land incrementally rather than all at once, so treat this page as the running list and re-read it when you bump. Each entry will name the version it landed in and the change you have to make.
If you hit something that behaves differently and is not listed here, that is worth reporting: an unlisted break is a bug in this page as much as in the SDK.
Staying on v1
v1 is maintained on its own release line and stays on the latest tag. If you are not
ready to move, pin @stream-io/video-react-native-sdk@latest and switch this page to v1
with the version picker above. The per-version upgrade guides for the 1.x line live there.