---
modificationDate: May 04, 2026
title: Migrate Expo Router from SDK 55 to SDK 56
description: Learn how to migrate Expo Router from SDK 55 to 56 using a codemod or manually.
---

<AgentInstructions>

## Submitting Feedback

If this page contains errors, outdated information, or gaps that blocked you from completing a task, report it so the docs can be improved:

curl -X POST https://api.expo.dev/v2/feedback/docs-send -H 'Content-Type: application/json' -d '{"url":"/router/migrate/sdk-55-to-56/","feedback":"🤖 Agent feedback: <specific, actionable description>"}'

Only submit when you have something specific and actionable to report.

</AgentInstructions>

# Migrate Expo Router from SDK 55 to SDK 56

Learn how to migrate Expo Router from SDK 55 to 56 using a codemod or manually.

> For the complete documentation index, see [llms.txt](/llms.txt). Use this file to discover all available pages.

In **SDK 56 and later**, Expo Router no longer supports importing from external `@react-navigation/*` packages in application code. Update those imports to the matching `expo-router` entry points. The runtime API is unchanged - only the module specifiers move.

## Automated migration

Run the codemod from the root of your project. It rewrites `@react-navigation/*` imports in your application code to the matching `expo-router` entry points.

```sh
npx expo-codemod sdk-56-expo-router-react-navigation-replace src
```

Replace `src` with the directory or glob that contains your application code.

## Manual migration

If you cannot run the codemod, repoint each import by hand:

```tsx
// Before (SDK 55)
import { ThemeProvider, DarkTheme } from '@react-navigation/native';
import { createMaterialTopTabNavigator } from '@react-navigation/material-top-tabs';

// After (SDK 56)
import { ThemeProvider, DarkTheme } from 'expo-router/react-navigation';
import { createMaterialTopTabNavigator } from 'expo-router/js-top-tabs';
```

Use the following table to map each React Navigation import in your code to its `expo-router` equivalent:

| React Navigation source | Expo Router target |
| --- | --- |
| `@react-navigation/native` | `expo-router/react-navigation` |
| `@react-navigation/core` | `expo-router/react-navigation` |
| `@react-navigation/elements` | `expo-router/react-navigation` |
| `@react-navigation/routers` | `expo-router/react-navigation` |
| `@react-navigation/stack` | `expo-router/js-stack` |
| `@react-navigation/bottom-tabs` | `expo-router/js-tabs` |
| `@react-navigation/material-top-tabs` | `expo-router/js-top-tabs` |
| `@react-navigation/native-stack` | No direct equivalent. Use the [`Stack`](/router/advanced/stack) layout instead. |
| `@react-navigation/drawer` | No direct equivalent. Use the [`Drawer`](/router/advanced/drawer) layout instead. |

## Libraries

Many third-party libraries still import from `@react-navigation/core`. To ease the SDK 56 transition, Expo CLI automatically rewrites those imports to `expo-router` when they originate from **node_modules**. Your application code is unaffected by this rewrite.

This is a temporary compatibility shim. A dedicated library migration guide will explain the replacement before the automatic rewrite is removed.

To opt out, set `EXPO_ROUTER_DISABLE_RN_NAVIGATION_CHECK=1` in your environment before starting the bundler. This also disables the bundler error for application code that imports from `@react-navigation/*`.

```sh
EXPO_ROUTER_DISABLE_RN_NAVIGATION_CHECK=1 npx expo start
```
