React Native 0.88 is a safe upgrade from 0.87 on paper, with no user-facing breaking changes, but it moves the whole event system to a new path and that is where a premium commerce app should spend its test budget. The release landed on October 19, 2026. It also brings variable fonts to text on both platforms, iOS SceneDelegate support and a firm date for Swift Package Manager replacing CocoaPods. Here is how we would rank the work for a team shipping a brand app.
What changed in React Native 0.88
React Native 0.88 dispatches events through the W3C EventTarget model by default, adds fontVariationSettings to Text and TextInput, and supports the iOS UIScene lifecycle. The official release post calls the event change the largest runtime change in the version. It was unblocked by syncing React 19.3.0 into the framework. Metro moves to 0.87, with 0.87.1 as the new minimum, and Hermes gets a version bump.
It is the third release without user-facing breaking changes, after 0.83 and 0.86. The team counts 568 commits from 91 contributors. With 0.88 now the latest stable line, 0.85.x falls out of support, so an app still on 0.85 no longer receives framework fixes.
React Native 0.88 vs 0.87: what to test first
Test touch and gesture behaviour first, because events now travel a real capture and bubble path instead of the old plugin registry. The core team says nothing should change for app code: prop names, synthetic event objects and ordering are the same, and the touch responder system is untouched. The risk sits in dependencies. Gesture, carousel, bottom sheet and analytics libraries sometimes reach into renderer internals, and those internals are what moved. The legacy path survives in 0.88 behind an internal flag, but the team plans to remove it in a follow-up release.
In a commerce app, the flows to walk through by hand are the ones where several gestures compete. A product gallery with pinch to zoom inside a horizontal pager. A size picker inside a bottom sheet that also scrolls. A swipe to delete line in the cart. A sticky add to cart bar over a scrolling product page. If those behave on 0.88 with your exact library versions, the event change is done for you.
Second on the list is anything that talks to your servers. On Android, the default User-Agent now carries the app name and version, matching iOS. That is good for debugging, but a CDN rule, bot filter or API gateway that keys on the old string will see different traffic after the upgrade. Check your edge rules before the build reaches the store, not after support tickets arrive.
Third, scroll behaviour. Several ScrollView fixes ship in this version, including maintainVisibleContentPosition holding position through fast data updates. That one matters for chat style order tracking and for infinite product grids that prepend items. Fixes change behaviour too, so recheck any workaround your team wrote against the old bugs.
Why variable fonts matter for brand apps
Variable fonts let a React Native app use one font file with continuous weight, width or optical size axes, instead of shipping a separate static file for each weight. In 0.88, Text and TextInput accept fontVariationSettings on Android and iOS, as a CSS style string or as an object keyed by four character axis tags.
For premium brands this is the most visible change in the release. Brand typefaces are increasingly delivered as variable fonts, and until now a mobile team usually exported four or five static cuts and approximated the rest. That broke parity with the website and the brand book. With axis control in core, the app can match the exact weight the identity specifies, adjust optical size for small product labels and large editorial headlines, and drop several font files from the bundle.
It also opens up motion. Animating a weight axis on a selected tab or a price that updates is a small detail, and small details are what separate a brand app from a template. Treat it carefully: animate typography only where it carries meaning, and test it on mid-range Android devices before shipping. Our brand and identity work now includes a variable font spec for mobile alongside the web one.
SceneDelegate and Swift Package Manager: the iOS timeline
React Native 0.88 adds SceneDelegate entry points because Apple requires the UIScene lifecycle from the iOS 27 SDK, and UIKit apps built with Xcode 27 that skip it will not launch. Support is additive, the AppDelegate path still works, and only a single scene is supported for now. We covered the migration traps in detail when Expo shipped its own version, in our AppDelegate vs SceneDelegate breakdown. Deep links and universal links are where most of the breakage hides, so they deserve real device testing.
The bigger planning item is packaging. Swift Package Manager stays experimental and opt-in in 0.88, but the published plan makes it the default in 0.89, with CocoaPods as an opt-out, and CocoaPods support removed in a later release. If your app depends on native SDKs for payments, analytics or loyalty that only ship as pods, that is your blocker list. Ask those vendors now. A two-release window passes quickly when one of them is a payment provider.
What we would do this quarter
Upgrade to 0.88 on a branch this month, spend most of the test time on gestures, and use the remaining weeks to clear the iOS packaging path. On our React Native and Flutter mobile builds, the order looks like this.
Start with the React Native Upgrade Helper diff from 0.87 to 0.88 and the dependency matrix. Gesture and animation libraries come first, then anything with native modules. If you use Expo, the 0.88 line arrives through SDK 58, so follow that release rather than upgrading React Native directly.
Then run a gesture test pass on two real devices per platform, including one mid-range Android phone. Next, audit server rules for the Android User-Agent change. Then move the iOS entry point to SceneDelegate, so the Xcode 27 deadline is not a surprise. Finally, try the Swift Package Manager opt-in on a branch and write down every pod that fails.
Variable fonts can come last, but they are the part the brand team will notice. If the identity already ships a variable typeface, wiring it in is a short task with an outsized effect on how finished the app feels.
Teams still on 0.84 or 0.85 should not jump straight to 0.88 in one move. Each step since 0.83 has been light, but stacking several releases hides which one broke a flow. Go one minor version at a time, ship each to internal testers, and keep releases small.