{"id":15611,"library":"expo-dev-client","title":"Expo Development Client","description":"The `expo-dev-client` package is a fundamental component of the Expo ecosystem, enabling developers to create custom development builds of their React Native applications. Unlike the generic Expo Go app, development builds include your project's specific native code, allowing for the use of custom native modules (third-party native libraries or your own native code) and advanced native configurations without ejecting to a bare React Native workflow. It provides a development environment that closely mirrors production while retaining fast iteration speeds for JavaScript changes. The current stable version is 55.0.28, aligning with Expo SDK 55. Expo SDKs are typically released three times a year, with each release targeting a specific React Native version. Key differentiators include improved debugging tools, a configurable launcher UI for switching between development servers, and seamless integration with EAS Build for cloud-based native builds.","status":"active","version":"55.0.28","language":"javascript","source_language":"en","source_url":"https://github.com/expo/expo","tags":["javascript","react-native","expo","expo-dev-client","typescript"],"install":[{"cmd":"npm install expo-dev-client","lang":"bash","label":"npm"},{"cmd":"yarn add expo-dev-client","lang":"bash","label":"yarn"},{"cmd":"pnpm add expo-dev-client","lang":"bash","label":"pnpm"}],"dependencies":[{"reason":"Peer dependency for core Expo SDK functionality and CLI integration.","package":"expo","optional":false}],"imports":[{"note":"A boolean function to check if the app is running in a development build. Useful for conditional logic.","wrong":"import DevClient from 'expo-dev-client'; DevClient.isDevelopmentBuild();","symbol":"isDevelopmentBuild","correct":"import { isDevelopmentBuild } from 'expo-dev-client';"},{"note":"`getUrl` is the exported function to retrieve the dev client URL. `url` is also exported but is an older alias.","wrong":"import { url } from 'expo-dev-client';","symbol":"getUrl","correct":"import { getUrl } from 'expo-dev-client';"},{"note":"Type definition for the URL object. While `expo-dev-client` re-exports some utilities directly, complex types might sometimes require importing from a deeper path. For runtime values, prefer the top-level imports.","wrong":"import { DevClientUrl } from 'expo-dev-client';","symbol":"DevClientUrl","correct":"import { DevClientUrl } from 'expo-dev-client/build/DevClient';"}],"quickstart":{"code":"import { StatusBar } from 'expo-status-bar';\nimport { StyleSheet, Text, View } from 'react-native';\nimport { isDevelopmentBuild, getUrl } from 'expo-dev-client';\n\nexport default function App() {\n  const appUrl = getUrl();\n  const isDev = isDevelopmentBuild();\n\n  return (\n    <View style={styles.container}>\n      <Text style={styles.title}>Expo Dev Client Example</Text>\n      <Text>Is Development Build: {isDev ? 'Yes' : 'No'}</Text>\n      {isDev && <Text>Development URL: {appUrl || 'N/A'}</Text>}\n      <Text style={styles.text}>This app is running in a custom Expo Development Client.</Text>\n      <Text style={styles.text}>It supports native modules and advanced configurations.</Text>\n      <StatusBar style=\"auto\" />\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: '#fff',\n    alignItems: 'center',\n    justifyContent: 'center',\n    padding: 20,\n  },\n  title: {\n    fontSize: 22,\n    fontWeight: 'bold',\n    marginBottom: 10,\n  },\n  text: {\n    fontSize: 16,\n    textAlign: 'center',\n    marginVertical: 5,\n  },\n});\n\n// To run this:\n// 1. npx create-expo-app my-dev-client-app --template bare-minimum\n// 2. cd my-dev-client-app\n// 3. npx expo install expo-dev-client\n// 4. Copy this code into App.tsx\n// 5. npx expo prebuild --platform android,ios\n// 6. npx expo run:ios (or run:android) to build and launch the custom client\n// 7. Then subsequent runs: npx expo start --dev-client","lang":"typescript","description":"This quickstart demonstrates creating a new Expo project, installing `expo-dev-client`, generating native projects with `prebuild`, and then building and running a custom development client. It also shows how to use `isDevelopmentBuild` and `getUrl` within your app logic."},"warnings":[{"fix":"Consult the official Expo SDK upgrade guide and changelog for detailed migration steps. Typically involves `npx expo install --fix` and rebuilding the native client.","message":"Major Expo SDK upgrades often introduce breaking changes for `expo-dev-client`. These can include minimum SDK versions, Node.js, Xcode, Android Gradle Plugin, or Java requirements. Always review the changelog for your target SDK.","severity":"breaking","affected_versions":">=49.0.0"},{"fix":"After modifying native dependencies or configuration (e.g., installing a new native module, changing a config plugin), run `npx expo prebuild` then `npx expo run:ios` or `npx expo run:android`.","message":"`expo-dev-client` requires a full native rebuild (using `npx expo run:ios` or `npx expo run:android`) whenever native dependencies are added, updated, or native configurations (e.g., in `app.json` config plugins) are changed. JavaScript changes still benefit from Fast Refresh.","severity":"gotcha","affected_versions":">=0.1.0"},{"fix":"Migrate development to use `expo-dev-client` and custom development builds, especially if your project requires native modules not included in Expo Go or uses config plugins.","message":"Starting with SDK 51, Expo Go will support only a single SDK version per release, shifting the primary development workflow towards development builds. Relying solely on Expo Go for development might limit access to newer React Native versions or custom native modules.","severity":"deprecated","affected_versions":">=51.0.0"},{"fix":"Ensure your development machine and device/simulator are on the same network. Try `npx expo start --dev-client --host tunnel` for a tunnel connection if local network issues persist. Clear Metro bundler cache with `npx expo start --clear`.","message":"Connecting an `expo-dev-client` build to the development server can sometimes fail due to network issues, firewalls, or incorrect IP addresses. Unlike Expo Go, it typically connects via LAN or localhost.","severity":"gotcha","affected_versions":">=0.1.0"}],"env_vars":null,"last_verified":"2026-04-21T00:00:00.000Z","next_check":"2026-07-20T00:00:00.000Z","problems":[{"fix":"Verify that your device and computer are on the same network. Try running `npx expo start --dev-client --host lan` or `npx expo start --dev-client --host tunnel`. Check firewall settings. Clear the Metro cache with `npx expo start --clear`.","cause":"The development client installed on your device/simulator cannot connect to the Metro development server, often due to network configuration, firewalls, or an incorrect IP address being advertised by Metro.","error":"Failed to load app from http://<IP>:<PORT> with error: The request timed out."},{"fix":"Try running `npx expo start --no-dev --minify` to simulate a production bundle locally and pinpoint JavaScript errors. Access device logs via Android Studio or Xcode for more detailed stack traces. Ensure `react-native` versions align in `app.json` and `package.json`.","cause":"This error typically indicates an issue preventing the JavaScript bundle from executing on startup, often due to a problem in your application code or Babel configuration, or a React Native version mismatch.","error":"Module AppRegistry is not a registered callable module (calling runApplication)"},{"fix":"Ensure your custom development client is up-to-date with your project's SDK. If in doubt, rebuild the native client with `npx expo prebuild` followed by `npx expo run:ios` or `npx expo run:android`.","cause":"While less common with `expo-dev-client` (which creates a custom app), this can sometimes appear if the custom client build itself is outdated relative to your SDK version, or if there was an issue during its installation.","error":"Could not find the Expo client app"},{"fix":"Upgrade your project to a supported SDK version using `npx expo upgrade`. If you are using a supported version, ensure your Expo CLI and related tools are also up-to-date.","cause":"The Expo SDK version used in your project is deprecated or unsupported by the current Expo CLI or tools, or there's a mismatch between your project's SDK and the tools being used.","error":"XX.X.X is not a valid SDK version."}],"ecosystem":"npm"}