Skip to content

[HOLD Expo SDK 58 stable] [$1000] Upgrade RN to 0.88 and Expo SDK 58 #101427

Open
4 of 8 issues completed
Open

Description

@mountiny

Upgrade React Native (RN) to the Latest Version for Enhanced Performance and Compatibility

Background

Over time, our codebase has grown to include numerous custom patches, and the open-source ecosystem around React Native continues to evolve with frequent updates, performance improvements, and new features. Third-party libraries often adapt quickly to these changes.

Expo SDK 58 upgrades React Native from 0.86 straight to 0.88, so it picks up the changes from both RN 0.87 and RN 0.88 in one step. RN 0.88 is classified as a non-breaking release, but RN 0.87 is a large cleanup release that removes many deprecated APIs and makes the Strict TypeScript API the default. See the Expo SDK 58 beta changelog.

SDK 58 is still in beta (expo@58.0.0-preview.3, bundling react-native@0.88.0-rc.0) and goes stable shortly after RN 0.88 ships. This issue is on HOLD until then.

This follows Upgrade RN to 0.86 and Expo SDK 57, which is now deployed to production.

Problem

Staying on RN 0.86 / Expo SDK 57 delays compatibility with the latest Expo ecosystem, misses two releases of RN fixes and performance work, and leaves us on bundled dependency versions that SDK 58 has already validated together. The RN 0.87 Strict TypeScript API opt-out only exists through RN 0.88, so the migration work gets harder the longer we wait.

Solution

  • Upgrade React Native to 0.88 and Expo SDK to 58
  • Upgrade prerequisite dependencies bundled with SDK 58 (see table below) before the main bump PR
  • Audit and remove unnecessary patches
  • Coordinate parallel PRs in App (NewDot) and Mobile-Expensify (OldDot / HybridApp)
  • Conduct thorough testing for stability across web, iOS, and Android

Prerequisite dependency upgrades (file as sub-issues when work begins)

SDK 58 bundles newer versions of these libraries. Follow the RN 0.86 / SDK 57 pattern: land each on current RN 0.86 / SDK 57 before the main bump.

Dependency Current (main) SDK 58 target Notes
react-native-worklets 0.11.1 0.12.2 Upgrade first; version alignment with reanimated is critical
react-native-reanimated 4.5.5 4.6.0 After worklets
react-native-gesture-handler 2.32.0 ~3.2.1 Major version bump, expect breaking API changes
react-native-webview 13.16.0 14.0.1 Major version bump; we carry a patch on this package
@react-native-community/netinfo 11.4.1 12.0.1 Major version bump
react-native-screens 4.25.0 ~4.27.0 We carry a patch on this package
react-native-safe-area-context 5.6.2 ~5.9.1 We carry a patch on this package

react-native-keyboard-controller is already on 1.22.4, which is what SDK 58 bundles, so it needs no prerequisite upgrade this time.

Known blockers and native work

  1. iOS 27 SDK and the UIScene lifecycle. SDK 58 requires the scene based lifecycle and generates a SceneDelegate. ios/NewExpensify.xcodeproj has no SceneDelegate today and targets iOS 16.4. This needs native work in both App and Mobile-Expensify for HybridApp.
  2. Strict TypeScript API is the default in RN 0.87. Deep imports from react-native/Libraries/* become type errors. main has roughly 15 of them across src/ and tests/, mostly StyleSheetTypes and CoreEventTypes, plus several inside patches/. The react-native-legacy-deep-imports customConditions opt-out only lasts through RN 0.88, so we should migrate rather than opt out.
  3. Android toolchain. RN 0.87 wants compileSdkVersion and buildToolsVersion at 37. android/build.gradle currently sets 36 with kotlinVersion = "2.1.20". AGP 9 support is new and needs android.builtInKotlin=false and android.newDsl=false.
  4. RN 0.88 TurboModule ArrayBuffer change. Codegen now emits RCTArrayBuffer * instead of NSMutableData * for TurboModule methods taking or returning an ArrayBuffer. This affects our nitro modules and any local TurboModule using ArrayBuffer.
  5. Removed APIs. A pass over main found no use of InteractionManager, ImageBackground, the Modal animated prop, or a boolean keyboardShouldPersistTaps. The removal of the StatusBar backgroundColor and translucent props still needs a review of src/libs/StatusBar/.
  6. Patches. patches/ holds 56 entries, including patches on react-native, react-native-reanimated, react-native-screens, react-native-safe-area-context, react-native-web, and react-native-webview. Each needs a rebase or removal.

Node is already on 26.5.0, so the RN 0.87 floor of Node 22.13.0 is met.

Issue OwnerCurrent Issue Owner: @collectioneur

Activity

  1. roryabraham commented on Sep 17, 2026

    @roryabraham
    Contributor

    @MelvinBot which of the prerequisite dependency upgrades can we land on RN 0.86? Create sub-issues for each of the prerequisite dependency upgrades that we can land before RN 0.86. Mark react-native-reanimated as blocked by react-native-worklets

  2. 14 remaining items

  3. melvin-bot commented on Sep 21, 2026

    @melvin-bot

    @collectioneur Uh oh! This issue is overdue by 2 days. Don't forget to update your issues!

  4. collectioneur commented on Sep 22, 2026

    @collectioneur
    Contributor

    Not overdue

  5. collectioneur commented on Sep 22, 2026

    @collectioneur
    Contributor

    I tested the 0.88 spike on a local branch, and it turned out that some of the bumps from the list aren't actually required for this upgrade:

    react-native-webview: no bump needed. Our current 13.16.0 builds and works fine on every platform with RN 0.88.
    @react-native-community/netinfo: also builds and works on 11.4.1 without a bump. It's still worth bumping to 12.0.1 because it lets us drop our two patches (they're already upstream), but that can be done as an independent PR 🙂

  6. TaduJR commented on Oct 5, 2026

    @TaduJR
    Contributor

    @collectioneur

    For the React Native 0.88 upgrade, please pin the AGP version to React Native's (9.2.1, and below 9.3 for now, since 9.3's R8 has an upstream bug that crashes react-native-screens). Then delete the R8 override that https://github.com/Expensify/Mobile-Expensify/pull/14155 adds and the Field / Required rules, which Expo 58 fixes, and run https://github.com/Expensify/Mobile-Expensify/pull/14155's QA flows on the adhoc build, GPS first.

  7. melvin-bot commented on Oct 15, 2026

    @melvin-bot

    This issue has not been updated in over 15 days. @Julesssss, @mountiny, @roryabraham, @shubham1206agra, @war-in, @jakubstec, @collectioneur eroding to Monthly issue.

    P.S. Is everyone reading this sure this is really a near-term priority? Be brave: if you disagree, go ahead and close it out. If someone disagrees, they'll reopen it, and if they don't: one less thing to do!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

EngineeringInternalRequires API changes or must be handled by Expensify staffMonthlyKSv2ReviewingHas a PR in reviewTask

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions