asc-metadata-sync

Sync App Store Connect metadata and localizations with validation and legacy format migration support. Manage two localization types: version-specific fields (description, keywords, what's new, support/marketing URLs) and app-level fields (name, subtitle, privacy policy) Download, validate, and upload .strings files in bulk for multi-language workflows with built-in character limit enforcement Export current metadata state, validate against App Store requirements, and import updates using the legacy migration workflow Quick field editing commands for individual metadata updates (what's new, description, keywords, copyright, release type) without file manipulation

INSTALLATION
npx skills add https://github.com/rudrankriyam/app-store-connect-cli-skills --skill asc-metadata-sync
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

$2a

2. Edit local files

Canonical files are written under:

  • metadata/app-info/<locale>.json for app-level fields: name, subtitle, privacyPolicyUrl, privacyChoicesUrl, privacyPolicyText
  • metadata/version/<version>/<locale>.json for version fields: description, keywords, marketingUrl, promotionalText, supportUrl, whatsNew

Copyright is not a localization field. Manage it with:

asc versions update --version-id "VERSION_ID" --copyright "2026 Your Company"

3. Validate before upload

asc metadata validate --dir "./metadata" --output table

For subscription apps, include the extra Terms of Use / EULA heuristic:

asc metadata validate --dir "./metadata" --subscription-app --output table

4. Preview and apply

Run a dry run first:

asc metadata push --app "APP_ID" --version "1.2.3" --platform IOS --dir "./metadata" --dry-run --output table

Apply after the plan looks correct:

asc metadata push --app "APP_ID" --version "1.2.3" --platform IOS --dir "./metadata"

Use asc metadata apply when the user wants the apply-named command shape for the same canonical files:

asc metadata apply --app "APP_ID" --version "1.2.3" --platform IOS --dir "./metadata" --dry-run

asc metadata apply --app "APP_ID" --version "1.2.3" --platform IOS --dir "./metadata"

Keyword-only workflow

Use this when only the version-localization keywords field should change:

asc metadata keywords diff --app "APP_ID" --version "1.2.3" --platform IOS --dir "./metadata"

asc metadata keywords apply --app "APP_ID" --version "1.2.3" --platform IOS --dir "./metadata" --confirm

For importing keyword research:

asc metadata keywords import --dir "./metadata" --version "1.2.3" --locale "en-US" --input "./keywords.csv"

asc metadata keywords sync --app "APP_ID" --version "1.2.3" --platform IOS --dir "./metadata" --input "./keywords.csv"

Quick field updates

For one-off version-localization edits, pass an explicit version selector. Use --version-id for deterministic updates when you already have it, or --version plus --platform when working from a version string.

asc apps info edit --app "APP_ID" --version-id "VERSION_ID" --locale "en-US" --whats-new "Bug fixes and improvements"

asc apps info edit --app "APP_ID" --version "1.2.3" --platform IOS --locale "en-US" --description "Your app description here"

asc apps info edit --app "APP_ID" --version "1.2.3" --platform IOS --locale "en-US" --keywords "keyword1,keyword2,keyword3"

asc apps info edit --app "APP_ID" --version "1.2.3" --platform IOS --locale "en-US" --support-url "https://support.example.com"

For app-info fields, prefer the post-create setup command:

asc app-setup info set --app "APP_ID" --primary-locale "en-US" --privacy-policy-url "https://example.com/privacy"

asc app-setup info set --app "APP_ID" --locale "en-US" --name "Your App Name" --subtitle "Your subtitle"

Lower-level localization files

Use .strings files when the user specifically wants import/export files instead of canonical JSON:

asc localizations list --version "VERSION_ID" --output table

asc localizations download --version "VERSION_ID" --path "./localizations"

asc localizations upload --version "VERSION_ID" --path "./localizations" --dry-run

asc localizations upload --version "VERSION_ID" --path "./localizations"

For app-info localizations:

asc apps info list --app "APP_ID" --output table

asc localizations list --app "APP_ID" --type app-info --app-info "APP_INFO_ID" --output table

asc localizations download --app "APP_ID" --type app-info --app-info "APP_INFO_ID" --path "./app-info-localizations"

asc localizations upload --app "APP_ID" --type app-info --app-info "APP_INFO_ID" --path "./app-info-localizations" --dry-run

asc localizations upload --app "APP_ID" --type app-info --app-info "APP_INFO_ID" --path "./app-info-localizations"

Legacy fastlane metadata

Use this only for existing fastlane-format trees:

asc migrate export --app "APP_ID" --version-id "VERSION_ID" --output-dir "./fastlane"

asc migrate validate --fastlane-dir "./fastlane"

asc migrate import --app "APP_ID" --version-id "VERSION_ID" --fastlane-dir "./fastlane" --dry-run

asc migrate import --app "APP_ID" --version-id "VERSION_ID" --fastlane-dir "./fastlane"

Character limits

Field

Limit

Name

30

Subtitle

30

Keywords

100 comma-separated characters

Description

4000

What's New

4000

Promotional Text

170

Agent behavior

  • Start with asc metadata pull unless the user specifically asks for .strings or fastlane metadata.
  • Always run asc metadata validate before remote writes.
  • Preview remote changes with --dry-run when the command supports it.
  • For quick edits, always pass --version-id or --version plus --platform; do not rely on ambiguous latest-version behavior.
  • Keep app-info fields and version fields separate.
  • Use --output table for human verification and JSON for automation.
BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card