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.
release runs the whole pipeline and resumes where it failedappuploader-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`
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.
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 projectskill --install project installs it for the current project onlyskill --format agents writes instructions for Codex and other agentsappuploader-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
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.
login first--json mode every step prints one JSON line for your pipeline to parsejobs: 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
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--help with examples# 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
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.
Every command supports --json with a fixed structure. Errors carry stable codes and exit codes. Progress goes to stderr and results go to stdout.
Every create is idempotent. If something already exists the result says created: false instead of failing, so two runs end the same as one.
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.
Deleting, revoking and withdrawing require --yes outside a terminal, so an agent cannot remove a certificate or pull a submission without you knowing.
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.
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.
Progress is saved after every step. If a run fails, run the same command again and it picks up at the failed step.
Dashed steps run only when the project config includes them
--dry-run rehearses the whole pipeline without writing anything--from, --to, --skip and --only trim the steps to run{"event":"step","step":"upload","status":"failed",
"retryable":true,
"next_action":"appuploader-cli release --from upload"}
{"event":"result","ok":false,"failed_step":"upload"}
Every part of an iOS release, from signing to App Review, has a command. Here they are by task.
Works with a free Apple ID
bundleBundle IDs and capabilities, adds what is missingcertIssues certificates, reuses valid onesdeviceTest devices, with bulk importprofileProvisioning profiles, rebuilt when expiredsigningPrepares every signing asset from the configYour App Store Connect records
appView and create appsversionCreate versions, publish manuallybuildUpload IPAs and wait for processingmetadataImport and export metadata, with AI translationapp ratingsCustomer ratings and reviewsUp to date with Apple's new asset library
screenshotScreenshots sorted by pixel sizepreviewApp preview videosassetAsset library, upload once and reusecustom-pageCustom product pagespage-testProduct page A/B testsSubmit, withdraw, TestFlight
reviewSubmit, withdraw and fill in review infotestflightDistribute builds, manage groups and testersbuild complianceAnswer export compliancegame-centerSync leaderboards and their localized namesNeeded before the first submission
iapIn-app purchases, pricing and metadatapricingApp price and availabilityprivacyPrivacy labelsagreementView and accept Apple agreementsThree account types, one config
loginApp-specific password, API Key or free Apple IDapi-key createIssue yourself an API Key with an Apple IDinitand doctorGenerate config, read-only health checkskillGenerate the AI skill fileaccount and teamSwitch between accounts and teamsRun appuploader-cli <command> --help for every flag and example.
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.
# 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
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.
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.
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.
appuploader-cli is part of AppUploader and uses your AppUploader license. No separate license is needed. See pricing.
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.
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.
Download AppUploader. appuploader-cli is already in the install folder.