agentleFS
agshinrajabovagshinrajabov/store-ready-kit/skills/aso-research/SKILL.md

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

  • Other versions1 project uses a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 1

    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.

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
  1. Very specific:

    Hard rules: Every proposed name, subtitle and keyword field goes through scripts/char_lint.py and passes before it is shown.

    line 11
  2. Very specific:

    Keep every file in aso/<date>/ at the project root (or a scratch folder).

    line 26
  3. Very specific:

    Remove app names, other jobs and unsupported languages.

    line 35
  4. Very specific:

    Add the phrases users actually use, but never competitor names that show up among them.

    line 38
  5. Very specific:

    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 …

    line 42
  6. Very specific:

    Lint: write all variants to variants.json and run python3 scripts/char_lint.py --file variants.json --competitors apps.json (give each …

    line 51
  7. Very specific:

    If store-audit flagged the name as a keyword stack, the recommended name must fix that.

    line 79
  8. Distinctive:

    If the user's current metadata breaks a rule, say so plainly before proposing anything else.

    line 81

≈ “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.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

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

  1. What the app does, for whom, in the developer's words, plus the current listing if one exists (listing.json, same format as store-audit).
  2. Launch storefronts and the languages the app really supports.
  3. The App Store ID if the app is live (so its current rank can be reported).
  4. A competitor snapshot, if store-audit already 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.

  1. Competitors: python3 scripts/keyword_rank.py apps --term "<job term>" --term … --country us -o apps.json This gives competitor IDs for step 3 and the snapshot that char_lint.py --competitors needs. You can also use store-audit's competitors.json.
  2. Seeds: 5–10 words for the app's job, written as a user would type them.
  3. Expand: python3 scripts/keyword_rank.py expand --seed … --country us -o expand.json Remove app names, other jobs and unsupported languages. Keep 20–40 candidates as shortlist.json (a list of terms). In a niche, autocomplete is mostly app names, so expect to write much of the shortlist by hand.
  4. Reviews: python3 scripts/keyword_rank.py reviews --app-id <top 2–3 competitors from apps.json> --format md Add the phrases users actually use, but never competitor names that show up among them. Keep complaint words separately for store-assets. If the direct competitors have no reviews, mine the closest adjacent apps and say so.
  5. Score: python3 scripts/keyword_rank.py score --keywords shortlist.json --app-text listing.json --country us[,gb…] -o scores.json 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 (roughly 10–30 s each per storefront). Correct relevance by hand where the calculation is wrong (--relevance overrides.json). Rows marked blocked are competitor names, and a term blocked in one storefront stays out everywhere.
  6. 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.
  7. Lint: write all variants to variants.json and run python3 scripts/char_lint.py --file variants.json --competitors apps.json (give each variant a label) Fix and re-run until it passes. WASTE warnings are worth fixing. LIMIT and BLOCK must be fixed.
  8. Category: recommend a primary and a secondary category (references/category-choice.md), with chart depth from python3 scripts/keyword_rank.py charts --genre <id> --genre <id> --country us,gb.

Output: aso-research.md

  1. Recommendation: one name, one subtitle and one keyword field, with character counts and the char_lint result line.
  2. Alternatives: the other variants in a table (name · subtitle · keywords · counts · lint).
  3. 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.
  4. Why these words: 3–5 sentences connecting the choice to what users type and what the app does.
  5. Category recommendation with the chart-depth numbers.
  6. Multi-market notes: terms that are easy in one storefront and hard in another, plus localisation advice for supported languages only.
  7. Refused tactics: anything the user asked for that this skill would not do, and why.
  8. Measure: which 5–10 keywords to re-check in 2–4 weeks, and the command to do it.
  9. 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-audit flagged 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 numbers
  • references/metadata-rules.md: limits, what is indexed, how fields combine, 2.3.7
  • references/category-choice.md: picking categories, genre IDs, chart depth
  • references/prohibited-tactics.md: what is refused and the honest alternative

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.