Documentation
Expo CI Doctor — configuration validation, failure prediction, and build readiness reporting for Expo and React Native projects.
Documentation Updated — February 2026
This documentation has been fully revised to reflect the current state of the tool. If you last used Expo CI Doctor before February 2026, the following are new since your last session:
- New commands:
preflight,diff,login,logout,whoami - New flags:
--ci-summary,--format=md,--upgrade,--noise - New Pro features: Failure Prediction, Upgrade Safety Report, CI Noise Filter, Stability Trend
- Build Readiness Score now available on all plans
- Subscription-based licensing has replaced one-time purchase keys
- The
activatecommand has been removed; uselogininstead
Installation
Run directly with npx, or install globally or as a project dev dependency.
# Run without installing
npx expo-ci-doctor doctor
# Install globally
npm install -g expo-ci-doctor
# Add as a dev dependency (recommended for teams)
npm install -D expo-ci-doctorRequires Node.js 18 or later. No additional native dependencies.
License Setup
Expo CI Doctor uses a subscription-based license tied to your account. Your license key starts with ecd_ and is available in your account dashboard.
Local Development
Use the login command to authenticate interactively. The key is stored in ~/.expo-ci-doctor/license.
npx expo-ci-doctor loginCI Environments
In CI, set the license key as a secret environment variable. The environment variable takes precedence over any locally stored key.
# Set as environment variable
export EXPO_CI_DOCTOR_KEY=ecd_your_license_key_here
# Or in your CI secrets and reference it as:
# EXPO_CI_DOCTOR_KEY: ${secrets.ECD_KEY}The environment variable name is EXPO_CI_DOCTOR_KEY. If this variable is set, the tool will use it and skip any local key lookup.
Command Reference
All commands accept --help for inline flag documentation.
check Starter Free
Validates your project configuration files. Scans app.json, eas.json, and package.json for common misconfigurations, missing fields, version mismatches, and structural issues.
This command does not require a license and can be used freely.
npx expo-ci-doctor check
npx expo-ci-doctor check --json # JSON output for scripting
npx expo-ci-doctor check --format=md # Markdown output| Flag | Description |
|---|---|
| --json | Output results as JSON |
| --format=md | Output results as Markdown |
| --ci | Non-interactive mode for CI environments |
analyze Starter
Matches your project state against a library of known CI failure patterns. Each match is given a confidence score and a build stage label (e.g., dependency resolution, native compilation, signing). Returns a categorized error report with fix pointers.
Requires an active Starter or Pro subscription.
npx expo-ci-doctor analyze
npx expo-ci-doctor analyze --ci # CI mode
npx expo-ci-doctor analyze --ci-summary # Compact summary line for CI logs
npx expo-ci-doctor analyze --json # JSON output
npx expo-ci-doctor analyze --format=md # Markdown report| Flag | Description |
|---|---|
| --ci | Disable interactive output |
| --ci-summary | Print a single compact summary line |
| --json | JSON output |
| --format=md | Markdown output |
| --noise | Enable CI noise filtering (Pro only) |
doctor Starter Pro (full)
Runs all checks and analysis, then produces a weighted verdict: PASS, WARN, or FAIL. Includes a Build Readiness Score, root-cause ranking, and actionable fix suggestions. Pro subscribers also receive Failure Prediction and Upgrade Safety data inline.
Requires an active Starter or Pro subscription.
npx expo-ci-doctor doctor
npx expo-ci-doctor doctor --ci # CI mode
npx expo-ci-doctor doctor --ci-strict # Exit 1 on warnings, not just errors
npx expo-ci-doctor doctor --ci-summary # Single-line CI summary
npx expo-ci-doctor doctor --json # JSON output
npx expo-ci-doctor doctor --format=md # Markdown report| Flag | Description |
|---|---|
| --ci | Non-interactive, clean output |
| --ci-strict | Treat warnings as failures (exit 1) |
| --ci-summary | Single-line summary for CI log output |
| --json | JSON output |
| --format=md | Markdown output |
| --upgrade | Include Upgrade Safety Report (Pro only) |
| --noise | Apply CI noise filter before analysis (Pro only) |
preflight Pro
Simulates a build before it runs. Checks native module compatibility, EAS profile validity, environment variable completeness, and signing configuration. Designed to catch issues that only surface during EAS builds, before you spend build minutes finding out.
Requires an active Pro subscription.
npx expo-ci-doctor preflight
npx expo-ci-doctor preflight --ci
npx expo-ci-doctor preflight --format=mddiff Pro
Compares the current project configuration snapshot against a previous one. Useful for tracking configuration drift between branches or deployments. Diffs are stored locally and can be exported.
Requires an active Pro subscription.
# Take a snapshot
npx expo-ci-doctor diff --snapshot
# Compare current state against last snapshot
npx expo-ci-doctor diff
# Output diff as Markdown
npx expo-ci-doctor diff --format=mdlogin / logout / whoami Free
Authentication commands. login prompts for your license key and stores it locally. logout removes the stored key. whoami prints the current account email and active plan.
npx expo-ci-doctor login
npx expo-ci-doctor logout
npx expo-ci-doctor whoamiFeature Deep Dives
Build Readiness Score Starter
A numeric score from 0 to 100 representing overall build readiness. Computed by weighting individual check results across configuration, dependency, and CI environment categories. A score above 80 is generally safe to proceed. Below 50 indicates significant risk.
The score is surfaced in the output of doctor and can be included in JSON/Markdown exports for tracking over time.
npx expo-ci-doctor doctor --json | jq .scoreFailure Prediction Pro
Given your current project state, the tool estimates the likelihood that an EAS build will fail, and identifies the most probable failure point. This is based on pattern matching against known failure signatures, not heuristics alone.
Failure predictions include a confidence percentage and a suggested fix for each identified risk. Low-confidence matches are listed separately to avoid noise.
Available via doctor when subscribed to Pro.
Upgrade Safety Report Pro
Simulates the effect of upgrading Expo SDK, React Native, or major dependencies. Reports which native modules are incompatible at the target version, which EAS configuration fields may need updating, and whether the upgrade is likely safe.
Use this before running expo upgrade on a project with native modules or a complex EAS configuration.
npx expo-ci-doctor doctor --upgrade
npx expo-ci-doctor doctor --upgrade --format=mdCI Noise Filter Pro
CI logs contain a lot of output that is not relevant to failures: progress bars, verbose dependency downloads, Gradle daemon startup messages, and similar noise. The noise filter pre-processes raw logs to isolate signal before passing them to the analyzer.
This improves analysis accuracy when logs are piped in directly from EAS or GitHub Actions artifacts.
npx expo-ci-doctor analyze --noiseHistorical CI Stability Trend Pro
Tracks Build Readiness Scores across runs and shows whether your project stability is improving or degrading over time. Useful for teams running the tool regularly as part of a CI step.
Trend data is stored locally in ~/.expo-ci-doctor/history/ and can be exported as JSON or Markdown.
Rich Markdown Output Starter
All commands support --format=md to produce a structured Markdown report. This is useful for posting results as GitHub PR comments, Slack messages, or storing as artifacts.
# Save Markdown report to file
npx expo-ci-doctor doctor --format=md > build-report.md
# Or pipe directly to a command
npx expo-ci-doctor doctor --format=md | gh pr comment --body-file=-CI Usage Guide
The tool is designed to run without human interaction in CI environments. Use --ci to suppress interactive prompts and spinners.
GitHub Actions — Standard Usage
name: EAS Build
on:
push:
branches: [main]
pull_request:
jobs:
diagnose-and-build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Install dependencies
run: npm ci
- name: Run Expo CI Doctor
env:
EXPO_CI_DOCTOR_KEY: ${{ secrets.ECD_KEY }}
run: npx expo-ci-doctor doctor --ci --ci-strict
- name: Build with EAS
run: npx eas-cli build --platform all --non-interactiveGitHub Actions — Markdown Report as PR Comment
- name: Run Expo CI Doctor (Markdown)
env:
EXPO_CI_DOCTOR_KEY: ${{ secrets.ECD_KEY }}
run: npx expo-ci-doctor doctor --ci --format=md > ecd-report.md
- name: Post report to PR
if: github.event_name == 'pull_request'
uses: marocchino/sticky-pull-request-comment@v2
with:
path: ecd-report.mdAuthentication in CI
Do not use npx expo-ci-doctor login in CI. Set the key as a secret environment variable instead:
# In GitHub Actions, add ECD_KEY as a repository secret
# Then reference it in your workflow:
env:
EXPO_CI_DOCTOR_KEY: ${{ secrets.ECD_KEY }}Compact CI Logging
Use --ci-summary for a single-line summary suitable for CI log readability and notifications:
npx expo-ci-doctor doctor --ci --ci-summaryExample output: PASS | Score: 91 | 0 errors, 1 warning | sdk-mismatch
Exit Codes
Exit codes allow CI pipelines to gate builds based on tool output.
| Code | Meaning | Notes |
|---|---|---|
| 0 | Passed — no errors or warnings | Safe to proceed |
| 1 | Warnings found | Build may succeed; use --ci-strict to treat as failure |
| 2 | Errors found | Build likely to fail; review output before proceeding |
| 3 | Tool error | Unexpected failure in the tool itself; check license and network |
Configuration File
Place a .expo-ci-doctor.json file in your project root to customize behavior. All fields are optional.
{
"ignore": [
"native-module-version",
"expo-sdk-mismatch"
],
"thresholds": {
"doctor-score": 70,
"confidence": 65
},
"monorepo": {
"root": "../..",
"packages": ["packages/*", "apps/*"]
},
"output": {
"format": "md",
"summaryOnly": false
}
}| Field | Type | Description |
|---|---|---|
| ignore | string[] | Rule IDs to suppress from output |
| thresholds.doctor-score | number | Minimum score to pass (default: 60) |
| thresholds.confidence | number | Minimum pattern confidence to report (default: 60) |
| monorepo.root | string | Relative path to the monorepo root |
| monorepo.packages | string[] | Glob patterns for workspace packages |
| output.format | "text" | "md" | "json" | Default output format |
Plans and Licensing
Expo CI Doctor uses subscription-based licensing. The license key is verified on each run against the active subscription. No offline activation is supported.
| Feature | Free | Starter ($5/mo) | Pro ($15/mo) |
|---|---|---|---|
| check command | Yes | Yes | Yes |
| Build Readiness Score | — | Yes | Yes |
| analyze command | — | Yes | Yes |
| doctor command (basic) | — | Yes | Yes |
| Rich Markdown output | — | Yes | Yes |
| Monorepo support | — | Yes | Yes |
| JSON output | — | Yes | Yes |
| Failure Prediction | — | — | Yes |
| Upgrade Safety Report | — | — | Yes |
| CI Noise Filter | — | — | Yes |
| Stability Trend History | — | — | Yes |
| preflight command | — | — | Yes |
| diff / snapshots | — | — | Yes |
How License Verification Works
On each command run, the CLI reads the license key from the environment variable EXPO_CI_DOCTOR_KEY or from the local key store at ~/.expo-ci-doctor/license. It makes a lightweight request to expocidoctor.dev/api/license/verify to confirm the key is valid and the subscription is active. The plan name is returned and used to gate Pro features.
If the subscription has lapsed or the key is invalid, gated commands will return an error and exit with code 3. The check command continues to work without a license.
No project data is sent during license verification. The only payload is the license key.