asc is an App Store Connect CLI for end-to-end release operations: upload metadata/screenshots/IAP subscriptions, manage localized "What's New" and store URLs, and build/deploy .ipa to TestFlight or App Store.
Step-by-step guides for every major workflow:
| # | Tutorial | Topic |
|---|---|---|
| 01 | Install & Project Init | Install asc, create API key, scaffold project, add app profile |
| 02 | Metadata & Screenshots | Fill CSV, name screenshot folders, run upload / metadata / screenshots |
| 03 | IAP & Subscriptions | Structure iap_packages.json, upload one-time IAP and subscriptions |
| 04 | What's New & Store URLs | Update release notes and support / marketing / privacy URLs |
| 05 | Build & Deploy | asc build, asc deploy, asc release, TestFlight vs App Store |
| 06 | Multi-App Profiles | Manage multiple apps, set a default, switch between projects |
| 07 | Guard Security | Machine / IP / credential binding, conflict resolution, CI bypass |
| 08 | CI/CD Automation | GitHub Actions example, inject credentials via env vars |
# Download and run installer (using source makes `asc` available immediately)
source <(curl -fsSL https://raw.githubusercontent.com/yinghuiwang/AppStoreTools/main/install.sh)
# Initialize current project
asc install
# Upload metadata + screenshots
asc uploadgit clone https://github.com/yinghuiwang/AppStoreTools.git
cd AppStoreTools
# Install environment + CLI
bash install.sh
# Interactive project initialization
asc install
# Start uploading
asc uploadpip install asc-appstore-tools
# or latest from GitHub
pip install git+https://github.com/yinghuiwang/AppStoreTools.git
asc install
asc uploadAppStoreTools/
├── src/asc/ # Python package source
│ ├── commands/ # CLI subcommands
│ ├── api.py # App Store Connect REST client
│ ├── config.py # Config management
│ ├── constants.py # Device/locale mapping
│ └── utils.py # Utilities
├── data/ # Upload input data
│ ├── appstore_info.csv # Metadata CSV
│ ├── iap_packages.example.json # IAP/subscription example
│ └── screenshots/ # Screenshots by locale
│ ├── cn/
│ └── en-US/
├── pyproject.toml
└── README.md
- Open App Store Connect - API Keys
- Create a key with App Manager role (or higher)
- Save Issuer ID and Key ID
- Download
.p8private key (download is one-time only)
In App Store Connect, open your app and copy the numeric Apple ID from the app URL/info page.
Option A — Scaffold a new project first (recommended for Xcode projects):
cd /path/to/MyXcodeProject
asc init # creates AppStore/ template structure
# fill in AppStore/Config/.env, then:
asc app import # reads .env and creates the profile automaticallyOption B — Import from an existing project with AppStore/Config/.env:
asc app import --path /path/to/MyProject --name myappOption C — Interactive setup:
asc app add myapp
# Fill in Issuer ID / Key ID / .p8 path / App ID / data pathsThe key file is copied to ~/.config/asc/keys/. Profile is saved to ~/.config/asc/profiles/myapp.toml.
Expected columns in data/appstore_info.csv:
| Column (CN header) | Meaning |
|---|---|
语言 |
Locale in DisplayName(code) format, e.g. 简体中文(zh-Hans) |
应用名称 |
App name |
副标题 |
Subtitle |
长描述 |
Description |
关键子 |
Keywords, comma-separated |
技术支持链接 |
Support URL (optional) |
营销网站 |
Marketing URL (optional) |
Screenshots are read from data/screenshots/<folder>/:
| Folder | Locale |
|---|---|
cn |
zh-Hans |
en |
en-US |
ja |
ja |
ko |
ko |
Screenshots are uploaded in numeric filename order. Device type is detected from image dimensions.
# Install & init
bash install.sh
asc install
# Build / deploy
asc build --scheme MyApp
asc build --project MyApp.xcworkspace --scheme MyApp --destination testflight
asc deploy --ipa build/export/MyApp.ipa
asc release --scheme MyApp --destination testflight
asc release --dry-run
# Metadata / screenshots
asc --app myapp upload
asc --app myapp upload --dry-run
asc --app myapp metadata
asc --app myapp keywords
asc --app myapp screenshots
asc --app myapp screenshots --display-type APP_IPHONE_67
# IAP / subscriptions
asc --app myapp iap --iap-file data/iap_packages.json
asc --app myapp iap --iap-file data/iap_packages.json --update-existing
# What's New
asc --app myapp whats-new --text "Bug fixes and performance improvements."
asc --app myapp whats-new --text "Bug fixes." --locales en-US
asc --app myapp whats-new --file data/whats_new.txt
# URLs
asc --app myapp set-support-url --text "https://example.com/support"
asc --app myapp set-marketing-url --text "https://example.com" --locales en-US
asc --app myapp set-privacy-policy-url --text "https://example.com/privacy"
asc --app myapp support-url
asc --app myapp marketing-url
asc --app myapp privacy-policy-url
# Validation
asc --app myapp check
# Profile management
asc app list
asc app default myapp
asc app show myapp
asc app edit myapp
asc app remove myapp
asc app import # import profile from AppStore/Config/.env
asc app import --path /path/to/project --name myapp
# Project scaffold
asc init # create AppStore/ template in Xcode project dir
asc init --path /path/to/MyApp
# Guard
asc guard status
asc guard enable
asc guard disable
asc guard unbind --current
asc guard unbind --credential <KEY_ID>
asc guard resetasc update # Update to the latest version
asc update --version 0.1.5 # Install a specific version
asc update --branch main # Install from a specific branch[build]
project = "MyApp.xcworkspace"
scheme = "MyApp"
output = "build"
signing = "auto"Then:
asc release --destination testflightasc app default myappor manually:
[defaults]
default_app = "myapp"After that:
asc upload
asc screenshots
asc checkzh-Hans:
- Fix known issues
- Improve generation speed
---
en-US:
- Bug fixes
- Faster generation
Supported top-level structures:
[...](one-time IAP only){ "items": [...] }(one-time IAP){ "items": [...], "subscriptionGroups": [...] }(with subscriptions)
See full schema in data/iap_packages.example.json.
| Display Type | Resolution |
|---|---|
APP_IPHONE_67 |
1290x2796 / 1320x2868 |
APP_IPHONE_65 |
1284x2778 / 1242x2688 |
APP_IPHONE_61 |
1179x2556 / 1170x2532 |
APP_IPHONE_58 |
1125x2436 |
APP_IPHONE_55 |
1242x2208 |
APP_IPAD_PRO_3GEN_129 |
2048x2732 |
APP_IPAD_PRO_3GEN_11 |
1668x2388 |
- App Store Connect must already have an editable app version
- Screenshot upload replaces existing screenshots for the same display type
- JWT tokens are auto-refreshed every 15 minutes
- Use
--dry-runfirst for safer validation
source ~/.zshrcIf you use bash:
source ~/.bash_profileinstall.sh: installs the CLI tool itself (Python env +asccommand)asc install: interactive guided setup — checks environment and configures app profileasc init: scaffoldsAppStore/template directory in an Xcode project (run once per project)
This tool does not create versions automatically. Prepare an editable version first in App Store Connect (for example PREPARE_FOR_SUBMISSION).