aso-research
Skill1 starsChanged 42 days agoMITView on GitHub
App Store keyword research and metadata from public data, for indie developers without paid ASO tools. Use when asked for ASO, App Store keywords, an app name or subtitle, the 100-character keyword field, which category to pick, why an app does not show up in search, or how to rank in another country. Expands seeds with App Store autocomplete, mines competitor reviews, scores keywords per storefront (popularity proxy, difficulty, relevance, opportunity), packs the keyword field, and proposes name / subtitle / keyword variants that always pass a character-limit and 2.3.7 linter. Refuses keyword stuffing, competitor names, and any tactic that breaks Apple's rules.
1 other project uses a version of this.
Adopted by
Most recently taken up by
- saif-o99/app-launch-skillstheir own version, first seen Oct 13, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- saif-o99/app-launch-skills★ 0same name
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 repository3 other files it gives its agents.
- store-assetsSkill
- store-auditSkill
- submission-pilotSkill
The file
We split this skill into the rules it gives an agent
8 rules. About 0 are common, 1 is distinctive, and 7 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
7
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 11
Hard rules: Every proposed name, subtitle and keyword field goes through scripts/char_lint.py and passes before it is shown.
- Very specific: line 26
Keep every file in aso/<date>/ at the project root (or a scratch folder).
- Very specific: line 35
Remove app names, other jobs and unsupported languages.
- Very specific: line 38
Add the phrases users actually use, but never competitor names that show up among them.
- Very specific: line 42
Do a quick pass with --no-popularity first (about 2 s per term per storefront), then probe popularity only for the 15–20 best terms …
- Very specific: line 51
Lint: write all variants to variants.json and run python3 scripts/char_lint.py --file variants.json --competitors apps.json (give each …
- Very specific: line 79
If store-audit flagged the name as a keyword stack, the recommended name must fix that.
- Distinctive: line 81
If the user's current metadata breaks a rule, say so plainly before proposing anything else.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
aso-research
Find the words real users type for what the app does, where a small app can rank, and fit them into the 30-character name, the 30-character subtitle and the 100-character keyword field without waste or rule-breaking.
Hard rules. Every proposed name, subtitle and keyword field goes through scripts/char_lint.py and
passes before it is shown. Never propose competitor names, trademarks, prices, "#1"/"best", or irrelevant
terms. Refuse those tactics even when asked (references/prohibited-tactics.md). Popularity and difficulty are
proxies from public data, so call them proxies every time and never present them as search volumes.
Inputs
- What the app does, for whom, in the developer's words, plus the current listing if one exists (
listing.json, same format asstore-audit). - Launch storefronts and the languages the app really supports.
- The App Store ID if the app is live (so its current rank can be reported).
- A competitor snapshot, if
store-auditalready made one (competitors.json).
Workflow
Keep every file in aso/<date>/ at the project root (or a scratch folder). Commands below are relative to
this skill's folder. Read references/keyword-method.md once before starting. It explains each step and how
to read the numbers.
- Competitors:
python3 scripts/keyword_rank.py apps --term "<job term>" --term … --country us -o apps.jsonThis gives competitor IDs for step 3 and the snapshot thatchar_lint.py --competitorsneeds. You can also usestore-audit'scompetitors.json. - Seeds: 5–10 words for the app's job, written as a user would type them.
- Expand:
python3 scripts/keyword_rank.py expand --seed … --country us -o expand.jsonRemove app names, other jobs and unsupported languages. Keep 20–40 candidates asshortlist.json(a list of terms). In a niche, autocomplete is mostly app names, so expect to write much of the shortlist by hand. - Reviews:
python3 scripts/keyword_rank.py reviews --app-id <top 2–3 competitors from apps.json> --format mdAdd the phrases users actually use, but never competitor names that show up among them. Keep complaint words separately forstore-assets. If the direct competitors have no reviews, mine the closest adjacent apps and say so. - Score:
python3 scripts/keyword_rank.py score --keywords shortlist.json --app-text listing.json --country us[,gb…] -o scores.jsonDo a quick pass with--no-popularityfirst (about 2 s per term per storefront), then probe popularity only for the 15–20 best terms (roughly 10–30 s each per storefront). Correct relevance by hand where the calculation is wrong (--relevance overrides.json). Rows markedblockedare competitor names, and a term blocked in one storefront stays out everywhere. - Variants: 3 names, 3 subtitles (
keyword-method.md§6), then a keyword field for each pair and each localisation (en-US and en-GB are separate fields):python3 scripts/keyword_pack.py --scores scores.json --country us --competitors apps.json --name "…" --subtitle "…"It drops terms with relevance below 0.5 and never reassembles a blocked brand. If it reports free characters, add relevant words by hand. - Lint: write all variants to
variants.jsonand runpython3 scripts/char_lint.py --file variants.json --competitors apps.json(give each variant alabel) Fix and re-run until it passes. WASTE warnings are worth fixing. LIMIT and BLOCK must be fixed. - Category: recommend a primary and a secondary category (
references/category-choice.md), with chart depth frompython3 scripts/keyword_rank.py charts --genre <id> --genre <id> --country us,gb.
Output: aso-research.md
- Recommendation: one name, one subtitle and one keyword field, with character counts and the
char_lintresult line. - Alternatives: the other variants in a table (name · subtitle · keywords · counts · lint).
- Keyword table: the top 25 by opportunity for each storefront. Columns: keyword, popularity proxy, difficulty, relevance, opportunity, current rank, and where it is placed (name / subtitle / keywords / not used). Add one line explaining that the numbers are proxies.
- Why these words: 3–5 sentences connecting the choice to what users type and what the app does.
- Category recommendation with the chart-depth numbers.
- Multi-market notes: terms that are easy in one storefront and hard in another, plus localisation advice for supported languages only.
- Refused tactics: anything the user asked for that this skill would not do, and why.
- Measure: which 5–10 keywords to re-check in 2–4 weeks, and the command to do it.
- Footer: Guidance based on public App Review Guidelines; Apple's decisions are their own. Also the date the data was fetched.
Judgement
- Relevance beats opportunity. A high-scoring keyword that does not describe the app is a 2.3.7 rejection risk and a 4.3 signal.
- A new app should not target terms with difficulty above ~70 in the name. Win the long tail first.
- If
store-auditflagged the name as a keyword stack, the recommended name must fix that. Brand first, at most one descriptor. - If the user's current metadata breaks a rule, say so plainly before proposing anything else.
- The scripts call public Apple endpoints at about one request a second, and slower when Apple throttles. Popularity probing costs several calls per term. Budget about 15 minutes for 20 probed terms in two storefronts, and keep the rest difficulty-only. In the keyword table, mark difficulty-only rows as such.
References
references/keyword-method.md: the method, step by step, and how to read the numbersreferences/metadata-rules.md: limits, what is indexed, how fields combine, 2.3.7references/category-choice.md: picking categories, genre IDs, chart depthreferences/prohibited-tactics.md: what is refused and the honest alternative
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.

