expo start command launches a local development server with Metro bundler, enabling you to develop your app on iOS, Android, and web platforms simultaneously.
Usage
Arguments
Directory of the Expo project. Defaults to the current working directory.
Options
Platform Selection
Open the app on a connected Android device or emulator. Alias:
-aOpen the app in an iOS simulator. Alias:
-iOpen the app in a web browser. Alias:
-wDevelopment Client Options
Launch the app in a custom native development build. Alias:
-dLaunch the app in Expo Go. Alias:
-gBundler Options
Clear the Metro bundler cache before starting. Alias:
-c, --reset-cacheMaximum number of tasks to allow Metro to spawn. Useful for controlling CPU usage.
Bundle in production mode instead of development mode.
Minify JavaScript code. Typically used with
--no-dev for production testing.Network Options
Dev server hosting type. Alias:
-mOptions:lan- Use the local network (default)tunnel- Use any network by tunneling through ngroklocalhost- Connect over localhost only
Same as
--host tunnel. Enables remote access via ngrok.Same as
--host lan. Uses your local network IP address.Same as
--host localhost. Only accessible from the same machine.Port to start the dev server on. Defaults to 8081. Does not apply to web or tunnel. Alias:
-pSkip network requests and use anonymous manifest signatures. Useful for development without internet.
Advanced Options
Custom URI protocol to use when launching the app. Overrides the scheme in app.json.
Start the dev server with HTTPS protocol. Deprecated in favor of
--tunnel.Path to private key for code signing. Defaults to
private-key.pem in the same directory as the certificate specified by expo-updates configuration in app.json.Examples
Basic Development
Start the development server with default settings:- QR code for Expo Go
- Options to open on different platforms
- Keyboard shortcuts for common actions
Launch on Specific Platform
Open directly on iOS simulator:Multiple Platforms
Launch on multiple platforms simultaneously:Development Client
For custom development builds:Clear Cache
If you’re experiencing issues, clear the bundler cache:Production Mode
Test production bundling locally:Custom Port
Run on a different port:Tunnel for Remote Access
Share your development server over the internet:- Testing on physical devices without being on the same network
- Sharing with team members
- Testing from different locations
Localhost Only
Restrict access to localhost:Offline Development
Work without an internet connection:Limit CPU Usage
Control Metro’s resource consumption:Interactive Commands
While the dev server is running, you can press these keys:- a - Open on Android
- i - Open on iOS
- w - Open on web
- r - Reload app
- m - Toggle menu
- j - Open debugger
- o - Open project in editor
- c - Clear cache and restart
- ? - Show help
Environment Variables
Theexpo start command respects several environment variables:
PORT- Default port for the dev serverEXPO_DEVTOOLS_LISTEN_ADDRESS- Address to bind the dev serverEXPO_DEBUG=1- Enable debug loggingEXPO_OFFLINE=1- Start in offline modeCI=1- Run in non-interactive CI modeEXPO_NO_CACHE=1- Disable API caches
How It Works
When you runexpo start:
- Loads Configuration - Reads app.json or app.config.js
- Starts Metro Bundler - Initializes the JavaScript bundler
- Creates Dev Server - Sets up HTTP server with middleware
- Generates Manifest - Creates the Expo manifest for runtime
- Displays UI - Shows QR code and interactive terminal
- Watches Files - Monitors for changes and triggers hot reloads
Platform-Specific Behavior
iOS
- Automatically detects running simulators
- Can launch new simulator if none are running
- Supports both Expo Go and development builds
- Handles code signing for development certificates
Android
- Detects connected devices via ADB
- Can launch emulators if none are running
- Installs APK if not present
- Forwards port for device communication
Web
- Uses Metro bundler (not Webpack)
- Supports server-side rendering
- Handles static file serving
- Includes React Native Web shims
Troubleshooting
Port Already in Use
If port 8081 is busy:Cache Issues
Clear the cache if you see stale code:Network Connection Issues
If QR code doesn’t work:- Ensure both computer and device are on same network
- Check firewall settings
- Try
--tunnelmode - Use
--localhostand connect via USB