# Appstore Metadata Sync

> App Store metadata JSON: edit, validate, push, or sync canonical `./metadata`, plus legacy fastlane migration via `asc migrate`. Excludes translation-first work, standalone release notes, and IAP/subscription names.

- Skill: `xopoko/appstore-metadata-sync` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add xopoko/appstore-metadata-sync`
- Raw SKILL.md: https://api.skillmd.com/api/skills/xopoko/appstore-metadata-sync/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Xopoko (https://skillmd.com/u/xopoko)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/xopoko/appstore-metadata-sync

---


# App Store Metadata Sync

Prefer canonical `asc metadata` JSON for app-info and version fields. Use `.strings` or fastlane flows only when specifically needed.

Use `appstore-metadata-localizer` when the main work is translation/adaptation across locales. Use `appstore-release-notes-writer` for What's New copy. Use `appstore-subscription-localizer` for subscription, group, or IAP display-name localizations.

## Command Plan Helper

For a deterministic dry-run command plan, run the helper from the plugin root:

```bash
python3 "$PLUGIN_ROOT/skills/appstore-metadata-sync/scripts/metadata_sync_plan.py" \
  --app "APP_ID" --version "1.2.3" --platform IOS --dir "./metadata" \
  --app-info "APP_INFO_ID" --version-id "VERSION_ID" \
  --include-keywords --keywords-csv "./keywords.csv"
```

The helper prints commands only; it does not call ASC, mutate metadata, or read credentials. Pass `--json` for machine-readable output. Pass `--confirming-actions` only after manually verifying generated `--confirm` commands.

## Workflow

1. Pull canonical metadata JSON into `./metadata` before editing unless the user already provided a fresh metadata tree.
2. Resolve `APP_INFO_ID` when multiple app-info records exist.
3. Edit the owning JSON fields: app-info fields for name/subtitle/privacy text and version fields for description, keywords, marketing URL, promotional text, support URL, and What's New.
4. Validate locally, then run `push --dry-run`; apply/push without dry-run only after the diff and target app/version are confirmed.
5. Use alternate `.strings` or fastlane migration flows only for legacy repos or explicit user requests.

Limits: name/subtitle 30, keywords 100, description/What's New 4000, promotional text 170. Use table output for human verification and JSON for automation.

## References

- `references/appstore-metadata-sync.md` for detailed canonical JSON, keyword, quick-edit, `.strings`, and fastlane commands.

