Skip to content
Report library
Purpose / Other

Expo Dev Client Skill Security Audit

What the author says it does (original text)

Framework (OSS). Build and distribute Expo development clients locally or via TestFlight for internal testing. For production TestFlight releases and store submission, use the eas-app-stores skill.

Independent security check

Do not install or run it yet

Files checked
2
Risks found
6
Could it run dangerous commands?Looks for programs run straight after downloading, remote control of your computer, and hidden commands.Risks found: 2
Medium risk

The feedback step downloads and immediately executes an unpinned npm package

Source references: 1
What we found

The command combines `npx --yes` with `@latest`, fetching and executing the current `submit-expo-feedback` release without an installation confirmation. That package's source is not included in the supplied material, so its behavior cannot be verified from this Skill.

Why this matters

If the package or its publisher account were compromised, the process would run with the user's permissions and could access files or credentials available in its environment. The entered feedback text is also handed to that program.

The feedback command explicitly uses `npx --yes` with `submit-expo-feedback@latest`: `@latest` leaves the code version unfixed, `--yes` bypasses the installation prompt, and the package source is absent from the supplied material. It runs only when submitting specific feedback, but the then-current package executes with the user's permissions and receives the feedback text. Users can restrict automatic execution and request a pinned, reviewed version.

SKILL.md:176In the instructionsOpen original file
## Submitting FeedbackIf you encounter errors, misleading or outdated information in this skill, report it so Expo can improve:```bashnpx --yes submit-expo-feedback@latest --category skills --subject "expo-dev-client" "<actionable feedback>"```Only submit when you have something specific and actionable to report. Include as much relevant context as possible.If an AI agent repeatedly failed or the user had to take over an Expo task, load the expo-skill-feedback skill and follow its eval-candidate flow instead of reusing the command above.
Medium risk

Connecting to an untrusted Metro address can make the development client load that server's code

Source references: 2
What we found

The Skill permits scanning a QR code or manually entering a Metro URL without advising the user to authenticate the server. A development client is designed to load application code supplied by that server and may include native capabilities already granted to the app.

Why this matters

A malicious or hijacked server could provide unexpected code to the device. That code may use APIs and permissions included in the development client, potentially accessing test data or making network requests.

What this evidence establishes

The source says the development client can connect to a development server by QR code or manually entered URL, but it does not direct users to unknown or untrusted servers, nor show which native permissions loaded code could access. The specific claim about arbitrary untrusted servers gaining the app's native capabilities therefore lacks implementation or permission evidence. Users can still require trusted local Metro addresses and visibility of the destination host before connecting.

This assessment concerns the code and conditions shown, not proof that harm has occurred.
SKILL.md:140In the instructionsOpen original file
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
Show 1 other places
SKILL.md:146In the instructionsOpen original file
Connect to local development:```bash# Start Metro bundlernpx expo start --dev-client# Scan QR code with dev client or enter URL manually```
Could it expose your files or keys?Looks for uploads of files containing passwords or keys, and keys written directly in the code.No risks found
Could it delete files or keep running?Looks for broad file deletion, disk overwrites, and programs set to start automatically.Risks found: 1
Medium risk

The archive is extracted directly into the current directory and may overwrite files

Source references: 1
What we found

The installation instructions select an archive with a wildcard and run `tar -xzf` without an isolated destination. Archive paths are written into the current working directory; collisions or an untrusted archive can therefore cause overwrites or path traversal.

Why this matters

Project files, configuration, or other current-directory content may be replaced. A crafted archive could also attempt to write outside the expected directory.

The example runs `tar -xzf build-*.tar.gz` in the current directory without an isolated destination and selects archives with a wildcard. Extraction writes paths from the archive into that directory; if the wrong, replaced, or untrusted archive is selected, it may overwrite matching files, and malicious paths may escape the intended location. Users can require verification of one archive and its contents, followed by extraction into a new isolated directory.

SKILL.md:92In the instructionsOpen original file
## Installing Local BuildsInstall iOS build on simulator:```bash# Find the .app in the .tar.gz outputtar -xzf build-*.tar.gzxcrun simctl install booted ./path/to/App.app```
Could it bypass safety checks?Looks for skipped website security checks, excessive file access, or actions that skip your approval.Risks found: 2
High risk

The “check EAS CLI version” step includes a command that can publish an app update

Source references: 1
What we found

The troubleshooting section places `eas update` under “Check EAS CLI version.” This command does not inspect or upgrade the CLI; in a configured Expo project, it creates and publishes an EAS Update. The heading may lead a user to treat it as a harmless version check.

Why this matters

It could publish the current JavaScript and assets to a configured update branch or channel, affecting installed apps or testers and potentially releasing broken code or bundled sensitive material.

The heading presents this as checking the EAS CLI version, but it also lists `eas update` immediately after the read-only `eas --version`. In a configured project, that command may perform the state-changing operation of publishing an update. The misleading heading could cause a user to run it without intending to publish. Users can ask the author to remove it or clearly document its publishing effect and require confirmation.

SKILL.md:169In the instructionsOpen original file
**Check EAS CLI version:**```basheas --versioneas update```
Low risk

The install command does not pin a dependency version

Source references: 2
What we found

The installation command does not specify dependency versions. The same command may download different code later, so what you install can differ from what was checked.

Why this matters

A later install may download different code even though the command and this report have not changed.

What this evidence establishes

`npx expo start --dev-client` starts a development server; it is not explicitly an install command. If the project already has a local `expo` dependency, npx normally uses it, while fetching may occur only when it is absent. This creates a conditional unpinned-resolution risk, but the source does not show that different code will necessarily be downloaded or installed.

This assessment concerns the code and conditions shown, not proof that harm has occurred.
SKILL.md:150In the instructionsOpen original file
# Start Metro bundlernpx expo start --dev-client
Show 1 other places
SKILL.md:146In the instructionsOpen original file
Connect to local development:```bash# Start Metro bundlernpx expo start --dev-client
Could it mislead the AI or hide text?Checks the skill instructions for requests to ignore you, influence the report, or hide text in invisible characters.No risks found
Could it change links or payment recipients without asking?Looks for forced referral or payment changes combined with instructions to hide the change.Risks found: 1
Medium risk

One build command consumes cloud capacity and submits to App Store Connect

Source references: 2
What we found

The recommended `--submit` command starts a paid EAS cloud build and an external App Store Connect submission in one operation. That has greater account and commercial consequences than merely creating a local development client. Although the Skill discloses pricing, the command provides no separate approval point for submission.

Why this matters

It may consume EAS build minutes, advance remote build numbers, and create a TestFlight build in the Apple account. The wrong app, configuration, or signing identity could also be submitted.

Legitimate use of this code

The command does start a cloud build and submit it to App Store Connect, but it appears under an explicit “Building for TestFlight” section. The text enumerates the cloud build, automatic submission, and email result, and earlier discloses possible cloud-build charges and the Apple Developer account requirement. It has account and cost impact, but those effects match the stated purpose and are not presented as a local-only build.

This assessment concerns the code and conditions shown, not proof that harm has occurred.
SKILL.md:10In the instructionsOpen original file
> **Free locally; cloud builds are paid.** `expo-dev-client` itself is open source and building locally is free. Building or distributing via EAS Build/TestFlight uses your EAS plan's build minutes and needs a paid Apple Developer account for device/TestFlight distribution. See https://expo.dev/pricing.
Show 1 other places
SKILL.md:55In the instructionsOpen original file
## Building for TestFlightBuild iOS dev client and submit to TestFlight in one command:```basheas build -p ios --profile development --submit```This will:1. Build the development client in the cloud2. Automatically submit to App Store Connect3. Send you an email when the build is ready in TestFlight

Inside this skill

8 instruction sections

The Skill instructs users to create Expo development clients for apps with custom native functionality and offers both cloud and local build paths. It explicitly states that cloud builds may consume paid build minutes and that device or TestFlight distribution requires a paid Apple Developer account.

View source
SKILL.md:8In the instructionsOpen original file
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.> **Free locally; cloud builds are paid.** `expo-dev-client` itself is open source and building locally is free. Building or distributing via EAS Build/TestFlight uses your EAS plan's build minutes and needs a paid Apple Developer account for device/TestFlight distribution. See https://expo.dev/pricing.

The suggested EAS configuration makes remote EAS the source of version numbers and automatically increments build numbers for both development and production profiles. This changes version state in the remote account rather than merely producing a local test artifact.

View source
SKILL.md:29In the instructionsOpen original file
{  "cli": {    "version": ">= 16.0.1",    "appVersionSource": "remote"  },  "build": {    "production": {      "autoIncrement": true    },    "development": {      "autoIncrement": true,      "developmentClient": true    }
SKILL.md:49In the instructionsOpen original file
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

The development client can connect to a Metro development server using a scanned QR code or a manually entered URL. Consequently, the development code loaded by the running app depends on the server selected by the user.

View source
SKILL.md:140In the instructionsOpen original file
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
SKILL.md:146In the instructionsOpen original file
Connect to local development:```bash# Start Metro bundlernpx expo start --dev-client# Scan QR code with dev client or enter URL manually```
Start here · InstructionsSKILL.md
expo-dev-client
Lines connect the instruction file to its sections, not an observed execution order. Select a section to read the source. 2 more sections are available in the original file.
Files and check records2 files

Coverage and gaps

Content covered in each file

These are the source ranges included in this check, not a guarantee that every issue has been resolved.

  • SKILL.mdFull text included
  • agents/openai.yamlFull text included

This report is for the version above. We read the available code and instructions without running the skill or checking extra packages it installs. This is not a promise of safety: a different version or setup may behave differently.

  • SKILL.mdInstructions
  • agents/openai.yamlSupporting file

Operations mentioned in code and instructions

Connect to websites
SKILL.md:10In the instructionsOpen original file
> **Free locally; cloud builds are paid.** `expo-dev-client` itself is open source and building locally is free. Building or distributing via EAS Build/TestFlight uses your EAS plan's build minutes and needs a paid Apple Developer account for device/TestFlight distribution. See https://expo.dev/pricing.
SKILL.md:14In the instructionsOpen original file
**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](https://docs.expo.dev/develop/development-builds/introduction/) for the full reasoning.
Run commands
SKILL.md:59In the instructionsOpen original file
```basheas build -p ios --profile development --submit
SKILL.md:79In the instructionsOpen original file
```bash# iOS (requires Xcode)
SKILL.md:96In the instructionsOpen original file
```bash# Find the .app in the .tar.gz output
Install extra software packages
SKILL.md:150In the instructionsOpen original file
# Start Metro bundlernpx expo start --dev-client
SKILL.md:179In the instructionsOpen original file
```bashnpx --yes submit-expo-feedback@latest --category skills --subject "expo-dev-client" "<actionable feedback>"```
Read keys or account settings
SKILL.md:160In the instructionsOpen original file
```basheas credentials```
Lines read
188
File checksum (to compare versions)
2e5b402416efbdfabc080a2f636c6fc848a497abf720126df4d33281a4ef8840