npm / expo-router
expo-router
What changed in expo-router 58, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-18.
7 breaking1 deprecations5 new APIs and options2 performance3 behavior and defaults16 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli initexpo-router 5834 changes
Breaking changes 7
The RouterActionHandling enum replaces ambiguous null and undefined return values.
Replaced by unstable_performance and unstable_PerformanceObserver.
Introduces unstable_performance as a replacement for the experimental unstable_navigationEvents API.
Introduces unstable_PerformanceObserver as a replacement for the experimental unstable_navigationEvents API.
The SitemapType returned by useSitemap no longer includes isInitial.
Generated route query strings encode spaces as +, leave * unescaped, encode ~ as %7E, and write raw null values as key=.
Reserved __expo_* launch URL params are ignored on Expo Go and development build launch URLs, so they no longer become route search params.
Deprecations 1
Adds a development warning when navigation.isFocused() is called during render.
New APIs and options 5
Call this API to restore the previous header appearance on iOS 26 and later.
Adds a performance mark recorded when a navigation action is queued.
Passes the current pathname and params props to the +html component.
Exports the type so custom routers can type the browser history instruction they return.
Allows setting the native header's light or dark interface style per Stack screen on iOS.
Performance 2
Reduces processing overhead.
Reads the anchor only when a layout is first needed, so async routes apply anchors and startup no longer loads every layout.
Behavior and default changes 3
Automatic safe-area measurements are disabled on web to preserve streamed content during hydration.
On iOS 26 and later, native header appearance is used by default.
Stack.Toolbar is now stable.
Fixes and other changes 16
Deep links to screens inside existing navigators return to the existing screen instead of stacking a second copy of the navigator over a presented modal or sheet.
Fixes the iOS zoom transition when closing a screen opened with Link.AppleZoom using router.back().
Fixes a crash when swiping the drawer on React Native 0.88.
The generated Href type is smaller, preventing large apps from failing with TS2590.
The first push to a screen is no longer incorrectly reported as pagePreloaded.
Fixes Tabs and Drawer routes retaining the previous ID's nested navigator state after navigating to a new ID.
Returns the current state, rather than the previous state, when called inside a state event listener.
Waits for the initial navigation state with Suspense.
On iOS 26 Liquid Glass, the header title adapts its color to content scrolling underneath.
Interfaces extending UnknownOutputParams can declare optional params, allowing omitted query parameters to be typed as optional.
Routes that throw during server rendering now show the error overlay instead of an "Internal Error" page in the dev server.
Fixes platform-specific route parsing and loader keys.
Restores the ./plugin subpath export so typed config plugins can be imported from <package>/plugin again.
Fixes the missing back animation after opening a screen from a link preview on iOS.
Fixes a production launch crash when the app has no scheme.
Resolves Native Tabs xcasset icon names through the iOS asset catalog so symbol sets render.