asc-metadata-sync
rorkai/app-store-connect-cli-skills
Sync and validate App Store metadata with canonical asc workflow for iOS apps.
What is asc-metadata-sync?
This skill manages App Store Connect metadata using the asc CLI's canonical JSON-based workflow. Use it to pull, edit, validate, and push app-info and version localization fields (name, description, keywords, etc.) to App Store Connect, or to migrate legacy fastlane metadata.
- Pull canonical metadata from App Store Connect into local JSON files organized by locale and version
- Edit app-info fields (name, subtitle, privacy URLs) and version fields (description, keywords, marketing URLs, what's new) in JSON format
- Validate metadata against character limits and App Store requirements before upload
- Preview changes with dry-run before applying to App Store Connect
- Support keyword-only workflows for targeted keyword updates and imports
- Migrate legacy fastlane-format metadata to canonical asc format
How to install asc-metadata-sync
npx skills add https://github.com/rorkai/app-store-connect-cli-skills --skill asc-metadata-sync- asc CLI installed and authenticated with App Store Connect credentials
- App ID and version string (or version ID) for the target app
How to use asc-metadata-sync
- 1.Run `asc metadata pull --app APP_ID --version VERSION --platform IOS --dir ./metadata` to download current metadata as JSON
- 2.Edit the JSON files under `metadata/app-info/<locale>.json` (for app-level fields) and `metadata/version/<version>/<locale>.json` (for version fields)
- 3.Run `asc metadata validate --dir ./metadata` to check for errors and character-limit violations
- 4.Run `asc metadata push --app APP_ID --version VERSION --platform IOS --dir ./metadata --dry-run` to preview changes
- 5.Run `asc metadata push --app APP_ID --version VERSION --platform IOS --dir ./metadata` to apply changes to App Store Connect
Use cases
- Updating app name, subtitle, and description across multiple locales before a release
- Importing keyword research and syncing keywords to App Store Connect
- Migrating an existing fastlane metadata tree to the canonical asc JSON workflow
- Setting up app-info fields (privacy policy URLs, support URLs) during initial app setup
- Reviewing and approving metadata changes through a durable artifact workflow before applying
- iOS app developers managing App Store metadata
- Release managers coordinating multi-locale app updates
- Teams migrating from fastlane to asc CLI tooling
- Developers automating metadata updates in CI/CD pipelines
asc-metadata-sync FAQ
Start with `asc metadata` (canonical JSON workflow) for all standard metadata updates. Use `asc localizations` only if you specifically need .strings files; use `asc migrate` only for existing fastlane-format metadata trees.
Pull metadata with `asc metadata pull`, edit the JSON files for each locale under `metadata/app-info/` and `metadata/version/`, then validate and push once. All locales are updated in a single push.
Name and Subtitle: 30 characters; Keywords: 100 comma-separated characters; Description and What's New: 4000 characters; Promotional Text: 170 characters.
Yes, use `asc metadata keywords diff` and `asc metadata keywords apply` for keyword-only workflows, or import keywords from a CSV with `asc metadata keywords import`.
Use `asc metadata plan` to create a review artifact, `asc metadata approve` to selectively approve changes, then `asc metadata apply --review-dir` with `--confirm` to apply only approved changes.
Full instructions (SKILL.md)
Source of truth, from rorkai/app-store-connect-cli-skills.
name: asc-metadata-sync description: Sync, validate, and apply App Store metadata with the current asc canonical metadata workflow. Use when updating metadata, localizations, keywords, or migrating legacy fastlane metadata.
asc metadata sync
Use this skill to keep App Store metadata in sync with App Store Connect. Prefer the canonical asc metadata workflow for app-info and version localization fields. Use the lower-level asc localizations and asc migrate commands only when the user specifically needs .strings files or legacy fastlane-format metadata.
Current canonical workflow
1. Pull canonical metadata
asc metadata pull --app "APP_ID" --version "1.2.3" --platform IOS --dir "./metadata"
If the app has multiple app-info records, resolve the app-info ID first and pass it explicitly:
asc apps info list --app "APP_ID" --output table
asc metadata pull --app "APP_ID" --app-info "APP_INFO_ID" --version "1.2.3" --platform IOS --dir "./metadata"
2. Edit local files
Canonical files are written under:
metadata/app-info/<locale>.jsonfor app-level fields:name,subtitle,privacyPolicyUrl,privacyChoicesUrl,privacyPolicyTextmetadata/version/<version>/<locale>.jsonfor 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"
For a review-artifact workflow with explicit approval before mutation, use the metadata review commands introduced in asc 2.6.1:
asc metadata plan --app "APP_ID" --version "1.2.3" --platform IOS --dir "./metadata" --review-dir ".asc/metadata/review"
asc metadata approve --review-dir ".asc/metadata/review" --all
asc metadata status --review-dir ".asc/metadata/review" --output table
asc metadata apply --app "APP_ID" --version "1.2.3" --platform IOS --dir "./metadata" --review-dir ".asc/metadata/review" --confirm
Use asc metadata approve --key "version:1.2.3:en-US:whatsNew" or --scope app-info,version when the user wants selective approval artifacts before the guarded apply. Version-scoped keys include the App Store version string.
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" --confirm
Deliverfile metadata_path and screenshots_path values take precedence and resolve relative to the Deliverfile. With --fastlane-dir "./fastlane", use metadata_path "./metadata" rather than "./fastlane/metadata"; the latter resolves to ./fastlane/fastlane/metadata. Fix stale values in the Deliverfile, or remove them to use the conventional metadata/ and screenshots/ directories.
Paths outside the selected Fastlane directory fail unless the operator explicitly trusts them with --allow-external-metadata or --allow-external-screenshots. Keep those flags off for untrusted imports.
Inspect the validation body as well as the process exit: asc migrate validate can return a report with valid: false and a nonzero errorCount while exiting 0. A confirmed import can print status: "partial" with completed stages and failure details while exiting nonzero, so non-empty stdout does not mean success.
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 pullunless the user specifically asks for.stringsor fastlane metadata. - Always run
asc metadata validatebefore remote writes. - Preview remote changes with
--dry-runwhen the command supports it. - Use
asc metadata planplusapprove/statuswhen the user wants a durable review artifact before apply. - For quick edits, always pass
--version-idor--versionplus--platform; do not rely on ambiguous latest-version behavior. - Keep app-info fields and version fields separate.
- Use
--output tablefor human verification and JSON for automation.
Related skills
More from rorkai/app-store-connect-cli-skills and the wider catalog.

asc-notarization
Archive, export, and notarize macOS apps with Developer ID signing for direct distribution.

asc-ppp-pricing
Set territory-specific pricing for subscriptions and in-app purchases using PPP strategies.

asc-release-flow
Orchestrate App Store releases: stage versions, attach builds, and submit for review.

asc-revenuecat-catalog-sync
Sync App Store Connect subscriptions and in-app purchases with RevenueCat catalogs.

asc-screenshot-resize
Resize and validate App Store screenshots using asc CLI and macOS sips.

asc-shots-pipeline
Automate iOS screenshot capture, framing, and App Store upload with xcodebuild, AXe, and Koubou.