appuploader-cli command-line tool

Let AI handle every step
of your App Store release

appuploader-cli covers every step of iOS app submission, and it is built for AI agents and CI pipelines. Certificates, provisioning profiles, app records, IPA upload, metadata, screenshots, App Review and TestFlight are each one command.

  • No Mac and no Xcode. Runs on Windows, Linux and macOS
  • One release runs the whole pipeline and resumes where it failed
  • Ships a skill file for Claude Code, Codex and other AI agents
~/MyApp
appuploader-cli release
[1/14] preflight: ok
[2/14] bundle: skipped
[3/14] certs: reused
[4/14] profiles: reused
[5/14] app: skipped
[6/14] version: ok
[7/14] upload: ok
[8/14] metadata: ok
[9/14] screenshots: ok
[10/14] build-wait: ok
[11/14] compliance: ok
[12/14] review-info: ok
[13/14] submit: ok
[14/14] testflight: ok
release finished; release type is MANUAL: once App Review approves it, publish it yourself with `appuploader-cli version publish 1.4.0`

Three ways to use it, one set of commands

Hand it to an AI agent, plug it into CI, or run it yourself. Accounts and data are shared with the AppUploader app, so an account you signed in there works on the command line too.

Install the skill file and release in plain language

One command writes a skill file for your AI agent. It covers the usage rules, exit codes and retry policy, common workflows and the full command index, so the agent knows how to call the tool safely.

  • skill --install user installs it for Claude Code in every project
  • skill --install project installs it for the current project only
  • skill --format agents writes instructions for Codex and other agents
  • Regenerate it after upgrading so it always matches the tool version
Release the IPA in the build folder as 1.4.0. Do a dry run first and show me.
Sure. I'll check the account and config, then dry-run the pipeline. Both steps are read-only and change nothing.
Commands the agent runs
appuploader-cli skill --install user
appuploader-cli doctor --for-release --json
appuploader-cli release --dry-run --json
# after you approve the dry run
appuploader-cli release --json --yes

Works with GitHub Actions, Jenkins and GitLab CI

In CI, sign in with an Apple ID and an app-specific password. Two-factor authentication never comes up and every feature works. Credentials are read only from environment variables, and the project config holds no secrets, so it is safe to commit.

  • With the Apple ID and app-specific password variables set, there is no need to run login first
  • In --json mode every step prints one JSON line for your pipeline to parse
  • Failures return stable exit codes that tell you whether to retry
  • Linux, Windows and macOS runners all work
.github/workflows/release.yml
jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      # install AppUploader; appuploader-cli is in its install folder
      # your existing build steps produce the IPA
      - name: Release to the App Store
        env:
          APPUPLOADER_APPLE_ID: ${{ secrets.APPLE_ID }}
          APPUPLOADER_PASSWORD: ${{ secrets.APP_SPECIFIC_PASSWORD }}
        run: appuploader-cli release --json --yes

Up and running in five minutes

Generate an appuploader.yaml in your app project. It describes the app, its signing assets, the version and where the metadata lives. Then three commands check, rehearse and release.

  • init --from-app exports your live metadata so you can keep it in git
  • --dry-run is read-only and reports what each step would do
  • Every command has --help with examples
Terminal
# 1. Sign in with your Apple ID and an app-specific password, no two-factor prompt
APPLE_PW='xxxx-xxxx-xxxx-xxxx' appuploader-cli login --apple-id dev@example.com --password-env APPLE_PW

# 2. Generate the project config in your app folder and edit it
appuploader-cli init --bundle-id com.example.app --name "My App"

# 3. Check, dry-run, release
appuploader-cli doctor --for-release
appuploader-cli release --dry-run
appuploader-cli release

Guardrails built for AI

Letting an AI work on your developer account is risky if it misreads results, breaks things on a rerun or deletes something by accident. appuploader-cli is designed to prevent all three.

Results are easy to read

Every command supports --json with a fixed structure. Errors carry stable codes and exit codes. Progress goes to stderr and results go to stdout.

Safe to run twice

Every create is idempotent. If something already exists the result says created: false instead of failing, so two runs end the same as one.

No secrets on the command line

There are no plain-text password flags. Credentials come from environment variables, the project config or a signed-in account, so they never land in shell history or AI transcripts.

Destructive actions need consent

Deleting, revoking and withdrawing require --yes outside a terminal, so an agent cannot remove a certificate or pull a submission without you knowing.

You decide when to publish

The pipeline stops at App Review. Publishing an approved version is your own step, needs the exact version number and asks once more before it runs.

Failures say what to do next

A failed result says whether it can be retried and includes the next command to copy and run. The agent does not have to guess.

One release runs the whole submission

Progress is saved after every step. If a run fails, run the same command again and it picks up at the failed step.

preflightbundlecertsprofilesappversionuploadmetadatascreenshotscustom-pagesbuild-waitcompliancereview-infogamecenteriappricingprivacysubmittestflight

Dashed steps run only when the project config includes them

Failures are easy to recover from

  • Every step is repeatable: existing records are skipped, valid certificates are reused and uploaded builds are not uploaded again
  • --dry-run rehearses the whole pipeline without writing anything
  • --from, --to, --skip and --only trim the steps to run
  • Steps an API Key cannot do, such as creating the app, pricing and privacy labels, switch to the Apple ID account you name
A failure in --json mode
{"event":"step","step":"upload","status":"failed",
 "retryable":true,
 "next_action":"appuploader-cli release --from upload"}
{"event":"result","ok":false,"failed_step":"upload"}

Everything it can do

Every part of an iOS release, from signing to App Review, has a command. Here they are by task.

Signing

Works with a free Apple ID

  • bundleBundle IDs and capabilities, adds what is missing
  • certIssues certificates, reuses valid ones
  • deviceTest devices, with bulk import
  • profileProvisioning profiles, rebuilt when expired
  • signingPrepares every signing asset from the config

Apps and versions

Your App Store Connect records

  • appView and create apps
  • versionCreate versions, publish manually
  • buildUpload IPAs and wait for processing
  • metadataImport and export metadata, with AI translation
  • app ratingsCustomer ratings and reviews

Assets and product pages

Up to date with Apple's new asset library

  • screenshotScreenshots sorted by pixel size
  • previewApp preview videos
  • assetAsset library, upload once and reuse
  • custom-pageCustom product pages
  • page-testProduct page A/B tests

Review and distribution

Submit, withdraw, TestFlight

  • reviewSubmit, withdraw and fill in review info
  • testflightDistribute builds, manage groups and testers
  • build complianceAnswer export compliance
  • game-centerSync leaderboards and their localized names

In-app purchases, pricing, privacy

Needed before the first submission

  • iapIn-app purchases, pricing and metadata
  • pricingApp price and availability
  • privacyPrivacy labels
  • agreementView and accept Apple agreements

Accounts and tooling

Three account types, one config

  • loginApp-specific password, API Key or free Apple ID
  • api-key createIssue yourself an API Key with an Apple ID
  • initand doctorGenerate config, read-only health check
  • skillGenerate the AI skill file
  • account and teamSwitch between accounts and teams

Run appuploader-cli <command> --help for every flag and example.

Ready for Apple's new asset library

Since October 2026, Apple's asset library replaces screenshot sets grouped by device. The items below can only be done through the asset library, and appuploader-cli supports all of them.

Upload an image once, place it on any page and language

  • iPhone Duo screenshots and previews: detected by pixel size on upload
  • Header and search result artwork: creative assets on the product page and in search, from iOS 27
  • Custom product pages: start from the current version's page and submit them with the version
  • Product page tests: A/B test icons and screenshots with a traffic split
  • Files with the same name and size are reused, and wrong sizes are rejected before anything is written
From April 2027, Apple requires iPhone Duo screenshots for every submission. AppUploader already supports them.
Asset library
# Apple's live sizes and limits
appuploader-cli asset specs --type screenshot --group IPHONE_DUO_PROFILE

# replace the Duo screenshots for a language with this folder
appuploader-cli asset place --locale en-US ./duo/

# new custom product page from the current version, with header art
appuploader-cli custom-page create "Spring" --from-version
appuploader-cli custom-page place Spring --locale en-US --type header header.png

# product page test on 30% of traffic
appuploader-cli page-test create "Icon test" --traffic 30 --treatment B

FAQ

Where is appuploader-cli? Do I download it separately?

No separate download. It ships with the AppUploader app:

On macOS it is AppUploader.app/Contents/Resources/appuploader-cli. On Windows it is appuploader-cli.exe next to the app. On Linux it is appuploader-cli next to the app.

Which AI agents does it support?

Claude Code can install the skill file directly. For Codex and other agents that read AGENTS.md, append the output of skill --format agents. Any agent that runs terminal commands can follow the skill file's rules and call it with --json --yes.

What about two-factor authentication?

In a terminal it prompts for the code. Scripts and agents can pass --2fa-code, or use --2fa-from-file so the login process waits for another process to write the code.

Sign in with an app-specific password instead and two-factor authentication never comes up.

Is it paid?

appuploader-cli is part of AppUploader and uses your AppUploader license. No separate license is needed. See pricing.

How should I sign in?

Use your Apple ID with an app-specific password. It never triggers two-factor authentication, every feature works, and it can be revoked on its own at any time.

To generate one, sign in to account.apple.com with your Apple ID, open "App-Specific Passwords" under "Sign-In and Security" and generate one. It is shown only once, so save it right away.

What if release fails halfway?

Run the next command shown in the output, which is usually release --from plus the failed step. Finished steps are skipped or reused, so nothing is created or uploaded twice.

Let AI ship your next version

Download AppUploader. appuploader-cli is already in the install folder.