In 2026, Expo is the usual way to start a React Native app, and React Native's own docs recommend it. In the last year it dropped the old architecture, made Hermes V1 its default engine and made Expo UI stable: real SwiftUI and Jetpack Compose controls, written in React. I shipped my app Linkoglot to both app stores with it from a Windows PC, and never opened Xcode or Android Studio.
TL;DR
- Expo is the default way to build with React Native: the React Native docs recommend a framework and name Expo, and 86% of State of React Native 2025 respondents used Expo CLI.
- What changed since SDK 54: precompiled iOS builds, React Compiler in the template, the old architecture removed, Hermes V1 by default, smaller over-the-air updates and a stable Expo UI.
- Native still wins when one platform is the product, when the app lives in OS features like widgets, or when your team already writes Swift or Kotlin.
- My pick: an app for both stores, built by someone who knows React and TypeScript, starts in Expo.
What is Expo, and why does React Native recommend it?
React Native gives you native iOS and Android apps written in React. Expo is a framework on top of it. It brings a CLI, an SDK of native modules (camera, notifications, audio and more) and file-based routing with Expo Router. EAS, its set of cloud services, has a free tier. The framework itself costs nothing: "Expo and the Expo SDK are free and open source (MIT license)."
React Native's setup page is direct: "if you're building a new app with React Native, we recommend using a Framework". It names one: "Expo is a production-grade React Native Framework." You can still go without one, and the same page says so.
In the State of React Native 2025 survey, 86.18% of the 926 people who answered had used Expo CLI in the last year, against 47.73% for the React Native Community CLI.
How did I ship an iPhone app without opening Xcode?
Linkoglot is my AI language-learning app, built alone and live on Google Play and the App Store since July 2026. I built it on a Windows PC. Xcode needs a Mac (Xcode 27 "will only install and run on Apple silicon Macs"), and I never opened it, or Android Studio.
The whole path ran through Expo's tools:
- 01 Write TypeScript and React on Windows, with Fast Refresh on both phones.
- 02 Generate Prebuild writes the ios and android folders from the app config and plugins.
- 03 Build EAS Build compiles in the cloud; iOS builds run on Expo's Macs.
- 04 Test Development builds on real phones, not Expo Go.
- 05 Ship Google Play and the App Store, each through its own review.
On EAS Build, "iOS builds run on macOS runners hosted in Expo's macOS cloud". In September 2026 Expo wrote a whole post about this path, "You don't need a Mac to develop iOS apps", and added a cloud iOS Simulator, still a "limited-access preview".
Testing was the part a PC couldn't do alone, and Expo Go wasn't enough. Expo Go is the store app that runs your project with only the native code it already ships: "There is no way to get the native code into the Expo Go app". Payments, push notifications on Android and Linkoglot's iOS notification extension all need a development build, your own app with Expo's dev tools inside.
So I bought an iPhone to test on, next to my Android phone. Expo Go isn't even in the stores for every SDK now: "Expo Go for SDK 56 is not available on the Apple App Store or Google Play Store."
What changed in Expo since SDK 54?
Expo ships a new SDK every few months, each one tied to a React Native version:
| Release | What changed |
|---|---|
| SDK 54, 10 Sep 2025, React Native 0.81 | Precompiled React Native for iOS, React Compiler on in the template, native tabs with Liquid Glass (beta), the last SDK with the old architecture |
| SDK 55, 25 Feb 2026, React Native 0.83 | Old architecture removed, native tabs in the default template, Expo UI for Jetpack Compose in beta, diffed updates as an option |
| SDK 56, 21 May 2026, React Native 0.85 | Hermes V1 by default, Expo UI stable, diffed updates on by default, Expo Router without React Navigation, agent files in new projects |
| SDK 57, 30 Jun 2026, React Native 0.86 | A small release on React Native 0.86, which "is intended to have no breaking changes"; a later patch fixes a Hermes V1 memory regression from SDK 56 |
| SDK 58 beta, 15 Sep 2026, React Native 0.88 RC | Built for iOS 27, Expo Modules 2.0 in beta |
A few terms. The "old architecture" is React Native's original bridge between JavaScript and native code. Native tabs use each platform's own tab bar, and diffed updates send only what changed in the JavaScript. React Native 0.82 was "the first React Native that runs entirely on the New Architecture", and in the 2025 survey 733 of 932 respondents had already migrated.
What got faster?
- iOS builds. Since SDK 54, React Native for iOS comes precompiled. Expo saw clean builds of React Native's test app drop "from about 120 seconds to 10 seconds" on an M4 Max. It also warned: "you're unlikely to see a ~10x build time improvement in your app". SDK 56 did the same for Expo's own modules: "around 1 minute (~16%)" off the median clean iOS build.
- Startup. Hermes V1 became React Native's default engine in 0.84 and Expo's in SDK 56, "bringing faster startup times". The public numbers come from one real app, Expensify, in the 0.82 post: time to interactive 2.5% faster on iOS and 7.6% faster on a low-end Android phone.
- Updates. EAS Update now sends only what changed between two JavaScript bundles. In the 24 hours before the SDK 56 post, diffed bundles were "on average 58% smaller than the full bundle they replaced".
- Re-renders. React Compiler memoizes components and values at build time, so you write fewer
useMemoanduseCallbackcalls by hand. Every new project has it on.
What is Expo UI?
Expo UI is "a set of components that allow you to build UIs directly with Jetpack Compose and SwiftUI from React". Since SDK 56 the SwiftUI and Compose parts are stable; the web part is still experimental. Expo's own summary: "It just exposes the primitives iOS and Android already ship, as React components."
The official example, a SwiftUI button inside a React component:
import { Host, Button } from '@expo/ui/swift-ui';
export function SaveButton() {
return (
<Host style={{ flex: 1 }}>
<Button label="Save changes" />
</Host>
);
}
Host is the boundary: everything inside it is laid out by SwiftUI or Compose, not by React Native's flexbox. Modifiers come from @expo/ui/swift-ui/modifiers as an array, like SwiftUI's own modifier chain.
Why it matters now is Liquid Glass. Apple's docs say standard SwiftUI and UIKit components "pick up the appearance and behavior of this material automatically". Apps built with the iOS 27 SDK can no longer opt out of the new look. A control from Expo UI is the real SwiftUI control, so it changes with the OS.
To add glass yourself, give an Expo UI view the glassEffect({ glass: { variant: 'clear' } }) modifier (Xcode 26 and iOS 26 or later). Your own React Native views can sit in a GlassView from expo-glass-effect, also on iOS 26 and up.
Expo's guidance on when to use it: Expo UI where users expect the screen to look like the OS (settings, modals, pickers, sheets), and regular React Native views for your own design. Linkoglot is the second kind: its screens are NativeWind with React Native Reusables.
What else comes with Expo now?
- Expo Router: file-based routes for the app, much like a web framework's. Since SDK 56 it no longer depends on React Navigation, and its native tabs get Liquid Glass on iOS 26.
- Native code when you need it: the Expo Modules API "allows you to write Swift and Kotlin to add new capabilities to your app", and config plugins edit the generated native projects at prebuild. Linkoglot's iOS notification extension is generated that way.
- EAS Submit and EAS Update: Submit uploads builds to both stores and "works from any OS (including Windows and Linux for iOS)". Update ships JavaScript, styles and images over the air; native changes still go through store review.
- EAS Observe: generally available since 20 August 2026. It measures launch times, time to first render and time to interactive in production, on real devices.
- AI tooling: Expo runs an MCP server for coding agents, on the free plan (with a monthly usage cap) since May 2026, and new SDK 56 projects start with
AGENTS.mdandCLAUDE.md. It's the same kind of setup I use with Claude Code.
The free EAS plan includes 15 Android and 15 iOS builds and 1,000 monthly active users for updates; the Starter plan is $19 a month plus usage.
Expo or Xcode and Android Studio: what do you trade?
| Expo (React Native) | Xcode (Swift, SwiftUI) | Android Studio (Kotlin, Compose) | |
|---|---|---|---|
| One codebase reaches | iOS, Android and web | Apple platforms | Android |
| Your computer | Any OS; iOS builds in EAS's cloud | A Mac; Xcode 27 needs Apple silicon | Windows, macOS, Linux or ChromeOS |
| Language | TypeScript and React | Swift | Kotlin |
| UI | React Native views, or SwiftUI and Compose through Expo UI | SwiftUI or UIKit | Jetpack Compose or Views |
| A new OS feature | After an Expo SDK or library update, or in your own module | On release day | On release day |
| Shipping a fix | JavaScript over the air, within store rules; native code through review | Through review | Through review |
| AI in the tools | Expo's MCP server, agent files in new projects | Claude, ChatGPT and Gemini in the coding assistant | Gemini agent mode, other models through a remote endpoint |
One thing the table hides: React Native developers still open the native tools. In the State of React Native 2025 survey, 68.2% built their apps with EAS Build, and 60.3% built by hand in Xcode and 55.9% in Android Studio. Expo moves those IDEs from your daily tools to the tools you open when a native build breaks. For Linkoglot, that day never came.
When are Xcode or Android Studio the better call?
- One platform is the product. An iOS-only app gets every new API in Xcode on release day. Expo's SDK built for iOS 27 was still a beta on 14 October 2026.
- The app lives in OS features. Widgets, watch apps and extensions are native targets written in Swift or Kotlin, Expo or not. Expo can generate them from config, but if they are most of the app, React Native is overhead.
- The team already writes Swift and Kotlin. A Kotlin team that needs both platforms has its own route: JetBrains declared "Compose Multiplatform for iOS is Stable" in May 2025.
For a new app on both stores, built by someone who knows React and TypeScript, I'd pick Expo again. My reasons for Linkoglot still hold: one codebase for two stores, fast tooling, libraries ready for the hard parts, and a language I already knew. The web skills carry over too: Linkoglot uses TanStack Query, Supabase's JavaScript client and Lingui, the same libraries I use on websites.
Limits
- I've shipped one app with Expo and none in Swift or Kotlin, so the native side comes from Apple's and Google's docs, not from my own hands.
- The speed numbers are Expo's and the React Native team's benchmarks (the Hermes figures are Expensify's app). I didn't measure them on Linkoglot.
- What I write about Expo UI, EAS Observe and SDK 58 comes from Expo's docs and posts. SDK 58 is a beta, and prices are as read on 14 October 2026.
How Linkoglot was built, from the database to both stores' rules, is in shipping a mobile app alone, and the app has its own chapter on my home page.
Sources
- Get Started with React Native (React Native docs) (opens in a new tab) (accessed )
- State of React Native 2025: architecture and frameworks (opens in a new tab) (accessed )
- State of React Native 2025: build and publish (opens in a new tab) (accessed )
- Expo pricing (opens in a new tab) (accessed )
- EAS Build (Expo docs) (opens in a new tab) (accessed )
- You don't need a Mac to develop iOS apps (Expo blog) (opens in a new tab) (accessed )
- Development builds FAQ (Expo docs) (opens in a new tab) (accessed )
- Notifications (Expo docs) (opens in a new tab) (accessed )
- Using RevenueCat with Expo (RevenueCat docs) (opens in a new tab) (accessed )
- Expo SDK 54 (Expo changelog) (opens in a new tab) (accessed )
- Expo SDK 55 (Expo changelog) (opens in a new tab) (accessed )
- Expo SDK 56 (Expo changelog) (opens in a new tab) (accessed )
- Expo SDK 57 (Expo changelog) (opens in a new tab) (accessed )
- Expo SDK 58 beta (Expo changelog) (opens in a new tab) (accessed )
- React Native 0.82: A New Era (React Native blog) (opens in a new tab) (accessed )
- React Native 0.84 (React Native blog) (opens in a new tab) (accessed )
- React Compiler (React docs) (opens in a new tab) (accessed )
- Expo UI (Expo docs) (opens in a new tab) (accessed )
- Expo UI: SwiftUI (Expo docs) (opens in a new tab) (accessed )
- GlassEffect (Expo docs) (opens in a new tab) (accessed )
- Expo UI is stable (Expo blog) (opens in a new tab) (accessed )
- Liquid Glass (Apple Developer Documentation) (opens in a new tab) (accessed )
- UIDesignRequiresCompatibility (Apple Developer Documentation) (opens in a new tab) (accessed )
- Expo Modules API: overview (Expo docs) (opens in a new tab) (accessed )
- Config plugins: introduction (Expo docs) (opens in a new tab) (accessed )
- Native tabs (Expo Router docs) (opens in a new tab) (accessed )
- EAS Submit (Expo docs) (opens in a new tab) (accessed )
- EAS Update (Expo docs) (opens in a new tab) (accessed )
- EAS Observe is now generally available (Expo changelog) (opens in a new tab) (accessed )
- EAS Observe: introduction (Expo docs) (opens in a new tab) (accessed )
- Expo MCP Server (Expo docs) (opens in a new tab) (accessed )
- The Expo MCP server is now available on the free plan (Expo changelog) (opens in a new tab) (accessed )
- Xcode 26 Release Notes (Apple Developer) (opens in a new tab) (accessed )
- Xcode 27 Release Notes (Apple Developer) (opens in a new tab) (accessed )
- Download Android Studio (Android Developers) (opens in a new tab) (accessed )
- Gemini in Android Studio features (Android Developers) (opens in a new tab) (accessed )
- Use a remote model in Android Studio (Android Developers) (opens in a new tab) (accessed )
- Compose Multiplatform 1.8.0: iOS is stable (JetBrains blog) (opens in a new tab) (accessed )