`.
+ *
+ * @default false
+ */
+ 'react-navigation'?: boolean;
}
export interface ExpoObserveModuleType {
diff --git a/packages/expo-observe/src/useObserve.ts b/packages/expo-observe/src/useObserve.ts
index 257d86d5fa744e..715237fab40762 100644
--- a/packages/expo-observe/src/useObserve.ts
+++ b/packages/expo-observe/src/useObserve.ts
@@ -1,10 +1,15 @@
import AppMetrics from 'expo-app-metrics';
import { isExpoRouterInitialized, useObserveForRouter } from './integrations/expo-router';
+import {
+ isReactNavigationInitialized,
+ useObserveForReactNavigation,
+} from './integrations/react-navigation';
import { useAssertValueDoesNotChange } from './useAssertValueDoesNotChange';
export function useObserve() {
const expoRouterInitialized = isExpoRouterInitialized();
+ const reactNavigationInitialized = isReactNavigationInitialized();
useAssertValueDoesNotChange(
expoRouterInitialized,
@@ -16,7 +21,20 @@ export function useObserve() {
// eslint-disable-next-line react-hooks/rules-of-hooks
const routerMarkInteractive = expoRouterInitialized ? useObserveForRouter() : undefined;
+ useAssertValueDoesNotChange(
+ reactNavigationInitialized,
+ "[expo-observe] React Navigation integration was toggled during a screen's lifecycle. " +
+ "Call `ExpoObserve.configure({ integrations: { 'react-navigation': true } })` once at startup before any screen mounts."
+ );
+ // useAssertValueDoesNotChange asserts that the useObserveForReactNavigation is either rendered
+ // or not for the whole lifecycle of this hook
+ const reactNavigationMarkInteractive = reactNavigationInitialized
+ ? // eslint-disable-next-line react-hooks/rules-of-hooks
+ useObserveForReactNavigation()
+ : undefined;
+
return {
- markInteractive: routerMarkInteractive ?? AppMetrics.markInteractive,
+ markInteractive:
+ routerMarkInteractive ?? reactNavigationMarkInteractive ?? AppMetrics.markInteractive,
};
}
diff --git a/packages/expo-router/package.json b/packages/expo-router/package.json
index 034057dd8b19ff..a21807f950a35e 100644
--- a/packages/expo-router/package.json
+++ b/packages/expo-router/package.json
@@ -152,7 +152,7 @@
"@expo/log-box": "workspace:^56.0.12",
"@expo/metro-runtime": "workspace:^56.0.11",
"@expo/schema-utils": "workspace:^56.0.0",
- "@expo/ui": "workspace:^56.0.11",
+ "@expo/ui": "workspace:^56.0.12",
"@radix-ui/react-slot": "^1.2.0",
"@radix-ui/react-tabs": "^1.1.12",
"@react-native-masked-view/masked-view": "^0.3.2",
diff --git a/packages/expo-task-manager/CHANGELOG.md b/packages/expo-task-manager/CHANGELOG.md
index e46e5bef661ae3..c57d88543fac04 100644
--- a/packages/expo-task-manager/CHANGELOG.md
+++ b/packages/expo-task-manager/CHANGELOG.md
@@ -10,6 +10,12 @@
### 💡 Others
+## 56.0.13 — 2026-05-21
+
+### 🐛 Bug fixes
+
+- [android] Apply bundled `proguard-rules.pro` via `consumerProguardFiles` so the `-keep class expo.modules.taskManager.**` rule is added to consumer apps' R8 pass. ([#46029](https://github.com/expo/expo/pull/46029) by [@jiunshinn](https://github.com/jiunshinn))
+
## 56.0.12 — 2026-05-21
### 🐛 Bug fixes
diff --git a/packages/expo-task-manager/android/build.gradle b/packages/expo-task-manager/android/build.gradle
index afc82962c15b10..4877e026a1d926 100644
--- a/packages/expo-task-manager/android/build.gradle
+++ b/packages/expo-task-manager/android/build.gradle
@@ -4,13 +4,14 @@ plugins {
}
group = 'host.exp.exponent'
-version = '56.0.12'
+version = '56.0.13'
android {
namespace "expo.modules.taskmanager"
defaultConfig {
versionCode 23
- versionName "56.0.12"
+ versionName "56.0.13"
+ consumerProguardFiles 'proguard-rules.pro'
}
}
diff --git a/packages/expo-task-manager/package.json b/packages/expo-task-manager/package.json
index f8b31165285b2c..426216e87116a4 100644
--- a/packages/expo-task-manager/package.json
+++ b/packages/expo-task-manager/package.json
@@ -1,6 +1,6 @@
{
"name": "expo-task-manager",
- "version": "56.0.12",
+ "version": "56.0.13",
"description": "Expo module that provides support for tasks that can run in the background.",
"main": "build/TaskManager.js",
"types": "build/TaskManager.d.ts",
diff --git a/packages/expo-ui/CHANGELOG.md b/packages/expo-ui/CHANGELOG.md
index 78ff486e7fbcdb..2bc3f7676e1a1d 100644
--- a/packages/expo-ui/CHANGELOG.md
+++ b/packages/expo-ui/CHANGELOG.md
@@ -8,10 +8,14 @@
### 🐛 Bug fixes
-- [iOS] Use non-selection `List` initializer in `List` when `selection` prop is not provided. ([#46101](https://github.com/expo/expo/pull/46101) by [@nishan](https://github.com/intergalacticspacehighway))
-
### 💡 Others
+## 56.0.12 — 2026-05-21
+
+### 🐛 Bug fixes
+
+- [iOS] Use non-selection `List` initializer in `List` when `selection` prop is not provided. ([#46101](https://github.com/expo/expo/pull/46101) by [@nishan](https://github.com/intergalacticspacehighway))
+
## 56.0.11 — 2026-05-21
_This version does not introduce any user-facing changes._
diff --git a/packages/expo-ui/android/build.gradle b/packages/expo-ui/android/build.gradle
index 98aad320864f19..795626694d52e8 100644
--- a/packages/expo-ui/android/build.gradle
+++ b/packages/expo-ui/android/build.gradle
@@ -12,13 +12,13 @@ apply plugin: 'expo-module-gradle-plugin'
apply plugin: 'org.jetbrains.kotlin.plugin.compose'
group = 'expo.modules.ui'
-version = '56.0.11'
+version = '56.0.12'
android {
namespace "expo.modules.ui"
defaultConfig {
versionCode 1
- versionName "56.0.11"
+ versionName "56.0.12"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildFeatures {
diff --git a/packages/expo-ui/package.json b/packages/expo-ui/package.json
index 230e763bb5a6fe..c22b079dd972fd 100644
--- a/packages/expo-ui/package.json
+++ b/packages/expo-ui/package.json
@@ -1,6 +1,6 @@
{
"name": "@expo/ui",
- "version": "56.0.11",
+ "version": "56.0.12",
"description": "A collection of UI components",
"sideEffects": [
"*.fx.js"
diff --git a/packages/expo-widgets/CHANGELOG.md b/packages/expo-widgets/CHANGELOG.md
index a8a468836e2202..d7589d0c9c7c6f 100644
--- a/packages/expo-widgets/CHANGELOG.md
+++ b/packages/expo-widgets/CHANGELOG.md
@@ -10,6 +10,10 @@
### 💡 Others
+## 56.0.13 — 2026-05-21
+
+_This version does not introduce any user-facing changes._
+
## 56.0.12 — 2026-05-21
### 🐛 Bug fixes
diff --git a/packages/expo-widgets/package.json b/packages/expo-widgets/package.json
index 87b7f1379608af..d585edf64fcc09 100644
--- a/packages/expo-widgets/package.json
+++ b/packages/expo-widgets/package.json
@@ -1,6 +1,6 @@
{
"name": "expo-widgets",
- "version": "56.0.12",
+ "version": "56.0.13",
"description": "Widgets.",
"main": "build/index.js",
"types": "build/index.d.ts",
@@ -32,7 +32,7 @@
"homepage": "https://docs.expo.dev/versions/latest/sdk/widgets/",
"dependencies": {
"@expo/plist": "workspace:^0.7.0",
- "@expo/ui": "workspace:~56.0.11"
+ "@expo/ui": "workspace:~56.0.12"
},
"devDependencies": {
"@expo/spawn-async": "^1.8.0",
diff --git a/packages/expo/README.md b/packages/expo/README.md
index a4fa6b42140e0d..d79bb35a9ce1d7 100644
--- a/packages/expo/README.md
+++ b/packages/expo/README.md
@@ -1,11 +1,175 @@
-# expo
+
-The `expo` package is a single package you can install in any React Native app to begin using Expo modules. [API Reference](https://docs.expo.dev/versions/latest/sdk/expo/).
+
+
+
+
+
-- includes core infrastructure for Expo modules: `expo-modules-core` and `expo-modules-autolinking`.
-- bundles a minimal set of Expo modules that are required by nearly every app, such as `expo-asset`.
-- provides [`@expo/cli`](https://github.com/expo/expo/blob/main/packages/%40expo/cli/README.md), a small CLI that provides a clean interface around both bundlers (such as Metro and Webpack) and native build tools (Xcode, Simulator.app, Android Studio, ADB, etc.), can generate native projects with `npx expo prebuild`, and aligns compatible package versions with `npx expo install`.
-- exposes a JavaScript module that configures an app at runtime as needed to use `expo-font` and to function in Expo Go (optional, only if applicable).
+Expo
+The open-source framework for universal React Native apps — one codebase for Android, iOS, and the web.
-See [CONTRIBUTING](./CONTRIBUTING.md) for instructions on working on this package.
+
+ 📚 Documentation
+ •
+ 📖 API Reference
+ •
+ 🧭 Expo Router
+ •
+ 🚀 EAS
+ •
+ 📝 Blog
+ •
+ 📰 Changelog
+ •
+ 👏 Contribute
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
⭐️ Be sure to star the Expo GitHub repo if you enjoy using the project! ⭐️
+
+
+---
+
+Expo is the [officially recommended](https://reactnative.dev/docs/getting-started) framework for building production React Native apps. It gives you everything you need to design, develop, and ship universal apps for Android, iOS, and the web from a single codebase — the SDK, the router, the build and update infrastructure, and the tooling — all open source and production-tested.
+
+You write your app in React with TypeScript or JavaScript; Expo handles the rest: a Metro-powered dev server with fast refresh, file-based routing that works the same on every platform, and a curated SDK of native modules you can drop in. From there, choose your own path — ship straight to the App Store and Play Store without ever opening Xcode or Android Studio, or reach for development builds and custom native code when your app needs to go further.
+
+Built and maintained in the open by [the Expo team](https://expo.dev/about) and a community of [thousands of contributors](https://github.com/expo/expo/graphs/contributors).
+
+## Quick start
+
+Create a new app and start the dev server:
+
+```
+npx create-expo-app@latest my-app
+cd my-app
+npx expo start
+```
+
+Then open the app on a simulator, a device with [Expo Go](https://expo.dev/go), or the web. See the [official Quick Start guide](https://docs.expo.dev/get-started/create-a-project/) for a full walkthrough.
+
+Already have a React Native app? Add Expo to it with [`install-expo-modules`](https://docs.expo.dev/bare/installing-expo-modules/):
+
+```
+npx install-expo-modules@latest
+```
+
+## The Expo ecosystem
+
+Expo is a collection of tools and services that work together, but each piece is independently useful.
+
+### Expo SDK
+
+A large set of first-party, cross-platform modules covering device APIs, media, storage, and system services — [`expo-camera`](https://docs.expo.dev/versions/latest/sdk/camera/), [`expo-image`](https://docs.expo.dev/versions/latest/sdk/image/), [`expo-notifications`](https://docs.expo.dev/versions/latest/sdk/notifications/), [`expo-file-system`](https://docs.expo.dev/versions/latest/sdk/filesystem/), [`expo-sqlite`](https://docs.expo.dev/versions/latest/sdk/sqlite/), [`expo-sensors`](https://docs.expo.dev/versions/latest/sdk/sensors/), and [many more](https://docs.expo.dev/versions/latest/).
+
+Every module is opt-in, fully typed, and maintained by the Expo team — install only what you need with `npx expo install`, and your bundle stays as small as your app demands.
+
+### Expo Router
+
+A [file-based router](https://docs.expo.dev/router/introduction/) for universal navigation across Android, iOS, and the web. Drop a file into `app/` and you have a route — with typed paths, automatic deep linking, and universal-link config generated for you. Layouts, modals, tabs, and stacks compose as React components and look the same on every platform.
+
+Under the hood it builds on [`react-native-screens`](https://github.com/software-mansion/react-native-screens) for true native navigators on mobile, plus a real router on the web. It also brings a fullstack story to React Native: [API routes](https://docs.expo.dev/router/web/api-routes/) and [static rendering](https://docs.expo.dev/router/web/static-rendering/) for SEO-friendly web builds.
+
+### Expo Modules API
+
+A modern Swift and Kotlin [API for writing native modules](https://docs.expo.dev/modules/overview/) — and the foundation the entire Expo SDK and a growing ecosystem of third-party libraries are built on.
+
+You describe a module declaratively: functions, properties, native views, and lifecycle events all live in a small Swift or Kotlin DSL. The framework handles type coercion and the calls between JavaScript and native automatically — no Objective-C, no Java, no C++, no JNI, no boilerplate. Scaffold a new module in seconds with `npx create-expo-module@latest`, ship it as a regular npm package, and have it picked up by Expo's autolinking on iOS and Android.
+
+### Expo UI
+
+[Expo UI](https://docs.expo.dev/versions/latest/sdk/ui/) — a set of truly native UI components backed by SwiftUI on iOS and Jetpack Compose on Android. Use platform controls (pickers, switches, sliders, menus, …) that look and feel exactly like the rest of the OS, from React.
+
+### DOM components
+
+Mark a React component with `"use dom"` and Expo will render it as web content inside your native app — perfect for incrementally migrating web code or reusing a React web component on mobile. [Learn more](https://docs.expo.dev/guides/dom-components/).
+
+### Continuous Native Generation
+
+Your `ios/` and `android/` folders are generated, not maintained. Describe your native config in `app.json` and [config plugins](https://docs.expo.dev/config-plugins/introduction/); run `npx expo prebuild` to materialize the projects on demand. Upgrades, package additions, and native customizations all flow through the same declarative pipeline — no more merge conflicts in native code.
+
+### EAS
+
+[Expo Application Services](https://expo.dev/eas) — hosted infrastructure for shipping React Native apps:
+
+- **[EAS Build](https://docs.expo.dev/build/introduction/)** — cloud builds for iOS and Android, no local Xcode or Android Studio setup required.
+- **[EAS Submit](https://docs.expo.dev/submit/introduction/)** — one command to submit to the App Store and Play Store.
+- **[EAS Update](https://docs.expo.dev/eas-update/introduction/)** — over-the-air JavaScript and asset updates, with channels and rollbacks.
+- **[EAS Workflows](https://docs.expo.dev/eas-workflows/get-started/)** — CI/CD for building, testing, and releasing your app.
+- **[EAS Hosting](https://docs.expo.dev/eas/hosting/introduction/)** — host your web app and API routes on Expo's edge.
+- **[Expo Launch](https://launch.expo.dev/)** — a guided, browser-based path to ship to the web and App Store without touching configuration. Built on top of EAS.
+
+EAS is optional, but the fastest path from `git push` to the store.
+
+### Tooling
+
+- **[Expo CLI](https://docs.expo.dev/more/expo-cli/)** — one interface around Metro and the native toolchain (Xcode, Simulator.app, Android Studio, ADB, …). Keep dependency versions aligned with `npx expo install`.
+- **[Expo Go](https://expo.dev/go)** and **[development builds](https://docs.expo.dev/develop/development-builds/introduction/)** — preview your app on a device in seconds.
+- **[Expo Atlas](https://docs.expo.dev/guides/analyzing-bundles/)** — visual bundle analyzer to inspect what's shipping in your JS.
+- **[Snack](https://snack.expo.dev)** — try Expo right in your browser, no install needed.
+
+## Why Expo
+
+- **Universal by default.** One codebase targets Android, iOS, and the web — with [tvOS and Android TV](https://docs.expo.dev/guides/building-for-tv/) support too.
+- **Production-ready.** Used in tens of thousands of apps on the App Store and Play Store.
+- **Customizable all the way down.** Config plugins and the Expo Modules API let you reach the metal when you need to.
+- **Open source.** MIT-licensed, actively developed in the open.
+
+## Learn more
+
+- [Documentation](https://docs.expo.dev) — guides, tutorials, and the full SDK reference.
+- [Tutorial](https://docs.expo.dev/tutorial/introduction/) — build your first universal app step by step.
+- [Examples](https://github.com/expo/examples) — sample projects you can copy from.
+- [Changelog](https://expo.dev/changelog) and [blog](https://expo.dev/blog).
+- [Discord & Forums](https://chat.expo.dev) — ask questions and chat with the community.
+- [Support](https://expo.dev/support) — community, enterprise, and partner-agency options all in one place.
+
+## Contributing
+
+Bug reports, fixes, and improvements are very welcome. See [CONTRIBUTING](./CONTRIBUTING.md) for how to set up this package locally, and the repo-wide [contributing guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md) for general guidelines.
+
+## License
+
+The Expo source code is made available under the [MIT License](https://github.com/expo/expo/blob/main/LICENSE).
diff --git a/packages/expo/bundledNativeModules.json b/packages/expo/bundledNativeModules.json
index 3448ae1b0e8aa1..6ac050d6a77aac 100644
--- a/packages/expo/bundledNativeModules.json
+++ b/packages/expo/bundledNativeModules.json
@@ -2,7 +2,7 @@
"@expo/fingerprint": "~0.19.1",
"@expo/metro-runtime": "~56.0.11",
"@expo/vector-icons": "^15.0.2",
- "@expo/ui": "~56.0.11",
+ "@expo/ui": "~56.0.12",
"@react-native-async-storage/async-storage": "2.2.0",
"@react-native-community/datetimepicker": "9.1.0",
"@react-native-masked-view/masked-view": "0.3.2",
@@ -22,8 +22,8 @@
"expo-asset": "~56.0.13",
"expo-audio": "~56.0.9",
"expo-auth-session": "~56.0.11",
- "expo-background-fetch": "~56.0.12",
- "expo-background-task": "~56.0.12",
+ "expo-background-fetch": "~56.0.13",
+ "expo-background-task": "~56.0.13",
"expo-battery": "~56.0.4",
"expo-blur": "~56.0.3",
"expo-brightness": "~56.0.5",
@@ -87,13 +87,13 @@
"expo-store-review": "~56.0.3",
"expo-symbols": "~56.0.5",
"expo-system-ui": "~56.0.5",
- "expo-task-manager": "~56.0.12",
+ "expo-task-manager": "~56.0.13",
"expo-tracking-transparency": "~56.0.5",
"expo-updates": "~56.0.15",
"expo-video-thumbnails": "~56.0.3",
"expo-video": "~56.1.2",
"expo-web-browser": "~56.0.5",
- "expo-widgets": "~56.0.12",
+ "expo-widgets": "~56.0.13",
"jest-expo": "~56.0.4",
"lottie-react-native": "~7.3.4",
"react": "19.2.3",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9e2a1a21ae0429..72a92095690b4b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -3123,7 +3123,7 @@ importers:
specifier: ^4.3.4
version: 4.4.3
expo-widgets:
- specifier: workspace:^56.0.12
+ specifier: workspace:^56.0.13
version: link:../expo-widgets
devDependencies:
'@babel/core':
@@ -3745,7 +3745,7 @@ importers:
packages/expo-background-fetch:
dependencies:
expo-task-manager:
- specifier: workspace:~56.0.12
+ specifier: workspace:~56.0.13
version: link:../expo-task-manager
devDependencies:
'@types/node':
@@ -3761,7 +3761,7 @@ importers:
packages/expo-background-task:
dependencies:
expo-task-manager:
- specifier: workspace:~56.0.12
+ specifier: workspace:~56.0.13
version: link:../expo-task-manager
devDependencies:
'@types/node':
@@ -5063,6 +5063,9 @@ importers:
specifier: 0.85.3
version: 0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3)
devDependencies:
+ '@react-navigation/native':
+ specifier: ^7.1.33
+ version: 7.1.33(react-native@0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)
'@testing-library/react-native':
specifier: ^13.3.0
version: 13.3.3(jest@29.7.0(@types/node@22.19.15)(ts-node@10.9.2(@swc/core@1.15.18)(@types/node@22.19.15)(typescript@6.0.3)))(react-native@0.85.3(@babel/core@7.29.0)(@react-native/jest-preset@0.85.3(@babel/core@7.29.0)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.14)(react@19.2.3))(react-test-renderer@19.2.3(react@19.2.3))(react@19.2.3)
@@ -5114,7 +5117,7 @@ importers:
specifier: workspace:^56.0.0
version: link:../@expo/schema-utils
'@expo/ui':
- specifier: workspace:^56.0.11
+ specifier: workspace:^56.0.12
version: link:../expo-ui
'@radix-ui/react-slot':
specifier: ^1.2.0
@@ -5918,7 +5921,7 @@ importers:
specifier: workspace:^0.7.0
version: link:../@expo/plist
'@expo/ui':
- specifier: workspace:~56.0.11
+ specifier: workspace:~56.0.12
version: link:../expo-ui
react:
specifier: 19.2.3
diff --git a/templates/expo-template-default/package.json b/templates/expo-template-default/package.json
index f30986174668dc..49fc301d49fce9 100644
--- a/templates/expo-template-default/package.json
+++ b/templates/expo-template-default/package.json
@@ -12,7 +12,7 @@
"lint": "expo lint"
},
"dependencies": {
- "@expo/ui": "~56.0.11",
+ "@expo/ui": "~56.0.12",
"expo": "~56.0.3",
"expo-constants": "~56.0.14",
"expo-device": "~56.0.4",
diff --git a/tools/src/promote-packages/tasks/findPackagesToPromote.ts b/tools/src/promote-packages/tasks/findPackagesToPromote.ts
index f01be7b5a21fe3..c8d29704ea32c9 100644
--- a/tools/src/promote-packages/tasks/findPackagesToPromote.ts
+++ b/tools/src/promote-packages/tasks/findPackagesToPromote.ts
@@ -27,9 +27,9 @@ export const findPackagesToPromote = new Task(
state.versionToReplace = versionToReplace;
// A canary version (e.g. 56.0.0-canary-20260212-4f61309) should always be
// considered less than any non-canary version for promotion purposes.
+ const prereleaseTag = versionToReplace ? semver.prerelease(versionToReplace)?.[0] : null;
const replacingCanary =
- !!versionToReplace &&
- (semver.prerelease(versionToReplace)?.[0] as string)?.startsWith('canary');
+ typeof prereleaseTag === 'string' && prereleaseTag.startsWith('canary');
state.isDemoting =
!!versionToReplace && semver.lt(pkg.packageVersion, versionToReplace) && !replacingCanary;