Version 25 completes the TypeScript alignment started in v24. Modular types across multiple packages now match the firebase-js-sdk modular API as closely as possible. Runtime behavior is largely unchanged; TypeScript consumers and apps using the modular API are most affected.
If you upgraded to v24 for Firestore only, see Migrating to v24 first — Firestore breaking changes remain in v24.
- Why we made these changes
- Agent-assisted migration
- Who is affected
- General pattern
- Tooling & native SDKs
- Cloud Storage
- Realtime Database
- Remote Config
- Performance Monitoring
- Installations
- App Check
- Firebase Auth
- Cloud Messaging
- Automated migration checklist
React Native Firebase aims to be a drop-in replacement for the firebase-js-sdk — with native extensions and performance where the platform allows. At the JavaScript level we have always tracked the modular API closely, but our TypeScript declarations had diverged: namespaces specific to React Native Firebase, instance-style typings, and helper names that did not match the SDK.
v25 finishes aligning those types module by module. For you as a developer that means:
- Shared mental model — code, examples, and AI assistance written for firebase-js-sdk modular APIs map directly to React Native Firebase.
- Safer refactors — TypeScript catches incorrect imports and call shapes at compile time instead of at runtime.
- Easier cross-platform work — the same typed modular surface works across web, React Native, and shared business logic.
- A clear path forward — namespaced APIs remain for compatibility but modular root exports are the supported, typed source of truth.
Most apps behave the same after updating package versions; the work is primarily import and type adjustments where TypeScript reports errors.
This guide is written to be complete enough for an automated first pass. We recommend feeding this document to your coding agent, then asking it to analyze your codebase against each relevant section below and produce a concrete change list (or PR) for the packages you use. The Automated migration checklist at the end is structured for that workflow.
| You use… | Likely impact |
|---|---|
TypeScript + modular imports (getX(), ref(), etc.) | High — update imports and call patterns per package sections below |
TypeScript + namespaced API only (firebase.storage().ref()) | Low–medium — namespaced APIs remain; some types are deprecated or stricter |
| JavaScript only, no type checking | Low — runtime is mostly compatible; deprecated APIs still work but emit warnings |
Across v25 package migrations:
- Import modular types and functions from the package root, not from
Firebase*Typesnamespaces. - Prefer free functions (
getToken(appCheck),trace(perf, name)) over instance methods on service objects. Firebase*Typesnamespaces remain for namespaced compatibility but are deprecated for new code.- Namespaced APIs (
firebase.auth(),storage()) still work; modular is the typed source of truth.
Commit: c8c1fc105 (SDK bump)
| Change | Who | Action |
|---|---|---|
firebase-ios-sdk 12.12.0+ requires Xcode 26.2+ | iOS developers | Upgrade Xcode before building v25 |
firebase-android-sdk 34.12.0, firebase-js-sdk 12.12.0 | All | Update lockfiles / pods as usual on upgrade |
PR: #8824
Modular Storage types now match firebase-js-sdk. The namespaced API (firebase.storage(), FirebaseStorageTypes) is preserved separately and deprecated for new code.
| Before (v24 modular / types) | Now (v25) |
|---|---|
Instance methods on Storage / StorageReference in modular typings | Use root-level functions: ref(), uploadBytes(), getDownloadURL(), etc. |
refFromURL(storage, url) | ref(storage, url) — ref() accepts gs:// and https:// URLs |
child(ref, path) | ref(ref, path) |
Modular toString(ref) helper | ref.toString() on the reference |
storage.statics.StringFormat, TaskEvent, TaskState | Import StringFormat, TaskEvent, TaskState from package root |
md5hash in metadata | md5Hash (firebase-js-sdk spelling) |
Generic Error in task callbacks | NativeFirebaseError |
ListOptions.pageToken required string | string | null (nullable, matching firebase-js-sdk) |
// Previously
import { getStorage, refFromURL, child } from '@react-native-firebase/storage';
const storage = getStorage();
const fileRef = child(refFromURL(storage, 'gs://bucket/path/file.jpg'), 'thumb.jpg');
await fileRef.putFile(localPath);// Now
import { getStorage, ref, putFile } from '@react-native-firebase/storage';
const storage = getStorage();
const fileRef = ref(ref(storage, 'gs://bucket/path/file.jpg'), 'thumb.jpg');
await putFile(fileRef, localPath);// Previously
import { getStorage, FirebaseStorageTypes } from '@react-native-firebase/storage';
function onState(snapshot: FirebaseStorageTypes.TaskSnapshot) {
if (snapshot.state === getStorage().app.storage().constructor.TaskState.RUNNING) { /* … */ }
}// Now
import { getStorage, ref, uploadBytesResumable, TaskState, type TaskSnapshot } from '@react-native-firebase/storage';
function onState(snapshot: TaskSnapshot) {
if (snapshot.state === TaskState.RUNNING) { /* … */ }
}RN-only helpers (putFile, writeToFile) remain exported from the package root for native file paths.
PR: #8977
Modular RTDB types (DatabaseReference, Query, DataSnapshot, OnDisconnect, QueryConstraint) no longer expose namespaced instance-style methods in public typings. Use function-based modular helpers.
| Before | Now |
|---|---|
import { ServerValue } from '@react-native-firebase/database' | Use serverTimestamp() and increment(delta) |
await goOffline(db) / .then() on goOffline | goOffline(db) returns void |
await goOnline(db) | goOnline(db) returns void |
getServerTime(db) treated as async | Returns synchronous Date |
// Previously
import { getDatabase, ref, set, ServerValue } from '@react-native-firebase/database';
await set(ref(getDatabase(), 'posts/1'), { createdAt: ServerValue.TIMESTAMP });// Now
import { getDatabase, ref, set, serverTimestamp } from '@react-native-firebase/database';
await set(ref(getDatabase(), 'posts/1'), { createdAt: serverTimestamp() });// Previously — instance methods typed on modular references
import {
getDatabase,
ref,
query,
orderByChild,
equalTo,
onValue,
} from '@react-native-firebase/database';
const db = getDatabase();
const scoresRef = ref(db, 'scores');
const q = query(scoresRef, orderByChild('score'), equalTo(100));
onValue(q, snapshot => {
/* … */
});Function-based helpers (query, orderByChild, onValue, etc.) are unchanged at runtime; TypeScript may now require you to stop calling deprecated instance methods (.orderByChild(), .on()) on modular-typed references and use the modular functions instead.
Namespaced firebase.database.ServerValue remains available.
PR: #8972
Modular Remote Config now uses firebase-js-sdk type names and instance properties.
| Removed (v24) | Replacement (v25) |
|---|---|
fetch(remoteConfig, expirationDurationSeconds?) | fetchConfig(remoteConfig) |
setConfigSettings(remoteConfig, settings) | remoteConfig.settings = { minimumFetchIntervalMillis, fetchTimeoutMillis } |
setDefaults(remoteConfig, defaults) | remoteConfig.defaultConfig = { … } |
onConfigUpdated(remoteConfig, cb) | onConfigUpdate(remoteConfig, observer) |
fetchTimeMillis(), settings(), lastFetchStatus() helpers | Read remoteConfig.fetchTimeMillis, .settings, .lastFetchStatus |
RemoteConfigValue.value / .source getters | value.asString() (etc.) and value.getSource() |
Exports: LastFetchStatus, ValueSource, ConfigSettings, ConfigDefaults, ConfigValue, ConfigValues, LastFetchStatusType, RemoteConfigLogLevel | Use FetchStatus, ValueSource, Value, RemoteConfigSettings, LogLevel |
Settings field rename: modular RemoteConfigSettings uses fetchTimeoutMillis (firebase-js-sdk), not the older React Native Firebase style fetchTimeMillis on the modular surface.
// Previously
import {
getRemoteConfig,
fetch,
activate,
getValue,
FirebaseRemoteConfigTypes,
} from '@react-native-firebase/remote-config';
const rc = getRemoteConfig();
await fetch(rc, 3600);
await activate(rc);
const flag = getValue(rc, 'feature_enabled');
console.log(flag.value, flag.source);// Now
import {
getRemoteConfig,
fetchConfig,
activate,
getValue,
type Value,
} from '@react-native-firebase/remote-config';
const rc = getRemoteConfig();
rc.settings = {
minimumFetchIntervalMillis: 3600000,
fetchTimeoutMillis: 60000,
};
await fetchConfig(rc);
await activate(rc);
const flag: Value = getValue(rc, 'feature_enabled');
console.log(flag.asString(), flag.getSource());PR: 4aedfe883 (TypeScript migration)
| Before | Now |
|---|---|
await initializePerformance(app, settings) | Returns FirebasePerformance synchronously |
perf.newTrace(name), perf.startTrace(name) | trace(perf, name) |
perf.newHttpMetric(url, method) | httpMetric(perf, url, method) |
perf.newScreenTrace(name) / startScreenTrace(name) | newScreenTrace(perf, name) / startScreenTrace(perf, name) |
perf.setPerformanceCollectionEnabled(bool) | perf.dataCollectionEnabled = bool |
PerformanceSettings React Native Firebase shape | { dataCollectionEnabled?, instrumentationEnabled? } (firebase-js-sdk) |
trace.getAttribute(key) typed as string | null | string | undefined |
RN-only exports retained: httpMetric, newScreenTrace, startScreenTrace, HttpMethod, HttpMetric, ScreenTrace.
// Previously
import { getPerformance } from '@react-native-firebase/perf';
const perf = getPerformance();
const t = perf.newTrace('load_screen');
await t.start();// Now
import { getPerformance, trace } from '@react-native-firebase/perf';
const perf = getPerformance();
const t = trace(perf, 'load_screen');
await t.start();PR: 739a4ca36 (TypeScript migration)
Modular getInstallations() returns a firebase-js-sdk-shaped Installations object exposing only app. Use modular helper functions instead of instance methods.
| Before | Now |
|---|---|
installations.getId() | getId(installations) |
installations.getToken() | getToken(installations) |
installations.delete() | deleteInstallations(installations) — argument is required |
// Previously
import { getInstallations } from '@react-native-firebase/installations';
const installations = getInstallations();
const id = await installations.getId();// Now
import { getInstallations, getId } from '@react-native-firebase/installations';
const installations = getInstallations();
const id = await getId(installations);Namespaced firebase.installations() / FirebaseInstallationsTypes remain available (deprecated).
PR: #8889
Version 25 aligns App Check's modular exports more closely with the Firebase JS SDK. If your app uses the modular API, import App Check types and helpers directly from @react-native-firebase/app-check instead of routing modular code through FirebaseAppCheckTypes.
The most common updates are:
- Import modular helpers such as
initializeAppCheck,getToken,getLimitedUseToken,setTokenAutoRefreshEnabled, andonTokenChangedfrom the package root. - Import modular types such as
AppCheckandAppCheckTokenResultfrom the package root. FirebaseAppis no longer exported from@react-native-firebase/app-check; import it from@react-native-firebase/app.FirebaseAppCheckTypesis type-only — useimport type { FirebaseAppCheckTypes }.- Modular
AppCheckhas no instance methods (matching firebase-js-sdk); use free functions. onTokenChangedcallback receivesAppCheckTokenResult, notAppCheckListenerResult.- Keep using
ReactNativeFirebaseAppCheckProvideron React Native when you need native provider selection for Android / Apple / web.
// Previously
import appCheck, { FirebaseAppCheckTypes } from '@react-native-firebase/app-check';
const instance = appCheck();
instance.getToken().then((result: FirebaseAppCheckTypes.AppCheckTokenResult) => {
console.log(result.token);
});// Now
import { getApp } from '@react-native-firebase/app';
import {
AppCheckTokenResult,
ReactNativeFirebaseAppCheckProvider,
initializeAppCheck,
getToken,
} from '@react-native-firebase/app-check';
const provider = new ReactNativeFirebaseAppCheckProvider();
provider.configure({
android: {
provider: __DEV__ ? 'debug' : 'playIntegrity',
},
apple: {
provider: __DEV__ ? 'debug' : 'appAttestWithDeviceCheckFallback',
},
web: {
provider: 'reCaptchaV3',
siteKey: 'your-recaptcha-site-key',
},
});
const appCheck = await initializeAppCheck(getApp(), {
provider,
isTokenAutoRefreshEnabled: true,
});
const result: AppCheckTokenResult = await getToken(appCheck);
console.log(result.token);If you do not need to reuse a provider instance, you can now also pass the React Native provider configuration inline through providerOptions:
import { getApp } from '@react-native-firebase/app';
import { initializeAppCheck } from '@react-native-firebase/app-check';
await initializeAppCheck(getApp(), {
provider: {
providerOptions: {
android: {
provider: __DEV__ ? 'debug' : 'playIntegrity',
},
apple: {
provider: __DEV__ ? 'debug' : 'appAttestWithDeviceCheckFallback',
},
web: {
provider: 'reCaptchaV3',
siteKey: 'your-recaptcha-site-key',
},
},
},
isTokenAutoRefreshEnabled: true,
});PR: #8991
Version 25 aligns @react-native-firebase/auth TypeScript types with the firebase-js-sdk modular API. Runtime behavior is largely unchanged, but TypeScript consumers should review the following breaking changes.
For maintainers and coding agents: the living triage matrix is okf-bundle/packages/auth/compare-types-triage.md. Run yarn compare:types auth after public API edits and update .github/scripts/compare-types/configs/auth.ts when differences are intentional.
| Context | Platform.OS | Backend | Notes |
|---|---|---|---|
| iOS/Android | ios, android | Native Firebase Auth SDK | Native bridge types (verifyPhoneNumber listener, Multi-Factor Authentication overloads, async isSignInWithEmailLink) |
| Other/Hermes | e.g. macOS, Windows RN | firebase-js-sdk via the auth web bridge | No DOM; MFA/TOTP covered by tests/local-tests |
| Other/Web | browser embedding | firebase-js-sdk | DOM APIs (reCAPTCHA, redirect) possible but not all delegated yet |
When a symbol is documented as iOS/Android only, do not assume it throws or is missing on Other without checking the web bridge. When compare:types signatures match but runtime differs, document in triage / this guide (not necessarily in differentShape).
Import modular types directly from @react-native-firebase/auth instead of FirebaseAuthTypes where possible. The namespaced FirebaseAuthTypes namespace remains available but is deprecated.
For auth errors, use NativeFirebaseAuthError (or the modular AuthError interface) instead of expecting a firebase-js-sdk AuthError class export — React Native Firebase does not re-export the firebase-js-sdk error class.
initializeRecaptchaConfigis not exported. React Native Firebase uses native SDK Phone Auth verification rather than the browser reCAPTCHA bootstrap flow.
The following RN Firebase-specific provider classes are deprecated in v25. Use OAuthProvider instead (matching firebase-js-sdk):
| Deprecated | Replacement |
|---|---|
AppleAuthProvider | new OAuthProvider('apple.com') |
OIDCAuthProvider | new OAuthProvider('oidc.<your-provider-id>') |
OIDCProvider | OAuthProvider |
// Previously (deprecated)
import { AppleAuthProvider } from '@react-native-firebase/auth';
const credential = AppleAuthProvider.credential(idToken, rawNonce);
// Now
import { OAuthProvider } from '@react-native-firebase/auth';
const provider = new OAuthProvider('apple.com');
const credential = provider.credential({ idToken, rawNonce });// Previously (deprecated)
import { OIDCAuthProvider } from '@react-native-firebase/auth';
const credential = OIDCAuthProvider.credential('sample-provider', idToken, accessToken);
// Now
import { OAuthProvider } from '@react-native-firebase/auth';
const provider = new OAuthProvider('oidc.sample-provider');
const credential = provider.credential({ idToken, accessToken });AppleAuthProvider and OIDCAuthProvider remain exported for compatibility but will be removed in a future major release.
ActionCodeURL.parseLink and parseActionCodeURL are implemented as synchronous pure URL parsers (matching firebase-js-sdk). They work on all platforms without calling the native bridge.
isSignInWithEmailLink(auth, emailLink)— returnsPromise<boolean>on iOS/Android (native bridge). The firebase-js-sdk returns a synchronousboolean. Port web code withawait isSignInWithEmailLink(auth, link)(or.then(...)).sendSignInLinkToEmail(auth, email, actionCodeSettings)—actionCodeSettingsis required in the modular API (matching firebase-js-sdk).- Namespaced email link (react-native-firebase convenience):
firebase.auth().sendSignInLinkToEmail(email, settings?)still accepts omitted settings. Internally_resolveActionCodeSettings()defaultsurlfromapp.options.authDomainandhandleCodeInApp: true. This is not platform-specific — only namespaced vs modular. Do not “fix” modular to match namespaced defaults. signInWithEmailLink(auth, email, emailLink?)— the third argument is optional, matching firebase-js-sdk.signInWithRedirect/linkWithRedirect— returnPromise<UserCredential>on native because provider flows resolve immediately with credentials instead of following the browser redirect contract.reauthenticateWithRedirect— returnsPromise<void>on native while still updatingcurrentUserafter the native provider flow completes.connectAuthEmulator(auth, url, options?)— whenoptionsis provided,disableWarningsis required (matching firebase-js-sdk).
These modular helpers are exported for firebase-js-sdk API parity. On iOS/Android they throw synchronously (or are not applicable) because native SDKs do not implement the browser persistence, redirect, or reCAPTCHA phone-link flows. Types match the firebase-js-sdk; behavior does not — see API reference @remarks on each symbol.
| API | Native iOS/Android behavior |
|---|---|
getRedirectResult | Always throws — use immediate UserCredential from signInWithRedirect / linkWithRedirect instead |
setPersistence | Always throws — native SDKs manage auth state |
useDeviceLanguage | Always throws |
revokeAccessToken | Always throws |
linkWithPhoneNumber | Always throws |
reauthenticateWithPhoneNumber | Always throws |
initializeAuth(app, deps?) accepts the firebase-js-sdk Dependencies type for API parity but ignores persistence, popup redirect resolver, and error-map dependencies on iOS/Android (see below).
verifyPhoneNumber(auth, phoneNumber, ...)— iOS/Android only native listener flow (force-resend, auto-verification callbacks). On Other platforms usesignInWithPhoneNumber/ firebase-js-sdkPhoneAuthProviderinstead.signInWithPhoneNumber(auth, phoneNumber, appVerifier?)— modular API no longer accepts the formerforceResendfourth argument from React Native Firebase; useverifyPhoneNumberwhen you need the native listener / force-resend behavior.
revokeToken(auth, authorizationCode)— React Native Firebase-specific modular helper for Apple's account-deletion requirement. Supported on iOS (nativerevokeTokenWithAuthorizationCode). Android and Web bridges resolve without performing revocation.- Do not confuse with
revokeAccessToken— that is firebase-js-sdk web-only OAuth token revocation and always throws on iOS/Android. - The namespaced
firebase.auth().revokeToken(authorizationCode)API remains available but is deprecated.
auth.tenantId = 'tenant-id'is now supported (delegates tosetTenantId).auth.authStateReady(),auth.beforeAuthStateChanged(...),auth.emulatorConfig, andauth.updateCurrentUser(user)are implemented on the Auth instance.auth.configruntime split (types unified): Declarations match firebase-js-sdkConfig, but runtime differs by platform:- iOS/Android: always
{}— native SDKs do not expose the web config object. - Other (Hermes/Web): firebase-js-sdk can populate
auth.config, but React Native Firebase does not delegate this yet. Do not readauth.configon native expectingapiKey/authDomain; usegetCustomAuthDomain(auth)on iOS/Android or app options on Other until delegation lands.
- iOS/Android: always
Provider credential factories return firebase-js-sdk-shaped credential classes (OAuthCredential, not internal type aliases) with toJSON() and static fromJSON() where applicable.
-
OAuthCredential.rawNonce— used for Sign in with Apple and Facebook limited-login flows (matches firebase-js-sdk credential options). OAuth 1.0 token secrets (e.g. Twitter) use the inheritedAuthCredential.secretbridge field instead ofrawNonce. -
RN Firebase credentials retain internal
token/secretbridge fields required by the native modules (implementation detail; omitted from generated API reference). -
OAuthProvider.credentialFromResult/credentialFromErrorand sibling provider helpers (GoogleAuthProvider,GithubAuthProvider,TwitterAuthProvider,FacebookAuthProvider,PhoneAuthProvider) always returnnullat runtime today. Declared types match firebase-js-sdk.- iOS/Android: no native extraction planned — credentials are not recoverable from native provider results.
- Other/Hermes: not delegated (firebase-js-sdk credential recovery is tied to popup/redirect flows).
- Other/Web: future implementation should delegate to firebase-js-sdk in the auth web bridge — do not invest in native iOS/Android bridge work for this.
-
GoogleAuthProvider.credential()throws when bothidTokenandaccessTokenare absent (matching firebase-js-sdk). -
FacebookAuthProvider.credential(token)matches firebase-js-sdk. React Native Firebase also exportscredential(token, secret)for Facebook limited-login nonce behavior — an intentional extension documented in compare:types.
- Modular
multiFactor(user)now uses the user's auth instance instead of always callinggetAuth(), fixing secondary Firebase app usage. - Namespaced
firebase.auth().multiFactor(user)now correctly validates thatuseris thecurrentUser. TotpSecret.generateQrCodeUrl()returnsPromise<string>on iOS/Android (native bridge). firebase-js-sdk returns a synchronous string.TotpSecret.openInOtpApp(qrCodeUrl)— RN-only helper that deep-links into a One-Time Password authenticator app; not part of firebase-js-sdk.- Other platforms: MFA and TOTP flows are exercised in
tests/local-testsvia the firebase-js-sdk bridge — not a gap to “port” from native overloads.
Modular helpers normalize several return shapes toward firebase-js-sdk:
UserCredentialincludes top-levelproviderIdandoperationType.- When the native bridge returns federated metadata,
additionalUserInfois attached as an enumerable property on modularUserCredentialobjects. Core fields match firebase-js-sdk (isNewUser,profile,providerId,username); extra native keys are copied onto the object for backwards compatibility. - Use
getAdditionalUserInfo(userCredential)for the canonical read (returnsAdditionalUserInfo | null, same shape as firebase-js-sdk). For TypeScript when you need provider-specific native extras, cast toAdditionalUserInfoNative(AdditionalUserInfo & Record<string, unknown>). checkActionCodenormalizesfromEmailtopreviousEmailand coerces multi-factor info shapes.signInWithPhoneNumberwraps confirmation results and validatesverificationIdpresence.
initializeAuth(app, deps?) accepts the firebase-js-sdk Dependencies type for API parity, but persistence, popup redirect resolver, and error-map dependencies are ignored because native SDKs manage auth state.
FirebaseAuthTypes.UserInfoprofile fields can be null.firebase.auth().configis typed asRecord<string, never>on the namespaced API (stricter than modularauth.config).
PR: #9053
Notification permission APIs in @react-native-firebase/messaging are deprecated in v25. They are not Firebase-specific; dedicated libraries handle permissions more completely.
| Deprecated API | Use instead |
|---|---|
requestPermission(messaging, …) | react-native-permissions or expo-notifications (Expo) |
hasPermission(messaging) | Same |
registerDeviceForRemoteMessages(messaging) | Same (platform setup) |
isDeviceRegisteredForRemoteMessages(messaging) | Same |
AuthorizationStatus static on messaging | Permission library equivalents |
These APIs still work at runtime but are marked @deprecated in TypeScript and documented for removal in a future major release. See #6283.
Use this section when running scripted or agent-assisted upgrades from v24 → v25.
# Bump all @react-native-firebase/* packages to v25 together (monorepo versions are aligned)
yarn add @react-native-firebase/app@^25.0.0 …
cd ios && pod installEnsure Xcode 26.2+ for iOS builds.
For each @react-native-firebase/<pkg> in your imports:
| Package | Search for | Replace with |
|---|---|---|
storage | refFromURL, child(, FirebaseStorageTypes, .statics. | ref(), root imports, modular functions |
database | ServerValue, .orderByChild(, await goOffline | serverTimestamp(), query/orderByChild functions, sync goOffline |
remote-config | fetch(, setDefaults, setConfigSettings, .value, .source | fetchConfig, defaultConfig/settings props, asString()/getSource() |
perf | .newTrace, .newHttpMetric, await initializePerformance | trace(), httpMetric(), sync initializePerformance |
installations | .getId(), .getToken(), .delete() | getId(), getToken(), deleteInstallations() |
app-check | appCheck().getToken(), value import of FirebaseAppCheckTypes | initializeAppCheck + getToken(), import type |
auth | FirebaseAuthTypes, AppleAuthProvider, OIDCAuthProvider | Root modular types, OAuthProvider |
messaging | requestPermission, hasPermission | react-native-permissions / expo-notifications |
yarn compile # root TypeScript compile
yarn compare:types # maintainers: per-package drift vs firebase-js-sdk
yarn tests:jest packages/<pkg>/__tests__ # targeted tests for touched packagesIf you only use firebase.storage(), firebase.auth(), etc. and do not import modular types:
- You may see deprecation warnings in IDE /
@deprecatedJSDoc. - Plan a gradual move to modular imports; namespaced removal is planned for a future major release.
- Runtime behavior should remain compatible for most flows.
| Package | PR / commit |
|---|---|
| Storage | #8824 |
| App Check | #8889 |
| Remote Config | #8972 |
| Realtime Database | #8977 |
| Performance | 4aedfe883 |
| Installations | 739a4ca36 |
| Auth | #8991 |
| Messaging (deprecations) | #9053 |
| Native SDKs (Xcode) | c8c1fc105 |
Packages migrated to TypeScript without public API breaks in v25: @react-native-firebase/app-distribution (#8967), @react-native-firebase/ml (#9005).

Core / App