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.
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 │
│ │ │ │
└──────────────┘ └──────────────┘
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
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>
);
}
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
Instead of sending the entire JavaScript bundle with each update, Expo now sends binary patches.
Setup Takes 10 Seconds
{
"expo": {
"updates": {
"enableBsdiffPatchSupport": true
}
}
}
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>
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
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>
);
}
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>
)
}}
/>
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!) │
└─────────┘ └─────────┘ └──────────────┘
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"])
// Your React Native code receives it
useExpoMessage('user_logged_in', (data) => {
console.log('User logged in:', data.userId);
});
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.jsonconfiguration - Execute Expo CLI commands
- Debug platform-specific issues
The Skills Repository
Use the expo-upgrade skill to migrate my project to SDK 55
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
You'll get:
- Native tabs API (not JavaScript tabs pretending to be native)
- New
/src/appdirectory 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
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%
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
- Expo SDK 55 Beta Changelog
- React Native Architecture
- How to Implement iOS Widgets in Expo Apps
- Shopify's New Architecture Migration
- Live Activities Guide
Published by GDSKS - Lead Architect, Founder at GLINCKER - Building GLINR Platform
Last updated: January 2025



Top comments (0)