asc is a Python 3.9+ CLI for routine App Store Connect release work. Use it from the terminal or its local Web UI to manage localized store content, in-app purchases, Xcode builds, and releases across multiple apps.
- Upload localized metadata, keywords, store URLs, and screenshots
- Create or update in-app purchases and auto-renewable subscriptions from JSON
- Upload missing IAP and subscription review screenshots
- Update What's New text, with optional LLM-assisted translation
- Build Xcode projects, export
.ipafiles, and upload builds to App Store Connect for TestFlight or App Store distribution - Manage multiple App Profiles with project-local defaults
- Run common workflows from a local Web UI with persistent task history and Webhook notifications
- Protect state-changing operations with machine, network, and credential Guard checks
- Python 3.9 or later
- An App Store Connect API key with the App Manager role or higher
- The key's Issuer ID, Key ID,
.p8private key, and the app's numeric Apple ID - macOS with Xcode command line tools for
build,deploy, andrelease
Metadata, screenshot, IAP, and Web UI workflows can run on Linux and Windows. Apple allows each .p8 private key to be downloaded only once, so store it securely.
The repository installer selects a supported installation method and configures the asc command on your PATH:
curl -fL --retry 5 --connect-timeout 20 \
-o /tmp/asc-install.sh \
https://raw.githubusercontent.com/yinghuiwang/AppStoreTools/main/install.sh
bash /tmp/asc-install.shAlternatively, install the published package or the latest source:
python -m pip install asc-appstore-tools
# or
python -m pip install git+https://github.com/yinghuiwang/AppStoreTools.gitRun the guided setup from your Xcode project. It checks the environment and helps create or import an App Profile:
cd /path/to/MyXcodeProject
asc installFor manual setup, use asc init to scaffold AppStore/ data or asc app add myapp to create a profile. Profiles and copied private keys are stored outside the project under ~/.config/asc/.
Verify credentials and preview the default metadata and screenshot upload before changing App Store Connect:
asc check
asc upload --dry-runUse asc --app myapp <command> to select a profile explicitly, or set one once with asc app default myapp.
# An imported asc init profile points to AppStore/data/appstore_info.csv
asc metadata --dry-run
# The same profile points to AppStore/data/screenshots/
asc screenshots --dry-runSee Metadata & Screenshots for the CSV columns, locale folders, supported display types, and upload behavior.
asc iap --iap-file AppStore/data/iap_packages.json --dry-run
asc iap --iap-file AppStore/data/iap_packages.json --update-existing
# Find products missing a review image and upload configured defaults
asc iap-screenshots --iap-file AppStore/data/iap_packages.json --dry-runStart from the current template generated by asc init at AppStore/data/iap_packages.json. A repository checkout also contains sample data at data/iap_packages.json. See IAP & Subscriptions for the schema and update rules.
asc whats-new --text "Bug fixes and performance improvements." --dry-run
# Translate one source text to the app's other locales through an OpenAI-compatible API
asc whats-new --text "Bug fixes and performance improvements." \
--translate --source-locale en-US --dry-run
asc set-support-url --text "https://example.com/support" --dry-run
asc set-marketing-url --text "https://example.com" --dry-run
asc set-privacy-policy-url --text "https://example.com/privacy" --dry-runLLM settings are managed from the Web UI or ~/.config/asc/llm.toml; OPENAI_API_KEY is also supported. File-based release notes and locale selection are covered in What's New & Store URLs.
asc build --dry-run
asc --app myapp deploy --ipa build/export/MyApp.ipa --dry-run
asc --app myapp release --destination testflight --dry-runasc build and asc release can discover the Xcode project, scheme, bundle ID, signing certificate, and provisioning profile, then cache resolved values in .asc/config.toml. See Build & Deploy for signing and App Store release options.
asc web
asc web status
asc web stopThe Web UI opens at http://127.0.0.1:8080 by default. It exposes the main upload and release workflows, keeps task history in ~/.config/asc/tasks.db, and can send completion notifications to Feishu, WeCom, or DingTalk from its settings page.
Run asc --help for all commands and asc <command> --help for every option.
Values are resolved in this order, from highest to lowest priority:
- CLI options such as
--app,--csv, or--screenshots - Project-local
.asc/config.toml - Global App Profile
- Environment variables
| Location | Purpose |
|---|---|
.asc/config.toml |
Project defaults, including the default app and build settings |
.asc/error.log |
Detailed errors for commands run from the current project |
~/.config/asc/profiles/ |
Reusable App Profiles and App Store Connect credentials |
~/.config/asc/keys/ |
Private keys copied during profile setup |
~/.config/asc/llm.toml |
OpenAI-compatible translation providers |
~/.config/asc/webhook.toml |
Web task notification settings |
~/.config/asc/tasks.db |
Persistent Web UI task history and logs |
For multiple apps, profile import, default selection, and CI environment variables, see Multi-App Profiles and CI/CD Automation.
| # | Guide | Covers |
|---|---|---|
| 01 | Install & Project Init | Installation, API keys, project templates, and the first profile |
| 02 | Metadata & Screenshots | CSV content, screenshot folders, validation, and uploads |
| 03 | IAP & Subscriptions | JSON schema, one-time purchases, and subscriptions |
| 04 | What's New & Store URLs | Release notes and support, marketing, and privacy URLs |
| 05 | Build & Deploy | Archives, signing, IPA export, and uploads for TestFlight or App Store distribution |
| 06 | Multi-App Profiles | Profile management and project defaults |
| 07 | Guard Security | Machine, network, and credential binding |
| 08 | CI/CD Automation | Non-interactive setup and GitHub Actions |
git clone https://github.com/yinghuiwang/AppStoreTools.git
cd AppStoreTools
python -m pip install -e ".[dev]"
pytest
python -m buildSource code lives in src/asc/; tests mirror the feature areas under tests/. Publishing is handled by .github/workflows/publish.yml when a v*.*.* tag is pushed.
After changing Tailwind utility classes in Web templates, rebuild local CSS with ./scripts/build_web_assets.sh (requires Node/npx). Fonts and vendor JS are already committed under src/asc/web/static/.
- Never commit
.p8keys,.envfiles, local profiles, or generated credentials. - Use
--dry-runbefore metadata, screenshot, IAP, URL, build, or release changes. - Keep Guard enabled on developer machines; use
asc guard statusto inspect bindings. - Bind the Web UI to
127.0.0.1unless access from another machine is intentional. - Keep API keys and Webhook secrets in environment variables or the configuration files under
~/.config/asc/, not in upload data.
Open a new terminal or reload the shell configuration:
source ~/.zshrc
# or
source ~/.bash_profileCreate an App Store version in App Store Connect first. The version must be in an editable state such as PREPARE_FOR_SUBMISSION.
Run asc guard status to see the active binding and conflict. Follow Guard Security before unbinding or disabling protection.
Re-run it with the global debug option, for example asc --debug upload --dry-run, and inspect .asc/error.log.