asc-localize-metadata
Skill4 starsChanged 6 months agoMITView on GitHub
Use when translating, generating, validating, or syncing localized App Store metadata such as description, keywords, subtitle, promotional text, or what-is-new across App Store locales.
7 other projects use a version of this, 7 of them edited.
Adopted by
Most recently taken up by
- VelimirMueller/claude-skillsedited, first seen Nov 1, 2026
- VelimirMueller/ai-development-skillsedited, first seen Nov 1, 2026
- The-Artificer-of-Ciphers-LLC/skills-from-the-artificeredited, first seen Nov 1, 2026
- rorkai/app-store-connect-cli-skillsedited, first seen Oct 26, 2026
- CamilleScholtz/swmpcedited, first seen Oct 8, 2026
- malpern/VoxClawedited, first seen Oct 8, 2026
Used with
Projects with it also use asc-apple-ads, asc-in-app-events and 2 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
rudrankriyamSkillasc-apple-ads
Use when managing Apple Ads with asc, including OAuth profiles, ad-account discovery, Platform API v1 campaigns and targeting, reports, assets, recommendations, guarded mutations, raw requests, and Campaign Management API v5 migration.
Also in 4 projects that use this
rorkaiSkillasc-in-app-events
Create and localize App Store in-app events, upload event media, and submit or recover event review submissions with asc. Use when managing in-app events, event card or details page assets, or event-specific submission errors.
Also in 4 projects that use this
kingsidharthSkillswiftui-pro
Comprehensively reviews SwiftUI code for best practices on modern APIs, maintainability, and performance. Use when reading, writing, or reviewing SwiftUI projects.
Also in 3 projects that use this
jamesrochabrunSkillswift-concurrency
Guide for building, auditing, and refactoring Swift code using modern concurrency patterns (Swift 6+). This skill should be used when working with async/await, Tasks, actors, MainActor, Sendable types, isolation domains, or when migrating legacy callback/Combine code to structured concurrency. Covers Approachable Concurrency settings, isolated parameters, and common pitfalls.
Also in 3 projects that use this
Other versions7 projects use a version of this.
Word for word · 0
None found.
Edited · 7
- rorkai/app-store-connect-cli-skills★ 1.1k91% same
- rudrankriyam/app-store-connect-cli-skills★ 1.1k91% same
- CamilleScholtz/swmpc★ 23996% same
- malpern/VoxClaw★ 20897% same
- VelimirMueller/ai-development-skills★ 791% same
- VelimirMueller/claude-skills★ 791% same
- The-Artificer-of-Ciphers-LLC/skills-from-the-artificer★ 694% same
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository76 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- .cursor/rules/components.mdcCursor rule
- .cursor/rules/currency.mdcCursor rule
- .cursor/rules/design-system.mdcCursor rule
- .cursor/rules/file-structure.mdcCursor rule
- .cursor/rules/forbidden-patterns.mdcCursor rule
- .cursor/rules/mvvm-architecture.mdcCursor rule
- .cursor/rules/pricing-display.mdcCursor rule
- .cursor/rules/scope.mdcCursor rule
- .cursor/rules/swift-conventions.mdcCursor rule
- accessibilitySkill
- animationsSkill
- apple-developer-authSkill
- apple-signinSkill
- app-store-preflightSkill
- asc-app-create-uiSkill
- asc-aso-auditSkill
- asc-build-lifecycleSkill
- asc-cli-usageSkill
- asc-crash-triageSkill
- asc-id-resolverSkill
- asc-metadata-syncSkill
- asc-metadata-yamlSkill
- asc-notarizationSkill
- asc-ppp-pricingSkill
- asc-release-flowSkill
- asc-revenuecat-catalog-syncSkill
- asc-screenshot-resizeSkill
- asc-shots-pipelineSkill
- asc-signing-setupSkill
- ascSkill
- asc-submission-healthSkill
- asc-subscription-localizationSkill
- asc-testflight-orchestrationSkill
- asc-wall-submitSkill
- asc-whats-new-writerSkill
- asc-workflowSkill
- asc-xcode-buildSkill
- billing-finance-calculatorSkill
- buildSkill
- business-modelSkill
- chartsSkill
- consolidate-errorsSkill
- content-composerSkill
- crashSkill
- debuggingSkill
- feature-directory-structureSkill
- feedback-statesSkill
- fix-errorSkill
- formsSkill
- foundation-modelsSkill
- hapticsSkill
- healthkitSkill
- layoutSkill
- listsSkill
- navigationSkill
- notificationsSkill
- onboarding-questionnaireSkill
- onboardingSkill
- The first 60 shown.
The file
Show its rules and text
We split this skill into the rules it gives an agent
13 rules. 5 are common, 0 are distinctive, and 8 are very specific to this project.
5
Common
Most of the 7 edited versions we read keep these.
0
Distinctive
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Common: line 8
Use this skill to pull English (or any source locale) App Store metadata, translate it with LLM, and push translations back to App Store …
- Very specific: line 12
Always confirm flags with --help for the exact asc version:
- Very specific: line 17
Prefer explicit long flags (--app, --version, --version-id, --type, --app-info).
- Very specific: line 18
Default output is JSON; use --output table only for human verification steps.
- Very specific: line 19
Prefer deterministic ID-based operations.
- Very specific: line 64
If you only have names (app name, version string) and need IDs deterministically, use asc-id-resolver.
- Common: line 90
Tone & Register: Always use formal, polite language.
- Common: line 92
keywords: Do NOT literally translate.
- Very specific: line 137
Create a .strings file per locale in the appropriate directory.
- Common: line 251
Validate character limits: before uploading. Count characters for each field.
- Common: line 254
Process one locale at a time: if translating many languages — easier to review and catch errors.
- Very specific: line 262
Use asc-id-resolver skill if you only have app/version names instead of IDs.
- Very specific: line 263
Use asc-metadata-sync skill for non-translation metadata operations.
“Common” is measured: kept by at least 6 in 10 of the 7 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
asc localize metadata
Use this skill to pull English (or any source locale) App Store metadata, translate it with LLM, and push translations back to App Store Connect — all automated.
Command discovery and output conventions
- Always confirm flags with
--helpfor the exactascversion:asc localizations --helpasc localizations download --helpasc localizations upload --helpasc apps info edit --help
- Prefer explicit long flags (
--app,--version,--version-id,--type,--app-info). - Default output is JSON; use
--output tableonly for human verification steps. - Prefer deterministic ID-based operations. Do not "pick the first row" via
head -1unless the user explicitly agrees.
Preconditions
- Auth configured (
asc auth loginorASC_*env vars) - Know your app ID (
asc apps listto find it) - At least one locale (typically en-US) already has metadata in App Store Connect
Supported Locales
App Store Connect locales for version and app-info localizations:
ar-SA, ca, cs, da, de-DE, el, en-AU, en-CA, en-GB, en-US,
es-ES, es-MX, fi, fr-CA, fr-FR, he, hi, hr, hu, id, it,
ja, ko, ms, nl-NL, no, pl, pt-BR, pt-PT, ro, ru, sk,
sv, th, tr, uk, vi, zh-Hans, zh-HantTwo Types of Metadata
Version Localizations (per-release)
Fields: description, keywords, whatsNew, supportUrl, marketingUrl, promotionalText
App Info Localizations (app-level, persistent)
Fields: name, subtitle, privacyPolicyUrl, privacyChoicesUrl, privacyPolicyText
Workflow
Step 1: Resolve IDs
# Find app ID
asc apps list --output table
# Find latest version ID
asc versions list --app "APP_ID" --state READY_FOR_DISTRIBUTION --output table
# or for editable version:
asc versions list --app "APP_ID" --state PREPARE_FOR_SUBMISSION --output table
# Find app info ID (for app-level fields like name/subtitle)
asc apps info list --app "APP_ID" --output tableNotes:
- Version-localization fields (description, keywords, whatsNew, etc.) are per-version.
- App-info fields (name, subtitle, privacy URLs/text) are app-level and use
--type app-info. - If you only have names (app name, version string) and need IDs deterministically, use
asc-id-resolver.
Step 2: Download source locale
# Download version localizations to local .strings files
# (description, keywords, whatsNew, promotionalText, supportUrl, marketingUrl, ...)
asc localizations download --version "VERSION_ID" --path "./localizations"
# Download app-info localizations to local .strings files
# (name, subtitle, privacyPolicyUrl, privacyChoicesUrl, privacyPolicyText, ...)
asc localizations download --app "APP_ID" --type app-info --app-info "APP_INFO_ID" --path "./app-info-localizations"This creates files like ./localizations/en-US.strings and ./app-info-localizations/en-US.strings. If download is unavailable, read fields individually:
# List version localizations to see existing locales and their content
asc localizations list --version "VERSION_ID" --output tableStep 3: Translate with LLM
For each target locale, translate the source text. Follow these rules:
Translation Guidelines
- Tone & Register: Always use formal, polite language. Use formal "you" forms where the language distinguishes them (Russian: «вы», German: «Sie», French: «vous», Spanish: «usted», Dutch: «u», Italian: «Lei», Portuguese: «você» formal, etc.). App Store descriptions are professional marketing copy — never use casual or informal register.
- description: Translate naturally, adapt tone to local market. Keep formatting (line breaks, bullet points, emoji). Stay within 4000 chars.
- keywords: Do NOT literally translate. Research what users in that locale would search for. Comma-separated, max 100 chars total. No duplicates, no app name (Apple adds it automatically).
- whatsNew: Translate release notes. Keep it concise. Max 4000 chars.
- promotionalText: Translate marketing hook. Max 170 chars. This can be updated without a new version.
- subtitle: Translate or adapt tagline. Max 30 chars — this is very tight, may need creative adaptation.
- name: Usually keep the original app name. Only translate if the user explicitly asks. Max 30 chars.
LLM Translation Prompt Template
For each target locale, use this approach:
Translate the following App Store metadata from {source_locale} to {target_locale}.
Rules:
- description: Natural, fluent translation. Preserve formatting (line breaks, bullets, emoji). Max 4000 chars.
- keywords: Do NOT literally translate. Choose keywords native speakers would search for in the App Store. Comma-separated, max 100 chars total. Do not include the app name.
- whatsNew: Translate release notes naturally. Max 4000 chars.
- promotionalText: Translate marketing tagline. Max 170 chars.
- subtitle: Adapt tagline creatively to fit 30 chars max.
- name: Keep the original app name unless explicitly requested to translate it. Max 30 chars.
- Use formal, polite language and formal "you" forms (Russian: вы, German: Sie, French: vous, Spanish: usted, Dutch: u, etc.). App Store copy is professional marketing — never use informal register.
- Respect cultural context. A playful tone in English may need adjustment for formal markets (e.g., ja, de-DE).
Source ({source_locale}):
description: """
{description}
"""
keywords: {keywords}
whatsNew: """
{whatsNew}
"""
promotionalText: {promotionalText}
name: {name}
subtitle: {subtitle}Step 4: Upload translations
Option A: Via .strings files (bulk)
Create a .strings file per locale in the appropriate directory.
Version localization example:
// nl-NL.strings
"description" = "Je app-beschrijving hier";
"keywords" = "wiskunde,kinderen,tafels,leren";
"whatsNew" = "Bugfixes en verbeteringen";
"promotionalText" = "Leer de tafels van vermenigvuldiging!";Then upload version localizations:
asc localizations upload --version "VERSION_ID" --path "./localizations"App-info localization example:
// nl-NL.strings
"subtitle" = "Leer tafels spelenderwijs";Then upload app-info localizations:
asc localizations upload --app "APP_ID" --type app-info --app-info "APP_INFO_ID" --path "./app-info-localizations"Option B: Via individual commands (fine control)
# Version localization fields (fine control).
# Prefer passing the explicit version ID for determinism.
asc apps info edit --app "APP_ID" --version-id "VERSION_ID" --locale "nl-NL" \
--description "Je beschrijving..." \
--keywords "wiskunde,kinderen,tafels" \
--whats-new "Bugfixes en verbeteringen"For app-level fields:
# Subtitle/name (app-info localization) is managed via app-info localizations.
# Use the app-info localization .strings + upload flow (there is no `asc app-infos localizations ...` command).
#
# 1) Edit: ./app-info-localizations/nl-NL.strings
# "subtitle" = "Leer tafels spelenderwijs";
#
# 2) Upload:
asc localizations upload --app "APP_ID" --type app-info --app-info "APP_INFO_ID" --path "./app-info-localizations"Step 5: Verify
# Check all locales are present
asc localizations list --version "VERSION_ID" --output table
# Check app info localizations
asc localizations list --app "APP_ID" --type app-info --app-info "APP_INFO_ID" --output tableCharacter Limits (enforce before upload!)
| Field | Limit |
| Name | 30 |
| Subtitle | 30 |
| Keywords | 100 (comma-separated) |
| Description | 4000 |
| What's New | 4000 |
| Promotional Text | 170 |
Always validate translated text fits within limits before uploading. Truncated text looks unprofessional. If translation exceeds the limit, shorten it — do not truncate mid-sentence.
Full Example: Add nl-NL and ru to Roxy Math
# 1) Resolve IDs deterministically (do not auto-pick the "first" row)
# If you only have names, use asc-id-resolver skill.
asc apps list --output table
APP_ID="APP_ID_HERE"
asc versions list --app "$APP_ID" --state PREPARE_FOR_SUBMISSION --output table
VERSION_ID="VERSION_ID_HERE"
asc apps info list --app "$APP_ID" --output table
APP_INFO_ID="APP_INFO_ID_HERE"
# 2) Download English source (or your chosen source locale)
asc localizations download --version "$VERSION_ID" --path "./localizations"
asc localizations download --app "$APP_ID" --type app-info --app-info "$APP_INFO_ID" --path "./app-info-localizations"
# 3) Read en-US.strings, translate to nl-NL and ru (LLM step)
# 4) Write nl-NL.strings and ru.strings to:
# - ./localizations/ (version localization fields)
# - ./app-info-localizations/ (subtitle/name/privacy fields)
# 5) Upload all
asc localizations upload --version "$VERSION_ID" --path "./localizations"
asc localizations upload --app "$APP_ID" --type app-info --app-info "$APP_INFO_ID" --path "./app-info-localizations"
# 6) Verify
asc localizations list --version "$VERSION_ID" --output table
asc localizations list --app "$APP_ID" --type app-info --app-info "$APP_INFO_ID" --output tableAgent Behavior
- Always start by reading the source locale — never translate from memory or assumptions.
- Check existing localizations first — don't overwrite existing translations unless the user asks to update them.
- Version vs app-info is different — version fields live under
--version "VERSION_ID"; subtitle/name/privacy live under--app ... --type app-info. - Prefer deterministic IDs — do not select IDs via
head -1unless explicitly requested; use--output tablefor selection orasc-id-resolver. - Validate character limits before uploading. Count characters for each field. If over limit, re-translate shorter.
- Keywords are special — do not literally translate. Research locale-appropriate search terms. Think like a user searching the App Store in that language.
- Show the user translations before uploading — present a summary table of all fields × locales for approval. Do not push without confirmation.
- Process one locale at a time if translating many languages — easier to review and catch errors.
- If upload fails for a locale, log the error, continue with other locales, report all failures at the end.
- For updates to existing localizations — download current, show diff of what will change, get approval, then upload.
Notes
- Version localizations are tied to a specific version. Create the version first if it doesn't exist.
promotionalTextcan be updated anytime without a new version submission.whatsNewis only relevant for updates, not the first version.- Use
asc-id-resolverskill if you only have app/version names instead of IDs. - Use
asc-metadata-syncskill for non-translation metadata operations. - For subscription/IAP display name localization, use
asc-subscription-localizationskill instead.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

