SkillAgentSearch skills...

Ascelerate

A command-line tool for building, archiving, and publishing apps to the App Store — from Xcode archive to App Review submission. Built with Swift on the App Store Connect API.

Install / Use

/learn @keremerkan/Ascelerate
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

ascelerate — A Swift CLI for App Store Connect

A command-line tool for building, archiving, and publishing apps to the App Store — from Xcode archive to App Review submission. Built with Swift on the App Store Connect API.

Note: Covers the core app release workflow: archiving, uploading builds, managing versions and localizations, screenshots, review submission, provisioning (devices, certificates, bundle IDs, profiles), and full management of in-app purchases and subscriptions. Most provisioning commands support interactive mode — run without arguments to get guided prompts.

Full documentation: ascelerate.dev

Requirements

  • macOS 13+
  • Swift 6.0+ (only for building from source)

Installation

Homebrew

brew tap keremerkan/tap
brew install ascelerate

The tap provides a pre-built binary for Apple Silicon Macs, so installation is instant.

Install script

curl -sSL https://raw.githubusercontent.com/keremerkan/ascelerate/main/install.sh | bash

Downloads the latest release, installs to /usr/local/bin, and removes the quarantine attribute automatically. Apple Silicon only.

Download manually

Download the latest release from GitHub Releases:

curl -L https://github.com/keremerkan/ascelerate/releases/latest/download/ascelerate-macos-arm64.tar.gz -o ascelerate.tar.gz
tar xzf ascelerate.tar.gz
mv ascelerate /usr/local/bin/

Since the binary is not signed or notarized, macOS will quarantine it on first download. Remove the quarantine attribute:

xattr -d com.apple.quarantine /usr/local/bin/ascelerate

Note: Pre-built binaries are provided for Apple Silicon (arm64) only. Intel Mac users should build from source.

Build from source

git clone https://github.com/keremerkan/ascelerate.git
cd ascelerate
swift build -c release
strip .build/release/ascelerate
cp .build/release/ascelerate /usr/local/bin/

Note: The release build takes a few minutes because the asc-swift dependency includes ~2500 generated source files covering the entire App Store Connect API surface. strip removes debug symbols, reducing the binary from ~175 MB to ~59 MB.

Shell completions

Set up tab completion for subcommands, options, and flags (supports zsh and bash):

ascelerate install-completions

This detects your shell and configures everything automatically. Restart your shell or open a new tab to activate.

AI coding skill

ascelerate ships with a skill file that gives AI coding agents (Claude Code, Cursor, Windsurf, GitHub Copilot) full knowledge of all commands, JSON formats, and workflows.

Via the binary (Claude Code only):

ascelerate install-skill

The tool checks for outdated skills on each run and prompts you to update after upgrades.

Via npx (any AI coding agent):

npx ascelerate-skill

This presents an interactive menu to select your agent and installs the skill to the appropriate directory. The skill file is fetched from GitHub, so it's always up to date. Use npx ascelerate-skill --uninstall to remove it.

Setup

1. Create an API Key

Go to App Store Connect > Users and Access > Integrations > App Store Connect API and generate a new key. Download the .p8 private key file.

2. Configure

ascelerate configure

This will prompt for your Key ID, Issuer ID, and the path to your .p8 file. The private key is copied into ~/.ascelerate/ with strict file permissions (owner-only access).

Usage

Aliases

Instead of typing full bundle IDs every time, you can create short aliases:

# Add an alias (interactive app picker)
ascelerate alias add myapp

# Now use the alias anywhere you'd use a bundle ID
ascelerate apps info myapp
ascelerate apps versions myapp
ascelerate apps localizations view myapp

# List all aliases
ascelerate alias list

# Remove an alias
ascelerate alias remove myapp

Aliases are stored in ~/.ascelerate/aliases.json. Any argument that doesn't contain a dot is looked up as an alias — real bundle IDs (which always contain dots) work unchanged.

Apps

# List all apps
ascelerate apps list

# Show app details
ascelerate apps info <bundle-id>

# List App Store versions
ascelerate apps versions <bundle-id>

# Create a new version
ascelerate apps create-version <bundle-id> <version-string>
ascelerate apps create-version <bundle-id> 2.1.0 --platform ios --release-type manual

# Check review submission status
ascelerate apps review status <bundle-id>
ascelerate apps review status <bundle-id> --version 2.1.0

# Submit for review
ascelerate apps review submit <bundle-id>
ascelerate apps review submit <bundle-id> --version 2.1.0

# Resolve rejected review items (after fixing issues and replying in Resolution Center)
ascelerate apps review resolve-issues <bundle-id>

# Cancel an active review submission
ascelerate apps review cancel-submission <bundle-id>

Pre-submission preflight checks

Before submitting for review, run preflight to verify that all required fields are filled in across every locale:

# Check the latest editable version
ascelerate apps review preflight <bundle-id>

# Check a specific version
ascelerate apps review preflight <bundle-id> --version 2.1.0

The command checks version state, build attachment, and then goes through each locale to verify localization fields (description, what's new, keywords), app info fields (name, subtitle, privacy policy URL), and screenshots. Results are grouped by locale with colored pass/fail indicators:

Preflight checks for MyApp v2.1.0 (Prepare for Submission)

Check                                Status
──────────────────────────────────────────────────────────────────
Version state                        ✓ Prepare for Submission
Build attached                       ✓ Build 42

en-US (English (United States))
  App info                           ✓ All fields filled
  Localizations                      ✓ All fields filled
  Screenshots                        ✓ 2 sets, 10 screenshots

de-DE (German (Germany))
  App info                           ✗ Missing: Privacy Policy URL
  Localizations                      ✗ Missing: What's New
  Screenshots                        ✗ No screenshots
──────────────────────────────────────────────────────────────────
Result: 5 passed, 3 failed

Exits with a non-zero status when any check fails, making it suitable for CI pipelines and workflow files.

Build Management

# Interactively select and attach a build to a version
ascelerate apps build attach <bundle-id>
ascelerate apps build attach <bundle-id> --version 2.1.0

# Attach the most recent build automatically
ascelerate apps build attach-latest <bundle-id>

# Remove the attached build from a version
ascelerate apps build detach <bundle-id>

Phased Release

# View phased release status
ascelerate apps phased-release <bundle-id>

# Enable phased release (starts inactive, activates when version goes live)
ascelerate apps phased-release <bundle-id> --enable

# Pause, resume, or complete a phased release
ascelerate apps phased-release <bundle-id> --pause
ascelerate apps phased-release <bundle-id> --resume
ascelerate apps phased-release <bundle-id> --complete

# Remove phased release entirely
ascelerate apps phased-release <bundle-id> --disable

Age Rating

# View age rating declaration
ascelerate apps app-info age-rating <bundle-id>

# Export age rating to JSON
ascelerate apps app-info age-rating export <bundle-id>

# Update age ratings from a JSON file
ascelerate apps app-info age-rating import <bundle-id> --file age-rating.json

The JSON file uses the same field names as the API. Only fields present in the file are updated:

{
  "isAdvertising": false,
  "isUserGeneratedContent": true,
  "violenceCartoonOrFantasy": "INFREQUENT_OR_MILD",
  "alcoholTobaccoOrDrugUseOrReferences": "NONE"
}

Intensity fields accept: NONE, INFREQUENT_OR_MILD, FREQUENT_OR_INTENSE. Boolean fields accept true/false.

Routing App Coverage

# View current routing coverage status
ascelerate apps routing-coverage <bundle-id>

# Upload a .geojson file
ascelerate apps routing-coverage <bundle-id> --file coverage.geojson

Localizations

# View localizations (latest version by default)
ascelerate apps localizations view <bundle-id>
ascelerate apps localizations view <bundle-id> --version 2.1.0 --locale en-US

# Export localizations to JSON
ascelerate apps localizations export <bundle-id>
ascelerate apps localizations export <bundle-id> --version 2.1.0 --output my-localizations.json

# Update a single locale
ascelerate apps localizations update <bundle-id> --whats-new "Bug fixes" --locale en-US

# Bulk update from JSON file
ascelerate apps localizations import <bundle-id> --file localizations.json

The JSON format for export and bulk update:

{
  "en-US": {
    "description": "My app description.\n\nSecond paragraph.",
    "whatsNew": "- Bug fixes\n- New dark mode",
    "keywords": "productivity,tools,utility",
    "promotionalText": "Try our new features!",
    "marketingURL": "https://example.com",
    "supportURL": "https://example.com/support"
  },
  "de-DE": {
    "whatsNew": "- Fehlerbehebungen\n- Neuer Dunkelmodus"
  }
}

Only fields present in the JSON are updated -- omitted fields are left unchanged.

Screenshots & App Previews

# Download all screenshots and preview videos
ascelerate apps media download <bundle-id>
ascelerate apps media download <bundle-id> --folder my-media/ --version 2.1.0

# Upload screenshots and preview videos from a folder
ascelerate apps media upload <bundle-id> media/

# Upl
View on GitHub
GitHub Stars121
CategoryDevelopment
Updated12h ago
Forks4

Languages

Swift

Security Score

95/100

Audited on Apr 10, 2026

No findings