{"id":"441edb1b-be6d-44e2-a818-21000215b539","shortId":"GRdKuU","kind":"skill","title":"asc-metadata-sync","tagline":"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.","description":"# asc metadata sync\n\nUse 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.\n\n## Current canonical workflow\n\n### 1. Pull canonical metadata\n\n```bash\nasc metadata pull --app \"APP_ID\" --version \"1.2.3\" --platform IOS --dir \"./metadata\"\n```\n\nIf the app has multiple app-info records, resolve the app-info ID first and pass it explicitly:\n\n```bash\nasc apps info list --app \"APP_ID\" --output table\nasc metadata pull --app \"APP_ID\" --app-info \"APP_INFO_ID\" --version \"1.2.3\" --platform IOS --dir \"./metadata\"\n```\n\n### 2. Edit local files\n\nCanonical files are written under:\n\n- `metadata/app-info/<locale>.json` for app-level fields: `name`, `subtitle`, `privacyPolicyUrl`, `privacyChoicesUrl`, `privacyPolicyText`\n- `metadata/version/<version>/<locale>.json` for version fields: `description`, `keywords`, `marketingUrl`, `promotionalText`, `supportUrl`, `whatsNew`\n\nCopyright is not a localization field. Manage it with:\n\n```bash\nasc versions update --version-id \"VERSION_ID\" --copyright \"2026 Your Company\"\n```\n\n### 3. Validate before upload\n\n```bash\nasc metadata validate --dir \"./metadata\" --output table\n```\n\nFor subscription apps, include the extra Terms of Use / EULA heuristic:\n\n```bash\nasc metadata validate --dir \"./metadata\" --subscription-app --output table\n```\n\n### 4. Preview and apply\n\nRun a dry run first:\n\n```bash\nasc metadata push --app \"APP_ID\" --version \"1.2.3\" --platform IOS --dir \"./metadata\" --dry-run --output table\n```\n\nApply after the plan looks correct:\n\n```bash\nasc metadata push --app \"APP_ID\" --version \"1.2.3\" --platform IOS --dir \"./metadata\"\n```\n\nUse `asc metadata apply` when the user wants the apply-named command shape for the same canonical files:\n\n```bash\nasc metadata apply --app \"APP_ID\" --version \"1.2.3\" --platform IOS --dir \"./metadata\" --dry-run\nasc metadata apply --app \"APP_ID\" --version \"1.2.3\" --platform IOS --dir \"./metadata\"\n```\n\n## Keyword-only workflow\n\nUse this when only the version-localization `keywords` field should change:\n\n```bash\nasc metadata keywords diff --app \"APP_ID\" --version \"1.2.3\" --platform IOS --dir \"./metadata\"\nasc metadata keywords apply --app \"APP_ID\" --version \"1.2.3\" --platform IOS --dir \"./metadata\" --confirm\n```\n\nFor importing keyword research:\n\n```bash\nasc metadata keywords import --dir \"./metadata\" --version \"1.2.3\" --locale \"en-US\" --input \"./keywords.csv\"\nasc metadata keywords sync --app \"APP_ID\" --version \"1.2.3\" --platform IOS --dir \"./metadata\" --input \"./keywords.csv\"\n```\n\n## Quick field updates\n\nFor 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.\n\n```bash\nasc apps info edit --app \"APP_ID\" --version-id \"VERSION_ID\" --locale \"en-US\" --whats-new \"Bug fixes and improvements\"\nasc apps info edit --app \"APP_ID\" --version \"1.2.3\" --platform IOS --locale \"en-US\" --description \"Your app description here\"\nasc apps info edit --app \"APP_ID\" --version \"1.2.3\" --platform IOS --locale \"en-US\" --keywords \"keyword1,keyword2,keyword3\"\nasc apps info edit --app \"APP_ID\" --version \"1.2.3\" --platform IOS --locale \"en-US\" --support-url \"https://support.example.com\"\n```\n\nFor app-info fields, prefer the post-create setup command:\n\n```bash\nasc app-setup info set --app \"APP_ID\" --primary-locale \"en-US\" --privacy-policy-url \"https://example.com/privacy\"\nasc app-setup info set --app \"APP_ID\" --locale \"en-US\" --name \"Your App Name\" --subtitle \"Your subtitle\"\n```\n\n## Lower-level localization files\n\nUse `.strings` files when the user specifically wants import/export files instead of canonical JSON:\n\n```bash\nasc localizations list --version \"VERSION_ID\" --output table\nasc localizations download --version \"VERSION_ID\" --path \"./localizations\"\nasc localizations upload --version \"VERSION_ID\" --path \"./localizations\" --dry-run\nasc localizations upload --version \"VERSION_ID\" --path \"./localizations\"\n```\n\nFor app-info localizations:\n\n```bash\nasc apps info list --app \"APP_ID\" --output table\nasc localizations list --app \"APP_ID\" --type app-info --app-info \"APP_INFO_ID\" --output table\nasc localizations download --app \"APP_ID\" --type app-info --app-info \"APP_INFO_ID\" --path \"./app-info-localizations\"\nasc localizations upload --app \"APP_ID\" --type app-info --app-info \"APP_INFO_ID\" --path \"./app-info-localizations\" --dry-run\nasc localizations upload --app \"APP_ID\" --type app-info --app-info \"APP_INFO_ID\" --path \"./app-info-localizations\"\n```\n\n## Legacy fastlane metadata\n\nUse this only for existing fastlane-format trees:\n\n```bash\nasc migrate export --app \"APP_ID\" --version-id \"VERSION_ID\" --output-dir \"./fastlane\"\nasc migrate validate --fastlane-dir \"./fastlane\"\nasc migrate import --app \"APP_ID\" --version-id \"VERSION_ID\" --fastlane-dir \"./fastlane\" --dry-run\nasc migrate import --app \"APP_ID\" --version-id \"VERSION_ID\" --fastlane-dir \"./fastlane\"\n```\n\n## Character limits\n\n| Field | Limit |\n|-------|-------|\n| Name | 30 |\n| Subtitle | 30 |\n| Keywords | 100 comma-separated characters |\n| Description | 4000 |\n| What's New | 4000 |\n| Promotional Text | 170 |\n\n## Agent behavior\n\n- Start with `asc metadata pull` unless the user specifically asks for `.strings` or fastlane metadata.\n- Always run `asc metadata validate` before remote writes.\n- Preview remote changes with `--dry-run` when the command supports it.\n- For quick edits, always pass `--version-id` or `--version` plus `--platform`; do not rely on ambiguous latest-version behavior.\n- Keep app-info fields and version fields separate.\n- Use `--output table` for human verification and JSON for automation.","tags":["asc","metadata","sync","app","store","connect","cli","skills","rorkai","agent-skills","ai-skills","app-store-connect"],"capabilities":["skill","source-rorkai","skill-asc-metadata-sync","topic-agent-skills","topic-ai-skills","topic-app-store-connect","topic-apple","topic-asc","topic-automation","topic-cicd","topic-cli","topic-devops","topic-ios","topic-macos","topic-testflight"],"categories":["app-store-connect-cli-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/rorkai/app-store-connect-cli-skills/asc-metadata-sync","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add rorkai/app-store-connect-cli-skills","source_repo":"https://github.com/rorkai/app-store-connect-cli-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 801 github stars · SKILL.md body (5,884 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:53:26.398Z","embedding":null,"createdAt":"2026-04-18T21:56:46.064Z","updatedAt":"2026-05-18T18:53:26.398Z","lastSeenAt":"2026-05-18T18:53:26.398Z","tsv":"'/app-info-localizations':693,711,732 '/fastlane':760,767,782,800 '/keywords.csv':397,412 '/localizations':623,631,642 '/metadata':105,153,217,236,263,287,319,334,364,377,389,410 '/privacy':567 '1':89 '1.2.3':101,149,259,283,315,330,360,373,391,406,483,503,522 '100':810 '170':823 '2':154 '2026':205 '3':208 '30':806,808 '4':242 '4000':816,820 'agent':824 'alreadi':438 'alway':841,864 'ambigu':877 'app':9,38,44,55,97,98,108,112,118,128,131,132,139,140,143,145,167,222,239,255,256,279,280,311,312,326,327,356,357,369,370,402,403,453,456,457,476,479,480,492,496,499,500,515,518,519,535,548,552,553,570,574,575,583,645,650,653,654,661,662,666,669,671,679,680,684,687,689,697,698,702,705,707,718,719,723,726,728,749,750,771,772,789,790,884 'app-info':54,111,117,142,534,644,665,668,683,686,701,704,722,725,883 'app-level':166 'app-setup':547,569 'appli':8,245,269,291,298,310,325,368 'apply-nam':297 'asc':2,15,30,50,66,69,94,127,136,196,213,232,252,276,289,308,323,352,365,384,398,452,475,495,514,546,568,608,616,624,635,649,658,676,694,715,746,761,768,786,828,843 'asc-metadata-sync':1 'ask':835 'autom':900 'bash':93,126,195,212,231,251,275,307,351,383,451,545,607,648,745 'behavior':825,881 'bug':471 'canon':16,49,87,91,158,305,605 'chang':350,851 'charact':801,814 'comma':812 'comma-separ':811 'command':71,300,544,858 'compani':207 'confirm':378 'connect':46 'copyright':186,204 'correct':274 'creat':542 'current':14,86 'descript':180,490,493,815 'determinist':434 'diff':355 'dir':104,152,216,235,262,286,318,333,363,376,388,409,759,766,781,799 'download':618,678 'dri':248,265,321,633,713,784,854 'dry-run':264,320,632,712,783,853 'edit':155,423,455,478,498,517,863 'en':394,466,488,508,527,559,579 'en-us':393,465,487,507,526,558,578 'eula':229 'example.com':566 'example.com/privacy':565 'exist':740 'explicit':125,426 'export':748 'extra':225 'fastlan':28,83,734,742,765,780,798,839 'fastlane-dir':764,779,797 'fastlane-format':82,741 'field':60,169,179,191,348,414,537,803,886,889 'file':79,157,159,306,592,595,602 'first':121,250 'fix':472 'format':84,743 'heurist':230 'human':895 'id':99,120,133,141,147,201,203,257,281,313,328,358,371,404,432,458,461,463,481,501,520,554,576,613,621,629,640,655,663,673,681,691,699,709,720,730,751,754,756,773,776,778,791,794,796,868 'import':380,387,770,788 'import/export':601 'improv':474 'includ':223 'info':56,113,119,129,144,146,454,477,497,516,536,550,572,646,651,667,670,672,685,688,690,703,706,708,724,727,729,885 'input':396,411 'instead':603 'io':103,151,261,285,317,332,362,375,408,485,505,524 'json':164,176,606,898 'keep':37,882 'keyword':24,181,336,347,354,367,381,386,400,510,809 'keyword-on':335 'keyword1':511 'keyword2':512 'keyword3':513 'latest':879 'latest-vers':878 'legaci':27,81,733 'level':65,168,590 'limit':802,804 'list':130,610,652,660 'local':23,59,67,156,190,346,392,422,464,486,506,525,557,577,591,609,617,625,636,647,659,677,695,716 'look':273 'lower':64,589 'lower-level':63,588 'manag':192 'marketingurl':182 'metadata':3,11,17,22,29,31,40,51,85,92,95,137,214,233,253,277,290,309,324,353,366,385,399,735,829,840,844 'metadata/app-info':163 'metadata/version':175 'migrat':26,70,747,762,769,787 'multipl':110 'name':170,299,581,584,805 'need':77 'new':470,819 'one':418 'one-off':417 'output':134,218,240,267,614,656,674,758,892 'output-dir':757 'pass':123,424,865 'path':622,630,641,692,710,731 'plan':272 'platform':102,150,260,284,316,331,361,374,407,444,484,504,523,872 'plus':443,871 'polici':563 'post':541 'post-creat':540 'prefer':47,538 'preview':243,849 'primari':556 'primary-local':555 'privaci':562 'privacy-policy-url':561 'privacychoicesurl':173 'privacypolicytext':174 'privacypolicyurl':172 'promot':821 'promotionaltext':183 'pull':90,96,138,830 'push':254,278 'quick':413,862 'record':114 'reli':875 'remot':847,850 'research':382 'resolv':115 'run':246,249,266,322,634,714,785,842,855 'selector':428 'separ':813,890 'set':551,573 'setup':543,549,571 'shape':301 'skill':35 'skill-asc-metadata-sync' 'source-rorkai' 'specif':76,599,834 'start':826 'store':10,39,45 'string':78,450,594,837 'subscript':221,238 'subscription-app':237 'subtitl':171,585,587,807 'support':530,859 'support-url':529 'support.example.com':532 'supporturl':184 'sync':4,5,32,42,401 'tabl':135,219,241,268,615,657,675,893 'term':226 'text':822 'topic-agent-skills' 'topic-ai-skills' 'topic-app-store-connect' 'topic-apple' 'topic-asc' 'topic-automation' 'topic-cicd' 'topic-cli' 'topic-devops' 'topic-ios' 'topic-macos' 'topic-testflight' 'tree':744 'type':664,682,700,721 'unless':831 'updat':21,198,415,435 'upload':211,626,637,696,717 'url':531,564 'us':395,467,489,509,528,560,580 'use':19,33,61,228,288,339,429,593,736,891 'user':75,294,598,833 'valid':6,209,215,234,763,845 'verif':896 'version':58,100,148,178,197,200,202,258,282,314,329,345,359,372,390,405,421,427,431,442,449,460,462,482,502,521,611,612,619,620,627,628,638,639,753,755,775,777,793,795,867,870,880,888 'version-id':199,430,459,752,774,792,866 'version-loc':344,420 'want':295,600 'what':469 'whats-new':468 'whatsnew':185 'work':446 'workflow':18,52,88,338 'write':848 'written':161","prices":[{"id":"4908bb2e-e888-4418-9cdf-76394df42cfa","listingId":"441edb1b-be6d-44e2-a818-21000215b539","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"rorkai","category":"app-store-connect-cli-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:56:46.064Z"}],"sources":[{"listingId":"441edb1b-be6d-44e2-a818-21000215b539","source":"github","sourceId":"rorkai/app-store-connect-cli-skills/asc-metadata-sync","sourceUrl":"https://github.com/rorkai/app-store-connect-cli-skills/tree/main/skills/asc-metadata-sync","isPrimary":false,"firstSeenAt":"2026-04-18T21:56:46.064Z","lastSeenAt":"2026-05-18T18:53:26.398Z"},{"listingId":"441edb1b-be6d-44e2-a818-21000215b539","source":"skills_sh","sourceId":"rorkai/app-store-connect-cli-skills/asc-metadata-sync","sourceUrl":"https://skills.sh/rorkai/app-store-connect-cli-skills/asc-metadata-sync","isPrimary":true,"firstSeenAt":"2026-05-07T20:42:06.948Z","lastSeenAt":"2026-05-07T22:41:24.293Z"}],"details":{"listingId":"441edb1b-be6d-44e2-a818-21000215b539","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"rorkai","slug":"asc-metadata-sync","github":{"repo":"rorkai/app-store-connect-cli-skills","stars":801,"topics":["agent-skills","ai-skills","app-store-connect","apple","asc","automation","cicd","cli","devops","ios","macos","testflight","xcode"],"license":"mit","html_url":"https://github.com/rorkai/app-store-connect-cli-skills","pushed_at":"2026-05-03T17:28:47Z","description":"Skills to automate app store deployed and everything related to it using the asc cli","skill_md_sha":"9c4c50556db816fc11de761230af71b0d801fdd8","skill_md_path":"skills/asc-metadata-sync/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/rorkai/app-store-connect-cli-skills/tree/main/skills/asc-metadata-sync"},"layout":"multi","source":"github","category":"app-store-connect-cli-skills","frontmatter":{"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."},"skills_sh_url":"https://skills.sh/rorkai/app-store-connect-cli-skills/asc-metadata-sync"},"updatedAt":"2026-05-18T18:53:26.398Z"}}