expo-router
58.0.24 · 19 Oct 2026MIT4.9M / weekRepositoryHomepagenpmAtom feed
298 stable releases, newest first, by release line. Notes are quoted as the maintainers published them.
- 58.x · latest line
58.0.24
19 Oct 2026Export the
ExtendedRouterandRouterExtensionMemberstypes. The publicextendRouter,extendRouterActions, andRouterExtensionAPIs reference them, so custom routers can now type the routers and extension members they create.[Web] Stop the "Bundling..." toast from logging the
useNativeDriverwarning in development.
58.0.23
16 Oct 2026Fix a deep link to a screen inside an existing navigator, such as a tab, stacking a second copy of that navigator on top of a presented modal or sheet instead of returning to it. Inside nested stacks a deep link again returns to a screen that is already there, as it did before SDK 58.
Patch Changes
Fix a deep link to a screen inside an existing navigator, such as a tab, stacking a second copy of that navigator on top of a presented modal or sheet instead of returning to it. Inside nested stacks a deep link again returns to a screen that is already there, as it did before SDK 58.
58.0.22
16 Oct 2026[iOS] Fix the zoom transition when a screen opened with
Link.AppleZoomis closed withrouter.back().
58.0.21
16 Oct 2026Only updates a dependency:expo-glass-effect 58.0.4
58.0.20
15 Oct 2026Upgrade React Native to 0.88.0.
Disable automatic safe-area measurements on web to preserve streamed content during hydration.
Replace ambiguous
nullandundefinedreturn values withRouterActionHandlingenum.
Patch Changes
Upgrade React Native to 0.88.0.
Disable automatic safe-area measurements on web to preserve streamed content during hydration.
Replace ambiguous
nullandundefinedreturn values withRouterActionHandlingenum.Fix a crash when swiping the drawer on React Native 0.88.
[iOS] Use native header appearance on iOS 26+ by default. Call
enableLegacyHeaderAppearance()to restore the previous appearance.Reduced the size of the generated
Hreftype so large apps no longer fail with TS2590 (Expression produces a union type that is too complex to represent).
58.0.19
14 Oct 2026Upgrade
react-native-screensto 4.30.0.Add the
expo-router:action-enqueuedperformance mark, recorded when a navigation action is queued.Fixed the first push to a screen being reported as
pagePreloaded.
Patch Changes
Upgrade
react-native-screensto 4.30.0.Add the
expo-router:action-enqueuedperformance mark, recorded when a navigation action is queued.Fixed the first push to a screen being reported as
pagePreloaded.[Internal] Return platform-tagged icons from the NativeTabs icon converter so tab icons type-check with
react-native-screens4.30.0.Replace the experimental
unstable_navigationEventsAPI withunstable_performanceandunstable_PerformanceObserver.Added a development warning when
navigation.isFocused()is called during render.
58.0.18
13 Oct 2026Upgrade
react-native-screensto 4.29.0.Allow interfaces extending
UnknownOutputParamsto declare optional params, so an omitted query parameter can be typed as optional, e.g.interface MyParams extends UnknownOutputParams { id?: string }.Fix
navigation.getState()returning the previous state inside astateevent listener.
Patch Changes
Upgrade
react-native-screensto 4.29.0.Allow interfaces extending
UnknownOutputParamsto declare optional params, so an omitted query parameter can be typed as optional, e.g.interface MyParams extends UnknownOutputParams { id?: string }.Fix
navigation.getState()returning the previous state inside astateevent listener.Read
unstable_settings.anchoronly when a layout is first needed, so async routes apply anchors and startup no longer loads every layout.Reduce route info processing overhead.
Point the
useFocusEffectdiagnostic links to the new focus handling guide.Pass the current
pathnameandparamsprops to the+htmlcomponent.[ios] Fix header title not adapting its color to content scrolling underneath a transparent header on iOS 26 Liquid Glass.
Wait for the initial navigation state with Suspense.
Fix Tabs and Drawer routes with
dangerouslySingularkeeping the nested navigator state of the previous ID after navigating to a new ID.
58.0.17
9 Oct 2026[Internal] Bump
react-native-webto~0.21.4.Fix the dev server error page for routes that throw during server rendering, which showed an "Internal Error" instead of the error overlay.
Patch Changes
[Internal] Bump
react-native-webto~0.21.4.Fix the dev server error page for routes that throw during server rendering, which showed an "Internal Error" instead of the error overlay.
58.0.16
6 Oct 2026Remove
isInitialfrom theSitemapTypereturned byuseSitemap.Mark
Stack.Toolbaras stable.
Patch Changes
Remove
isInitialfrom theSitemapTypereturned byuseSitemap.Mark
Stack.Toolbaras stable.
58.0.15
5 Oct 2026Only updates dependencies:@expo/log-box 58.0.10@expo/metro-runtime 58.0.12
58.0.14
5 Oct 2026Export the
RouterBrowserHistoryActiontype. The publicRouterandRouterActionResulttypes reference it, so custom routers can now type the browser history instruction they return.
58.0.13
3 Oct 2026[Internal] Bump
react-native-webto~0.21.3.Restored the
./pluginsubpath export so typed config plugins can be imported from<package>/pluginagain.Fix platform-specific route parsing and loader keys.
Patch Changes
[Internal] Bump
react-native-webto~0.21.3.Restored the
./pluginsubpath export so typed config plugins can be imported from<package>/pluginagain.Fix platform-specific route parsing and loader keys.
Generated route query strings now encode spaces as
+, leave*unescaped, encode~as%7E, and write raw null values askey=.[Internal] Expose config plugin types.
58.0.12
1 Oct 2026Update
expo-router/testing-libraryto use@testing-library/react-nativev14.
58.0.11
1 Oct 2026Fix missing back animation after opening a screen from a link preview on iOS.
Allow setting the native header's light or dark interface style per
Stackscreen on iOS.[Internal] Remove the
import-modemodule and readprocess.env.EXPO_ROUTER_IMPORT_MODEdirectly inuseScreens.
Patch Changes
Fix missing back animation after opening a screen from a link preview on iOS.
Allow setting the native header's light or dark interface style per
Stackscreen on iOS.[Internal] Remove the
import-modemodule and readprocess.env.EXPO_ROUTER_IMPORT_MODEdirectly inuseScreens.Fix a crash on launch in production when the app has no
scheme.Resolve Native Tabs
xcasseticon names through the iOS asset catalog so symbol sets render.Fixes a minor grammatical issue in the error message when
NativeTabsis used on an unsupported platform.
58.0.10
29 Sep 2026Force-bump all packages, due to migration to changesets.
Use
unwrapDevLaunchURLfromexpo-linkinginstead of a private copy of theexpo-development-clientURL handling.Ignore the reserved
__expo_*launch URL params on Expo Go and development build launch URLs, so they no longer become route search params.
Patch Changes
Force-bump all packages, due to migration to changesets.
Use
unwrapDevLaunchURLfromexpo-linkinginstead of a private copy of theexpo-development-clientURL handling.Ignore the reserved
__expo_*launch URL params on Expo Go and development build launch URLs, so they no longer become route search params.Remove obsolete fork annotations and commented-out path conversion code.
Update Expo Router navigation guidance in API comments and diagnostics to point to Expo documentation.
58.0.9
28 Sep 2026This version does not introduce any user-facing changes.
58.0.8
25 Sep 2026This version does not introduce any user-facing changes.
58.0.7
23 Sep 2026This version does not introduce any user-facing changes.
58.0.6
22 Sep 2026This version does not introduce any user-facing changes.
58.0.5
21 Sep 2026- deprecated
Deprecate
withLayoutContext. UseintegrateWithRouterinstead. Prevent browser unloads on web while
usePreventRemoveis active.Stabilize async routes on web and enable them by default. Native async routes remain experimental and opt-in.
New features
Prevent browser unloads on web while
usePreventRemoveis active.Stabilize async routes on web and enable them by default. Native async routes remain experimental and opt-in.
Add support for react-native-screens 5.0.0-alpha.3.
Bug fixes
Derive browser history on web from router action results in reducer phase.
Others
- deprecated
Deprecate
withLayoutContext. UseintegrateWithRouterinstead.
58.0.4
16 Sep 2026- breaking
web.output: 'server'now renders HTML pages on each request instead of prerendering them during export. Enable data loaders by default for static and server output
Enable server rendering by default for
web.output: "server"
Breaking changes
- breaking
web.output: 'server'now renders HTML pages on each request instead of prerendering them during export.
New features
Enable data loaders by default for static and server output
Enable server rendering by default for
web.output: "server"Add the
apiRoutesconfig plugin option to support API routes with static rendering.
58.0.3
15 Sep 2026Add controls for opting queued router operations out of React transitions.
Export
attachRouteStatefor custom router extensions.Enable server middleware by default
58.0.2
14 Sep 2026This version does not introduce any user-facing changes.
58.0.1
14 Sep 2026- deprecated
Add the stable
expo-router/native-tabsentry point and deprecateexpo-router/unstable-native-tabs. - deprecated
Deprecate
initialRouteNameinunstable_settings. Useanchorinstead. Stabilize
unstable_integrateWithRouterandunstable_createStandardRouterNavigatorasintegrateWithRouterandcreateStandardRouterNavigator. The old names remain available as deprecated aliases.
New features
- deprecated
Add the stable
expo-router/native-tabsentry point and deprecateexpo-router/unstable-native-tabs. Stabilize
unstable_integrateWithRouterandunstable_createStandardRouterNavigatorasintegrateWithRouterandcreateStandardRouterNavigator. The old names remain available as deprecated aliases.
Bug fixes
Mock
react-native-workletsinexpo-router/testing-librarysoreact-native-gesture-handlerandreact-native-reanimatedload in Jest.
Others
- deprecated
Deprecate
initialRouteNameinunstable_settings. Useanchorinstead. Upgrade React Native to 0.88.0-rc.0
58.0.0
10 Sep 2026- breaking
Remove the
onUnhandledActioncontainer prop fromexpo-router/react-navigation. - breaking
Remove the
onReadycontainer prop and thereadycontainer event. - breaking
Remove
createStackNavigatorfromexpo-router/js-stack. Useunstable_createStandardStackNavigatorwithunstable_integrateWithRouterinstead.
Breaking changes
- breaking
Remove the
onUnhandledActioncontainer prop fromexpo-router/react-navigation. - breaking
Remove the
onReadycontainer prop and thereadycontainer event. - breaking
Remove
createStackNavigatorfromexpo-router/js-stack. Useunstable_createStandardStackNavigatorwithunstable_integrateWithRouterinstead. - breaking
Make
expo-symbolsan optional peer dependency. Install it to usemdicons withNativeTabs.Trigger.Iconon Android. - breaking
Make
@expo/uian optional peer dependency. Install it to useStack.Toolbaron Android. - breaking
Remove
UNSTABLE_UnhandledLinkingContextfromexpo-router/react-navigation. - breaking
Remove
BaseNavigationContainerexport fromexpo-router/react-navigation. - breaking
Dispatch queued navigation actions in React transitions. The current screen stays visible while the destination suspends, so
SuspenseFallbackno longer renders for navigation-triggered suspense. - breaking
Remove
beforeRemove,__unsafe_action__,PreventRemoveContext, andusePreventRemoveContextfromexpo-router/react-navigation. - breaking
Preserve the focused route when switching navigator types in a conditional layout.
- breaking
Generate deterministic navigation states and route keys. Complete states from custom routers or persisted state must include
routeKeySeq. - breaking
Defer
navigation.dispatchand navigation helper actions until after commit. Usenavigation.dispatchSyncfor synchronous dispatch; dispatch functions are no longer supported. - breaking
Require complete state in
CommonActions.resetand removeRouter.getRehydratedStatefromexpo-router/react-navigation. - breaking
Remove
resetRootfromNavigationContainerRefandcreateNavigationContainerRef. - breaking
Remove
NavigatorScreenParams,getActionFromState, andLinkingOptions.getActionFromStatefromexpo-router/react-navigation. - breaking
Represent nested navigation only as navigation state. The
screen,params, andinitialparams are now ordinary user params. - breaking
Stop copying ancestor route params into descendant routes during imperative navigation, matching cold-start deep-link behavior.
- breaking
Custom routers must return
{ state, affectedRouteKey }fromgetStateForActioninstead of returning navigation state directly. - breaking
The
freezeOnBlurscreen option is disabled and screens are never frozen when blurred. - breaking
Remove the experimental web modal implementation. See the web modals guide.
- breaking
Remove
NavigationIndependentTreeanduseNavigationIndependentTreefromexpo-router/react-navigation. To embed an isolated navigation tree in a screen, use@react-navigation/native. - breaking
Remove the deprecated
LinkanduseLinkPropsexports fromexpo-router/react-navigation. UseLinkfromexpo-routerwith anhrefinstead. - breaking
Remove the deprecated
navigateDeprecatedaction and thenavigationInChildEnabledcontainer prop fromexpo-router/react-navigation. - breaking
Remove
getInitialStatefrom theRouterinterface. Custom routers no longer create initial state. - breaking
Remove
routeParamListfromRouterConfigOptionsand remove theRouterActionOptionstype. Custom routers receiveRouterConfigOptionsingetStateForAction. - breaking
Remove the deprecated
NavigationContainerexport - breaking
Remove the static
defaultfield fromDrawerNavigationStateand deprecategetDrawerStatusFromState. - breaking
Remove the
preloadedRouteKeysfield fromTabNavigationState. - breaking
Make
historyoptional inTabNavigationStateandDrawerNavigationState - breaking
Make navigation state
typeoptional for custom routers. - breaking
Handle
PUSHin tab and drawer routers instead of coercing it toNAVIGATE. Custom routers must now handle thePUSHaction ingetStateForAction. - breaking
Remove the
initialParamsprop from Expo Router screens androuteParamListfrom custom router action options. - breaking
Remove the
initialRouteNameprop from Expo Router navigators. Configure the initial route withunstable_settings.initialRouteNamein the route layout instead. - breaking
Remove
NavigationContainerRefContextfallback inuseNavigation. The hook now throws when called outside a navigator, including components rendered viaExpoRoot'swrapperprop. - breaking
Allow
keyto beundefinedin theDescriptortype and in routes passed to screenoptions, navigatorscreenOptions, andRouteGroupConfig.screenOptionscallbacks. - breaking
Unify JS Tabs, TopTabs, Drawer, and headless tabs with NativeTabs - only screens declared in the layout become visible.
- breaking
Make
href: nullhide JS tabs and make their routes unreachable, redirecting navigation to the initial tab. - breaking
Remove
getStateForRouteNamesChangefrom theRouterinterface onexpo-router/react-navigation. Custom routers must handle theROUTE_NAMES_CHANGEDaction ingetStateForActioninstead. - breaking
Migrate the JS
TopTabsnavigator to thestandard-navigationintegration. - breaking
Make
beforeRemovenon-preventable and addremovePreventedevent. - breaking
Remove the
navigationKeyprop from layout<Screen>and<Group>components. - breaking
Remove the
redirectprop from layout<Screen>components. - breaking
Add
redirectToto protected routes and render guarded screens as redirects instead of removing them from navigators. - breaking
Migrate the
Drawernavigator to thestandard-navigationintegration. - breaking
Remove
StackNavigationState.preloadedRoutesproperty and append preloaded routes tostate.routes - breaking
Migrate the JS
Tabsnavigator to thestandard-navigationintegration.
New features
Add a
routePreloadednavigation event that reports the route affected by each committed preload.Add
activityEnabledto navigators and screens to hide deeply nested route content with React Activity.Support application-defined screen options in custom standard navigators.
Export
createBaseTabProps,createNativeStackProps,createJSStackProps,createJSTabsProps,createJSTopTabsProps, andcreateNativeTabsPropsfor integrating navigators with Expo Router.Export
createBaseStackPropsfor integrating custom stack navigators with Expo Router.Expose route removal prevention state to custom navigators through
createProps.Expose route preload state to custom navigators through
createProps.Export
usePreventRemovefromexpo-routerand addrepeatfor continuing the blocked navigation action.Add
extendRouterandextendRouterActionsfor customizing router behavior.Add unstable APIs for integrating custom native and JavaScript stack navigators with
standard-navigation.Add
LocaleProviderto customize navigation direction at runtime.[Android] Add
cornerRadiussupport to dropdown menu.Add
unstable_useIsNavigatingfor observing queued or pending navigation.Add unstable
NavigationAwareActivitycomponent.Add screen error boundaries
Export
NativeStackViewfor custom navigator implementations on web.Add global registry for routers.
Improve withLayoutContext types
Expose
unstable_nativePropsprops from Stack componentExpose route provenance to custom navigators through descriptor
routeSource.Re-export drawer content components and types (
DrawerContentScrollView,DrawerItem,DrawerItemList,DrawerContentComponentProps,DrawerNavigationProp, and more) fromexpo-router/drawerAdd
pageHeadersconfig plugin option for declaring per-path response headersImprove standard-navigation types for
createProps.Add a
processScreensoption to thestandard-navigationintegration.Hide the splash screen when the built-in
+not-foundscreen rendersHonor loader
Cache-Controlheaders via the platform HTTP cache instead of caching loader data in memoryCancel pending loader requests when their routes are removed during navigation
Add a public
expo-router/native-stacksubpath socreateNativeStackNavigatorcan be imported without a deepbuild/path.
Bug fixes
[ios] Fix link previews failing to activate preloaded screens or switch native tabs, including nested stacks and repeated preview openings.
Mark routes after the focused one as preloaded in states returned by the singular
Stackrouter.Remove guarded history entries from JavaScript and experimental stacks.
Test not-found routes in navigators.
Test
createPropsdispatch timing.Re-export missing bottom tab types from
expo-router/js-tabs.Oder tabs by
.Triggerorder during initial renderPrevent Native Tabs from remounting the focused tab while preloading other tabs after a cold-start deep link.
Re-export the vendored JavaScript stack API from
expo-router/js-stack.Fix
useLoaderData()throwing "Update hook called on initial render" when React replays a suspended route after its loader settles during a transition.Make layouts with explicitly declared screens honor
unstable_settings.initialRouteNameinstead of declaration order, which can change deep-link back stacks.Prevent unfocused nested native tab navigators from redirecting global router state.
Fixed
TabsandTopTabs(expo-router/js-tabs,expo-router/js-top-tabs) not being usable from RSCRedirect fully guarded navigators to parent
Unset
nativeContainerStylein transparent presentations[ios] Fix broken navigation state when a long press on a
Linkwith a menu is released before the context menu fully presents.[android] Disable safe area insets in Native Tabs on Android when tab bar is hidden.
[ios] Fix memory leaks in the native toolbar and link preview from strong-reference cycles and closures that strongly captured
self.[android][ios] Fix
expo-router/headandexpo-router/stackresolution on native platforms.Fix missing subpath warning from Metro when importing from
expo-router/serverFix
replacenavigation in tabs leaving the replaced route in history.Prevent
useLoaderData()from re-rendering readers of unrelated loader pathsFix package export for
expo-router/unstable-split-view[ios][native-tabs] Fix a
[RNScreens] icon and selectedIcon must be same type.crash when the normal and selected icons resolved to different rendering modes.
Others
Clarify prefetch terminology.
Add batched navigation history tests.
Replace the
escape-string-regexpdependency with an internal helper.Replace the internal
colordependency with@react-native/normalize-colors.Resolve queued navigation actions against render-time state.
Propagate prevent-remove guards to ancestors.
Mark preloaded routes with
isPreloaded: trueon the route object.Replace latest-value refs with
useLatestCallbackanduseEffectEvent.- removed
Remove the root
optionsevent,DocumentTitleOptions, and thedocumentTitleprop fromexpo-router/react-navigation. Remove
onStateChangefromBaseNavigationContainerandNavigationContainerPropsinexpo-router/react-navigationPass toolbar menu icons straight to react-navigation instead of converting them to react-native-screens icons.
Remove module-level mutable navigation state from Expo Router.
Remove the dev-only
stackfield from the__unsafe_action__event inexpo-router/react-navigation.Read navigation state from the React tree instead of imperative refs.
Scope routing queues to each router root and bind
useRouter()to its owning container.Derive
useIsFocusedfrom context.Base
useNavigationStateon global state.Move Expo Router store values into React context.
- removed
Remove the ignored
linking.enabledoption. Build the complete initial navigation state from a deep link.
Rename the routing queue intent
ROUTER_LINKtoNAVIGATE_TO_HREFand add a genericACTIONintent for raw navigation actions.Render only the focused tab route during the first render.
Order JS Tabs, NativeTabs, headless tabs and Drawer by
routeNamesorderIntegrate native stack with standard navigation
Refactor native-stack for compliance with standard-navigation integration
- removed
Remove the deprecated static-navigation API from
expo-router/react-navigation. Remove
UNSTABLE_routeNamesChangeBehaviorand unhandled-state replay fromuseNavigationBuilder.Remove
useOnlyUserDefinedScreensfromwithLayoutContextMove
@testing-library/jest-domand@testing-library/user-eventfromdependenciestodevDependenciesRewrite native tabs using standard-navigation
[Internal] Split
useLoaderData()into a document cache and a per-mount Suspense store[Internal] Read the development server URL from
expo/internal/bundle-origininstead of duplicating its accessor[Internal] Isolate the loader's Suspense store from
LoaderClient- removed
[Internal] Remove legacy root entrypoint shims
Drop
fast-deep-equalandshallowequaldependenciesDrop
invariantdependency
- 57.x
57.0.10 – 57.0.2819 releases without a noteShow each
- 57.0.2815 Oct 2026no note
- 57.0.2714 Oct 2026no note
- 57.0.2612 Oct 2026no note
- 57.0.256 Oct 2026no note
- 57.0.2429 Sep 2026no note
- 57.0.2324 Sep 2026no note
- 57.0.2218 Sep 2026no note
- 57.0.2111 Sep 2026no note
- 57.0.208 Sep 2026no note
- 57.0.194 Sep 2026no note
- 57.0.181 Sep 2026no note
- 57.0.1726 Aug 2026no note
- 57.0.1624 Aug 2026no note
- 57.0.1520 Aug 2026no note
- 57.0.1417 Aug 2026no note
- 57.0.1314 Aug 2026no note
- 57.0.1210 Aug 2026no note
- 57.0.116 Aug 2026no note
- 57.0.104 Aug 2026no note
57.0.9
29 Jul 2026This version does not introduce any user-facing changes.
57.0.8
22 Jul 2026Reading the note…
57.0.7
17 Jul 2026Reading the note…
57.0.6
15 Jul 2026Reading the note…
57.0.5
15 Jul 2026Reading the note…
57.0.4
7 Jul 2026Reading the note…