56 results available
Sign in
Skills directory

expo-dev-client

expo

·

Last changed
Hardened

This skill has been hardened by Chainguard

Last changed

This version passed the hardening gate. Hardening applied 11 targeted changes and preserved all other text. Classified findings before hardening: 1. Classified findings closed: 0. Classified findings remaining: 1. Unclassified scanner findings remaining: 0. Review findings closed: 13. Review findings remaining: 0.


Open before hardening

1

Medium
Open after hardening

1

Medium

Expand
File
Group
Subtype
Severity
Status
SKILL.md

Supply Chain & Install-Time Trust

—

Medium
Open

1 finding


SKILL.md

Use EAS Build to create development clients for testing native code changes on physical devices. Use this for creating custom Expo Go clients for testing branches of your app.

Important: When Development Clients Are Needed

Development clients are the recommended setup for any real or production app. Expo Go is a playground for learning and quick experiments with the native libraries it bundles; most apps outgrow it and move to a development client. See Expo Go vs. development builds for the full reasoning.

You must use a dev client, because Expo Go cannot run these, when using:

  • Local Expo modules (custom native code)
  • Apple targets (widgets, app clips, extensions)
  • Third-party native modules not in Expo Go
  • Config plugins, or testing remote push notifications and App/Universal Links

EAS Configuration

Ensure eas.json has a development profile:

{
  "cli": {
    "version": ">= 16.0.1",
    "appVersionSource": "remote"
  },
  "build": {
    "production": {
      "autoIncrement": true
    },
    "development": {
      "autoIncrement": true,
      "developmentClient": true
    }
  },
  "submit": {
    "production": {},
    "development": {}
  }
}

Key settings:

  • developmentClient: true - Bundles expo-dev-client for development builds
  • autoIncrement: true - Automatically increments build numbers
  • appVersionSource: "remote" - Uses EAS as the source of truth for version numbers

Building for TestFlight

Before running this command, tell the user that it uses paid EAS build minutes and Apple credentials and uploads the build to App Store Connect, then wait for the user's explicit approval. Development client builds on TestFlight are for internal testers only, because they expose the dev menu and dev server connections.

Build iOS dev client and submit to TestFlight in one command:

eas build -p ios --profile development --submit

This will:

  1. Build the development client in the cloud
  2. Automatically submit to App Store Connect
  3. Send you an email when the build is ready in TestFlight

After receiving the TestFlight email:

  1. Download the build from TestFlight on your device
  2. Launch the app to see the expo-dev-client UI
  3. Connect to your local Metro bundler or scan a QR code

Building Locally

Build a development client on your machine:

# iOS (requires Xcode)
eas build -p ios --profile development --local

# Android
eas build -p android --profile development --local

Local builds output:

  • iOS: a signed .ipa file for physical devices. Installing on a simulator needs a build profile with the iOS simulator option turned on, which produces a .tar.gz archive that contains the .app bundle
  • Android: .apk or .aab file

Installing Local Builds

Install only artifacts produced by the user's own local build. Replace the file names below with the exact path the build printed, list the archive contents before extracting, extract into a dedicated folder, and confirm with the user that the file is the one just built.

Install iOS build on simulator:

# Find the .app in the .tar.gz output
tar -xzf build-*.tar.gz
xcrun simctl install booted ./path/to/App.app

Install iOS build on device (requires signing):

# Use Xcode Devices window or ideviceinstaller
ideviceinstaller -i build.ipa

Install Android build:

adb install build.apk

Building for Specific Platform

Cloud builds upload the project to EAS and use paid build minutes. Before running any of these commands, tell the user and wait for explicit approval, and prefer the local commands above when feasible. Make sure secret files and environment files are excluded from the upload, and keep sensitive values in EAS secrets rather than in the repository.

# iOS only
eas build -p ios --profile development

# Android only
eas build -p android --profile development

# Both platforms
eas build --profile development

Checking Build Status

# List recent builds
eas build:list

# View build details
eas build:view

Using the Dev Client

Once installed, the dev client provides:

  • Development server connection - Enter your Metro bundler URL or scan QR
  • Build information - View native build details
  • Launcher UI - Switch between development servers

Connect only to the user's own local or trusted development server, and scan QR codes or open URLs only from sources the user trusts. Run Metro on a trusted network. Make sure expo is installed as a project dependency so npx runs the local package.

Connect to local development:

# Start Metro bundler
npx expo start --dev-client

# Scan QR code with dev client or enter URL manually

When you launch the dev client yourself to screenshot or drive it, skip the onboarding sheet, the dev menu at launch, and the Tools button. On SDK 58+, Expo CLI does this for launches it starts from a non-interactive shell; for a URL you open yourself, use <scheme>://?__expo_url=<encoded dev server URL>&__expo_disable_onboarding=1&__expo_disable_fab=1&__expo_disable_auto_launch=1. On SDK 57 and earlier, launch the iOS app with the -EXDevMenu* launch arguments, and on Android open <scheme>://expo-development-client/?url=<encoded dev server URL>&disableOnboarding=1&disableFab=1&disableAutoLaunch=1. See ../expo-overview/references/launch-without-dev-menu.md for the exact commands. That file belongs to a separate skill; review it with the user before following its commands. Use the onboarding, fab, and auto launch options only for agent-driven automation against the user's own local server.

Troubleshooting

Build fails with signing errors:

This command is interactive. Run it together with the user, review the existing credentials first, and get explicit user approval before creating, replacing, or removing any certificate or key.

eas credentials

Clear build cache:

This starts a new paid cloud build, so get the user's explicit approval first.

eas build -p ios --profile development --clear-cache

Check EAS CLI version:

eas --version

The eas update command publishes over the air app updates to testers and users. It is a release step, so use it only when the user asks to publish an update. Upgrade the EAS CLI through the normal package manager after confirming with the user.

Install

Install with chainctl
chainctl skill install public/expo/expo-dev-client:latest
Get started with chainctl
View source

Harden your own skills

Bring Chainguard's hardening pipeline to your first-party skills — custom rulesets, automated remediation, full audit trail.

Provenance

Upstream sourcehttps://github.com/expo/skills
Upstream commit0d035556e37737de83199d8e623641bad7a7cced
OCI reference

skills.cgr.dev/public/github.com/expo/plugins/expo/skills/expo-dev-client:latest

License

MIT

Files

HARDENING.md

LICENSE

SKILL.md

agents/openai.yaml


The trusted source for open source

Talk to an expert
PrivacyTerms

Product

Chainguard ContainersChainguard LibrariesChainguard VMsChainguard OS PackagesChainguard ActionsChainguard Agent SkillsIntegrationsPricing
© 2026 Chainguard, Inc. All Rights Reserved.
Chainguard® and the Chainguard logo are registered trademarks of Chainguard, Inc. in the United States and/or other countries.
The other respective trademarks mentioned on this page are owned by the respective companies and use of them does not imply any affiliation or endorsement.