# What changed in expo-router

> 34 changes in expo-router 58 from its official release notes, upgrade guides and advisories: 7 breaking, 1 deprecations, 5 new APIs and options. Each one cited. Sources checked 2026-10-18. HTML: https://unstale.sh/npm/expo-router/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## expo-router 58

### Breaking changes

- The RouterActionHandling enum replaces ambiguous null and undefined return values. (58.0.20) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.20)
- Replaced by unstable_performance and unstable_PerformanceObserver. (58.0.19) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.19)
- Introduces unstable_performance as a replacement for the experimental unstable_navigationEvents API. (58.0.19) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.19)
- Introduces unstable_PerformanceObserver as a replacement for the experimental unstable_navigationEvents API. (58.0.19) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.19)
- The SitemapType returned by useSitemap no longer includes isInitial. (58.0.16) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.16)
- Generated route query strings encode spaces as +, leave * unescaped, encode ~ as %7E, and write raw null values as key=. (58.0.13) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.13)
- Reserved __expo_* launch URL params are ignored on Expo Go and development build launch URLs, so they no longer become route search params. (58.0.10) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.10)

### Deprecations

- Adds a development warning when navigation.isFocused() is called during render. (58.0.19) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.19)

### New APIs and options

- Call this API to restore the previous header appearance on iOS 26 and later. (58.0.20) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.20)
- Adds a performance mark recorded when a navigation action is queued. (58.0.19) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.19)
- Passes the current pathname and params props to the +html component. (58.0.18) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.18)
- Exports the type so custom routers can type the browser history instruction they return. (58.0.14) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.14)
- Allows setting the native header's light or dark interface style per Stack screen on iOS. (58.0.11) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.11)

### Performance

- Reduces processing overhead. (58.0.18) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.18)
- Reads the anchor only when a layout is first needed, so async routes apply anchors and startup no longer loads every layout. (58.0.18) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.18)

### Behavior and default changes

- Automatic safe-area measurements are disabled on web to preserve streamed content during hydration. (58.0.20) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.20)
- On iOS 26 and later, native header appearance is used by default. (58.0.20) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.20)
- Stack.Toolbar is now stable. (58.0.16) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.16)

### Fixes and other changes

- 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. (58.0.23) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.23)
- Fixes the iOS zoom transition when closing a screen opened with Link.AppleZoom using router.back(). (58.0.22) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.22)
- Fixes a crash when swiping the drawer on React Native 0.88. (58.0.20) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.20)
- The generated Href type is smaller, preventing large apps from failing with TS2590. (58.0.20) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.20)
- The first push to a screen is no longer incorrectly reported as pagePreloaded. (58.0.19) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.19)
- Fixes Tabs and Drawer routes retaining the previous ID's nested navigator state after navigating to a new ID. (58.0.18) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.18)
- Returns the current state, rather than the previous state, when called inside a state event listener. (58.0.18) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.18)
- Waits for the initial navigation state with Suspense. (58.0.18) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.18)
- On iOS 26 Liquid Glass, the header title adapts its color to content scrolling underneath. (58.0.18) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.18)
- Interfaces extending UnknownOutputParams can declare optional params, allowing omitted query parameters to be typed as optional. (58.0.18) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.18)
- Routes that throw during server rendering now show the error overlay instead of an "Internal Error" page in the dev server. (58.0.17) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.17)
- Fixes platform-specific route parsing and loader keys. (58.0.13) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.13)
- Restores the ./plugin subpath export so typed config plugins can be imported from <package>/plugin again. (58.0.13) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.13)
- Fixes the missing back animation after opening a screen from a link preview on iOS. (58.0.11) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.11)
- Fixes a production launch crash when the app has no scheme. (58.0.11) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.11)
- Resolves Native Tabs xcasset icon names through the iOS asset catalog so symbol sets render. (58.0.11) — [release notes](https://github.com/expo/expo/releases/tag/expo-router%4058.0.11)
