In a real app
An Expo Router project is recognizable by its app/ (or src/app/) directory, a root _layout.tsx rendering Stack or Tabs, parenthesized groups such as (tabs) or (auth), and dynamic routes like [id].tsx. Navigation goes through Link with an href, or useRouter() (push, replace, back, dismissTo); useNavigation stays for navigator-specific APIs (events, options). Typed routes are enabled in app.json with experiments.typedRoutes and generate a .d.ts file that turns a link to a nonexistent route into a TypeScript error.
SDK 58 is a breaking change for projects that read navigation state or used the screen, params, and initial parameters to target a nested screen: those are now ordinary user parameters, and the migration guide recommends navigating to a complete href. initialRouteName is gone in favor of unstable_settings.anchor, and many compatibility APIs in expo-router/react-navigation were removed. On a project with a custom router or navigation.dispatch calls, budget for this migration.
What I check: that deep links are tested with npx uri-scheme open or xcrun simctl openurl, that stack screens are not remounted in a loop because a _layout renders conditionally on auth state (prefer Redirect or Stack.Protected), and that the app does not import @react-navigation/* alongside Expo Router.
Related terms
React Navigation
The standard navigation library for React Native: stack, tabs, drawer, with native screens through react-native-screens.
Deep linking
Opening a specific screen of the app from a URL: a custom scheme (myapp://) or a verified https link (universal links, App Links).
Universal links and App Links
Ordinary https links that open the app when installed, proven by a file hosted on your domain (AASA, assetlinks.json).
Expo
The open-source framework React Native recommends: a native module SDK, a CLI, prebuild, Expo Router, and the EAS cloud services.
Fast Refresh
React Native’s hot reloading: a component edit is applied within a second or two while local state is preserved.