metadata-optimization
Rewrite an app Product's App Store metadata — title, subtitle, keywords field, description, promotional text.
Written by Kwern, after the skill of the same name in Eronred's aso-skills, MIT. Updated 2026-10-05.
The file, as Kwern runs it
Nothing below is rewritten or cut. The description a model routes on comes first, then the file itself. The whole thing, frontmatter included, is at /skills/metadata-optimization.md.
description
Rewrite an app Product's App Store metadata — title, subtitle, keywords field, description, promotional text. Use for "optimize my title", "write my subtitle", "keywords field", "character limits", "app description". For a whole-listing audit use aso; for other markets use localization.
Write App Store metadata that ranks for the Product's target keywords and converts the visitor who lands on the listing. Output is one listing Proposal per field and Locale, which Kwern writes to App Store Connect when the User approves it, plus a metadata package with the alternatives and the reasoning, saved with save_output.
Gather
read_context— positioning, ICP, voice, competitors, target keywords if the Foundation doc names them.app_store_listing— current name, description, genres.connector_asc_localizationswhen the ASC Connector exists — the title, the subtitle, the promotional text and the private keywords field of every Locale, the primary first. Without it, treat the subtitle, the promotional text and the keywords field as unknown and say so in the package.- With the Apple Ads Connector:
connector_apple_ads_search_termsfor the search terms that already convert,connector_apple_ads_suggestionsfor the keywords the Run has not found yet, thenconnector_apple_ads_search_term_popularityon every candidate keyword in each storefront the package targets. Without it, infer keywords from the Foundation doc and the competitors' listings throughfetch_urlon iTunes Search (https://itunes.apple.com/search?term=<name>&entity=software&country=<storefront>&limit=1). connector_asc_analyticswhen available — the page counts, the baseline the package must beat. Page conversion ispageDownloads÷pageViews, overall and per source type:downloadsalso counts the downloads made straight from search results, which no page view precedes, so divide the page downloads. Compare sources by their own rate, since a searcher and a browser convert differently, and quote a source's counts without a rate while it has fewer than 1,000 page views over the period.
The locale is the Product's primary storefront unless the Run says otherwise.
Write
Rules for each field are in references/field-rules.md: limits, what is indexed, formulas, and the mistakes to flag. Apply them in this order, because each field must avoid the keywords the previous one already covers:
- Title — brand + #1 keyword, three options with character counts.
- Subtitle — secondary keywords, benefit-led, no word repeated from the title, three options.
- Keywords field — 100 chars, comma-separated, no spaces, singular forms, no word already in title/subtitle, ranked by relevance × popularity and observed search-term performance.
- Description — conversion only (not indexed): hook in the first 170 characters, social proof, four to six benefit bullets, how it works, a review quote drawn from
app_store_reviews, call to action. - Promotional text — 170 chars, changeable without review; propose one for the current moment (launch, season, milestone).
Output: metadata package
For every field: recommended version, alternative A (different keyword emphasis), alternative B (different positioning angle), each with chars/limit, keywords covered, one-line rationale. Then:
- Keyword coverage matrix — each target keyword × where it lands (title / subtitle / keywords field), so no keyword is covered twice and none is missing.
- Before / after — current vs recommended per field, with the keywords gained.
- Apply — which fields need a version the User can still edit in App Store Connect: title, subtitle, keywords field and description do; the promotional text does not.
Propose
Each field you change is one propose per Locale, with appStoreField (name for the title, subtitle, keywords, description, promotionalText) and the Locale's code in locale: content is the recommended version, whole, and why names the keywords it gains and the baseline it must beat. The alternatives stay in the package.
Done when every changed field has its Proposal in every Locale the package targets, every target keyword appears in the matrix exactly once, every recommended field is within its limit, and the package names the data it lacked (keywords field, search terms, popularity, conversion) when a Connector was absent.
Related Skills
aso— full listing audit; run it first when the target keywords are unknown.localization— this package for other storefronts.custom-product-pages— variants of the description and screenshots per audience.
What it discloses
The Skill reads these files only when it needs them, so the model spends nothing on them the rest of the time.
references/field-rules.md
From your accounts to a proposal
- 01
Connect what it reads
Give the ASO agent the accounts it works on. Kwern never asks for a password, and an agent missing a connection says so instead of guessing.
- 02
The loop runs weekly
Before it writes a word it reads the foundation doc, which holds the positioning, the audience and the voice, and whatever its connectors return that day.
- 03
The metadata-optimization skill runs
The agent activates it when the run calls for it, and what the model then reads is the file on this page, word for word.
- 04
A proposal waits for you
Nothing is published and nothing is spent until you approve it. Approve and Kwern posts it where it holds the keys; where it does not, it hands you the text and the link.
The file, the agency, and the agent
| On your own | An agency | Kwern | |
|---|---|---|---|
| The method | Whatever you remember to do that week | Theirs, and you never get to read it | This file, open on this page |
| Who runs it | You, when there is time | An account manager, between other accounts | The ASO agent, weekly |
| What it reads | What you can pull by hand | What you remembered to send them | Your connected accounts and your foundation doc |
| What comes out | A draft, sometimes | A deck, and a report at the end of the month | A proposal you approve or throw away |
| What it costs | Your evenings | A retainer | One subscription, and the model on your own key |
Questions about metadata-optimization
Pair it with
The other skills the same agents reach for during a run.
Someone is asking for what you built today.
On Reddit, on X, in ChatGPT's answers. Kwern finds them every morning and drafts the reply in your voice; you decide what goes out.