# Launch command reference > Launch wraps **211 App Store Connect & Google Play API operations** across **63 commands**, guarded by **1940 tests**. Generated from the `commander` definitions in `src/cli/` by `npm run docs:gen` — edit the commands, then regenerate. For the curated overview, install, and configuration, see the [README](../README.md). ## `launch init` scaffold launch.config.ts (and .env.example) into the current repo ## `launch adopt` onboard an app that already ships: import its App Store Connect setup into config | Flag | Description | | --- | --- | | `--all` | adopt every discovered app (the default when --app is omitted) | | `-a, --app ` | comma-separated app handles to adopt (default: all discovered apps) | | `--dry-run` | print the plan and exit, importing nothing | | `-y, --yes` | skip the confirmation prompt (for CI) | ## `launch migrate` import an existing EAS or fastlane setup into a Launch config ### `launch migrate eas` read eas.json/app.json and emit launch.config.ts, .env.example, store.config.json + a report | Flag | Description | | --- | --- | | `--force` | overwrite files that already exist | | `--dry-run` | print what would be written without writing anything | | `--out ` | write the migrated files to this directory (default: current directory) | ### `launch migrate fastlane` read fastlane config (Appfile/Fastfile/Matchfile…) and emit launch.config.ts, .env.example, store.config.json + a report | Flag | Description | | --- | --- | | `--force` | overwrite files that already exist | | `--dry-run` | print what would be written without writing anything | | `--out ` | write the migrated files to this directory (default: current directory) | ### `launch migrate help [command]` display help for command ## `launch config` work with the launch.config.ts schema — emit JSON Schema, validate a config, or print the field reference ### `launch config schema` print the JSON Schema for launch.config.ts (generated from the config types) | Flag | Description | | --- | --- | | `--out ` | write the schema to this file instead of stdout | ### `launch config validate [file]` validate a config against the schema, reporting each problem with its field path ### `launch config docs` print the launch.config.ts field reference (the same content as docs/config.md) ### `launch config help [command]` display help for command ## `launch build ` run the full pipeline and upload to the testing track (--no-submit to build only) | Flag | Description | | --- | --- | | `-p, --profile ` | build profile | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--account ` | iOS only — Apple account to build with: label or Key ID (default: active) | | `--explain` | expand each step into a plain-English teaching block | | `--no-submit` | build only; do not upload | | `--remote [target]` | iOS only — build on a remote Mac: 'aws' (default) or user@host over SSH | | `--distribution ` | store (default, TestFlight/Play) or internal (ad-hoc install link) | | `--bump ` | iOS only — version bump: patch\|minor\|major\|keep (default: last used, else prompt) or 'ask' to force the prompt | | `--track ` | Android only — Play track: internal\|closed\|open\|production (default: internal) | | `--rollout ` | Android only — staged-rollout fraction for production (default: 1.0) | | `--size-budget ` | override the profile soft size budget for this build only (MB, e.g. 250) | | `--budget ` | alias of --size-budget | | `--clean` | force a from-scratch build (default: fast incremental, clean only when native deps change) | | `--dry-run` | rehearse every step and print what it would do, changing nothing | | `-y, --yes` | skip the pre-upload size confirmation (auto-confirm) | | `-v, --verbose` | stream the full xcodebuild/gradle output instead of a progress spinner | | `--env ` | inline env override (repeatable); highest precedence | | `--include-local` | also load .env.local (off by default to avoid surprise local env) | | `--print-env` | print the resolved env (masked) with its sources, then exit without running | ## `launch release ` submit the latest build to the store's PUBLIC production track (with confirmation) | Flag | Description | | --- | --- | | `-a, --app ` | app handle | | `-p, --profile ` | build profile | | `--account ` | iOS only — Apple account label or Key ID (default: ASC_ACCOUNT, then the active account) | | `--rollout ` | Android only — staged-rollout fraction (default: 1.0) | | `--build ` | iOS only — promote an existing build number, or "latest", instead of uploading | | `--upload` | iOS only — upload the latest local build (skip the upload-vs-promote picker) | | `--no-wait` | iOS only — after uploading, return without waiting for processing/submit | | `--manual` | iOS only — hold the approved build for manual release | | `--scheduled ` | iOS only — schedule the go-live at an ISO-8601 instant | | `--phased` | iOS only — opt into Apple's 7-day phased rollout | | `--dry-run` | iOS only — print the release plan (touches nothing) and exit | | `--create-app` | iOS only — show the one-time App Store Connect setup checklist and exit | | `--explain` | expand each step | | `--env ` | inline env override (repeatable); highest precedence | | `--include-local` | also load .env.local (off by default to avoid surprise local env) | | `--print-env` | print the resolved env (masked) with its sources, then exit without running | ## `launch status` show each app's App Store version, review, and phased-rollout state | Flag | Description | | --- | --- | | `-a, --app ` | comma-separated app handles (default: all iOS apps) | | `--watch` | poll until the review reaches a terminal verdict | | `--json` | machine-readable output for CI | ## `launch open [target]` deep-link the app's App Store Connect / Play Console page in your browser | Flag | Description | | --- | --- | | `--platform ` | ios/tvos/macos/visionos (App Store Connect) or android (Play Console) | | `-a, --app ` | app handle to open (default: the first app for the platform) | ## `launch dashboard` serve a local, read-only web UI over your apps, builds, accounts, and secrets | Flag | Description | | --- | --- | | `--host ` | interface to bind | | `--port ` | port to bind | | `--json` | print the dashboard state as JSON and exit (no server) | ## `launch release-train [action] [id]` coordinate an app's iOS + Android + OTA release as one resumable record (ADR 0004) | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `-p, --profile ` | build profile whose env feeds the Android submit + OTA export | | `--platform

` | start: restrict to one native platform (ios or android) | | `--no-ota` | start: coordinate the native legs only (no OTA followers) | | `--hold` | start: hold every car until all are approved, then release together | | `--channel ` | start: OTA channel the followers publish to | | `--runtime-version ` | start: runtime version OTA followers target (default: from app config) | | `--watch` | status: poll until the train settles | | `--json` | machine-readable output for CI/agents | | `--env ` | inline env override (repeatable); highest precedence | | `--include-local` | also load .env.local (off by default to avoid surprise local env) | | `--print-env` | print the resolved env (masked) with its sources, then exit without running | ## `launch rollout ` steer an iOS phased release: pause | resume | complete | Flag | Description | | --- | --- | | `-a, --app ` | comma-separated app handles (default: all iOS apps) | ## `launch creds [action] [value] [value2]` inspect credentials, onboard/switch Apple accounts, or provision signing assets | Flag | Description | | --- | --- | | `--platform

` | ios (default), android, tvos, macos, or visionos | | `--key-id ` | iOS: App Store Connect Key ID (else read from the AuthKey_*.p8 filename) | | `--issuer-id ` | iOS: Issuer ID UUID (else ASC_ISSUER_ID, else prompted) | | `--p8 ` | iOS: path to the .p8 (else auto-discovered in ~/Downloads, else ASC_API_KEY_PATH) | | `--label ` | iOS set-key: human label for the account (else prompted, else the Key ID) | | `--account ` | iOS setup: account to provision against (label or Key ID; default: active) | | `-a, --app ` | setup: app handle to provision for (default: the only app, or prompt) | | `--import ` | Android setup: import an existing upload keystore instead of generating one | | `--alias ` | Android setup: key alias inside the imported keystore | | `--team-id ` | push-key import: Apple Team ID for the APNs key (default: active account's team) | | `--out ` | push-key export: file path to write the .p8 to | | `--force` | push-key export: overwrite the output file if it already exists | | `--yes` | non-interactive: fail instead of prompting (CI, remote, agents) | ## `launch secret [action] [name]` manage keychain-backed build secrets (set/list/rm) instead of plaintext .env | Flag | Description | | --- | --- | | `-a, --app ` | app to scope the secret to (default: the sole app, or prompt) | | `-p, --profile ` | profile to scope to (default: all profiles) | | `--value ` | set: the secret value (else prompted; required when non-interactive) | | `--yes` | non-interactive: fail instead of prompting (CI, remote, agents) | ## `launch metadata` sync the store listing (name, description, keywords, screenshots) via store.config.json ### `launch metadata pull` download the live store listing into store.config.json | Flag | Description | | --- | --- | | `--platform

` | ios (default) or android | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--config ` | path to store.config.json (default: /store.config.json) | | `--dry-run` | rehearse without contacting the store | ### `launch metadata push` upload store.config.json to the store listing (metadata only; no binary) | Flag | Description | | --- | --- | | `--platform

` | ios (default) or android | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--config ` | path to store.config.json (default: /store.config.json) | | `--dry-run` | rehearse: write the fastlane metadata folders and print the command, upload nothing | ### `launch metadata help [command]` display help for command ## `launch sync` reconcile App Store Connect products (capabilities, IAPs, subscriptions, pricing), store-listing copy, screenshots, and app previews from config | Flag | Description | | --- | --- | | `-a, --app ` | comma-separated app handles to sync (default: all apps with something to sync) | | `--dry-run` | print the plan and exit, making no changes | | `--allow-destructive` | permit destructive actions such as removing a capability | | `-y, --yes` | skip the confirmation prompt (for CI) | | `--no-snapshot` | skip the automatic pre-sync snapshot baseline | ## `launch plan [surface]` diff launch.config against live store state (read-only): capabilities, IAPs, subscriptions, pricing | Flag | Description | | --- | --- | | `-a, --app ` | comma-separated app handles (default: all apps) | | `--check` | exit 2 when drift is present (CI gate); same as `launch drift` | | `--json` | machine-readable output for CI/agents | ## `launch drift [surface]` fail when live store state has drifted from launch.config (alias for `launch plan --check`) | Flag | Description | | --- | --- | | `-a, --app ` | comma-separated app handles (default: all apps) | | `--json` | machine-readable output for CI/agents | ## `launch offers` reconcile subscription offers (codes, promo/intro/win-back) and promoted-purchase order from config | Flag | Description | | --- | --- | | `-a, --app ` | comma-separated app handles (default: all apps with offers declared) | | `--dry-run` | print the plan and exit, making no changes | | `-y, --yes` | skip the confirmation prompt (for CI) | ### `launch offers generate-codes ` generate redeemable codes under an existing offer-code campaign | Flag | Description | | --- | --- | | `-a, --app ` | app handle (default: the only app) | | `-n, --count ` | how many codes to generate | | `-e, --expires ` | expiration date (YYYY-MM-DD); required for one-time-use codes | | `--custom ` | create one shareable custom code with this value instead of one-time-use codes | ### `launch offers list ` list a subscription's offer-code campaigns and their states | Flag | Description | | --- | --- | | `-a, --app ` | app handle (default: the only app) | ### `launch offers deactivate ` deactivate an offer-code campaign (its terms can't be edited, only switched off) | Flag | Description | | --- | --- | | `-a, --app ` | app handle (default: the only app) | ## `launch ai` AI-assisted authoring for your store presence ### `launch ai listing` draft App Store / Play listing copy with AI into store.config.json (review with `launch plan`) | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--locale ` | comma-separated locales (default: existing App Store locales, else en-US) | | `--about ` | a short description of the app to seed the copy | | `--platform

` | ios (default), android, or all | | `--model ` | Anthropic model id (default: claude-sonnet-4-6 or $LAUNCH_AI_MODEL) | | `--config ` | path to store.config.json (default: /store.config.json) | | `--dry-run` | generate and preview, but write nothing | | `-y, --yes` | skip the confirmation prompt (for CI) | ### `launch ai screenshots` enhance your real screenshots into store-ready ones with genshot (review with `launch plan screenshots`) | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--brief ` | a short description of the app to steer the enhancement | | `--locale ` | comma-separated locales (default: the locales of your source screenshots, else en-US) | | `--platform

` | ios, android, or all (default) | | `--in

` | directory of real source screenshots to enhance (default: /screenshots) | | `--captions ` | comma-separated captions, one per shot (omit to let genshot write them) | | `--device-types ` | comma-separated target slots (default: the modern iPhone/iPad + Play phone set) | | `--out ` | where to promote approved screenshots (default: /screenshots) | | `--genshot-bin ` | path to the genshot CLI (default: genshot on PATH) | | `--dry-run` | enhance and preview, but promote nothing | | `-y, --yes` | skip the confirmation prompt (for CI) | ### `launch ai help [command]` display help for command ## `launch reviews` read App Store customer reviews and reply from the CLI ### `launch reviews list` list an app's customer reviews, newest first | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--rating <1-5>` | only show reviews with this star rating | | `--territory ` | only show reviews from this territory (e.g. USA) | | `--unanswered` | only show reviews without a developer response | | `--json` | output machine-readable JSON | ### `launch reviews reply ` post (or replace) the developer response to a review | Flag | Description | | --- | --- | | `-m, --message ` | the reply text | | `--file ` | read the reply text from a file | | `-y, --yes` | skip the confirmation prompt (for CI) | ### `launch reviews delete ` delete the developer response to a review | Flag | Description | | --- | --- | | `-y, --yes` | skip the confirmation prompt (for CI) | ### `launch reviews help [command]` display help for command ## `launch reports` download App Store Connect sales, finance & analytics reports ### `launch reports sales` download a Sales & Trends report (gzipped TSV) | Flag | Description | | --- | --- | | `--vendor-number ` | vendor number (or set ASC_VENDOR_NUMBER) | | `--date ` | report date; format follows --frequency (e.g. 2026-06-01 for DAILY) | | `--from ` | start of a DAILY date range (with --to) | | `--to ` | end of a DAILY date range (with --from) | | `--frequency ` | DAILY \| WEEKLY \| MONTHLY \| YEARLY | | `--report-type ` | SALES \| SUBSCRIPTION \| SUBSCRIBER \| … | | `--sub-type ` | SUMMARY \| DETAILED | | `--out ` | directory to write the report(s) into | | `--json` | parse the TSV and write JSON instead of the raw .tsv | ### `launch reports finance` download a Finance report for a fiscal period (gzipped TSV) | Flag | Description | | --- | --- | | `--vendor-number ` | vendor number (or set ASC_VENDOR_NUMBER) | | `--date ` | fiscal period, e.g. 2026-05 | | `--region ` | region code: ZZ (all) or a specific one like US | | `--report-type ` | FINANCE_DETAIL \| FINANCIAL | | `--out ` | directory to write the report into | | `--json` | parse the TSV and write JSON instead of the raw .tsv | ### `launch reports analytics` request + download App Store Connect Analytics reports | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--access-type ` | ONGOING \| ONE_TIME_SNAPSHOT | | `--category ` | APP_USAGE \| APP_STORE_ENGAGEMENT \| COMMERCE \| FRAMEWORK_USAGE \| PERFORMANCE | | `--name ` | filter to one report by exact name | | `--granularity ` | DAILY \| WEEKLY \| MONTHLY | | `--date ` | limit to instances covering this processing date | | `--out ` | directory to write the report(s) into | ### `launch reports help [command]` display help for command ## `launch insights` aggregate rating & review trends across the App Store and Play (read-only) | Flag | Description | | --- | --- | | `-a, --app ` | comma-separated app handles (default: all apps) | | `--json` | machine-readable output for CI/agents | ## `launch team` read and manage the App Store Connect team (members & invitations) from the CLI ### `launch team list` list team members and pending invitations | Flag | Description | | --- | --- | | `--json` | output machine-readable JSON | ### `launch team invite ` invite a new team member by email | Flag | Description | | --- | --- | | `--first ` | the invitee's first name | | `--last ` | the invitee's last name | | `--role ` | comma-separated roles (e.g. DEVELOPER,APP_MANAGER) | | `--provisioning` | allow the member to create signing assets | | `-y, --yes` | skip the confirmation prompt (for CI) | ### `launch team remove ` remove a team member or cancel a pending invitation, by email | Flag | Description | | --- | --- | | `-y, --yes` | skip the confirmation prompt (for CI) | ### `launch team help [command]` display help for command ## `launch release-config` reconcile App Store release attributes (age rating, categories, price, review details) from release.config.json | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--config ` | path to the release config file | | `--dry-run` | print the plan and exit, making no changes | | `-y, --yes` | skip the confirmation prompt (for CI) | ## `launch app-clips` reconcile App Clip card metadata (action, per-locale subtitle) from appclips.config.json | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--config ` | path to the App Clips config file | | `--dry-run` | print the plan and exit, making no changes | | `-y, --yes` | skip the confirmation prompt (for CI) | ## `launch eu-distribution` authorize EU alternative-distribution domains from eu-distribution.config.json (DMA) | Flag | Description | | --- | --- | | `--config ` | path to the EU distribution config file | | `--dry-run` | print the plan and exit, making no changes | | `-y, --yes` | skip the confirmation prompt (for CI) | ### `launch eu-distribution set-key ` register the team's package-signing public key (the public half — a plain .pem file) ### `launch eu-distribution list` show the team's authorized distribution domains and whether a key is registered ## `launch wallet` register Apple Pay merchant ids & Wallet pass type ids from wallet.config.json | Flag | Description | | --- | --- | | `--config ` | path to the wallet config file | | `--dry-run` | print the plan and exit, making no changes | | `-y, --yes` | skip the confirmation prompt (for CI) | ### `launch wallet list` show the team's registered Apple Pay merchant ids and Wallet pass type ids ## `launch game-center` reconcile Game Center achievements & leaderboards from gamecenter.config.json | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--config ` | path to the Game Center config file | | `--dry-run` | print the plan and exit, making no changes | | `-y, --yes` | skip the confirmation prompt (for CI) | ## `launch accessibility` reconcile accessibility declarations (nutrition labels) from accessibility.config.json | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--config ` | path to the accessibility config file | | `--dry-run` | print the plan and exit, making no changes | | `-y, --yes` | skip the confirmation prompt (for CI) | ## `launch availability` set the App Store territories the app sells in, from availability.config.json | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--config ` | path to the availability config file | | `--dry-run` | print the plan and exit, making no changes | | `-y, --yes` | skip the confirmation prompt (for CI) | ## `launch custom-pages` reconcile custom product pages (alternate listings) from custom-pages.config.json | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--config ` | path to the custom pages config file | | `--dry-run` | print the plan and exit, making no changes | | `-y, --yes` | skip the confirmation prompt (for CI) | ## `launch experiments` reconcile product-page A/B experiments from experiments.config.json | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--config ` | path to the experiments config file | | `--dry-run` | print the plan and exit, making no changes | | `-y, --yes` | skip the confirmation prompt (for CI) | ## `launch play-products` reconcile Google Play in-app products from the launch.config.ts product catalog | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--dry-run` | print the plan and exit, making no changes | | `-y, --yes` | skip the confirmation prompt (for CI) | ## `launch play-subscriptions` reconcile Google Play subscriptions (base plans + offers) from the launch.config.ts catalog | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--dry-run` | print the plan and exit, making no changes | | `-y, --yes` | skip the confirmation prompt (for CI) | ## `launch play-reviews` read Google Play customer reviews and reply from the CLI ### `launch play-reviews list` list an app's Play reviews (only reviews with text from the last ~week) | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--rating <1-5>` | only show reviews with this star rating | | `--unanswered` | only show reviews without a developer reply | | `--lang ` | machine-translate review text into this language (e.g. en-US) | | `--json` | output machine-readable JSON | ### `launch play-reviews reply ` post (or replace) the developer reply to a review | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `-m, --message ` | the reply text | | `--file ` | read the reply text from a file | | `-y, --yes` | skip the confirmation prompt (for CI) | ### `launch play-reviews help [command]` display help for command ## `launch play-tracks` manage Google Play release tracks from the CLI ### `launch play-tracks status` show each track's releases and country availability | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--json` | output machine-readable JSON | ### `launch play-tracks promote` ship a build to a track at a chosen status / rollout, with release notes | Flag | Description | | --- | --- | | `--track ` | target track (internal, alpha, beta, production, or a custom track) | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--status ` | release status: draft, inProgress, halted, completed (default: completed, or inProgress with --rollout) | | `--rollout ` | staged-rollout fraction 0–1 (implies --status inProgress) | | `--notes ` | path to a JSON file mapping language codes to release-note text | | `--name ` | release name (Play derives one from the version when omitted) | | `-y, --yes` | skip the confirmation prompt (for CI) | ### `launch play-tracks testers` read or set the Google Groups allowed to test a track | Flag | Description | | --- | --- | | `--track ` | the testing track (e.g. internal, alpha, beta) | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--groups ` | comma-separated Google Group emails to set (omit to just read) | | `-y, --yes` | skip the confirmation prompt (for CI) | ### `launch play-tracks help [command]` display help for command ## `launch play-reports` read Android quality vitals (crash/ANR rate) from the Play Developer Reporting API ### `launch play-reports vitals` show crash-rate and ANR-rate trends for an Android app (DAILY) | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--metric ` | show only one vital (default: both) | | `--days ` | how many days of history to show (default: 28) | | `--json` | output machine-readable JSON | ### `launch play-reports help [command]` display help for command ## `launch play-pricing` compute recommended Google Play prices for every region from one base price ### `launch play-pricing localize ` show Google's recommended local price for every Play market, from one base price | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `-c, --currency ` | ISO-4217 currency of | | `--json` | output machine-readable JSON | ### `launch play-pricing help [command]` display help for command ## `launch device` manage iOS devices for ad-hoc (internal) distribution ### `launch device add [name]` register a device UDID so internal builds can install on it ### `launch device list` list the devices registered for ad-hoc distribution ### `launch device help [command]` display help for command ## `launch testflight` manage TestFlight beta groups and testers ### `launch testflight groups` list the app's TestFlight beta groups | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | ### `launch testflight create-group ` create an external beta group testers can be invited into | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | ### `launch testflight testers` list the testers in a beta group | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `-g, --group ` | beta group (auto-selected if there's only one) | ### `launch testflight add [emails...]` invite/add testers to a beta group (sends a TestFlight invite to new emails) | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `-g, --group ` | external beta group to add into (auto-selected if there's only one) | | `--first ` | first name applied to bare emails | | `--last ` | last name applied to bare emails | | `--csv ` | import testers from a CSV (email,firstName,lastName per line) | | `--dry-run` | report what would change without inviting anyone | | `-y, --yes` | skip the confirmation prompt | ### `launch testflight rm ` remove testers from a beta group | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `-g, --group ` | beta group to remove from (auto-selected if there's only one) | | `--dry-run` | report what would change without removing anyone | | `-y, --yes` | skip the confirmation prompt | ### `launch testflight release` set a build's "What to Test" notes and submit it for Beta App Review | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--build ` | target build by CFBundleVersion (default: the latest valid build) | | `--whats-new ` | What to Test notes (for --locale); overrides the config file | | `--locale ` | locale for --whats-new | | `--config ` | path to testflight.config.json (localized whatToTest) | | `--no-review` | set the notes only; don't submit for Beta App Review | | `--dry-run` | print the plan and exit, making no changes | | `-y, --yes` | skip the confirmation prompt (for CI) | ### `launch testflight feedback` list tester crash & screenshot feedback, newest first (download attachments with --out) | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--build ` | only show feedback for this build (CFBundleVersion) | | `--type ` | only show one kind: crash \| screenshot | | `--out ` | download screenshot attachments into this directory | | `--json` | output machine-readable JSON | ### `launch testflight help [command]` display help for command ## `launch events` read and manage App Store in-app events from the CLI ### `launch events list` list an app's in-app events and their localizations | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--json` | output machine-readable JSON | ### `launch events create ` create a draft in-app event | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--badge ` | event badge (e.g. LIVE_EVENT, PREMIERE, CHALLENGE) | | `--locale ` | primary locale (e.g. en-US) | | `--deep-link ` | deep link opened when a user taps the event | | `--priority ` | HIGH or NORMAL | | `--purpose ` | marketing purpose (e.g. ATTRACT_NEW_USERS) | ### `launch events localize ` set (or update) one locale's copy on an event | Flag | Description | | --- | --- | | `--locale ` | the locale to set (e.g. en-US) | | `--name ` | the event name shown to users | | `--short ` | the short description | | `--long ` | the long description | ### `launch events delete ` delete a draft in-app event | Flag | Description | | --- | --- | | `-y, --yes` | skip the confirmation prompt (for CI) | ### `launch events help [command]` display help for command ## `launch setup` set Launch up automatically and verify everything's ready to ship | Flag | Description | | --- | --- | | `--platform

` | ios (default), android, tvos, macos, or visionos | | `--yes` | non-interactive: install missing tools without asking (CI/agents) | | `--no-rehearse` | skip the dry-run pipeline rehearsal at the end | ### `launch setup ios` report iOS signing & provisioning status (account, App ID, capabilities, cert, profile, devices) | Flag | Description | | --- | --- | | `--account ` | Apple account to inspect (label or Key ID; default: active) | | `-a, --app ` | which app to inspect (default: the only app, or prompt) | | `--provision` | also ensure the distribution cert + App Store profile (like 'launch creds setup') | | `--json` | emit the report as JSON (for agents/scripts) | | `--yes` | non-interactive: auto-confirm Apple resource creation under --provision | ## `launch sandbox` list StoreKit sandbox testers and clear their purchase history ### `launch sandbox list` list the account's sandbox testers | Flag | Description | | --- | --- | | `--json` | output machine-readable JSON | ### `launch sandbox clear [emails...]` clear sandbox testers' StoreKit purchase history (for re-testing purchases) | Flag | Description | | --- | --- | | `--all` | clear every sandbox tester's purchase history | | `-y, --yes` | skip the confirmation prompt (for CI) | ### `launch sandbox help [command]` display help for command ## `launch doctor` check that the local toolchain and store account are ready | Flag | Description | | --- | --- | | `--platform

` | ios (default), android, tvos, macos, or visionos | | `-a, --app ` | comma-separated app handles (default: all apps) | | `--fix` | install any missing build tools (Apple platforms only; asks for consent first) | | `--yes` | skip prompts and proceed with installs (CI/agents) | | `--json` | machine-readable output for CI/agents | ## `launch store` store-account readiness and operations ### `launch store doctor` check store-account readiness: Apple app record, Play onboarding & access (read-only) | Flag | Description | | --- | --- | | `-a, --app ` | comma-separated app handles (default: all apps) | | `--json` | machine-readable output for CI/agents | ### `launch store help [command]` display help for command ## `launch audit` pre-submit readiness sweep: would a submission be rejected right now? (read-only) | Flag | Description | | --- | --- | | `-a, --app ` | comma-separated app handles (default: all apps) | | `--json` | machine-readable output for CI/agents | ## `launch privacy` reconcile your permission/data surface against your privacy declarations ### `launch privacy scan` check permissions/manifests against the privacy declarations; flags undeclared collection (read-only) | Flag | Description | | --- | --- | | `-a, --app ` | comma-separated app handles (default: all apps) | | `--json` | machine-readable output for CI/agents | ### `launch privacy help [command]` display help for command ## `launch iap` in-app-purchase readiness and operations ### `launch iap doctor` check in-app-purchase readiness: products & subscriptions exist and are submittable (read-only) | Flag | Description | | --- | --- | | `-a, --app ` | comma-separated app handles (default: all apps) | | `--json` | machine-readable output for CI/agents | ### `launch iap help [command]` display help for command ## `launch snapshot` capture, diff, and export point-in-time copies of live store state (read-only) ### `launch snapshot create [name]` capture live App Store + Play state into a named snapshot | Flag | Description | | --- | --- | | `-a, --app ` | comma-separated app handles (default: all apps) | | `--json` | machine-readable output for CI/agents | ### `launch snapshot list` list saved snapshots, newest first | Flag | Description | | --- | --- | | `--json` | machine-readable output for CI/agents | ### `launch snapshot diff [against]` compare a saved snapshot against another saved snapshot or live state (default: live) | Flag | Description | | --- | --- | | `-a, --app ` | comma-separated app handles (default: all apps) | | `--json` | machine-readable output for CI/agents | ### `launch snapshot export ` print a saved snapshot as JSON, or write it to a file with --out | Flag | Description | | --- | --- | | `--out ` | write the snapshot JSON to this file instead of stdout | ### `launch snapshot delete ` delete a saved snapshot by name | Flag | Description | | --- | --- | | `--json` | machine-readable output for CI/agents | ### `launch snapshot prune` delete old user snapshots by count and/or age (auto pre-sync baselines are never touched) | Flag | Description | | --- | --- | | `--keep ` | keep only the N newest snapshots | | `--older-than ` | delete snapshots older than N days | | `--yes` | actually delete (without it, a dry-run preview is shown) | | `--json` | machine-readable output for CI/agents | ### `launch snapshot restore ` restore a saved snapshot's App Store listing + Play catalog back to live (additive; --yes to apply) | Flag | Description | | --- | --- | | `-a, --app ` | comma-separated app handles (default: all apps) | | `--source ` | restore only this source (e.g. apple-listing) | | `--yes` | actually apply the restore (without it, a dry-run plan is shown) | | `--json` | machine-readable output for CI/agents | ### `launch snapshot help [command]` display help for command ## `launch explain [topic]` plain-English glossary for an Apple/iOS term (csr, app-record, provisioning-profile, …) ## `launch completion [shell]` shell tab-completion for commands, flags, app handles, profiles, surfaces, and snapshots ### `launch completion install` wire completion into your shell's rc file (idempotent), or print the manual step | Flag | Description | | --- | --- | | `-s, --shell ` | shell to wire up: bash \| zsh \| fish (default: $SHELL) | ## `launch update` publish an over-the-air JS update (Expo Updates protocol) to your own bucket | Flag | Description | | --- | --- | | `--channel ` | release channel testers/builds map to | | `--platform

` | ios, android, or all | | `-a, --app ` | app handle (auto-selected if there's only one) | | `-p, --profile ` | build profile whose env is baked into the bundle | | `--runtime-version ` | runtime version this update targets (default: from app config) | | `--no-sign` | publish unsigned (lower security floor — anyone who can write the bucket can push JS) | | `--dry-run` | rehearse: print the layout, worker, and app config without exporting or uploading | | `--env ` | inline env override (repeatable); highest precedence | | `--include-local` | also load .env.local (off by default to avoid surprise local env) | | `--print-env` | print the resolved env (masked) with its sources, then exit without running | ## `launch updates` inspect and roll back published OTA updates ### `launch updates list` list published updates, newest first | Flag | Description | | --- | --- | | `--channel ` | release channel to read | | `--platform ` | only show ios or android updates | | `--runtime-version ` | only show updates for this runtime version | | `--json` | output machine-readable JSON | ### `launch updates view ` show full detail for one published update | Flag | Description | | --- | --- | | `--channel ` | release channel to read | | `--json` | output machine-readable JSON | ### `launch updates rollback` republish a prior update, or roll clients back to the embedded bundle | Flag | Description | | --- | --- | | `--channel ` | release channel to roll back | | `--platform ` | limit to ios or android (default: both) | | `--to ` | republish a specific update id (skips the picker) | | `--to-embedded` | roll clients back to the bundle embedded in the binary | | `--runtime-version ` | runtime version for --to-embedded (default: from app config) | | `-a, --app ` | app handle (used to resolve the runtime version for --to-embedded) | | `-y, --yes` | skip the confirmation prompt (for CI/agents) | ### `launch updates help [command]` display help for command ## `launch cloud [action]` manage the remote AWS EC2 Mac build host (setup | status | teardown | doctor) ## `launch demo [platform]` replay the simulated walkthrough of the build → sign → submit pipeline ## `launch builds` inspect and trim local build history (the artifact index) ### `launch builds list` list past builds, newest first | Flag | Description | | --- | --- | | `-a, --app ` | only show builds for this app | | `--platform ` | only show builds for one platform (ios/android/tvos/macos/visionos) | | `--json` | output machine-readable JSON | ### `launch builds view ` show full detail for one build | Flag | Description | | --- | --- | | `--json` | output machine-readable JSON | ### `launch builds log ` print a past build's full native log (secrets redacted), or open it in your editor | Flag | Description | | --- | --- | | `--open` | reveal the log in your editor / OS viewer instead of printing it | ### `launch builds prune` delete build binaries older than the retention window (keeps the newest per app+platform) | Flag | Description | | --- | --- | | `--days ` | retention window in days (default: config artifactRetentionDays, else 30) | | `-a, --app ` | only prune builds for this app | | `--platform ` | only prune builds for one platform (ios/android/tvos/macos/visionos) | | `--dry-run` | show what would be deleted without deleting | | `-y, --yes` | skip the confirmation prompt (for CI) | | `--json` | output machine-readable JSON | ### `launch builds help [command]` display help for command ## `launch ci` scaffold CI workflows for building & shipping Launch apps ### `launch ci init` write a GitHub Actions workflow that builds and ships on a hosted runner | Flag | Description | | --- | --- | | `--android` | also emit an Android job (Ubuntu runner) | | `--force` | overwrite an existing .github/workflows/launch.yml | ### `launch ci help [command]` display help for command ## `launch agents` scaffold agent skills/rules (Claude, Cursor, Codex) so coding agents can drive Launch ### `launch agents init` write Claude skills, Cursor rules, and the AGENTS.md Launch section into this repo | Flag | Description | | --- | --- | | `--agent ` | claude \| cursor \| codex \| all (comma-separated; default: auto-detect) | | `-y, --yes` | non-interactive: skip the confirmation prompt (CI, agents) | ### `launch agents check` verify the scaffolded agent files are in sync with the installed Launch | Flag | Description | | --- | --- | | `--agent ` | claude \| cursor \| codex \| all (comma-separated; default: auto-detect) | ## `launch mcp` serve Launch's read-only tools to AI agents over MCP (stdio); `install` wires it into a client ### `launch mcp install` wire `launch mcp` into an AI client's config (default: auto-detect Claude Code / Cursor) | Flag | Description | | --- | --- | | `--client ` | claude-code \| cursor \| claude-desktop (default: auto-detect) | ## `launch run [id|latest]` install a built artifact on a connected device (iOS device or Android device/emulator) | Flag | Description | | --- | --- | | `-d, --device ` | target device: an Android serial (adb) or an iOS device id (devicectl) | ## `launch fingerprint` show the native fingerprint and why the next build is clean or incremental (iOS) | Flag | Description | | --- | --- | | `-a, --app ` | app handle (auto-selected if there's only one) | | `--json` | output machine-readable JSON | ## `launch diagnose [logfile]` explain a failed native build — parse the cause + fix from a build log ## `launch build:resign` re-sign a stored build with different credentials, without rebuilding | Flag | Description | | --- | --- | | `--id ` | a build id from `launch builds list` (defaults to the latest) | | `--latest` | re-sign the most recent build (the default) | | `-a, --app ` | only consider builds for this app | | `--account ` | iOS: the Apple account whose signing assets to use (defaults to active) | | `-o, --output ` | where to write the resigned artifact (defaults to the current directory) | | `--dry-run` | print the resign plan and change nothing |