DEV Community

Cover image for Expo SDK 55: The Day React Native Grew Up
GDS K S
GDS K S

Posted on

Expo SDK 55: The Day React Native Grew Up

It's 6 AM. Your phone buzzes. Not a notification—a Live Activity showing your Uber driver is 3 minutes away. You glance at your iPhone's home screen widget: "2 unread receipts ready for review." Both built with React Native.

Both impossible six months ago.

Welcome to Expo SDK 55. The release that finally made "cross-platform" stop feeling like a compromise.


Title: Expo 55 SDK

TL;DR for the Busy Developer

Feature What Changed
New Architecture Now mandatory (no more newArchEnabled)
Widgets Home screen widgets from JavaScript
Live Activities Lock Screen + Dynamic Island support
OTA Updates 75% smaller with Hermes bytecode diffing
Navigation Native iOS transitions by default
Brownfield XCFramework/AAR library output

The End of an Era (And Why You Should Be Excited)

Let me tell you about the bridge.

For nearly a decade, every React Native app had a dirty secret. A JSON serialization layer sitting between your JavaScript code and the native platform. Every button tap. Every scroll event. Every animation frame. All of it had to cross this bridge—marshaling data back and forth like a slow customs checkpoint.

I remember the first time I noticed it. A user complained our app felt "laggy." I profiled the app and watched in horror as scroll events queued up, waiting their turn to cross the bridge.

SDK 55 demolished that bridge.

OLD ARCHITECTURE
┌──────────────┐                        ┌──────────────┐
│              │    JSON Serialization  │              │
│  JavaScript  │  ◄─────────────────►   │    Native    │
│    Thread    │       (the bridge)     │    Thread    │
│              │                        │              │
└──────────────┘                        └──────────────┘


NEW ARCHITECTURE (SDK 55)
┌──────────────┐                        ┌──────────────┐
│              │      Direct C++ Refs   │              │
│  JavaScript  │  ◄════════════════►    │    Native    │
│    Thread    │         (JSI)          │    Thread    │
│              │                        │              │
└──────────────┘                        └──────────────┘
Enter fullscreen mode Exit fullscreen mode

The New Architecture isn't "new" anymore—it's mandatory. The newArchEnabled flag? Gone. The legacy architecture? Frozen in React Native 0.80, deprecated in 0.82, and now officially buried.

Performance Gains

Startup Time (Android)
Old  █████████████████████████████████████▓▒░  100%
New  █████████████████████████████████▓▒░░░░░   90%   10% faster

Module Loading at Launch
Old  █████████████████████████████████████▓▒░  100%
New  ██████████████▓▒░░░░░░░░░░░░░░░░░░░░░░░░   40%   60% less memory

Bridge Overhead Per Call
Old  █████████████████████████████████████▓▒░  100%
JSI  █▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░    5%   95% reduction
Enter fullscreen mode Exit fullscreen mode

From the trenches: Shopify reported their app launch times improved by 10% on Android after migrating. Tab switching became "snappier." Screen loads felt smoother. These aren't marketing claims—they're production metrics.


The Widget Revolution: Your App, Always Visible

Here's a confession: I've always been jealous of native iOS developers.

Not because of Swift (though it's beautiful). Not because of Xcode (definitely not). Because of widgets. Those little windows into your app that live on the home screen—glanceable, instant, native.

SDK 55 changes everything.

Your First Widget in 30 Seconds

// widgets/ReceiptWidget.tsx
import { Widget, Text, VStack } from '@expo/ui';

export function ReceiptWidget({ receipts }) {
  return (
    <Widget>
      <VStack>
        <Text style={{ fontSize: 14, fontWeight: 'bold' }}>
          {receipts.length} receipts to review
        </Text>
        <Text style={{ fontSize: 12, color: 'gray' }}>
          ${receipts.reduce((sum, r) => sum + r.total, 0).toFixed(2)} total
        </Text>
      </VStack>
    </Widget>
  );
}
Enter fullscreen mode Exit fullscreen mode

That's it. No Xcode. No Swift. No bridging headers.

Live Activities: The Feature That Changes Everything

Live Activities let your app claim real estate on the Lock Screen and Dynamic Island—updating in real-time without push notifications.

Use Case What Users See Why It Matters
Food delivery Driver location, ETA, order status No more obsessively opening the app
Sports apps Live scores updating every play Fans never miss a moment
Finance apps Stock movements during market hours Real-time without battery drain
Travel apps Flight status, gate changes, boarding Stress-free travel
Fitness apps Workout metrics on Lock Screen Eyes on the workout, not the phone

The 75% Update: Why Your Users Will Thank You

Let's talk about a problem every app developer knows intimately: update fatigue.

Your users don't want to download 15MB every time you fix a typo. Your marketing team doesn't want users ignoring updates. Your EAS bill doesn't want terabytes of bandwidth.

SDK 55 introduces Hermes bytecode diffing—and it's borderline magic.

Update Size Comparison

Bug fix (1 file changed)
Before  █████████████████████████████████████▓▒░   8.0 MB
After   █▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   0.4 MB   95% smaller

Feature update (multiple files)
Before  ███████████████████████████████████████████████▓▒░  12.0 MB
After   █████████▓▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   3.0 MB   75% smaller

Hotfix (critical bug)
Before  █████████████████████████████████████▓▒░   8.0 MB
After   ▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   0.2 MB   97% smaller
Enter fullscreen mode Exit fullscreen mode

Instead of sending the entire JavaScript bundle with each update, Expo now sends binary patches.

Setup Takes 10 Seconds

{
  "expo": {
    "updates": {
      "enableBsdiffPatchSupport": true
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

The math: 1M users x 4 updates/month = 32TB before, 8TB after. That's real money.


Expo Router: Navigation That Finally Feels Right

I've used every React Native navigation library. React Navigation (solid). RNRF (remember that?). Wix Navigation (powerful but complex). They all worked. They all felt... off.

SDK 55 closes that gap.

The Apple Zoom Transition

That fluid zoom effect when you tap a photo in Apple's Photos app? It's now the default on iOS with Expo Router.

// No configuration needed. It just works.
<Link href="/photo/123">
  <Image
    source={photo.uri}
    sharedTransitionTag="photo-123"
  />
</Link>
Enter fullscreen mode Exit fullscreen mode

The transition happens at 60fps because it's using UIKit's native transition APIs—not JavaScript animations pretending to be native.

Material 3 Colors: One API, Both Platforms

Material Colors

import { useColors } from 'expo-router';

function MyScreen() {
  const colors = useColors();

  return (
    <View style={{ backgroundColor: colors.surface }}>
      <Text style={{ color: colors.onSurface }}>
        This adapts to the user's wallpaper
      </Text>
    </View>
  );
}
Enter fullscreen mode Exit fullscreen mode

On iOS, this same API returns adaptive system colors. One codebase. Native theming on both platforms.

Native iOS Toolbars

<Stack.Screen
  name="document"
  options={{
    toolbar: (
      <Stack.Toolbar>
        <Stack.ToolbarItem icon="share" onPress={handleShare} />
        <Stack.ToolbarItem icon="trash" onPress={handleDelete} />
      </Stack.Toolbar>
    )
  }}
/>
Enter fullscreen mode Exit fullscreen mode

No custom components. No absolute positioning hacks. Just native UIToolbar.


The Brownfield Breakthrough

Here's a scenario I've seen dozens of times:

"We have a mature iOS app. We want to add a new feature fast. We're considering React Native for just this feature. Is that possible?"

For years, the honest answer was: "Yes, but it's painful."

SDK 55's expo-brownfield package changes this equation completely.

Your Expo Code
      │
      ▼
┌─────────────────────────────┐
│  npx expo-brownfield build  │
│      --platform ios         │
└─────────────────────────────┘
      │
      ├────────────┬────────────┐
      ▼            ▼            ▼
┌─────────┐  ┌─────────┐  ┌──────────────┐
│   iOS   │  │ Android │  │ Native Team  │
│XCFramework││   AAR   │  │(no Node.js!) │
└─────────┘  └─────────┘  └──────────────┘
Enter fullscreen mode Exit fullscreen mode

Your native team doesn't need Node.js. They don't need to understand Metro bundler. They just import a library like any other.

Bi-directional Communication Built In

// Native iOS code
ExpoModule.sendMessage("user_logged_in", ["userId": "123"])
Enter fullscreen mode Exit fullscreen mode
// Your React Native code receives it
useExpoMessage('user_logged_in', (data) => {
  console.log('User logged in:', data.userId);
});
Enter fullscreen mode Exit fullscreen mode

Microsoft, Meta, and Coinbase have all adopted this pattern. It's how React Native scales to enterprise.


The AI Developer's Toolkit

This is where SDK 55 gets genuinely weird—in the best way.

Expo has built first-class support for AI-assisted development.

MCP Server Integration

The Expo CLI now exposes commands to AI agents through the Model Context Protocol. Tools like Claude Code can:

  • Run builds and diagnose errors automatically
  • Modify your app.json configuration
  • Execute Expo CLI commands
  • Debug platform-specific issues

The Skills Repository

Use the expo-upgrade skill to migrate my project to SDK 55
Enter fullscreen mode Exit fullscreen mode

The AI agent reads the migration guide, analyzes your codebase, updates dependencies, fixes breaking changes, and runs prebuild—all automatically.

This isn't future speculation. It's shipping in SDK 55.


Migration Guide: What You Need to Do

Starting Fresh?

npx create-expo-app@latest --template default@next
Enter fullscreen mode Exit fullscreen mode

You'll get:

  • Native tabs API (not JavaScript tabs pretending to be native)
  • New /src/app directory structure
  • Refreshed UI template
  • New Architecture by default

Upgrading an Existing Project?

# Step 1: Upgrade packages
npx expo install expo@next --fix

# Step 2: Remove legacy config (IMPORTANT!)
# Delete "newArchEnabled" from app.json - it no longer exists

# Step 3: Regenerate native code
npx expo prebuild --clean

# Step 4: Test thoroughly
npx expo run:ios
npx expo run:android
Enter fullscreen mode Exit fullscreen mode

Breaking Changes Checklist

Change Action Required
notification field removed Use expo-notifications config plugin
expo-av removed from Expo Go Use expo-video and expo-audio
Push notifications in Expo Go Now throws error (Android)

The Bigger Picture

SDK 55 isn't just a version bump. It's React Native finally delivering on its original promise.

Remember when React Native launched in 2015? The pitch was "learn once, write anywhere." But for years, "anywhere" came with asterisks:

  • Performance asterisks*
  • Native feature asterisks*
  • Integration asterisks*

Those asterisks are disappearing.

React Native Feature Parity Over Time

2015  █████████████▓▒░░░░░░░░░░░░░░░░░░░░░░░░░   35%
2020  █████████████████████████▓▒░░░░░░░░░░░░░   65%
2025  ████████████████████████████████████▓▒░░   92%
Enter fullscreen mode Exit fullscreen mode

Widgets

Live Activities. Home screen widgets. Native transitions. Background blur. Dynamic theming. All from JavaScript. All with the same codebase.

The teams that bet on React Native years ago—Meta, Microsoft, Shopify, Coinbase—they're being vindicated. The skeptics who said "just go native" are watching their argument erode with every SDK release.

Is React Native perfect? No. Build times are still longer than SwiftUI. The debugging experience still has gaps. Some native APIs still need bridging.

But the gap is closing. Fast.

SDK 55 is the release where React Native stopped being "good enough" and started being "genuinely compelling."

The bridge is gone. The future is here.


Ready to try SDK 55? The beta runs for about two weeks, with fixes shipping continuously. Start with npx expo install expo@next --fix and report any issues you find.


Found this helpful? Please share with your team and drop a reaction if you enjoyed the read.

This article is part of the GLINCKER Engineering Series. More coming on implementing iOS widgets with Expo, React Native performance optimization, and building offline-first mobile apps.


Sources & Further Reading


Published by GDSKS - Lead Architect, Founder at GLINCKER - Building GLINR Platform

Last updated: January 2025

Top comments (0)