xref: /expo/docs/pages/more/expo-cli.mdx (revision 75d433ca)
1---
2title: Expo CLI
3maxHeadingDepth: 4
4description: The Expo CLI is a command-line tool that is the primary interface between a developer and other Expo tools.
5---
6
7import { Terminal } from '~/ui/components/Snippet';
8import { StatusTag } from '~/ui/components/Tag';
9import { Tabs, Tab } from '~/ui/components/Tabs';
10
11> **info** This documentation refers to the Local Expo CLI (SDK 46 and above). For information on legacy Expo CLI, see [Global Expo CLI](/archive/expo-cli).
12
13The `expo` package provides a small and powerful CLI tool `npx expo` which is designed to keep you moving fast during app development.
14
15## Highlights
16
17- [Start a server](#develop) for developing your app: `npx expo start`.
18- [Generate the native Android and iOS directories](#prebuild) for your project: `npx expo prebuild`.
19- [Build and run](#compiling) the native apps locally: `npx expo run:ios` and `npx expo run:android`.
20- [Install and update packages](#install) that work with the version of `react-native` in your project: `npx expo install package-name`.
21- `npx expo` can be used with `npx react-native` simultaneously.
22
23To view a list of available commands in Expo CLI, run the following in your project:
24
25<Terminal cmd={['$ npx expo -h']} />
26
27> You can also run `yarn expo -h` if you prefer to use yarn as the package manager.
28
29The output should look something like below:
30
31```shell
32Usage
33  $ npx expo <command>
34
35Commands
36  start, export, export:web
37  run:ios, run:android, prebuild
38  install, customize, config
39  login, logout, whoami, register
40
41Options
42  --version, -v   Version number
43  --help, -h      Usage info
44```
45
46You can run any command with the `--help` or `-h` flag to learn more about it:
47
48<Terminal cmd={['$ npx expo login -h']} />
49
50## Installation
51
52Expo CLI is included in the `expo` package. You can install it with npm or yarn:
53
54<Terminal cmd={['$ yarn add expo']} />
55
56> Projects that are not using [Expo Prebuild](#prebuild) (often referred to as _Bare workflow_) will need to perform additional setup to ensure all custom Expo bundling features work: [Metro: Bare workflow setup](/versions/latest/config/metro#bare-workflow-setup).
57
58## Develop
59
60Start a development server to work on your project by running:
61
62<Terminal cmd={['$ npx expo start']} />
63
64> You can also run `npx expo` as an alias to `npx expo start`.
65
66This command starts a server on `http://localhost:8081` (for SDK 48 and lower, the port number is `19000`) that a client can use to interact with the bundler. The default bundler is [Metro](https://facebook.github.io/metro/).
67
68The UI that shows up in the process is referred to as the **Terminal UI**. It contains a QR code (for the dev server URL) and a list of keyboard shortcuts you can press:
69
70| Keyboard shortcut               | Description                                                                                                                                                                              |
71| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
72| <kbd>A</kbd>                    | Open the project on a connected Android device.                                                                                                                                          |
73| <kbd>Shift</kbd> + <kbd>A</kbd> | Select an Android device or emulator to open.                                                                                                                                            |
74| <kbd>I</kbd>                    | Open the project in an iOS Simulator.                                                                                                                                                    |
75| <kbd>Shift</kbd> + <kbd>I</kbd> | Select an iOS Simulator to open.                                                                                                                                                         |
76| <kbd>W</kbd>                    | Open the project in a web browser. This may require webpack to be installed in your project.                                                                                             |
77| <kbd>R</kbd>                    | Reload the app on any connected device.                                                                                                                                                  |
78| <kbd>S</kbd>                    | Switch the launch target between Expo Go and development builds.                                                                                                                         |
79| <kbd>M</kbd>                    | Open the dev menu on any connected native device (web not supported).                                                                                                                    |
80| <kbd>Shift</kbd> + <kbd>M</kbd> | Choose more commands to trigger on connected devices.<br/>This includes toggling the performance monitor, opening the element inspector, reloading the device, and opening the dev menu. |
81| <kbd>J</kbd>                    | Open Chrome Dev Tools for any connected device that is using Hermes as the JavaScript engine. [Learn more](/guides/using-hermes#javascript-inspector-for-hermes).                        |
82| <kbd>O</kbd>                    | Open project code in your editor. This can be configured with the `EXPO_EDITOR` and `EDITOR` [environment variables](#environment-variables).                                            |
83| <kbd>E</kbd>                    | Show the development server URL as a QR code in the terminal.                                                                                                                            |
84| <kbd>?</kbd>                    | Show all Terminal UI commands.                                                                                                                                                           |
85
86### Launch target
87
88The `npx expo start` command automatically launches the app in a development build if `expo-dev-client` is installed in the project. Otherwise, it launches the app in Expo Go.
89
90Alternatively, you can force the launch target by passing the following flags to the command:
91
92- `--dev-client`: Always launch the app in a development build.
93- `--go`: Always launch the app in Expo Go.
94
95You can also switch the launch target during runtime by pressing <kbd>S</kbd> in the **Terminal UI**. The `run` commands also use `--dev-client` after compiling the development build, by default.
96
97### Server URL
98
99By default, the project is served over a LAN connection. You can change this behavior to localhost-only by using the flag `npx expo start --localhost`.
100
101Other available options are:
102
103- `--port`: Port to start the dev server on (does not apply to webpack or [tunnel URLs](#tunneling)). Default: **8081**. For SDK 48 and lower, defaults to `19000`.
104- `--https`: Start the dev server using a secure origin. This is currently only supported on web.
105
106You can force the URL to be any value with the `EXPO_PACKAGER_PROXY_URL` environment variable. For example:
107
108<Terminal cmd={['$ export EXPO_PACKAGER_PROXY_URL=http://expo.dev', '$ npx expo start']} />
109
110Will open apps to: `exp://expo.dev:80` (the `:80` is a temporary workaround for Android WebSockets).
111
112#### Tunneling
113
114Restrictive network conditions (common for public Wi-Fi), firewalls (common for Windows users), or Emulator misconfiguration can make it difficult to connect a remote device to your dev server over lan/localhost.
115
116Sometimes it's easier to connect to a dev server over a proxy URL that's accessible from any device with internet access, this is referred to as **tunneling**. `npx expo start` provides built-in support for **tunneling** via [ngrok][ngrok].
117
118To enable tunneling, first install `@expo/ngrok`:
119
120<Terminal cmd={['$ npm i -g @expo/ngrok']} />
121
122Then run the following to start your dev server from a _tunnel_ URL:
123
124<Terminal cmd={['$ npx expo start --tunnel']} />
125
126This will serve your app from a public URL like: `http://xxxxxxx.bacon.19000.exp.direct:80`.
127
128**Drawbacks**
129
130- Tunneling is slower than local connections because requests must be forwarded to a public URL.
131- Tunnel URLs are public and can be accessed by any device with a network connection. Expo CLI mitigates the risk of exposure by adding entropy to the beginning of the URL. Entropy can be reset by clearing the `.expo` directory in your project.
132- Tunnels require a network connection on both devices, meaning this feature cannot be used with the `--offline` flag.
133
134Tunneling requires a third-party hosting service, this means it may sometimes experience intermittent issues like `ngrok tunnel took too long to connect` or `Tunnel connection has been closed. This is often related to intermittent connection problems with the Ngrok servers...`. Be sure to check for [Ngrok outages](https://status.ngrok.com/) before reporting an issue. Some Windows users have also reported needing modify their antivirus settings to allow Ngrok to work.
135
136#### Offline
137
138You can develop without a network connection by using the `--offline` flag:
139
140<Terminal cmd={['$ npx expo start --offline']} />
141
142Offline will prevent the CLI from making network requests. If you don't use the flag and your computer has no internet connection, then offline support will automatically be enabled, it will just take a bit longer to verify the reachability.
143
144Expo CLI makes network requests to sign manifests with your user credentials to ensure sensitive information is sandboxed in reusable runtimes like Expo Go.
145
146### .expo directory
147
148When you start the development server in a project for the first time, a **.expo** directory is created at the root of that project. It contains two files:
149
150- **devices.json**: Contains information about devices that have opened this project recently.
151- **settings.json**: Contains information about server configuration that is used to serve the project's manifest.
152
153Both of these files have information that is specific to your local computer. This is the reason why **.expo** directory is included in the **.gitignore** file, by default, when a new project is created. It is not meant to be shared with other developers.
154
155## Building
156
157A React Native app consists of two parts: a native runtime ([compiling](#compiling)), and static files like JavaScript bundles and assets ([exporting](#exporting)). Expo CLI provides commands for performing both tasks.
158
159### Compiling
160
161You can compile your app locally with the `run` commands:
162
163<Terminal
164  cmd={['# Build for iOS', '$ npx expo run:ios', '# Build for Android', '$ npx expo run:android']}
165/>
166
167**Highlights**
168
169- Build directly on connected devices with no global side effects using the `--device` flag. Supports locked devices, letting you retry instantly instead of needing to rebuild.
170- Automatically codesign iOS apps for development from the CLI without having to open Xcode.
171- Smart log parsing shows warnings and errors from your project source code, unlike Xcode which surfaces hundreds of benign warnings from your node modules.
172- Fatal errors causing your app to crash will be surfaced in the terminal preventing the need to reproduce in Xcode.
173
174`npx expo run:ios` can only be run on a Mac, and Xcode must be installed. You can build the app in the cloud from any computer using `eas build -p ios`. Similarly, `npx expo run:android` requires Android Studio and Java to be installed and configured on your computer.
175
176Building locally is useful for developing native modules and [debugging complex native issues](/debugging/runtime-issues/#native-debugging). Building remotely with `eas build` is a much more resilient option due to the pre-configured cloud environment.
177
178If your project does not have the corresponding native directories, the `npx expo prebuild` command will run once to generate the respective directory before building.
179
180For example, if your project does not have an **ios** directory in the root of your project, then `npx expo run:ios` will first run `npx expo prebuild -p ios` before compiling your app. For more information on this process, see [Expo Prebuild](/workflow/prebuild).
181
182**Cross-Platform Arguments**
183
184- `--no-build-cache`: Clear the native cache before building. On iOS, this is the **derived data** folder. Cache clearing is useful for profiling your build times.
185- `--no-install`: Skip installing dependencies. On iOS, this will also skip running `npx pod-install` if the `dependencies` field in the project's `package.json` has changed.
186- `--no-bundler`: Skip starting the dev server. Enabled automatically if the dev server is already serving the app from a different process.
187- `-d, --device [device]`: Device name or ID to build the app on. You can pass `--device` without arguments to select a device from a list of available options. This supports connected devices as well as virtual devices.
188- `-p, --port <port>`: Port to start the development server. **Default: 8081**. This is only relevant for development builds. Production builds will [export](#exporting) the project and embeds the files in the native binary before installing them on a device.
189
190#### Compiling Android
191
192Android apps can have multiple different **variants** which are defined in the project's `build.gradle` file. Variants can be selected with the `--variant` flag:
193
194<Terminal cmd={['$ npx expo run:android --variant debug']} />
195
196You can compile the Android app for production by running:
197
198<Terminal cmd={['$ npx expo run:android --variant release']} />
199
200This build is not automatically code-signed for submission to the Google Play Store. This command should be used to test bugs that may only show up in production builds. To generate a production build that is code signed for the Play Store, we recommend using [EAS Build](/build/introduction).
201
202You can debug the native Android project using native debugging tools by opening the `android/` folder in Android Studio:
203
204<Terminal cmd={['$ open -a /Applications/Android Studio.app android']} />
205
206#### Compiling iOS
207
208An iOS app can have multiple **schemes** for representing different sub-apps like App Clips, watchOS apps, Safari Extensions, and so on. By default, `npx expo run:ios` will choose the scheme for your iOS app. You can pick a custom scheme with the `--scheme <my-scheme>` argument. If you pass in the `--scheme` argument alone, then Expo CLI will prompt you to choose a scheme from the list of available options in your Xcode project.
209
210The scheme you select will filter out which `--device` options show up in the selection prompt, for example, selecting an Apple TV scheme will only show available Apple TV devices.
211
212You can compile an iOS app for production by running:
213
214<Terminal cmd={['$ npx expo run:ios --configuration Release']} />
215
216This build is not automatically code signed for submission to the Apple App Store. `npx expo run:ios` should mostly be used to test bugs that only show up in production builds. Native code signing requires several network requests and is prone to many different types of errors from the Apple servers. To generate a production build that is code signed for the App Store, we recommend using [EAS Build](/build/introduction).
217
218When you compile your app onto a Simulator, the Simulator's native error logs will be piped to the Expo CLI process in the terminal. This is useful for quickly seeing bugs that may cause a fatal error. For example, missing permission messages. Error piping is not available for physical iOS devices.
219
220You can debug using `lldb` and all of the native Apple debugging tools by opening the project in Xcode and rebuilding from Xcode:
221
222<Terminal cmd={['$ xed ios']} />
223
224Building from Xcode is useful because you can set native breakpoints and profile any part of the application. Be sure to track changes in source control (git) in case you need to regenerate the native app with `npx expo prebuild -p ios --clean`.
225
226**iOS development signing**
227
228If you want to see how your app will run on your device, all you have to do is connect it, run `npx expo run:ios —-device`, and select your connected device.
229
230Expo CLI will automatically sign the device for development, install the app, and launch it.
231
232If you don't have any developer profiles setup on your computer then you'll need to set them up manually outside of Expo CLI by following this guide: [Setup Xcode signing](https://expo.fyi/setup-xcode-signing).
233
234### Exporting
235
236You can export the JavaScript and assets for your app using Metro bundler by running:
237
238<Terminal cmd={['$ npx expo export']} />
239
240This is done automatically when using `eas update` or when compiling the native runtime. The `export` command works similar to most web frameworks:
241
242- A bundler transpiles and bundles your application code for **production** environments, stripping all code guarded by the `__DEV__` boolean.
243- All static files are copied into a static `dist/` folder which can be served from a static host.
244- Contents of the `public/` folder are copied into the `dist/` folder as-is.
245
246The following options are provided:
247
248- `--platform <platform>`: Choose the platform to compile for: 'ios', 'android', 'all'. **Default: all**. 'web' is also available if configured in the app config. For more information, see [Customizing Metro](/guides/customizing-metro).
249- `--dev`: Bundle for **development** environments without minifying code or stripping the `__DEV__` boolean.
250- `--output-dir <dir>`: The directory to export the static files to. **Default: dist**
251- `--max-workers <number>`: Maximum number of tasks to allow the bundler to spawn. Setting this to `0` will run all transpilation on the same process, meaning you can easily debug Babel transpilation.
252- `-c, --clear`: Clear the bundler cache before exporting.
253- `--no-minify`: Skip minifying JavaScript and CSS assets (SDK 49 and above).
254
255#### Hosting with sub-paths
256
257> Experimental functionality. It will be available from SDK 50.
258
259<Tabs>
260
261<Tab label="SDK 49 and below">
262
263    Exporting for a sub-path is not supported in SDK 49 and below.
264
265</Tab>
266
267<Tab label="SDK 50 and above">
268
269You can configure the prefix for static assets by setting the `experiments.basePath` field in your [app config](/workflow/configuration/):
270
271```json app.json
272{
273  "expo": {
274    "experiments": {
275      "basePath": "/my-root"
276    }
277  }
278}
279```
280
281This will export the website with all resources prefixed with `/my-root`. For example, an image at `assets/image.png` will be expected to be hosted at **/my-root/assets/image.png**. The actual file will be located in the same file system location as the entire directory is expected to be hosted at `/my-root` on the server.
282
283Expo Router has built-in support for `basePath`. When using the `Link` and `router` APIs, the `basePath` will be automatically prepended to the URL.
284
285```js app/blog/index.tsx
286import { Link } from 'expo-router';
287
288export default function Blog() {
289  return <Link href="/blog/123">Go to blog post</Link>;
290}
291```
292
293This will **export** to the following:
294
295```html Output HTML
296<a href="/my-root/post/123">Go to blog post</a>
297```
298
299If you use `<a>`, React Navigation, or the `Linking` API directly, you'll need to manually prepend the `basePath`.
300
301The `basePath` functionality is production-only and must be set before exporting the website. If you change the value, you must re-export the website.
302
303Images and other assets will work automatically if you `require` or `import` them. If you directly reference a resource URL then you will need to append the **basePath** manually.
304
305```js app/index.tsx
306import { Image } from 'expo-image';
307
308export default function Blog() {
309  return <Image source={require('@/assets/image.png')} />;
310}
311```
312
313This will **export** to the following:
314
315```html Output HTML
316<img src="/my-root/assets/assets/image.png" />
317```
318
319Manually passing a URL will need to be manually prefixed:
320
321```js app/index.tsx
322export default function Blog() {
323  return <img src="/my-root/assets/image.png" />;
324}
325```
326
327</Tab>
328
329</Tabs>
330
331### Exporting with webpack
332
333> webpack is only supported for the Web platform.
334
335You can export the JavaScript and assets for your web app using webpack by running the following:
336
337<Terminal cmd={['$ npx expo export:web']} />
338
339- `--dev`: Bundle in 'development' mode without minifying code or stripping the `__DEV__` boolean.
340- `-c, --clear`: Clear the bundler cache before exporting.
341
342This command will be disabled if your project is configured to use `metro` for bundling web projects in the `app.json` via the `expo.web.bundler: 'metro'` field.
343
344## Prebuild
345
346<Terminal cmd={['$ npx expo prebuild']} />
347
348Native source code must be generated before a native app can compile. Expo CLI provides a unique and powerful system called _prebuild_, that generates the native code for your project. To learn more, read the [Expo Prebuild docs](/workflow/prebuild.mdx).
349
350## Config
351
352Evaluate the app config (**app.json**, or **app.config.js**) by running:
353
354<Terminal cmd={['$ npx expo config']} />
355
356- `--full`: Include all project config data.
357- `--json`: Output in JSON format, useful for converting an `app.config.js` to an `app.config.json`.
358- `-t, --type`: [Type of config](#config-type) to show.
359
360### Config type
361
362There are three different config types that are generated from the app config:
363
364- `public`: The manifest file to use with OTA updates. Think of this like an `index.html` file's `<head />` element but for native apps.
365- `prebuild`: The config that is used for [Expo Prebuild](/workflow/prebuild) including async modifiers. This is the only time the config is not serializable.
366- `introspect`: A subset of the `prebuild` config that only shows in-memory modifications like `Info.plist` or `AndroidManifest.xml` changes. Learn more about [introspection](/config-plugins/development-and-debugging/#introspection).
367
368## Install
369
370Unlike the web, React Native is not backwards compatible. This means that npm packages often need to be the exact right version for the currently installed copy of `react-native` in your project. Expo CLI provides a best-effort tool for doing this using a list of popular packages and the known working version combinations. Simply use the `install` command as a drop-in replacement for `npm install`:
371
372<Terminal cmd={['$ npx expo install expo-camera']} />
373
374Running a single instance of this command, you can also install multiple packages:
375
376<Terminal cmd={['$ npx expo install typescript expo-sms']} />
377
378You can directly pass arguments to the underlying package manager by using the `--` operator:
379
380<Terminal
381  cmd={['$ yarn expo install typescript -- -D', '# yarn add typescript -D']}
382  cmdCopy="yarn expo install typescript -- -D"
383/>
384
385### Version validation
386
387You can perform validation and correction with the `--check` and `--fix` flags:
388
389- `--check`: Check which installed packages need to be updated.
390- `--fix`: Automatically update any invalid package versions.
391
392Example:
393
394<Terminal
395  cmd={[
396    '# Check all packages for incorrect versions, prompt to fix locally',
397    '$ npx expo install --check',
398  ]}
399  cmdCopy="npx expo install --check"
400/>
401
402`npx expo install --check` prompts you about packages that are installed incorrectly. It also prompts about installing these packages to their compatible versions locally. It exits with non-zero in Continuous Integration (CI). This means you can use this to do continuous immutable validation. In contrast, `npx expo install --fix` will always fix packages if needed, regardless of the environment.
403
404You can validate specific packages by passing them:
405
406<Terminal
407  cmd={[
408    '# Check only react-native and expo-sms',
409    '$ npx expo install react-native expo-sms --check',
410  ]}
411  cmdCopy="npx expo install react-native expo-sms --check"
412/>
413
414The command `npx expo install expo-camera` and `npx expo install expo-camera --fix` serve the same purpose, the `--fix` command is useful for upgrading all packages in your project like:
415
416<Terminal cmd={['$ npx expo install --fix']} />
417
418### Configuring dependency validation
419
420> Available in SDK 49 and above.
421
422There may be circumstances where you want to use a version of a package is different from the version recommended by `npx expo install`.
423
424For example, you are testing a new version of `react-native-reanimated` to verify that it works well in your app and fixes a bug that you encountered. Now you want to 1) not be warned by `npx expo start` or `npx expo-doctor` and 2) not have that package version changed when you run `npx expo install --fix`.
425
426You can exclude specific packages from the version checks while still allowing the `install` command to install, check, and fix any other dependencies. This configuration extends to the checking done by `npx expo-doctor`.
427
428To exclude packages from version checking, set the `expo.install` config object in your project's **package.json**:
429
430```json package.json
431{
432  "expo": {
433    "install": {
434      "exclude": ["expo-updates", "expo-splash-screen"]
435    }
436  }
437}
438```
439
440### Install package managers
441
442`npx expo install` has support for `yarn`, `npm`, and `pnpm`.
443
444You can force the package manager using a named argument:
445
446- `--npm`: Use `npm` to install dependencies. Default when **package-lock.json** exists.
447- `--yarn`: Use `yarn` to install dependencies. Default when **yarn.lock** exists.
448- `--pnpm`: Use `pnpm` to install dependencies. Default when **pnpm-lock.yaml** exists.
449
450## Authentication
451
452Expo CLI provides authentication methods to use with the `npx expo start` command. Authentication is used to "code sign" manifests for secure OTA usage. Think of this like HTTPS on the web.
453
4541. Register an account with `npx expo register`.
4552. Login to your account with `npx expo login`.
4563. Check which account is currently authenticated with `npx expo whoami`.
4574. Logout with `npx expo logout`.
458
459These credentials are shared across Expo CLI and EAS CLI.
460
461## Customizing
462
463Sometimes you may want to customize a project file that would otherwise be generated in memory by Expo CLI. When utilizing tools other than Expo CLI, you'll need to have the default config files present, otherwise your app may not work as expected. You can generate files by running:
464
465<Terminal cmd={['$ npx expo customize']} />
466
467From here, you can choose to generate basic project files like:
468
469- **babel.config.js** -- The Babel configuration. This is required to be present if you plan to use tooling other than Expo CLI to bundle your project.
470- **webpack.config.js** -- The default webpack config for web development.
471- **metro.config.js** -- The default Metro config for universal development. This is required for usage with `npx react-native`.
472- **tsconfig.json** -- Create a TypeScript config file and install the required dependencies.
473
474## Environment Variables
475
476| Name                                | Type        | Description                                                                                                                                                                                                                                                                                                                                                                          |
477| ----------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
478| `HTTP_PROXY`                        | **string**  | HTTP/HTTPS proxy URL to connect for all network requests. Configures [https-proxy-agent](https://www.npmjs.com/package/https-proxy-agent).                                                                                                                                                                                                                                           |
479| `EXPO_NO_WEB_SETUP`                 | **boolean** | Prevents the CLI from forcing web dependencies (`react-dom`, `react-native-web`, `@expo/webpack-config`) to be installed before using web functionality.<br/>This is useful for cases where you wish to perform non-standard web development.                                                                                                                                        |
480| `EXPO_OFFLINE`                      | **boolean** | Skip all network requests when applicable. This leads to faster development in areas with poor network connection.                                                                                                                                                                                                                                                                   |
481| `EXPO_NO_TYPESCRIPT_SETUP`          | **boolean** | Prevents the CLI from forcing TypeScript to be configured on `npx expo start`.<br/>For more information, see [TypeScript guide](/guides/typescript/).                                                                                                                                                                                                                                |
482| `DEBUG=expo:*`                      | **string**  | Enables debug logs for the CLI, you can configure this using the [`debug` convention](https://github.com/debug-js/debug#conventions).                                                                                                                                                                                                                                                |
483| `EXPO_DEBUG`                        | **boolean** | An alias for `DEBUG=expo:*`.                                                                                                                                                                                                                                                                                                                                                         |
484| `EXPO_PROFILE`                      | **boolean** | Enable profiling stats for the CLI, this does not profile your application.                                                                                                                                                                                                                                                                                                          |
485| `EXPO_NO_CACHE`                     | **boolean** | Disable all global caching. By default, app config JSON schemas, Expo Go binaries for simulators and emulators, and project templates are cached in the global **.expo** folder on your machine.                                                                                                                                                                                     |
486| `CI`                                | **boolean** | When enabled, the CLI will disable interactive functionality, skip optional prompts, and fail on non-optional prompts.<br/>Example: `CI=1 npx expo install --check` will fail if any installed packages are outdated.                                                                                                                                                                |
487| `EXPO_NO_TELEMETRY`                 | **boolean** | Disables anonymous usage collection. [Learn more about telemetry](#telemetry).                                                                                                                                                                                                                                                                                                       |
488| `EXPO_NO_GIT_STATUS`                | **boolean** | Skips warning about git status during potentially dangerous actions like `npx expo prebuild --clean`.                                                                                                                                                                                                                                                                                |
489| `EXPO_NO_REDIRECT_PAGE`             | **boolean** | Disables the redirect page for selecting an app, that shows when a user has `expo-dev-client` installed, and starts the project with `npx expo start` instead of `npx expo start --dev-client`.                                                                                                                                                                                      |
490| `EXPO_PUBLIC_FOLDER`                | **string**  | Public folder path to use with Metro for web. [Learn more about customizing Metro](/guides/customizing-metro/).<br/>Default: `public`                                                                                                                                                                                                                                                |
491| `EDITOR`                            | **string**  | Name of the editor to open when pressing <kbd>O</kbd> in the Terminal UI. This value is used across many command line tools.                                                                                                                                                                                                                                                         |
492| `EXPO_EDITOR`                       | **string**  | An Expo-specific version of the `EDITOR` variable which takes higher priority when defined.                                                                                                                                                                                                                                                                                          |
493| `EXPO_IMAGE_UTILS_NO_SHARP`         | **boolean** | Disable the usage of global Sharp CLI installation in favor of the slower Jimp package for image manipulation. This is used in places like `npx expo prebuild` for generating app icons.                                                                                                                                                                                             |
494| `EXPO_TUNNEL_SUBDOMAIN`             | **boolean** | <StatusTag status="experimental" /><br/>Disable using `exp.direct` as the hostname for `--tunnel` connections. This enables **https://** forwarding which can be used to test universal links on iOS. This may cause unexpected issues with `expo-linking` and Expo Go. Select the exact subdomain to use by passing a `string` value that is not one of: `true`, `false`, `1`, `0`. |
495| `EXPO_METRO_NO_MAIN_FIELD_OVERRIDE` | **boolean** | Force Expo CLI to use the [`resolver.resolverMainFields`](https://facebook.github.io/metro/docs/configuration/#resolvermainfields) from the project's **metro.config.js** for all platforms. By default, Expo CLI will use `['browser', 'module', 'main']`, which is the default for webpack, for the web and the user-defined main fields for other platforms.                      |
496| `EXPO_NO_INSPECTOR_PROXY`           | **boolean** | <StatusTag note="SDK 49+" /><br/>Disable the customized inspector proxy with improved support for the Chrome DevTools protocol.<br/>This includes support for the network inspector.                                                                                                                                                                                                 |
497| `EXPO_NO_CLIENT_ENV_VARS`           | **boolean** | <StatusTag note="SDK 49+" /><br/>Prevent inlining `EXPO_PUBLIC_` environment variables in client bundles.                                                                                                                                                                                                                                                                            |
498| `EXPO_NO_DOTENV`                    | **boolean** | <StatusTag note="SDK 49+" /><br/>Prevent all `.env` file loading across Expo CLI.                                                                                                                                                                                                                                                                                                    |
499| `EXPO_NO_METRO_LAZY`                | **boolean** | Prevent adding the `lazy=true` query parameter to Metro URLs (`[email protected]` and greater). This disables `import()` support.                                                                                                                                                                                                                                                         |
500| `EXPO_USE_TYPED_ROUTES`             | **boolean** | Use `expo.experiments.typedRoutes` to enable statically typed routes in Expo Router.                                                                                                                                                                                                                                                                                                 |
501| `EXPO_METRO_UNSTABLE_ERRORS`        | **boolean** | <StatusTag status="experimental" /><br/>Enable unstable error message improvements in Metro bundler. The features behind this flag are subject to removal and may be upstreamed.                                                                                                                                                                                                     |
502| `EXPO_USE_METRO_WORKSPACE_ROOT`     | **boolean** | Enable auto server root detection for Metro. This will change the server root to the workspace root. Useful for monorepos.                                                                                                                                                                                                                                                           |
503
504## Telemetry
505
506Expo dev tools collect anonymous data about general usage. This helps us know when a feature is not working as expected. Telemetry is completely optional, you can opt out by using the `EXPO_NO_TELEMETRY=1` environment variable.
507
508[ngrok]: https://ngrok.com
509