ExpoExpo SDK 58React NativeUpgrade Guide

Expo SDK 58: What's New (React Native 0.88, iOS 27) and How to Upgrade

Everything that matters in Expo SDK 58 — React Native 0.88, iOS 27 and iPhone Duo support, stable Expo Router native tabs and data loaders, App Intents, recycling Expo UI lists, Android widgets — plus the breaking changes and a step-by-step upgrade guide.

DeveloperMill5 min read

Expo SDK 58 was released on October 15, 2026, and it's a big one. It ships React Native 0.88, is built for iOS 27, and makes several Expo Router features that were experimental for a long time stable: native tabs, data loaders, SSR, and middleware. If you skipped the deliberately small SDK 57, this is the release where you'll notice the difference.

Here's what's new, what breaks, and how to upgrade safely.

The highlights at a glance

  • React Native 0.88 (includes 0.87): Swift Package Manager tooling, fontVariationSettings on Text, ArrayBuffer in TurboModules, DevTools improvements.
  • Built for iOS 27: scene-based app life cycle, resizable iPhone apps, and iPhone Duo (foldable) layouts.
  • Expo Router: native tabs, toolbars, data loaders, SSR, and middleware are stable.
  • App Intents (alpha): expose app actions to Siri, Shortcuts, Spotlight, and Apple Intelligence.
  • Expo UI: recycling lists, native iOS navigation components, new Jetpack Compose components.
  • Android home screen widgets via expo-widgets.
  • Faster builds: prebuilt expo-modules-core on Android, a smarter fingerprint default, and an experimental Rust-based transformer for about 2× faster cold bundling.

Built for iOS 27 and iPhone Duo

iOS 27 requires the UIKit scene-based life cycle, and it makes iPhone apps resizable. SDK 58 adopts both. Prebuild now generates a SceneDelegate.swift, so if you customized AppDelegate.swift (deep links, push handling, or a third-party SDK's init code), read the scene life cycle migration guide before you upgrade.

Apps built with SDK 58 are also ready for iPhone Duo, where system bars move into a side rail. The safest path is to rely on Expo Router's Stack and NativeTabs (they adapt automatically) and to keep react-native-safe-area-context up to date. Hard-coded top or bottom padding is the thing most likely to look broken.

Expo Router: native tabs and data loaders are stable

This is the headline for most app developers. Native tabs, which render the real system tab bar (Liquid Glass on iOS, Material on Android), move to a stable import path:

// app/(tabs)/_layout.tsx
import { NativeTabs } from "expo-router/native-tabs"

export default function TabLayout() {
  return (
    <NativeTabs>
      <NativeTabs.Trigger name="index">
        <NativeTabs.Trigger.Label>Home</NativeTabs.Trigger.Label>
        <NativeTabs.Trigger.Icon sf="house.fill" md="home" />
      </NativeTabs.Trigger>
      <NativeTabs.Trigger name="settings">
        <NativeTabs.Trigger.Label>Settings</NativeTabs.Trigger.Label>
        <NativeTabs.Trigger.Icon sf="gear" md="settings" />
      </NativeTabs.Trigger>
    </NativeTabs>
  )
}

If you used expo-router/unstable-native-tabs on SDK 55–57, update the import. We cover the full API (badges, search tabs, minimize-on-scroll) in our Expo Router native tabs guide.

Data loaders, server-side rendering, and middleware no longer need experimental flags either, and server output is now the default for web. The navigation core was also reworked. withLayoutContext is deprecated in favor of integrateWithRouter, so if you wrap a custom navigator, plan that migration.

App Intents: Siri, Shortcuts, and Apple Intelligence

The new expo-app-intents package (alpha) exposes your app's actions and content to Siri, Shortcuts, Spotlight, and Apple Intelligence. You set it up with:

npx expo-app-intents init

Think "Siri, mark my workout as done" or a Shortcut that opens a specific screen. It's alpha, so don't build a core feature on it yet, but it's worth prototyping if your app has obvious one-tap actions.

Expo UI: recycling lists and native navigation

Expo UI, which lets you render real SwiftUI and Jetpack Compose components from React, gets a meaningful upgrade:

  • List, LazyVStack, LazyHStack, LazyColumn, and LazyRow now virtualize and recycle rows, so large data sets are practical.
  • New iOS navigation components: NavigationStack, Toolbar, NavigationLink, and NavigationDestination.
  • New Compose components and SwiftUI modifiers, plus a screenshot for every component in the docs.

Android widgets, faster builds, and agent tooling

  • expo-widgets now supports Android. Widgets run their own JavaScript bundle on a dedicated Hermes runtime.
  • Prebuilt expo-modules-core on Android roughly halved a clean debug build in Expo's own testing.
  • Expo Modules 2.0 beta lets you write plain Swift or Kotlin classes annotated for JavaScript access instead of using the DSL.
  • Fingerprint default is now balanced, so version bumps in app.json no longer force a native rebuild.
  • Experimental Rust transformer (experiments.noxcturnalTransformWorker) gives roughly 2× faster cold bundling.
  • @expo/agent-cli (experimental) gives AI coding agents machine-readable access to Expo CLI, EAS CLI, and expo-doctor.

Breaking changes to check before upgrading

These are the changes most likely to break an existing app:

  • Strict React Native TypeScript API: deep imports from react-native/Libraries/* are now type errors, and ref types changed.
  • React Native removals: InteractionManager is gone (use requestIdleCallback), along with the Touchable root export and some StatusBar and Modal props.
  • iOS scene-based life cycle: app delegate callbacks are delivered differently.
  • expo-file-system: File.write() is now async, so add await.
  • expo-sqlite: libSQL support was removed.
  • expo-notifications: foreground notifications now show by default.
  • Android: R8 is enabled by default in release builds. Test release builds, not just dev builds.
  • @expo/ui: Host top-aligns content on iOS, and stack spacing defaults changed.
  • macOS isn't supported in SDK 58 yet.

How to upgrade to Expo SDK 58

  1. Make sure you're on Node.js 22.13+ (or 24.3+, or 26+).
  2. Upgrade the SDK and align every Expo package:
npx expo install expo@^58.0.0 --fix
  1. Run the doctor and fix anything it flags:
npx expo-doctor@latest
  1. Search your code for InteractionManager, react-native/Libraries/, unstable-native-tabs, and File.write(.
  2. Rebuild your development builds (eas build --profile development). Old dev clients won't load SDK 58 bundles.
  3. Test a release build on Android because of the R8 default.

Starting fresh? Create an SDK 58 project with:

npx create-expo-app@latest --template default@sdk-58

Should you upgrade now?

If you're on SDK 57, yes. The jump is manageable, and stable native tabs plus iOS 27 readiness are worth it before Apple's next review cycle. If you're on SDK 55 or older, upgrade one SDK at a time and read each changelog.

Want a head start? Our Expo templates and free components target current SDKs with the New Architecture, TypeScript, and NativeWind, so you start from code that already follows SDK 58 conventions. For the libraries that pair best with this release, see our best React Native libraries for 2026 roundup.

Frequently asked questions

What React Native version does Expo SDK 58 use?

Expo SDK 58 ships React Native 0.88, upgrading from 0.86 in SDK 57. It includes everything from React Native 0.87 as well, such as Swift Package Manager tooling, fontVariationSettings on Text, and ArrayBuffer support in TurboModules.

How do I upgrade to Expo SDK 58?

Run `npx expo install expo@^58.0.0 --fix`, then `npx expo-doctor@latest`, review the breaking changes (scene-based iOS life cycle, strict React Native TypeScript API, async File.write in expo-file-system), and rebuild your development builds. Expo Go for SDK 58 only supports SDK 58 projects.

Are Expo Router native tabs stable in SDK 58?

Yes. In SDK 58, native tabs, toolbars, data loaders, server-side rendering, and middleware are all stable. Native tabs are now imported from `expo-router/native-tabs` instead of `expo-router/unstable-native-tabs`.

Which Node.js version does Expo SDK 58 require?

Expo tooling now requires Node.js 22.13 or newer on the 22 line, 24.3 or newer on the 24 line, or Node.js 26+. Odd-numbered Node releases are not supported.

Build it faster with a template

Production-ready Expo React Native templates with the patterns from this post already wired up.

Browse templates