{"record":{"id":"3aa3e4daeae97322","repo":"expo/expo","slug":"no-expo-go","errorCode":"NO_EXPO_GO","errorMessage":"Expo Go is not installed on device \"${deviceManager.name}\", while running in offline mode. Manually install Expo Go or run without --offline flag (or EXPO_OFFLINE environment variable).","messagePattern":"Expo Go is not installed on device \"(.+?)\", while running in offline mode\\. Manually install Expo Go or run without --offline flag \\(or EXPO_OFFLINE environment variable\\)\\.","errorType":"exception","errorClass":"CommandError","httpStatus":null,"severity":"error","filePath":"packages/@expo/cli/src/start/platforms/ExpoGoInstaller.ts","lineNumber":123,"sourceCode":"          await deviceManager.uninstallAppAsync(this.appId);\n        }\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /** Check if a given device has Expo Go installed, if not then download and install it. */\n  async ensureAsync(deviceManager: DeviceManager<IDevice>): Promise<boolean> {\n    const isExpoGoInstalledAndIfSoContainerPathForIOS =\n      await deviceManager.isAppInstalledAndIfSoReturnContainerPathForIOSAsync(this.appId);\n    let shouldInstall = !isExpoGoInstalledAndIfSoContainerPathForIOS;\n    if (env.EXPO_OFFLINE) {\n      if (isExpoGoInstalledAndIfSoContainerPathForIOS) {\n        Log.warn(`Skipping Expo Go version validation in offline mode`);\n        return false;\n      }\n      throw new CommandError(\n        'NO_EXPO_GO',\n        `Expo Go is not installed on device \"${deviceManager.name}\", while running in offline mode. Manually install Expo Go or run without --offline flag (or EXPO_OFFLINE environment variable).`\n      );\n    }\n\n    if (isExpoGoInstalledAndIfSoContainerPathForIOS) {\n      shouldInstall =\n        await this.promptForUninstallExpoGoIfInstalledClientVersionMismatchedAndReturnShouldInstallAsync(\n          deviceManager,\n          {\n            // iOS optimization to prevent duplicate calls to `getContainerPathAsync`.\n            containerPath:\n              typeof isExpoGoInstalledAndIfSoContainerPathForIOS === 'string'\n                ? isExpoGoInstalledAndIfSoContainerPathForIOS\n                : undefined,\n          }\n        );\n    }","sourceCodeStart":105,"sourceCodeEnd":141,"githubUrl":"https://github.com/expo/expo/blob/b09195aac27c9e4a63daaf12dcb6f00b6b2e08ee/packages/@expo/cli/src/start/platforms/ExpoGoInstaller.ts#L105-L141","documentation":"Thrown by ExpoGoInstaller.ensureAsync (code NO_EXPO_GO) when Expo Go is not installed on the target device and the CLI is running in offline mode (env.EXPO_OFFLINE true). In offline mode the CLI cannot download the Expo Go IPA, so instead of fetching it, it errors and instructs the user to install Expo Go manually or disable offline mode. If Expo Go IS installed in offline mode, it logs a warning and skips version validation.","triggerScenarios":"ensureAsync runs with env.EXPO_OFFLINE=true; isAppInstalledAndIfSoReturnContainerPathForIOSAsync returns falsy for the Expo Go app id, so the offline branch throws NO_EXPO_GO instead of attempting a download.","commonSituations":"Running `expo start --offline` (or with EXPO_OFFLINE=1) against a device/emulator that has never had Expo Go installed. A freshly wiped simulator. An air-gapped CI machine. A device where Expo Go was uninstalled.","solutions":["Remove the --offline flag / unset EXPO_OFFLINE so the CLI can download and install Expo Go.","Manually install Expo Go on the device (sideload the IPA / install from App Store / Play Store, or `xcrun simctl install`).","Pre-install Expo Go on the simulator image before running in offline mode.","Use a development build instead of Expo Go if offline is mandatory."],"exampleFix":"// before: EXPO_OFFLINE=1 npx expo start --ios   (no Expo Go on sim)\n// after: drop offline so it can fetch Expo Go\n//   npx expo start --ios","handlingStrategy":"fallback","validationCode":"import { env } from '../../utils/env';\n\nif (env.EXPO_OFFLINE) {\n  const installed = await deviceManager.isAppInstalledAndIfSoReturnContainerPathForIOSAsync('host.exp.Exponent');\n  if (!installed) {\n    throw new Error('Offline mode requires Expo Go pre-installed on the device.');\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  await expoGoInstaller.ensureAsync(deviceManager);\n} catch (e: any) {\n  if (e.code === 'NO_EXPO_GO') {\n    // unset EXPO_OFFLINE and retry, or switch to a development build\n  } else throw e;\n}","preventionTips":["Pre-install Expo Go on simulator images used in offline CI.","Avoid --offline unless Expo Go is confirmed present.","Use a development build when offline is mandatory."],"tags":["expo-go","offline","ios","device","installation"],"backgroundTag":null,"analyzedSha":"b09195aac27c9e4a63daaf12dcb6f00b6b2e08ee","analyzedAt":"2026-08-12T15:59:58.304Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}