expo-ci-doctor logoexpo-ci-doctor
Back to home

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 activate command has been removed; use login instead

Installation

Run directly with npx, or install globally or as a project dev dependency.

Terminal
# 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-doctor

Requires 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 login

CI 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
FlagDescription
--jsonOutput results as JSON
--format=mdOutput results as Markdown
--ciNon-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
FlagDescription
--ciDisable interactive output
--ci-summaryPrint a single compact summary line
--jsonJSON output
--format=mdMarkdown output
--noiseEnable 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
FlagDescription
--ciNon-interactive, clean output
--ci-strictTreat warnings as failures (exit 1)
--ci-summarySingle-line summary for CI log output
--jsonJSON output
--format=mdMarkdown output
--upgradeInclude Upgrade Safety Report (Pro only)
--noiseApply 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=md

diff 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=md

login / 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 whoami

Feature 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 .score

Failure 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=md

CI 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 --noise

Historical 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

.github/workflows/build.yml
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-interactive

GitHub Actions — Markdown Report as PR Comment

.github/workflows/build.yml
      - 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.md

Authentication 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-summary

Example output: PASS | Score: 91 | 0 errors, 1 warning | sdk-mismatch

Exit Codes

Exit codes allow CI pipelines to gate builds based on tool output.

CodeMeaningNotes
0Passed — no errors or warningsSafe to proceed
1Warnings foundBuild may succeed; use --ci-strict to treat as failure
2Errors foundBuild likely to fail; review output before proceeding
3Tool errorUnexpected 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.

.expo-ci-doctor.json
{
  "ignore": [
    "native-module-version",
    "expo-sdk-mismatch"
  ],
  "thresholds": {
    "doctor-score": 70,
    "confidence": 65
  },
  "monorepo": {
    "root": "../..",
    "packages": ["packages/*", "apps/*"]
  },
  "output": {
    "format": "md",
    "summaryOnly": false
  }
}
FieldTypeDescription
ignorestring[]Rule IDs to suppress from output
thresholds.doctor-scorenumberMinimum score to pass (default: 60)
thresholds.confidencenumberMinimum pattern confidence to report (default: 60)
monorepo.rootstringRelative path to the monorepo root
monorepo.packagesstring[]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.

FeatureFreeStarter ($5/mo)Pro ($15/mo)
check commandYesYesYes
Build Readiness ScoreYesYes
analyze commandYesYes
doctor command (basic)YesYes
Rich Markdown outputYesYes
Monorepo supportYesYes
JSON outputYesYes
Failure PredictionYes
Upgrade Safety ReportYes
CI Noise FilterYes
Stability Trend HistoryYes
preflight commandYes
diff / snapshotsYes

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.

View pricing and plans

Starter is $5/mo. Pro is $15/mo. Cancel anytime.

See pricing