# Table of Contents - [Expo Documentation](#expo-documentation) - [Core concepts - Expo Documentation](#core-concepts-expo-documentation) - [Documentation for LLMs - Expo Documentation](#documentation-for-llms-expo-documentation) - [Create a project - Expo Documentation](#create-a-project-expo-documentation) - [Introduction - Expo Documentation](#introduction-expo-documentation) - [Next steps - Expo Documentation](#next-steps-expo-documentation) - [Start developing - Expo Documentation](#start-developing-expo-documentation) - [Navigation in Expo and React Native apps - Expo Documentation](#navigation-in-expo-and-react-native-apps-expo-documentation) - [FAQ - Expo Documentation](#faq-expo-documentation) - [Set up your environment - Expo Documentation](#set-up-your-environment-expo-documentation) - [Authentication in Expo and React Native apps - Expo Documentation](#authentication-in-expo-and-react-native-apps-expo-documentation) - [Create a development build on EAS - Expo Documentation](#create-a-development-build-on-eas-expo-documentation) - [Tools for development - Expo Documentation](#tools-for-development-expo-documentation) - [Animation - Expo Documentation](#animation-expo-documentation) - [Next steps - Expo Documentation](#next-steps-expo-documentation) - [Share a development build with your team - Expo Documentation](#share-a-development-build-with-your-team-expo-documentation) - [Switch from Expo Go to a development build - Expo Documentation](#switch-from-expo-go-to-a-development-build-expo-documentation) - [Use a development build - Expo Documentation](#use-a-development-build-expo-documentation) - [Next steps - Expo Documentation](#next-steps-expo-documentation) - [Color themes - Expo Documentation](#color-themes-expo-documentation) - [Store data - Expo Documentation](#store-data-expo-documentation) - [System bars - Expo Documentation](#system-bars-expo-documentation) - [Tools, workflows and extensions - Expo Documentation](#tools-workflows-and-extensions-expo-documentation) - [Safe areas - Expo Documentation](#safe-areas-expo-documentation) - [Assets - Expo Documentation](#assets-expo-documentation) - [Errors and warnings - Expo Documentation](#errors-and-warnings-expo-documentation) - [Using a dangerous mod - Expo Documentation](#using-a-dangerous-mod-expo-documentation) - [Unit testing with Jest - Expo Documentation](#unit-testing-with-jest-expo-documentation) - [How to launch an update using Expo Orbit - Expo Documentation](#how-to-launch-an-update-using-expo-orbit-expo-documentation) - [Introduction to config plugins - Expo Documentation](#introduction-to-config-plugins-expo-documentation) - [App stores metadata - Expo Documentation](#app-stores-metadata-expo-documentation) - [Introduction to development builds - Expo Documentation](#introduction-to-development-builds-expo-documentation) - [Send over-the-air updates - Expo Documentation](#send-over-the-air-updates-expo-documentation) - [Publish your web app - Expo Documentation](#publish-your-web-app-expo-documentation) - [Create a dev tools plugin - Expo Documentation](#create-a-dev-tools-plugin-expo-documentation) - [Share previews with your team - Expo Documentation](#share-previews-with-your-team-expo-documentation) - [DateTimePicker - Expo Documentation](#datetimepicker-expo-documentation) - [MailComposer - Expo Documentation](#mailcomposer-expo-documentation) - [FlashList - Expo Documentation](#flashlist-expo-documentation) - [React Native Maps - Expo Documentation](#react-native-maps-expo-documentation) - [captureRef - Expo Documentation](#captureref-expo-documentation) - [Manifests - Expo Documentation](#manifests-expo-documentation) - [MaskedView - Expo Documentation](#maskedview-expo-documentation) --- # Expo Documentation Hide navigation Search [Home](https://docs.expo.dev/) [Guides](https://docs.expo.dev/guides/overview) [EAS](https://docs.expo.dev/eas) [Reference](https://docs.expo.dev/versions/latest) [Learn](https://docs.expo.dev/tutorial/overview) [Archive](https://docs.expo.dev/archive) [Expo Snack](https://snack.expo.dev/) [Discord and Forums](https://chat.expo.dev/) [Newsletter](https://expo.dev/mailing-list/signup) State of React Native 2025 Have a few minutes and want to shape the future of React Native? [Fill out the Survey Now!](https://survey.stateofreactnative.com/) Create amazing apps that run everywhere ======================================= Build one JavaScript/TypeScript project that runs natively on all your users' devices. Quick Start ----------- Terminal Copy `-` `npx create-expo-app@latest` Then continue [setting up your environment](https://docs.expo.dev/get-started/set-up-your-environment) . Create a universal Android, iOS, and web app -------------------------------------------- [Start Tutorial](https://docs.expo.dev/tutorial/introduction) Launch to app stores ---------------------- Ship apps with zero config or no prior experience. Launch easily guides you through the technical stuff, directly from GitHub. No config or prior knowledge needed. [Try Launch](https://launch.expo.dev/) ### Deploy from CLI Deploy your apps using command-line tools for iOS and web platforms. Deploy to TestFlight -------------------- Terminal Copy `-` `npx testflight` This is an iOS-only command that will upload your app to TestFlight. Deploy your web app ------------------- Terminal Copy `-` `npx eas-cli deploy` For prerequisites and complete instructions, see [our guide](https://docs.expo.dev/deploy/web#export-your-web-project/) . ### Discover more Try out Expo in minutes and learn how to get the most out of Expo. Speed up your development with Expo Application Services -------------------------------------------------------- [Start EAS Tutorial](https://docs.expo.dev/tutorial/eas/introduction) Discover the benefits of file-based routing with Expo Router ------------------------------------------------------------ [Learn More](https://docs.expo.dev/router/introduction) ### Try Expo in your browser Expo's Snack lets you try Expo with zero local setup. [Create a Snack](https://snack.expo.dev/) ### Chat with the community Join over 60,000 other developers on the Expo Community Discord. [Go to Discord](https://chat.expo.dev/) ### Explore APIs Expo supplies a vast array of SDK modules. You can also create your own. [Image](https://docs.expo.dev/versions/latest/sdk/image) [Camera](https://docs.expo.dev/versions/latest/sdk/camera) [Notifications](https://docs.expo.dev/versions/latest/sdk/notifications) [View all APIs](https://docs.expo.dev/versions/latest) ### Explore examples Explore a variety of example projects showcasing how to use Expo and seamlessly integrate it with popular services. [StickerSmash](https://github.com/expo/examples/tree/master/stickersmash) [Router + menus](https://github.com/expo/examples/tree/master/with-router-menus) [API Routes + Open AI](https://github.com/expo/examples/tree/master/with-openai) [View all examples](https://github.com/expo/examples) ### Watch our latest talks Explore our team's presentations. Stay informed and gain expertise. [See More Talks](https://docs.expo.dev/additional-resources#talks) [Keynote: streamline React Native development\ \ Charlie Cheever, Jon Samp\ \ App.js Conf 2025](https://www.youtube.com/watch?v=lnxanzsP1rM) [Deploy Everywhere with Expo Router\ \ Evan Bacon\ \ App.js Conf 2025](https://www.youtube.com/watch?v=GKQ_0VfYweg) [Embracing Native Code and Capabilities\ \ Keith Kurak\ \ App.js Conf 2025](https://www.youtube.com/watch?v=TLoHua8bzPg) [Launching Desktop Apps to Orbit with React Native\ \ Gabriel Donadel\ \ App.js Conf 2024](https://www.youtube.com/watch?v=K7yC3JKfWYU) ### Join the community See the source code, connect with others, and get connected. [Discord and Forums\ \ Join our Discord to chat, ask questions or attend events.](https://chat.expo.dev/) [GitHub\ \ View SDK and docs code, submit a PR, or report an issue.](https://github.com/expo/expo) [YouTube\ \ Follow our channel to explore tutorials and other content.](https://www.youtube.com/channel/UCx_YiR733cfqVPRsQ1n8Fag) [LinkedIn\ \ Follow Expo on LinkedIn for news and updates.](https://www.linkedin.com/company/expo-dev/) [Bluesky\ \ Follow Expo on Bluesky for news and updates.](https://bsky.app/profile/expo.dev) [X\ \ Follow Expo on X for news and updates.](https://x.com/expo) [Reddit\ \ Get the latest on r/expo.](https://www.reddit.com/r/expo) [Canny\ \ Give us a feedback or request a feature.](https://expo.canny.io/) --- # Core concepts - Expo Documentation Hide navigation Search [Home](https://docs.expo.dev/) [Guides](https://docs.expo.dev/guides/overview) [EAS](https://docs.expo.dev/eas) [Reference](https://docs.expo.dev/versions/latest) [Learn](https://docs.expo.dev/tutorial/overview) [Archive](https://docs.expo.dev/archive) [Expo Snack](https://snack.expo.dev/) [Discord and Forums](https://chat.expo.dev/) [Newsletter](https://expo.dev/mailing-list/signup) Core concepts ============= [Edit page](https://github.com/expo/expo/edit/main/docs/pages/core-concepts.mdx) Copy page An overview of Expo tools, features and services. [Edit page](https://github.com/expo/expo/edit/main/docs/pages/core-concepts.mdx) Copy page * * * Expo is an [open-source framework](https://github.com/expo/expo/) for apps that run natively on Android, iOS, and the web. Expo brings together the best of mobile and the web and enables many important features for building and scaling an app. The `expo` npm package enables a suite of incredible features for React Native apps. The `expo` package can be installed in nearly any React Native project. Tools and features[](https://docs.expo.dev/core-concepts/#tools-and-features) ------------------------------------------------------------------------------ [Expo SDK\ \ Comprehensive suite of well-tested React Native modules that run on Android, iOS, and web.](https://docs.expo.dev/versions/latest) [Develop an app with Expo\ \ An overview of the development process of building an Expo app to help build a mental model of the core development loop.](https://docs.expo.dev/workflow/overview) [Expo Modules API\ \ Write highly performant native code with modern Swift and Kotlin API.](https://docs.expo.dev/modules/overview) [Prebuild\ \ Separate React from Native to develop from any computer, upgrade easily, white label apps, and maintain larger projects.](https://docs.expo.dev/workflow/prebuild) [Expo CLI\ \ Manage dependencies, compile native apps, develop for the web, and connect to any device with a powerful dev server.](https://docs.expo.dev/more/expo-cli) [Expo Go\ \ Learn React by trying it on your simulator or device.](https://docs.expo.dev/get-started/set-up-your-environment) > All features are free, optional, and can be used independently of each other. Unused features add no additional bloat to your app. | Feature | With `expo` | Without `expo` (bare React Native) | | --- | --- | --- | | Develop complex apps entirely in JavaScript. | | | | Write JSI native modules with Swift and Kotlin. | | | | Develop apps without Xcode or Android Studio. | | | | Create and share example apps in the browser with [Snack](https://snack.expo.dev/)
. | | | | Major upgrades without native changes. | | | | First-class TypeScript support. | | | | Install natively compatible libraries from the command line. | | | | Develop performant websites with the same codebase. | | | | [Tunnel](https://docs.expo.dev/more/expo-cli#tunneling)
your dev server to any device. | | | Services[](https://docs.expo.dev/core-concepts/#services) ---------------------------------------------------------- The team behind Expo also provides Expo Application Services (EAS), deeply integrated cloud services for building, submitting, and updating your React Native app. EAS can be used with any React Native app, regardless of whether it uses `expo` or not. [Expo Application Services\ \ The easiest way to build, deploy, and update native apps.](https://docs.expo.dev/eas) --- # Documentation for LLMs - Expo Documentation Hide navigation Search [Home](https://docs.expo.dev/) [Guides](https://docs.expo.dev/guides/overview) [EAS](https://docs.expo.dev/eas) [Reference](https://docs.expo.dev/versions/latest) [Learn](https://docs.expo.dev/tutorial/overview) [Archive](https://docs.expo.dev/archive) [Expo Snack](https://snack.expo.dev/) [Discord and Forums](https://chat.expo.dev/) [Newsletter](https://expo.dev/mailing-list/signup) Documentation for LLMs ====================== [Edit page](https://github.com/expo/expo/edit/main/docs/pages/llms.mdx) A list of Expo and EAS documentation files available for large language models (LLMs) and apps that use them. [Edit page](https://github.com/expo/expo/edit/main/docs/pages/llms.mdx) * * * At Expo, we support the [llms.txt](https://llmstxt.org/) initiative to provide documentation for large language models (LLMs) and apps that use them. Below is a list of documentation files available: * [/llms.txt](https://docs.expo.dev/llms.txt) : A list of all available documentation files * [/llms-full.txt](https://docs.expo.dev/llms-full.txt) : Complete documentation for Expo, including Expo Router, Expo Modules API, development process, and more * [/llms-eas.txt](https://docs.expo.dev/llms-eas.txt) : Complete documentation for the Expo Application Services (EAS) * [/llms-sdk.txt](https://docs.expo.dev/llms-sdk.txt) : Complete documentation for the latest Expo SDK Looking for deprecated Expo SDK versions?[](https://docs.expo.dev/llms/#looking-for-deprecated-expo-sdk-versions) * [/llms-sdk-v53.0.0.txt](https://docs.expo.dev/llms-sdk-v53.0.0.txt) : Documentation for the Expo SDK v53.0.0 * [/llms-sdk-v52.0.0.txt](https://docs.expo.dev/llms-sdk-v52.0.0.txt) : Documentation for the Expo SDK v52.0.0 * [/llms-sdk-v51.0.0.txt](https://docs.expo.dev/llms-sdk-v51.0.0.txt) : Documentation for the Expo SDK v51.0.0 --- # Create a project - Expo Documentation Hide navigation Search [Home](https://docs.expo.dev/) [Guides](https://docs.expo.dev/guides/overview) [EAS](https://docs.expo.dev/eas) [Reference](https://docs.expo.dev/versions/latest) [Learn](https://docs.expo.dev/tutorial/overview) [Archive](https://docs.expo.dev/archive) [Expo Snack](https://snack.expo.dev/) [Discord and Forums](https://chat.expo.dev/) [Newsletter](https://expo.dev/mailing-list/signup) Create a project ================ [Edit page](https://github.com/expo/expo/edit/main/docs/pages/get-started/create-a-project.mdx) Copy page Learn how to create a new Expo project. [Edit page](https://github.com/expo/expo/edit/main/docs/pages/get-started/create-a-project.mdx) Copy page * * * System requirements: * [Node.js (LTS)](https://nodejs.org/en/) . * macOS, Windows (Powershell and [WSL 2](https://expo.fyi/wsl) ), and Linux are supported. We recommend starting with the default project created by `create-expo-app`. The default project includes example code to help you get started. To create a new project, run the following command: Terminal Copy `-` `npx create-expo-app@latest` > You can choose a different template by adding the [`--template` option](https://docs.expo.dev/more/create-expo#--template) > . Next step[](https://docs.expo.dev/get-started/create-a-project/#next-step) --------------------------------------------------------------------------- You have a project. Now it's time to set up your development environment so that you can start developing. --- # Introduction - Expo Documentation Hide navigation Search [Home](https://docs.expo.dev/) [Guides](https://docs.expo.dev/guides/overview) [EAS](https://docs.expo.dev/eas) [Reference](https://docs.expo.dev/versions/latest) [Learn](https://docs.expo.dev/tutorial/overview) [Archive](https://docs.expo.dev/archive) [Expo Snack](https://snack.expo.dev/) [Discord and Forums](https://chat.expo.dev/) [Newsletter](https://expo.dev/mailing-list/signup) Introduction ============ [Edit page](https://github.com/expo/expo/edit/main/docs/pages/get-started/introduction.mdx) Copy page Get started creating apps with Expo. [Edit page](https://github.com/expo/expo/edit/main/docs/pages/get-started/introduction.mdx) Copy page * * * Expo is a framework that makes developing Android and iOS apps easier. Our framework provides file-based routing, a standard library of native modules, and much more. Expo is open source with an active community on [GitHub](https://github.com/expo/expo) and [Discord](https://chat.expo.dev/) . We also make [Expo Application Services (EAS)](https://expo.dev/eas) , a set of services that complement the Expo framework in each step of the development process. To get started visit: [Quick start docs\ \ Create a project, set up your development environment, and start developing.](https://docs.expo.dev/get-started/create-a-project) --- # Next steps - Expo Documentation Hide navigation Search [Home](https://docs.expo.dev/) [Guides](https://docs.expo.dev/guides/overview) [EAS](https://docs.expo.dev/eas) [Reference](https://docs.expo.dev/versions/latest) [Learn](https://docs.expo.dev/tutorial/overview) [Archive](https://docs.expo.dev/archive) [Expo Snack](https://snack.expo.dev/) [Discord and Forums](https://chat.expo.dev/) [Newsletter](https://expo.dev/mailing-list/signup) Next steps ========== [Edit page](https://github.com/expo/expo/edit/main/docs/pages/get-started/next-steps.mdx) Copy page Develop, review, and submit your project. [Edit page](https://github.com/expo/expo/edit/main/docs/pages/get-started/next-steps.mdx) Copy page * * * Here are next steps to continue building your app: ### Reset your project[](https://docs.expo.dev/get-started/next-steps/#reset-your-project) You can remove the boilerplate code and start fresh with a new project. Run the following command to reset your project: Terminal Copy `-` `npm run reset-project` This command will move the existing files in app to app-example, then create a new app directory with a new index.tsx file. ### Develop, review, and deploy[](https://docs.expo.dev/get-started/next-steps/#develop-review-and-deploy) Learn how to develop by reading the docs in the Develop section. You'll learn how to create [UI elements](https://docs.expo.dev/develop/user-interface/splash-screen-and-app-icon) , add [unit tests](https://docs.expo.dev/develop/unit-testing) , include [native modules](https://docs.expo.dev/config-plugins/introduction) , and more. Once you've developed your app, you can share it with your teammates for [review](https://docs.expo.dev/review/overview) . Finally, you can [build](https://docs.expo.dev/deploy/build-project) and [submit](https://docs.expo.dev/deploy/submit-to-app-stores) your project to the app stores. ### Step-by-step guide[](https://docs.expo.dev/get-started/next-steps/#step-by-step-guide) For a guided, step-by-step walkthrough of building an app with Expo from start to finish, check out the [tutorial](https://docs.expo.dev/tutorial/introduction) . --- # Start developing - Expo Documentation Hide navigation Search [Home](https://docs.expo.dev/) [Guides](https://docs.expo.dev/guides/overview) [EAS](https://docs.expo.dev/eas) [Reference](https://docs.expo.dev/versions/latest) [Learn](https://docs.expo.dev/tutorial/overview) [Archive](https://docs.expo.dev/archive) [Expo Snack](https://snack.expo.dev/) [Discord and Forums](https://chat.expo.dev/) [Newsletter](https://expo.dev/mailing-list/signup) Start developing ================ [Edit page](https://github.com/expo/expo/edit/main/docs/pages/get-started/start-developing.mdx) Copy page Make your first change to an Expo project and see it live on your device. [Edit page](https://github.com/expo/expo/edit/main/docs/pages/get-started/start-developing.mdx) Copy page * * * 1 Start a development server[](https://docs.expo.dev/get-started/start-developing/#start-a-development-server) ------------------------------------------------------------------------------------------------------------- To start the development server, run the following command: Terminal Copy `-` `npx expo start` 2 Open the app on your device[](https://docs.expo.dev/get-started/start-developing/#open-the-app-on-your-device) --------------------------------------------------------------------------------------------------------------- After running the command above, you will see a QR code in your terminal. Scan this QR code to open the app on your device. If you're using an Android Emulator or iOS Simulator, you can press a or i respectively to open the app. Having problems?[](https://docs.expo.dev/get-started/start-developing/#having-problems) Make sure you are on the same Wi-Fi network on your computer and your device. If it still doesn't work, it may be due to the router configuration — this is common for public networks. You can work around this by choosing the Tunnel connection type when starting the development server, then scanning the QR code again. Terminal Copy `-` `npx expo start --tunnel` > Using the Tunnel connection type will make the app reloads considerably slower than on LAN or Local, so it's best to avoid tunnel when possible. You may want to install and use an emulator or simulator to speed up development if Tunnel is required to access your machine from another device on your network. 3 Make your first change[](https://docs.expo.dev/get-started/start-developing/#make-your-first-change) ----------------------------------------------------------------------------------------------------- Open the app/(tabs)/index.tsx file in your code editor and make a change. app/(tabs)/index.tsx | | | | | --- | --- | --- | | 17 | 17 | } | | 18 | 18 | \> | | 19 | 19 | | | 20 | | Welcome! | | | 20 | Hello World! | | 21 | 21 | | | 22 | 22 | | | 23 | 23 | | Changes not showing up on your device?[](https://docs.expo.dev/get-started/start-developing/#changes-not-showing-up-on-your-device) Expo Go is configured by default to automatically reload the app whenever a file is changed, but let's make sure to go over the steps to enable it in case somehow things aren't working. * Make sure you have the [development mode enabled in Expo CLI](https://docs.expo.dev/workflow/development-mode#development-mode) . * Close the Expo app and reopen it. * Once the app is open again, shake your device to reveal the developer menu. If you are using an emulator, press Ctrl + M for Android or Cmd ⌘ + D for iOS. * If you see Enable Fast Refresh, press it. If you see Disable Fast Refresh, dismiss the developer menu. Now try making another change. ![Developer menu in Expo Go app.](https://docs.expo.dev/static/images/get-started/developer-menu.png) * * * File structure[](https://docs.expo.dev/get-started/start-developing/#file-structure) ------------------------------------------------------------------------------------- Below, you can get familiar with the default project's file structure: Files app assets components constants hooks scripts app.json package.json tsconfig.json ### app Contains the app's navigation, which is file-based. The file structure of the app directory determines the app's navigation. The app has two routes defined by two files: app/(tabs)/index.tsx and app/(tabs)/explore.tsx. The layout file in app/(tabs)/\_layout.tsx sets up the tab navigator. Features[](https://docs.expo.dev/get-started/start-developing/#features) ------------------------------------------------------------------------- The default project template has the following features: Default project File-based routing Android, iOS, and web support Images Light and dark modes Animations ![Two tabs in an Expo app](https://docs.expo.dev/static/images/get-started/navigation.png) ### File-based routing The app has two screens: app/(tabs)/index.tsx and app/(tabs)/explore.tsx. The layout file in app/(tabs)/\_layout.tsx sets up the tab navigator. [Learn More](https://docs.expo.dev/router/introduction) --- # Navigation in Expo and React Native apps - Expo Documentation Hide navigation Search [Home](https://docs.expo.dev/) [Guides](https://docs.expo.dev/guides/overview) [EAS](https://docs.expo.dev/eas) [Reference](https://docs.expo.dev/versions/latest) [Learn](https://docs.expo.dev/tutorial/overview) [Archive](https://docs.expo.dev/archive) [Expo Snack](https://snack.expo.dev/) [Discord and Forums](https://chat.expo.dev/) [Newsletter](https://expo.dev/mailing-list/signup) Navigation in Expo and React Native apps ======================================== [Edit page](https://github.com/expo/expo/edit/main/docs/pages/develop/app-navigation.mdx) Copy page Learn about the recommended approach for integrating navigation in an Expo and React Native project. [Edit page](https://github.com/expo/expo/edit/main/docs/pages/develop/app-navigation.mdx) Copy page * * * The core React Native library does not include a built-in navigation solution, so you can choose a navigation library that best fits your needs. For Expo and React Native apps, it is generally a choice between [React Navigation](https://reactnavigation.org/) or [Expo Router](https://docs.expo.dev/router/introduction) . Why React Native apps needs a navigation library[](https://docs.expo.dev/develop/app-navigation/#why-react-native-apps-needs-a-navigation-library) --------------------------------------------------------------------------------------------------------------------------------------------------- React Native core includes basic UI components, touch handling, device APIs and networking, but excludes, among other things, storage, camera, maps, most device sensors, and navigation! These are intended to be covered by community libraries. React Navigation[](https://docs.expo.dev/develop/app-navigation/#react-navigation) ----------------------------------------------------------------------------------- React Navigation is a component-based navigation library widely used across the React Native ecosystem. It lets you compose stack, tab, and drawer navigators entirely in code so you can implement complex flows, custom transitions, and app-specific UX patterns. The library offers platform-specific look-and-feel with smooth animations and gestures, unified mobile and web routing, automatic deep links, type routes with static configuration, and is highly customizable. [React Navigation: Getting started\ \ Learn how to get started with React Navigation.](https://reactnavigation.org/docs/getting-started) Expo Router (recommended for Expo projects)[](https://docs.expo.dev/develop/app-navigation/#expo-router-recommended-for-expo-projects) --------------------------------------------------------------------------------------------------------------------------------------- Expo Router is a file-based routing library for Expo and React Native projects and is a built on top of React Navigation. By following the app directory convention, it turns files into routes and is integrated with Expo for [Expo CLI](https://docs.expo.dev/more/expo-cli) and bundling without additional setup. The library also adds features such as typed routes, dynamic routes, lazy bundling in development, static rendering for the web, and automatic deep linking. New Expo projects created with `npx create-expo-app@latest` include Expo Router by default so you can ship cross-platform navigation quickly while still being able to reach for React Navigation APIs when needed. [Introduction to Expo Router\ \ Expo Router is an open-source routing library for Universal React Native applications built with Expo.](https://docs.expo.dev/router/introduction) [Installation\ \ Learn how to quickly get started by creating a new project with Expo Router or adding the library to an existing project.](https://docs.expo.dev/router/installation) [Core concepts\ \ Learn about the core concepts of file-based routing in Expo.](https://docs.expo.dev/router/basics/core-concepts) --- # FAQ - Expo Documentation Hide navigation Search [Home](https://docs.expo.dev/) [Guides](https://docs.expo.dev/guides/overview) [EAS](https://docs.expo.dev/eas) [Reference](https://docs.expo.dev/versions/latest) [Learn](https://docs.expo.dev/tutorial/overview) [Archive](https://docs.expo.dev/archive) [Expo Snack](https://snack.expo.dev/) [Discord and Forums](https://chat.expo.dev/) [Newsletter](https://expo.dev/mailing-list/signup) FAQ === [Edit page](https://github.com/expo/expo/edit/main/docs/pages/faq.mdx) Copy page A list of common questions and limitations about Expo and related services. [Edit page](https://github.com/expo/expo/edit/main/docs/pages/faq.mdx) Copy page * * * This page lists some of the common questions and answers about Expo and related services. If you have a question that is not answered here, see [Forums](https://chat.expo.dev/) for more common questions. What is Expo used for?[](https://docs.expo.dev/faq/#what-is-expo-used-for) --------------------------------------------------------------------------- Expo is an [open-source framework](https://github.com/expo/expo) for apps that run natively on Android, iOS, and the web. Expo brings together the best of mobile and the web and enables many important features for building and scaling an app such as live updates, instantly sharing your app, and web support. The `expo` npm package enables a suite of incredible features for React Native apps. The `expo` package can be installed in nearly any React Native project. See [what Expo offers](https://docs.expo.dev/core-concepts) for more information. Do companies use Expo?[](https://docs.expo.dev/faq/#do-companies-use-expo) --------------------------------------------------------------------------- Yes, Expo is used by top companies worldwide, serving hundreds of millions of end users. See our [showcase](https://expo.dev/customers) . Why does Expo have its own SDK?[](https://docs.expo.dev/faq/#why-does-expo-have-its-own-sdk) --------------------------------------------------------------------------------------------- When Expo was first created, React Native had yet to be publicly released. This means there were no third-party packages. To make React Native's developer experience reasonable, we created [several libraries to achieve common functionalities](https://docs.expo.dev/versions/latest) . Many of these libraries have since been forked and modified to meet various needs. We welcome users to mix and match whichever [custom native code](https://docs.expo.dev/workflow/customizing) they need to make their app great. The Expo SDK is well-tested, written in TypeScript, documented, and built for Android, iOS, and the web. Every module in the Expo SDK works together to ensure versioning always matches. This creates a nice upgrading experience. The Expo SDK is also written with the [Expo Modules API](https://docs.expo.dev/modules) to make contributing, maintaining, and understanding easier. What is the difference between Expo and React Native?[](https://docs.expo.dev/faq/#what-is-the-difference-between-expo-and-react-native) ----------------------------------------------------------------------------------------------------------------------------------------- The `expo` package provides a suite of features that make it easier to develop, and scale complex React Native applications. You can install `expo` in nearly any React Native app. The `expo` package is not required to use [Expo Application Services (EAS)](https://docs.expo.dev/eas) or React Native, however, it is highly recommended. See [what Expo offers](https://docs.expo.dev/core-concepts) for more information. Do I need to switch from React Native to use Expo?[](https://docs.expo.dev/faq/#do-i-need-to-switch-from-react-native-to-use-expo) ----------------------------------------------------------------------------------------------------------------------------------- No, the `expo` npm package and CLI work with any React Native app. [Expo Application Services (EAS)](https://docs.expo.dev/eas) also works with all React Native apps with first-class support for builds, updates, app store submissions, and more. How much does Expo cost?[](https://docs.expo.dev/faq/#how-much-does-expo-cost) ------------------------------------------------------------------------------- The Expo platform is [free and open source](https://blog.expo.dev/exponent-is-free-as-in-and-as-in-1d6d948a60dc) . This includes the libraries that make up the [Expo SDK](https://docs.expo.dev/versions/latest) and the [Expo CLI](https://docs.expo.dev/more/expo-cli) used for development. The Expo Go app, the easiest way to get started, is also free from the app stores. [Expo Application Services (EAS)](https://docs.expo.dev/eas) is an optional suite of cloud services for React Native apps, from the Expo team. EAS makes it easier to build your app, submit it to the stores, keep it updated, send push notifications, and more. You can use EAS for free if the [Free plan](https://expo.dev/pricing) quotas are sufficient for your app. More information is available on the [pricing page](https://expo.dev/pricing) . How do I add custom native code to my Expo project?[](https://docs.expo.dev/faq/#how-do-i-add-custom-native-code-to-my-expo-project) ------------------------------------------------------------------------------------------------------------------------------------- Expo supports adding custom native code and customizing that native code (Android/Xcode projects). To use any custom native code, you can create a [development build](https://docs.expo.dev/develop/development-builds/introduction) and [config plugins](https://docs.expo.dev/config-plugins/introduction) . We do recommend using the modules in the [Expo SDK](https://docs.expo.dev/versions/latest) when possible for easier upgrades and improved developer experience. Can I use Expo in the app that is created with React Native CLI?[](https://docs.expo.dev/faq/#can-i-use-expo-in-the-app-that-is-created-with-react-native-cli) --------------------------------------------------------------------------------------------------------------------------------------------------------------- Yes! All Expo tools and services work great in any React Native app. For example, you can use any part of the [Expo SDK](https://docs.expo.dev/versions/latest) , [`expo-dev-client`](https://docs.expo.dev/develop/development-builds/installation) and EAS Build, Submit, and Update — they work great! Learn more about [installing `expo` in your project](https://docs.expo.dev/bare/installing-expo-modules) , [adopting prebuild](https://docs.expo.dev/guides/adopting-prebuild) , and [setting up EAS Build](https://docs.expo.dev/build/introduction) . How do I share my Expo project? Can I submit it to the app stores?[](https://docs.expo.dev/faq/#how-do-i-share-my-expo-project-can-i-submit-it-to-the-app-stores) ------------------------------------------------------------------------------------------------------------------------------------------------------------------ The fastest way to share your project is to publish with [EAS Update](https://docs.expo.dev/eas-update/introduction) and launch in a [development build](https://docs.expo.dev/develop/development-builds/introduction) . This gives your app a URL; you can share this URL with anybody who has the [development build](https://docs.expo.dev/develop/development-builds/introduction) for Android or iOS. URLs can also be opened in Expo Go for Android. When ready, you can create a production build (.aab and .ipa) to submit to the app stores. You can build your app in a single command with [EAS Build](https://docs.expo.dev/build/introduction) and submit it to the stores with [EAS Submit](https://docs.expo.dev/submit/introduction) . You can also use [internal distribution](https://docs.expo.dev/build/internal-distribution) to share your app with an APK on Android and ad-hoc or enterprise provisioning on iOS. Can I develop iOS apps on a Windows computer?[](https://docs.expo.dev/faq/#can-i-develop-ios-apps-on-a-windows-computer) ------------------------------------------------------------------------------------------------------------------------- Traditionally you needed a macOS to develop iOS apps, however, you can use [EAS Build](https://docs.expo.dev/build/introduction) to build your app in the cloud. You can also use [EAS Submit](https://docs.expo.dev/submit/introduction) to submit your app to the stores. Testing can be done on a physical iOS device using [Expo Go](https://expo.dev/go) or a [development build](https://docs.expo.dev/develop/development-builds/introduction) . What versions of Android and iOS are supported by the Expo SDK?[](https://docs.expo.dev/faq/#what-versions-of-android-and-ios-are-supported-by-the-expo-sdk) ------------------------------------------------------------------------------------------------------------------------------------------------------------- Currently, Expo SDK supports Android 7+ and iOS 15.1+. For more information, see [Support for Android and iOS versions](https://docs.expo.dev/versions/latest#support-for-android-and-ios-versions) . What is the minimal size of a "hello world" expo app?[](https://docs.expo.dev/faq/#what-is-the-minimal-size-of-a-hello-world-expo-app) --------------------------------------------------------------------------------------------------------------------------------------- A bare minimum production app created using pure Expo is less than 3 MB. For iOS, Expo targets a newer minimum iOS version which enables app store optimizations. If the `expo` package is included in your app, it only adds 1 MB one time to the final size of apps on app stores. The `expo` package has a marginal size cost (for example, 150 Kib on Android). The rest of the size comes from the language runtime (such as Kotlin on Android). Can I use Expo with my native library?[](https://docs.expo.dev/faq/#can-i-use-expo-with-my-native-library) ----------------------------------------------------------------------------------------------------------- You can use native Android and iOS libraries with Expo by creating a [custom native module](https://docs.expo.dev/modules) with Swift and Kotlin. Many popular libraries already have custom native modules. Check out our [React Native directory](https://reactnative.directory/) to find popular libraries for your use case. Can I use Expo with this web library?[](https://docs.expo.dev/faq/#can-i-use-expo-with-this-web-library) --------------------------------------------------------------------------------------------------------- Many popular web packages such as three.js work with Expo and React Native. See [Expo examples](https://github.com/expo/examples) for more information. Is Expo similar to React for web development?[](https://docs.expo.dev/faq/#is-expo-similar-to-react-for-web-development) ------------------------------------------------------------------------------------------------------------------------- Expo is an [open-source framework](https://github.com/expo/expo) for apps that run natively on Android, iOS, and the web. React Native is similar to `react-dom` from web development, enabling you to run React on a particular platform, however, it has a few key differences: * React Native does not support HTML or CSS. * Instead of using the DOM, React Native uses native components. For example, `` instead of `
`. Native components are more performant than the DOM and provide a much nicer user experience. * Unlike React.js which has access to browser APIs, React Native uses custom native APIs. For example, instead of `navigator.geolocation`, you use `expo-location` to access the user's location. Custom native APIs are similar to browser APIs except you have full control over them. This means you can access new features before they are available in the browser. In the same way React.js frameworks help users create larger websites with ease, Expo helps users create larger apps with ease. Expo provides a suite of well-tested React Native modules that run on Android, iOS, and the web. Expo also provides a [suite of tools](https://docs.expo.dev/eas) for building, deploying, and updating your app. What are the store policies regarding interpreted code?[](https://docs.expo.dev/faq/#what-are-the-store-policies-regarding-interpreted-code) --------------------------------------------------------------------------------------------------------------------------------------------- React Native uses a JavaScript interpreter (JSC, V8, or Hermes) to run your application code. Refer to the [Google Play Policy Center](https://play.google/developer-content-policy/) and [Apple Developer Program License Agreement](https://developer.apple.com/support/terms/apple-developer-program-license-agreement) directly for the most up-to-date policy information. _The following are excerpts of related policies, as of April 25, 2024._ ### Google Play Store[](https://docs.expo.dev/faq/#google-play-store) `...an app may not download executable code (such as dex, JAR, .so files) from a source other than Google Play. This restriction does not apply to code that runs in a virtual machine or an interpreter where either provides indirect access to Android APIs (such as JavaScript in a webview or browser). Apps or third-party code, like SDKs, with interpreted languages (JavaScript, Python, Lua, etc.) loaded at run time (for example, not packaged with the app) must not allow potential violations of Google Play policies.` Source: [Google Play Policy Center](https://support.google.com/googleplay/android-developer/answer/9888379?hl=en) . ### Apple App Store[](https://docs.expo.dev/faq/#apple-app-store) `...Interpreted code may be downloaded to an Application but only so long as such code: (a) does not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store, (b) does not create a store or storefront for other code or applications, and (c) does not bypass signing, sandbox, or other security features of the OS.` Source: [3.3.1 APIs and Functionality - B. Executable Code](https://developer.apple.com/support/terms/apple-developer-program-license-agreement#b331) . Should I use Expo CLI or React Native Community CLI?[](https://docs.expo.dev/faq/#should-i-use-expo-cli-or-react-native-community-cli) --------------------------------------------------------------------------------------------------------------------------------------- Expo CLI offers the same core functionality as React Native Community CLI (also known as "React Native CLI") with additional features such as automatic [TypeScript setup](https://docs.expo.dev/guides/typescript) , [web support](https://docs.expo.dev/workflow/web) , [auto installing compatible libraries](https://docs.expo.dev/more/expo-cli#install) , [improved native build commands](https://docs.expo.dev/more/expo-cli#compiling) , [tunneling](https://docs.expo.dev/more/expo-cli#tunneling) , [Prebuild](https://docs.expo.dev/workflow/prebuild) , and [more](https://docs.expo.dev/more/expo-cli) . It can be used simultaneously with React Native Community. Regardless of which CLI you use, you can use any part of the [Expo SDK](https://docs.expo.dev/versions/latest) and [Expo Application Services](https://docs.expo.dev/eas) with your project. For more information, see: * Learn how you can migrate to use Expo CLI in an [existing React Native project](https://docs.expo.dev/bare/using-expo-cli) . * Learn about the benefits of [using a framework to build React Native apps](https://reactnative.dev/blog/2024/06/25/use-a-framework-to-build-react-native-apps) . * Learn about the benefits of migrating to Expo CLI such as improved app performance, expedites release, and fostering stronger collaboration across you team in [this blog post](https://expo.dev/blog/from-rnc-cli-to-expo) . > Note: EAS Build is compatible with existing React Native projects (where native directories are checked into version control). When these directories are present, EAS Build does not run the prebuild step, as that could overwrite any manual customizations you have made to the native project files. You'll have to configure the native directories on your own with native tools such as Android Studio or Xcode. Is Expo Go open source?[](https://docs.expo.dev/faq/#is-expo-go-open-source) ----------------------------------------------------------------------------- Yes, the source for Expo Go can be found in the [expo/expo GitHub repository](https://github.com/expo/expo) in the apps/expo-go directory. The Expo Go app is also built with Expo and React Native. What can I do or cannot do with Expo Go?[](https://docs.expo.dev/faq/#what-can-i-do-or-cannot-do-with-expo-go) --------------------------------------------------------------------------------------------------------------- [Expo Go](https://docs.expo.dev/get-started/set-up-your-environment?redirected=#how-would-you-like-to-develop) is a sandbox that can help you get started quickly with React Native development in order to learn, prototype, or experiment. It allows you to use libraries included in the Expo SDK and libraries that don't require custom native code. Expo Go cannot use third-party libraries that require custom native code and you cannot edit native code directly in Expo Go. It cannot be used for production apps. We strongly recommend any projects that require additional libraries with native code to migrate to [development builds](https://docs.expo.dev/develop/development-builds/introduction) . It's like creating a version of Expo Go that is specifically customized to your app's needs. Is ejecting deprecated?[](https://docs.expo.dev/faq/#is-ejecting-deprecated) ----------------------------------------------------------------------------- Yes, eject is a deprecated term and is no longer necessary. When Expo was first released, apps had larger native binary sizes and didn't support custom native code without "ejecting". This changed in December 2020 with the release of [EAS Build](https://docs.expo.dev/build/introduction) which supports any React Native app. The concept of "ejecting" was replaced by the [`npx expo prebuild`](https://docs.expo.dev/workflow/prebuild) command in SDK 41 (April 2021), which continuously generates native projects based on the libraries in your project and the app config (app.json). The `expo eject` command was fully deprecated in SDK 46 (August 2022). Unlike the previous eject workflow, authors can configure their libraries to work with Expo Prebuild by creating a [config plugin](https://docs.expo.dev/config-plugins/introduction) . This means you can use any library with Expo Prebuild. You can also use any custom native code with Expo Prebuild by creating a [development build](https://docs.expo.dev/develop/development-builds/introduction) . Learn more in the [Expo Prebuild documentation](https://docs.expo.dev/workflow/prebuild) . --- # Set up your environment - Expo Documentation Hide navigation Search [Home](https://docs.expo.dev/) [Guides](https://docs.expo.dev/guides/overview) [EAS](https://docs.expo.dev/eas) [Reference](https://docs.expo.dev/versions/latest) [Learn](https://docs.expo.dev/tutorial/overview) [Archive](https://docs.expo.dev/archive) [Expo Snack](https://snack.expo.dev/) [Discord and Forums](https://chat.expo.dev/) [Newsletter](https://expo.dev/mailing-list/signup) Set up your environment ======================= [Edit page](https://github.com/expo/expo/edit/main/docs/pages/get-started/set-up-your-environment.mdx) Copy page Learn how to set up your development environment to start building with Expo. [Edit page](https://github.com/expo/expo/edit/main/docs/pages/get-started/set-up-your-environment.mdx) Copy page * * * Let's set up a local development environment for running your project on Android and iOS. Where would you like to develop?[](https://docs.expo.dev/get-started/set-up-your-environment/#where-would-you-like-to-develop) ------------------------------------------------------------------------------------------------------------------------------- We recommend using a real device to develop, since you'll get to see exactly what your users will see. ![Android device](https://docs.expo.dev/static/images/get-started/android-device.png) Android device ![iOS device](https://docs.expo.dev/static/images/get-started/ios-device.png) iOS device ![Android Emulator](https://docs.expo.dev/static/images/get-started/android-emulator.png) Android Emulator ![iOS Simulator](https://docs.expo.dev/static/images/get-started/ios-simulator.png) iOS Simulator How would you like to develop?[](https://docs.expo.dev/get-started/set-up-your-environment/#how-would-you-like-to-develop) --------------------------------------------------------------------------------------------------------------------------- Expo Go is a sandbox for trying out Expo quickly. A development build is a build of your own app that includes Expo's developer tools. ![Expo Go](https://docs.expo.dev/static/images/get-started/expo-go.png) Expo Go Try out app development in a limited sandbox without custom native modules. Great for testing out Expo quickly. Not intended for long-term projects. ![Development build](https://docs.expo.dev/static/images/get-started/development-build.png) Development build Make a build of your own app with developer tools. Supports custom native modules. Intended for production projects. * * * Set up an Android device with Expo Go[](https://docs.expo.dev/get-started/set-up-your-environment/#set-up-an-android-device-with-expo-go) ------------------------------------------------------------------------------------------------------------------------------------------ Scan the QR code to download the app from the Google Play Store, or visit the Expo Go page on the [Google Play Store](https://play.google.com/store/apps/details?id=host.exp.exponent&referrer=docs) . Next step[](https://docs.expo.dev/get-started/set-up-your-environment/#next-step) ---------------------------------------------------------------------------------- You have a project and a development environment. Now it's time to start developing. --- # Authentication in Expo and React Native apps - Expo Documentation Hide navigation Search [Home](https://docs.expo.dev/) [Guides](https://docs.expo.dev/guides/overview) [EAS](https://docs.expo.dev/eas) [Reference](https://docs.expo.dev/versions/latest) [Learn](https://docs.expo.dev/tutorial/overview) [Archive](https://docs.expo.dev/archive) [Expo Snack](https://snack.expo.dev/) [Discord and Forums](https://chat.expo.dev/) [Newsletter](https://expo.dev/mailing-list/signup) Authentication in Expo and React Native apps ============================================ [Edit page](https://github.com/expo/expo/edit/main/docs/pages/develop/authentication.mdx) Copy page Learn about setting up authentication in your Expo project. [Edit page](https://github.com/expo/expo/edit/main/docs/pages/develop/authentication.mdx) Copy page * * * Authentication is a critical part of 90 to 95 percent of modern apps. This guide explains common methods, patterns, and solutions to help you implement authentication in your Expo app. > TL;DR: Auth is hard. If you want to skip the complexity, jump to the [Auth solutions](https://docs.expo.dev/develop/authentication#auth-solutions) > section for ready-made solutions. Otherwise, keep reading. Implementing authentication involves more than writing client-side code. You'll need to manage server requests, password flows, third-party providers like Google or Apple, email handling, and OAuth standards. It can get complex quickly. There are several types of authentication methods. Some are simple and effective, while others offer a better user experience but require more work. Let's look at the most common approaches and how you can implement them. Navigation auth flow[](https://docs.expo.dev/develop/authentication/#navigation-auth-flow) ------------------------------------------------------------------------------------------- Let's start with the basics: any authentication system needs to separate public screens (such as login or signup) from protected screens (such as home or profile). At the navigation level, it comes down to a simple check: is the user authenticated? To begin, you can simulate this using a hardcoded boolean value, like `isAuthenticated = true`, and build your navigation logic around it. Once everything is working, you can plug in your real authentication flow. Using Expo Router[](https://docs.expo.dev/develop/authentication/#using-expo-router) Expo Router v5 introduced [protected routes](https://docs.expo.dev/router/advanced/protected) , which prevent users from accessing certain screens unless they are authenticated. This feature works well for client-side navigation and simplifies your setup. If you're using an older version of Expo Router, you can use [redirects](https://docs.expo.dev/router/advanced/authentication-rewrites) instead. Redirects provide the same result but require a bit more manual configuration. They are still supported in Expo Router v5 for backward compatibility. [![Expo Router Protected Routes](https://i3.ytimg.com/vi/zHZjJDTTHJg/maxresdefault.jpg)\ \ Expo Router Protected Routes\ \ Learn how to implement an authentication flow with Expo Router](https://www.youtube.com/watch?v=zHZjJDTTHJg) Using React Navigation[](https://docs.expo.dev/develop/authentication/#using-react-navigation) If you're using React Navigation, they offer a helpful [authentication flow guide](https://reactnavigation.org/docs/auth-flow/) that explains how to structure your navigation logic. It includes examples for both [static](https://reactnavigation.org/docs/auth-flow/?config=static#how-it-will-work) and [dynamic](https://reactnavigation.org/docs/auth-flow/?config=dynamic#how-it-will-work) approaches based on the user's authentication state. Both Expo Router and React Navigation give you flexible tools to implement protected navigation based on whether the user is logged in. Email and password[](https://docs.expo.dev/develop/authentication/#email-and-password) --------------------------------------------------------------------------------------- Email and password is a popular option when adding authentication to your app. To make this flow user-friendly, you also need to implement forgot password and reset password functionality so users who lose access to their accounts can recover them. If you want a quicker solution, several services offer built-in email and password authentication, including [Clerk](https://docs.expo.dev/develop/authentication#clerk) , [Supabase](https://docs.expo.dev/develop/authentication#supabase) , [Cognito](https://docs.expo.dev/develop/authentication#cognito) , [Firebase](https://docs.expo.dev/develop/authentication#firebase-auth) , and [Better Auth](https://docs.expo.dev/develop/authentication#better-auth) . Most of these have generous free tiers, but it is a good idea to evaluate pricing if your app grows quickly. The biggest advantage of these services is their ease of integration. They usually offer clear documentation, starter kits, and prebuilt components that save you time. Security checklist (OWASP) and store-review gotchas[](https://docs.expo.dev/develop/authentication/#security-checklist-owasp-and-store-review-gotchas) If you're building this flow yourself, be sure to review the [Authentication Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html#authentication-cheat-sheet) by OWASP. It outlines best practices for password length, encryption, recovery, secure storage, and more. > Adding email and password authentication is usually enough to pass App Store and Play Store review. You can submit your app with this method first. If you include "Sign in with Google," Apple may reject your app unless you also support "Sign in with Apple." The same rule applies in reverse on Google Play. [Better Auth Example\ \ An example demonstrating email and password authentication with Better Auth.](https://github.com/expo/examples/tree/master/with-better-auth) Passwordless login[](https://docs.expo.dev/develop/authentication/#passwordless-login) --------------------------------------------------------------------------------------- Passwordless login removes the need for users to create or remember a password. Instead, they provide their email address or phone number during registration. Your app then sends a [magic link](https://auth0.com/docs/authenticate/passwordless/authentication-methods/email-magic-link#classic-login-flow-with-magic-links) or [one-time passcode (OTP)](https://en.wikipedia.org/wiki/One-time_password) to their inbox or device. This is a smoother experience for most users and reduces friction during onboarding. Magic Links[](https://docs.expo.dev/develop/authentication/#magic-links) With magic links, the user receives an email containing a link that redirects them back into your app. If everything works correctly, the session is verified and established. A key detail here is [deep linking](https://docs.expo.dev/linking/into-your-app) . Since users leave the app to check their email, the link must open your app and route them to the correct screen. If deep linking fails, the session cannot be validated, and the login flow breaks. If you're using Expo Router deep linking is handled automatically (for most cases). You usually don't need to configure anything extra to make magic links work properly, which makes this approach even easier to adopt. See [Linking into your app](https://docs.expo.dev/linking/into-your-app) to learn more. [React Navigation](https://reactnavigation.org/) also supports deep linking, but you will need to configure it manually. See its [Deep Linking guide](https://reactnavigation.org/docs/deep-linking/) for more details. One-Time Passcodes (OTP)[](https://docs.expo.dev/develop/authentication/#one-time-passcodes-otp) An alternative to magic links is sending a one-time passcode by email or SMS. Instead of clicking a link, the user copies the code and manually returns to the app to enter it. This must happen within a specific time window before the code expires. There's no deep linking involved here. The user stays in control of the flow and must return to the app themselves. Fortunately, newer versions of Android and iOS automatically detect passcodes in incoming messages. This enables autofill suggestions above the keyboard, allowing users to enter the code with a single tap. When this works, the experience is seamless. > Magic links and passcodes are both valid authentication methods for Google Play Store and Apple App Store reviews. You can submit your app with either of these methods as the only option and get approved, even before adding social or OAuth login options. OAuth 2.0[](https://docs.expo.dev/develop/authentication/#oauth-20) -------------------------------------------------------------------- To let your users log in using their existing accounts from services like Google, Apple, GitHub, and more, you can use OAuth 2.0. [OAuth 2.0](https://oauth.net/2) is a widely used, secure protocol that allows your app to access user information from another service, without needing to handle passwords. It allows your users to log in with a single tap, which saves time, builds trust, and removes the need to manage passwords. > OAuth flows can be complex. If you're looking for a simple integration, most providers offer SDKs and services that handle everything for you. You can learn more about these in the [Auth solutions](https://docs.expo.dev/develop/authentication#auth-solutions) > section. If you are looking for full control or want to understand how OAuth works under the hood, the following sections show how to implement a complete OAuth flow yourself using Expo. ### How OAuth works[](https://docs.expo.dev/develop/authentication/#how-oauth-works) OAuth works by introducing an authorization server that acts as a secure middleman. Instead of giving your app their password, users log in through this server and approve access to specific data (like their name or email). The server then issues a temporary code, which your app can exchange for a secure access token. ![](https://docs.expo.dev/static/images/develop/authentication/oauth-flow.avif) In this diagram, 'client' simply refers to the application and does not imply any specific implementation details, such as whether it runs on a server, desktop, mobile device, or other platform. Once you understand this pattern, you can apply it to any provider. The setup for Google, Apple, or GitHub will follow the same general steps. ### Custom OAuth with Expo API Routes[](https://docs.expo.dev/develop/authentication/#custom-oauth-with-expo-api-routes) The previous diagram shows a high-level overview of the OAuth flow. However, the preferred method for a client to obtain an authorization grant from the user is to use an authorization server as an intermediary, which is exactly what you can build using Expo API Routes. The following diagram illustrates this flow in more detail: ![](https://docs.expo.dev/static/images/develop/authentication/api-routes-oauth-flow.avif) Expo lets you implement the entire OAuth flow directly in your app using: [Expo Router](https://docs.expo.dev/router/introduction) [Expo Router API Routes](https://docs.expo.dev/router/web/api-routes) [Expo AuthSession](https://docs.expo.dev/versions/latest/sdk/auth-session) Some providers offer native APIs to handle the sign-in flow directly within the app. Google offers a native Sign in with Google experience on Android. If you're looking for a native implementation, see the [Google authentication guide](https://docs.expo.dev/guides/google-authentication) . Apple provides Sign in with Apple, which uses a native bottom sheet and Face ID on iOS. See [`expo-apple-authentication`](https://docs.expo.dev/versions/latest/sdk/apple-authentication) reference. The following setup gives you full control over the login experience across Android, iOS, and web. What are Expo API Routes?[](https://docs.expo.dev/develop/authentication/#what-are-expo-api-routes) [Expo Router API Routes](https://docs.expo.dev/router/web/api-routes) allow you to write server-side logic directly inside your Expo app. You can define functions that handle requests just like an Express or Next.js backend, no need for an external server. This makes it easy to securely handle sensitive parts of the auth flow, like the [authorization code exchange](https://www.oauth.com/oauth2-servers/pkce/authorization-code-exchange) , directly within your app. Since these routes run on the server, you can safely manage secrets, issue JWTs, and validate tokens. > You're essentially building a lightweight custom auth server scoped to your own application, all using your Expo project. What is Expo AuthSession?[](https://docs.expo.dev/develop/authentication/#what-is-expo-authsession) [Expo AuthSession](https://docs.expo.dev/versions/latest/sdk/auth-session) is a client-side package that helps you open a web browser or native modal to start the OAuth login flow. It handles redirection, parses the authorization response, and brings the user back into your app. It's the tool that kicks off the flow and talks to your API Route after the user authorizes access. See [Authentication with OAuth or OpenID providers](https://docs.expo.dev/guides/authentication) for more information. This setup lets you: * Start the login flow using AuthSession * Receive the auth code in your API Route * Exchange the code for a token securely * Generate a custom JWT with your own logic * Return that token to the client * Store sessions using cookies (Web) or JWTs (Native) * Deploy instantly using EAS Hosting (free to start) The following tutorials cover implementing OAuth on Android, iOS, and web, including how to create and verify custom JWTs, manage sessions, and protect API routes. If you're new to this flow, we recommend starting with the Google tutorial. [![Google Sign-In with Expo OAuth](https://i3.ytimg.com/vi/V2YdhR1hVNw/maxresdefault.jpg)\ \ Google Sign-In with Expo OAuth\ \ Learn how to implement Google Sign-In with Expo Router API Routes](https://www.youtube.com/watch?v=V2YdhR1hVNw) [![Sign in with Apple using Expo](https://i3.ytimg.com/vi/tqxTijhYhp8/maxresdefault.jpg)\ \ Sign in with Apple using Expo\ \ Learn how to implement Sign in with Apple](https://www.youtube.com/watch?v=tqxTijhYhp8) Managing sessions after OAuth[](https://docs.expo.dev/develop/authentication/#managing-sessions-after-oauth) Handling the OAuth flow securely is just the beginning. Once the user is authenticated, you need to think about how to store, restore, and validate their session. This includes: * Storing the session securely on the client * Restoring it when the app restarts * Protecting your API routes so only authenticated users can access them Traditionally, [cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Cookies#what_cookies_are_used_for) are used to store sessions on the web, while [JSON Web Tokens (JWTs)](https://en.wikipedia.org/wiki/JSON_Web_Token) are common in native applications. The above tutorials demonstrate exactly how to handle this. After receiving the ID token from a provider like Google or Apple, you generate a custom JWT on the server using Expo API Routes. This gives you full control over the session, including: * Structuring the payload using consistent fields across providers * Customizing expiration times * Signing the token with a secret key so your server can verify it later Once the token is created: * For Android and iOS apps, you can store it securely using [`expo-secure-store`](https://docs.expo.dev/versions/latest/sdk/securestore) * For web apps, you can set it as a secure cookie to maintain the session On every request, the token is sent back to your server, where you verify the signature and check the expiration. If everything checks out, you continue processing the request. This session model keeps your backend stateless, scalable, and secure, and works consistently across platforms. All of this is covered in the video tutorials linked above, including: * Generating and verifying custom JWTs * Handling session storage with Secure Store and cookies * Protecting API routes with authentication logic Auth solutions[](https://docs.expo.dev/develop/authentication/#auth-solutions) ------------------------------------------------------------------------------- If you prefer not to build a full authentication system from scratch, several services offer built-in solutions with first-class support for Expo. Here are some of the most popular options: Better Auth[](https://docs.expo.dev/develop/authentication/#better-auth) [BetterAuth](https://www.better-auth.com/docs/integrations/expo) is a modern, open-source authentication provider built for developers. It integrates smoothly with Expo, and they offer a guide that shows how to use it with [Expo API Routes](https://www.better-auth.com/docs/integrations/expo) for full control. It works well with any provider and deploys easily with EAS Hosting. Clerk[](https://docs.expo.dev/develop/authentication/#clerk) [Clerk](https://clerk.com/expo-authentication) is a powerful, full-featured authentication service with excellent Expo support. It includes email/password, passcodes, magic links, OAuth providers, and even passkeys. They also offer a native Expo module that handles much of the integration for you. Supabase[](https://docs.expo.dev/develop/authentication/#supabase) [Supabase](https://supabase.com/docs/guides/getting-started/tutorials/with-expo-react-native) provides a full backend platform, including a built-in authentication service that works with any OAuth provider. It integrates well with Expo apps and also includes support for email, magic links, and more. Cognito[](https://docs.expo.dev/develop/authentication/#cognito) [AWS Cognito](https://medium.com/@juliuscecilia33/aws-cognito-and-react-native-bf23ef7fea23) is Amazon's solution for managing user pools and identity. It connects seamlessly with other AWS services and can be integrated into Expo apps using AWS Amplify. It does require more configuration, but it's robust and scalable. Firebase Auth[](https://docs.expo.dev/develop/authentication/#firebase-auth) [Firebase Authentication](https://rnfirebase.io/auth/usage) is Google's auth platform and supports email, magic links, and OAuth providers. It works with React Native through [`react-native-firebase`](https://github.com/invertase/react-native-firebase) , which is compatible with Expo development builds. Modern methods[](https://docs.expo.dev/develop/authentication/#modern-methods) ------------------------------------------------------------------------------- Once you have a working authentication system in place, you can improve the user experience by adding optional but powerful enhancements like biometrics and passkeys. These features add convenience, trust, and speed to your login flows. Biometrics[](https://docs.expo.dev/develop/authentication/#biometrics) Biometrics like Face ID and Touch ID can be used to unlock the app or confirm identity after a valid session is established. These are not authentication methods on their own, but act as a local gate that makes re-authentication faster and more secure. React Native provides access to biometric APIs through libraries like [`expo-local-authentication`](https://docs.expo.dev/versions/latest/sdk/local-authentication) or [`react-native-biometrics`](https://github.com/SelfLender/react-native-biometrics) . Passkeys[](https://docs.expo.dev/develop/authentication/#passkeys) [Passkeys](https://safety.google/authentication/passkey) are a new, passwordless way to log in to apps and websites. Backed by Apple, Google, and Microsoft, they use platform-level cryptography and biometrics to authenticate users without passwords. Passkeys offer a seamless and secure experience, but they require a user to already be authenticated before registering one. They also require extra configuration if you're not using a provider that handles them for you. * React Native passkey support: [`react-native-passkeys`](https://github.com/peterferguson/react-native-passkeys) * Native passkey support with Clerk: [Clerk Passkeys for Expo](https://clerk.com/docs/references/expo/passkeys) Recommendations[](https://docs.expo.dev/develop/authentication/#recommendations) --------------------------------------------------------------------------------- This guide covers a lot of ground, from basic email and password flows to fully custom OAuth implementations, session management, and modern methods like biometrics and passkeys. Not all of these need to be implemented at once. In many cases, starting simple is the best approach. Shipping your app with something like email authentication using a magic link or one-time passcode is often more than enough to get through the App Store review process and start collecting feedback from real users. That said, if you're building an app where you expect high traffic from day one or need to support sign-in across platforms with minimal friction, investing in a more complete authentication flow early on can make a big difference. It can help improve user onboarding, trust, and retention right from the start. Modern solutions like OAuth, biometrics, and passkeys are not required, but they can be excellent additions once your core system is in place. The key is to build authentication that fits your current needs, while staying flexible enough to grow with your product. --- # Create a development build on EAS - Expo Documentation Hide navigation Search [Home](https://docs.expo.dev/) [Guides](https://docs.expo.dev/guides/overview) [EAS](https://docs.expo.dev/eas) [Reference](https://docs.expo.dev/versions/latest) [Learn](https://docs.expo.dev/tutorial/overview) [Archive](https://docs.expo.dev/archive) [Expo Snack](https://snack.expo.dev/) [Discord and Forums](https://chat.expo.dev/) [Newsletter](https://expo.dev/mailing-list/signup) Create a development build on EAS ================================= [Edit page](https://github.com/expo/expo/edit/main/docs/pages/develop/development-builds/create-a-build.mdx) Copy page Learn how to create development builds for a project. [Edit page](https://github.com/expo/expo/edit/main/docs/pages/develop/development-builds/create-a-build.mdx) Copy page * * * When you create a new Expo app with `npx create-expo-app`, you start off with a project where you update the JavaScript code on your local machine and view the changes in the Expo Go app. A development build is essentially your own version of Expo Go where you are free to use any native libraries and change any native config. In this guide, you will learn how to convert your project that runs on Expo Go into a development build, which will make the native side of your app fully customizable. [![How to create a development build](https://i3.ytimg.com/vi/uQCE9zl3dXU/maxresdefault.jpg)\ \ How to create a development build](https://www.youtube.com/watch?v=uQCE9zl3dXU) Prerequisites[](https://docs.expo.dev/develop/development-builds/create-a-build/#prerequisites) ------------------------------------------------------------------------------------------------ The instructions assume you already have an existing Expo project that runs on Expo Go. The requirements for building the native app depend on which platform you are using, which platform you are building for, and whether you want to build on EAS or on your local machine. Build on EAS[](https://docs.expo.dev/develop/development-builds/create-a-build/#build-on-eas) This is the easiest way to build your native app, as it requires no native build tools on your side. The builds happen on the EAS servers, which makes it possible to trigger iOS builds from non-macOS platforms. | | Android | iOS Simulator | iPhone device | | --- | --- | --- | --- | | macOS | | | (\*) | | Windows | | | (\*) | | Linux | | | (\*) | (\*) All builds that run on an iPhone device require a paid [Apple Developer](https://developer.apple.com/) account for build signing. Build locally using the EAS CLI[](https://docs.expo.dev/develop/development-builds/create-a-build/#build-locally-using-the-eas-cli) Any EAS CLI command can be built on your local machine with the `--local` flag. This requires your local [development environment](https://reactnative.dev/docs/set-up-your-environment?os=macos&platform=ios) to be set up with native build tools. Read more about [local app development](https://docs.expo.dev/build-reference/local-builds) . | | Android | iOS Simulator | iPhone device | | --- | --- | --- | --- | | macOS | | | (\*) | | Windows | (\*\*) | | | | Linux | | | | (\*) All builds that run on an iPhone device require a paid [Apple Developer](https://developer.apple.com/) account for build signing. (\*\*) No first-class support, but possible with [WSL](http://expo.fyi/wsl.md) . Build locally without EAS[](https://docs.expo.dev/develop/development-builds/create-a-build/#build-locally-without-eas) To build locally without EAS requires your local [development environment](https://reactnative.dev/docs/set-up-your-environment?os=macos&platform=ios) to be set up with native build tools. This is the only way to test your iOS build on an iPhone device without a paid Apple Developer Account (only possible on macOS). Read more about [local app compilation](https://docs.expo.dev/guides/local-app-development#local-app-compilation) and see the [Expo Go to Development Build](https://docs.expo.dev/develop/development-builds/expo-go-to-dev-build) guide. | | Android | iOS Simulator | iPhone device | | --- | --- | --- | --- | | macOS | | | | | Windows | | | | | Linux | | | | Get started[](https://docs.expo.dev/develop/development-builds/create-a-build/#get-started) -------------------------------------------------------------------------------------------- For detailed, step-by-step instructions, see our [EAS Tutorial](https://docs.expo.dev/tutorial/eas/introduction) . Available also as a [tutorial series](https://www.youtube.com/playlist?list=PLsXDmrmFV_AS14tZCBin6m9NIS_VCUKe2) on YouTube. 1 ### Install expo-dev-client[](https://docs.expo.dev/develop/development-builds/create-a-build/#install-expo-dev-client) Terminal Copy `-` `npx expo install expo-dev-client` Are you using this library in a existing (bare) React Native apps?[](https://docs.expo.dev/develop/development-builds/create-a-build/#are-you-using-this-library-in-a) Apps that don't use [Continuous Native Generation](https://docs.expo.dev/workflow/continuous-native-generation) or are created with `npx react-native`, require further configuration after installing this library. See steps 1 and 2 from [Install `expo-dev-client` in an existing React Native app](https://docs.expo.dev/bare/install-dev-builds-in-bare) . 2 ### Build the native app (Android)[](https://docs.expo.dev/develop/development-builds/create-a-build/#build-the-native-app-android) Prerequisites [](https://docs.expo.dev/develop/development-builds/create-a-build/#prerequisites) 3 requirements 1. Expo account Sign up for an [Expo](https://expo.dev/signup) account, if you haven't already. 2. EAS CLI The [EAS CLI](https://docs.expo.dev/build/setup#install-the-latest-eas-cli) installed and logged in. Terminal Copy `-` `npm install -g eas-cli && eas login` 3. An Android Emulator (optional) An [Android Emulator](https://docs.expo.dev/workflow/android-studio-emulator) is optional if you want to test your app on an emulator. Terminal Copy `-` `eas build --platform android --profile development` Read more about [Android builds on EAS](https://docs.expo.dev/tutorial/eas/android-development-build) . 2 ### Build the native app (iOS Simulator)[](https://docs.expo.dev/develop/development-builds/create-a-build/#build-the-native-app-ios-simulator) Prerequisites [](https://docs.expo.dev/develop/development-builds/create-a-build/#prerequisites-1) 3 requirements 1. Expo account Sign up for an [Expo](https://expo.dev/signup) account, if you haven't already. 2. EAS CLI The [EAS CLI](https://docs.expo.dev/build/setup#install-the-latest-eas-cli) installed and logged in. Terminal Copy `-` `npm install -g eas-cli && eas login` 3. macOS with iOS Simulator installed iOS Simulators are available only on macOS. Make sure you have the [iOS Simulator](https://docs.expo.dev/workflow/ios-simulator) installed. Edit `development` profile in eas.json and set the [`simulator`](https://docs.expo.dev/eas/json#simulator) option to `true` (you have to create a separate profile for simulator builds if you also want to create iOS device builds for this project). eas.json Copy `{ "build": { "development": { "ios": { "simulator": true } } } }` Terminal Copy `-` `eas build --platform ios --profile development` iOS Simulator builds can only be installed on simulators and not on real devices. Read more about [iOS Simulator builds on EAS](https://docs.expo.dev/tutorial/eas/ios-development-build-for-simulators) . 2 ### Build the native app (iOS device)[](https://docs.expo.dev/develop/development-builds/create-a-build/#build-the-native-app-ios-device) Prerequisites [](https://docs.expo.dev/develop/development-builds/create-a-build/#prerequisites-2) 3 requirements 1. Expo account Sign up for an [Expo](https://expo.dev/signup) account, if you haven't already. 2. EAS CLI The [EAS CLI](https://docs.expo.dev/build/setup#install-the-latest-eas-cli) installed and logged in. Terminal Copy `-` `npm install -g eas-cli && eas login` 3. Apple Developer account A paid [Apple Developer](https://developer.apple.com/) account for creating [signing credentials](https://docs.expo.dev/app-signing/managed-credentials#generating-app-signing-credentials) so the app could be installed on an iOS device. Terminal Copy `-` `eas build --platform ios --profile development` iOS device builds can only be installed on iPhone devices and not on iOS Simulators. Read more about [iOS device builds on EAS](https://docs.expo.dev/tutorial/eas/ios-development-build-for-devices) . 3 ### Install the app[](https://docs.expo.dev/develop/development-builds/create-a-build/#install-the-app) You'll need to install the native app on your device, emulator, or simulator. #### When building on EAS[](https://docs.expo.dev/develop/development-builds/create-a-build/#when-building-on-eas) If you create your development build on EAS, the CLI will prompt you to install the app after the build is finished. You can also install previous builds from the [expo.dev](https://expo.dev/) dashboard or using [Expo Orbit](https://expo.dev/orbit) . #### When building locally using EAS CLI[](https://docs.expo.dev/develop/development-builds/create-a-build/#when-building-locally-using-eas-cli) When building locally the output of the build will be an archive. You may drag and drop this on your Android Emulator/iOS Simulator to install it, or use [Expo Orbit](https://expo.dev/orbit) to install a build from your local machine. 4 ### Start the bundler[](https://docs.expo.dev/develop/development-builds/create-a-build/#start-the-bundler) The development client built in step 2 is the native side of your app (basically your own version of Expo Go). To continue developing, you'll also want to start the JavaScript bundler. Depending on how you built the app, this may already be running, but if you close the process for any reason, there is no need to rebuild your development client. Simply restart the JavaScript bundler with: Terminal Copy `-` `npx expo start` This is the same command you would have used with Expo Go. It detects whether your project has `expo-dev-client` installed, in which case it will default to targeting your development build instead of Expo Go. Video walkthroughs[](https://docs.expo.dev/develop/development-builds/create-a-build/#video-walkthroughs) ---------------------------------------------------------------------------------------------------------- ["EAS Tutorial Series"\ \ A course on YouTube: learn how to speed up your development with Expo Application Services.](https://www.youtube.com/playlist?list=PLsXDmrmFV_AS14tZCBin6m9NIS_VCUKe2) ["Async Office Hours: How to make a development build with EAS Build"\ \ Learn how to make a development build with EAS Build in this video tutorial hosted by Developer Success Engineer: Keith Kurak.](https://www.youtube.com/watch?v=LUFHXsBcW6w) --- # Tools for development - Expo Documentation Hide navigation Search [Home](https://docs.expo.dev/) [Guides](https://docs.expo.dev/guides/overview) [EAS](https://docs.expo.dev/eas) [Reference](https://docs.expo.dev/versions/latest) [Learn](https://docs.expo.dev/tutorial/overview) [Archive](https://docs.expo.dev/archive) [Expo Snack](https://snack.expo.dev/) [Discord and Forums](https://chat.expo.dev/) [Newsletter](https://expo.dev/mailing-list/signup) Tools for development ===================== [Edit page](https://github.com/expo/expo/edit/main/docs/pages/develop/tools.mdx) Copy page An overview of Expo tools and websites that will help you during various aspects of your project-building journey. [Edit page](https://github.com/expo/expo/edit/main/docs/pages/develop/tools.mdx) Copy page * * * When you create a new project with Expo, learning about the following essential tools and websites can help you during your app development journey. This page provides an overview of a list of recommended tools. Expo CLI[](https://docs.expo.dev/develop/tools/#expo-cli) ---------------------------------------------------------- Expo CLI is a development tool and is installed automatically with `expo` package when you create a new project. You can use it by leveraging `npx` (a Node.js package runner). It is designed to help you move faster during the app development phase. For example, your first interaction with Expo CLI is starting the development server by running the command: `npx expo start`. The following is a list of common commands that you will use with Expo CLI while developing your app: | Command | Description | | --- | --- | | `npx expo start` | Starts the development server (whether you are using a development build or Expo Go). | | `npx expo prebuild` | Generates native Android and iOS directories using [Prebuild](https://docs.expo.dev/workflow/prebuild)
. | | `npx expo run:android` | Compiles native Android app locally. | | `npx expo run:ios` | Compiles native iOS app locally. | | `npx expo install package-name` | Used to install a new library or validate and update specific libraries in your project by adding `--fix` option to this command. | | `npx expo lint` | [Setup and configures](https://docs.expo.dev/guides/using-eslint)
ESLint. If ESLint is already configured, this command will [lint your project files](https://docs.expo.dev/guides/using-eslint#usage)
. | In a nutshell, Expo CLI allows you to develop, compile, start your app, and more. See [Expo CLI reference](https://docs.expo.dev/more/expo-cli) for more available options and actions you can perform with the CLI. EAS CLI[](https://docs.expo.dev/develop/tools/#eas-cli) -------------------------------------------------------- EAS CLI is used to log in to your Expo account and compile your app using different EAS services such as Build, Update, or Submit. You can also use this tool to: * Publish your app to the app stores * Create a development, preview, or production build of your app * Create over-the-air (OTA) updates * Manage your app credentials * Create an ad hoc provisioning profile for an iOS device To use EAS CLI, you need to install it globally on your local machine by running the command: Terminal Copy `-` `npm install -g eas-cli` You can use `eas --help` in your terminal window to learn more about the available commands. For a complete reference, see [`eas-cli` npm page](https://www.npmjs.com/package/eas-cli) . Expo Doctor[](https://docs.expo.dev/develop/tools/#expo-doctor) ---------------------------------------------------------------- Expo Doctor is a command line tool used to diagnose issues in your Expo project. To use it, run the following command in your project's root directory: Terminal Copy `-` `npx expo-doctor` This command performs checks and analyzes your project's codebase for common issues in [app config](https://docs.expo.dev/workflow/configuration) and package.json files, dependency compatibility, configuration files, and the overall health of the project. Once the check is complete, Expo Doctor outputs the results. If Expo Doctor finds an issue, it provides a description of the problem along with advice on how to fix it or where to find help. By default, Expo Doctor validates your project's packages against the [React Native directory](https://reactnative.directory/) and checks if app config properties are properly synced when native directories exist. You can configure these checks in your project's package.json file. See [`reactNativeDirectoryCheck`](https://docs.expo.dev/versions/latest/config/package-json#reactnativedirectorycheck) and [`appConfigFieldsNotSyncedCheck`](https://docs.expo.dev/versions/latest/config/package-json#appconfigfieldsnotsynced) for more details. You can also use `npx expo-doctor --help` to display usage information. Orbit[](https://docs.expo.dev/develop/tools/#orbit) ---------------------------------------------------- Orbit is a macOS and Windows app that enables: * Install and launch builds from EAS on physical devices and emulators. * Install and launch updates from EAS on Android Emulators or iOS Simulators. * Launch snack projects on Android Emulators or iOS Simulators. * Use local files to install and launch apps. Orbit supports any Android .apk, iOS Simulator compatible .app, or ad hoc signed apps. * See a list of pinned projects from your EAS dashboard. ### Installation[](https://docs.expo.dev/develop/tools/#installation) macOS Windows You can download Orbit with Homebrew for macOS, or directly from the [GitHub releases](https://github.com/expo/orbit/releases) . Terminal Copy `-` `brew install expo-orbit` If you want Orbit to start when you log in automatically, click on the Orbit icon in the menu bar, then Settings and select the Launch on Login option. > Orbit for Windows is in preview and is only compatible with x64 and x86 machines. Compatibility for other architectures will be added in the future. You can download Orbit for Windows directly from the [GitHub releases](https://github.com/expo/orbit/releases) . > Orbit relies on the Android SDK on both macOS and Windows and `xcrun` for device management only on macOS, which requires setting up both [Android Studio](https://docs.expo.dev/workflow/android-studio-emulator) > and [Xcode](https://docs.expo.dev/workflow/ios-simulator) > . Expo Tools for VS Code[](https://docs.expo.dev/develop/tools/#expo-tools-for-vs-code) -------------------------------------------------------------------------------------- Expo Tools is a VS Code extension to improve your development experience when working with app config files. It provides features such as autocomplete and intellisense for files such as app config, EAS config, store config and Expo Module config files. [Install Expo Tools VS Code extension\ \ Use this link to install the extension or search Expo Tools directly in your VS Code editor.](https://marketplace.visualstudio.com/items?itemName=expo.vscode-expo-tools) You can also use it to debug your app using VS Code's built-in debugger to set breakpoints, inspect variables, execute code through the debug console, and more. See [Debugging with VS Code](https://docs.expo.dev/debugging/tools#debugging-with-vs-code) for how to use this extension for debugging. Test prototypes with Snack and Expo Go[](https://docs.expo.dev/develop/tools/#test-prototypes-with-snack-and-expo-go) ---------------------------------------------------------------------------------------------------------------------- ### Snack[](https://docs.expo.dev/develop/tools/#snack) Snack is an in-browser development environment that works similarly to Expo Go. It's a great way to share code snippets and experiment with React Native without downloading any tools on your computer. To use it, go to [snack.expo.dev](https://snack.expo.dev/) , edit the `` component in App.js, choose a platform (Android, iOS, or web) in the right panel and see the changes live. ### Expo Go[](https://docs.expo.dev/develop/tools/#expo-go) [Expo Go](https://expo.dev/go) is a free open-source, sandbox for learning and experimenting with React Native. It works with Android and iOS. For more information on how to use it: * Click [this link](https://docs.expo.dev/get-started/set-up-your-environment?mode=expo-go) to go to Set up your environment guide * Select a platform to develop under Where would you like to develop? * Select Expo Go under How would you like to develop? * Follow the instructions described in that guide > Note: Not recommended for building and distributing production apps to the app stores. Instead, use [development builds](https://docs.expo.dev/get-started/set-up-your-environment?mode=development-build) > . What if I open a project with an unsupported SDK version?[](https://docs.expo.dev/develop/tools/#what-if-i-open-a-project-with) When running a project that was created for an unsupported SDK version in Expo Go, you'll see the following error: `"Project is incompatible with this version of Expo Go"` To fix this, upgrading your project to a [supported SDK version](https://docs.expo.dev/versions/latest#each-expo-sdk-version-depends-on-a-react-native-version) is recommended. If you want to learn how to do it, see [Upgrade the project to a new SDK Version](https://docs.expo.dev/develop/tools#how-do-i-upgrade-my-project-from) . How do I upgrade my project from an unsupported SDK version?[](https://docs.expo.dev/develop/tools/#how-do-i-upgrade-my-project-from) See [Upgrading Expo SDK guide](https://docs.expo.dev/workflow/upgrading-expo-sdk-walkthrough) for instructions for upgrading to a specific SDK version. React Native directory[](https://docs.expo.dev/develop/tools/#react-native-directory) -------------------------------------------------------------------------------------- Any library that is compatible with React Native works in an Expo project when you use a development build to create your project. [reactnative.directory](https://reactnative.directory/) is a searchable database for React Native libraries. If a library you are looking for is not included in Expo SDK, use the directory to find a compatible library for your project. [Use libraries\ \ See this guide to learn more about the difference between React Native core libraries, Expo SDK libraries, and third-party libraries. It also explains how to determine third-party library compatibility.](https://docs.expo.dev/workflow/using-libraries) --- # Animation - Expo Documentation Hide navigation Search [Home](https://docs.expo.dev/) [Guides](https://docs.expo.dev/guides/overview) [EAS](https://docs.expo.dev/eas) [Reference](https://docs.expo.dev/versions/latest) [Learn](https://docs.expo.dev/tutorial/overview) [Archive](https://docs.expo.dev/archive) [Expo Snack](https://snack.expo.dev/) [Discord and Forums](https://chat.expo.dev/) [Newsletter](https://expo.dev/mailing-list/signup) Animation ========= [Edit page](https://github.com/expo/expo/edit/main/docs/pages/develop/user-interface/animation.mdx) Copy page Learn how to integrate React Native animations and use it in your Expo project. [Edit page](https://github.com/expo/expo/edit/main/docs/pages/develop/user-interface/animation.mdx) Copy page * * * Animations are a great way to enhance and provide a better user experience. In your Expo projects, you can use the [Animated API](https://reactnative.dev/docs/next/animations) from React Native. However, if you want to use more advanced animations with better performance, you can use the [`react-native-reanimated`](https://docs.swmansion.com/react-native-reanimated/) library. It provides an API that simplifies the process of creating smooth, powerful, and maintainable animations. Installation[](https://docs.expo.dev/develop/user-interface/animation/#installation) ------------------------------------------------------------------------------------- You can skip installing `react-native-reanimated` if you have created a project using [the default template](https://docs.expo.dev/get-started/create-a-project) . This library is already installed. Otherwise, install it by running the following command: Terminal Copy `-` `npx expo install react-native-reanimated` Usage[](https://docs.expo.dev/develop/user-interface/animation/#usage) ----------------------------------------------------------------------- ### Minimal example[](https://docs.expo.dev/develop/user-interface/animation/#minimal-example) The following example shows how to use the `react-native-reanimated` library to create a simple animation. For more information on the API and advanced usage, see [`react-native-reanimated` documentation](https://docs.swmansion.com/react-native-reanimated/docs/fundamentals/your-first-animation) . Using react-native-reanimated Copy Open in Snack `import Animated, { useSharedValue, withTiming, useAnimatedStyle, Easing, } from 'react-native-reanimated'; import { View, Button, StyleSheet } from 'react-native'; export default function AnimatedStyleUpdateExample() { const randomWidth = useSharedValue(10); const config = { duration: 500, easing: Easing.bezier(0.5, 0.01, 0, 1), }; const style = useAnimatedStyle(() => { return { width: withTiming(randomWidth.value, config), }; }); return (