Help us improve
Share bugs, ideas, or general feedback.
From appmate
Generates a daily ASO keyword-ranking report for the top-3 apps by download volume, querying iTunes Search for rank changes and producing a markdown dashboard.
npx claudepluginhub fengyiqicoder/appmate --plugin appmateHow this skill is triggered — by the user, by Claude, or both
Slash command
/appmate:aso-daily-reportThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> Run once to watch the keyword-ranking changes of the top-3 apps in their main markets.
Optimizes App Store metadata (title, subtitle, keywords) for a single app using keyword ranking and popularity analysis. Automates ASO optimization via App Store Connect APIs.
Provides ASO toolkit for keyword research, competitor analysis, metadata optimization, review sentiment, and performance tracking on Apple App Store and Google Play.
Researches keywords, analyzes competitors, optimizes metadata, and tracks performance for Apple App Store and Google Play Store listings.
Share bugs, ideas, or general feedback.
Run once to watch the keyword-ranking changes of the top-3 apps in their main markets.
Every step in this skill calls App Store Connect APIs. Before any other step, run:
python3 scripts/appmate_config.py check
If exit code ≠ 0, STOP. Do not invoke any other part of this skill, do not run scripts/aso_daily.py. Tell the user AppMate credentials are not configured, show the precheck output verbatim, and tell them to invoke the appmate-setup skill. The downstream script also enforces this gate (exits 2 with the same message), but the explicit precheck avoids wasted iTunes Search calls.
Take the top-3 apps by download volume → find each one's main market → LLM semantic tokenization (handles CJK / Chinese-Japanese-Korean App Store metadata when the target market uses those scripts) → query iTunes Search for rankings → rank ≤ 20 enters the "target keyword group" → popularity & difficulty come from the static keyword reference → compare against yesterday's snapshot → markdown report.
aso-optimize skill| ASO daily report (this skill) | ASO optimize (aso-optimize skill) | |
|---|---|---|
| Trigger | user runs it occasionally | on demand, single app |
| Scope | runs all top-3 apps | one app, deep optimization |
| Purpose | monitor changes + rank delta | generate new metadata |
| Output | dashboard tables | paste-ready 3-string set |
| LLM role | tokenization only (Step 2) | the whole flow |
| User intervention | 2 (trigger + provide the LLM tokenization loop) | 2 (trigger + receive the final) |
| Candidate filter | rank ≤ 20 = target word | no filter — full data |
| Report granularity | horizontal comparison of 3 apps | single-app depth |
| Item | Content |
|---|---|
| Trigger | the user asks → you (Claude) start the flow |
| Input | data/apps_full.json (live-app list) + data/sales_cache.json (top-3) + data/aso_rank_snapshots.json (yesterday's snapshot) |
| Output | in-conversation markdown + data/aso_daily.md file |
data/aso_rank_snapshots.json; compare against yesterday's snapshot to compute the delta; filter to rank ≤ 20 = target words; LLM renders per the report template.Overall experience: trigger → you run it all yourself → give the user the report.
Rendered in the same language the user has been using in this conversation. Default to English; if the user has been writing in Chinese / Japanese / Spanish / etc., translate the template headers, labels and prose accordingly. The keyword strings inside the table cells (the actual App Store metadata being analyzed) stay in their App Store locale form (e.g. zh-Hans tokens stay as zh-Hans) regardless of conversation language — only the surrounding column headers and prose follow the user's conversation language.
**Yesterday ({MM-DD}) data · Rank = App Store web search · Popularity/difficulty = internal metric**
## {idx}. {app_name} · {platform} · {flag} {country}
Downloads yesterday **{N}** · target keywords **{X}** (rank ≤ 20, filtered from {Y} candidates)
> ⚠️ If the app has no localization for that country's language family, print a one-line warning
| Keyword | Rank | Δ | Popularity | Difficulty |
|---|:-:|:-:|:-:|:-:|
| `keyword` | **#N** | ↑3 | **88** 🔥 | 44 🟢 |
| ... | ... | ↓1 | ... | ... |
Sorting: descending by popularity, ties by ascending rank.
Yesterday (MM-DD) data …), do not stack metadata rows.H2 (##), single-market focus, do not show multiple markets.— on day one).**#N**, 11-20 plain #N, > 20 should not appear (already filtered by TARGET_RANK_CEILING).| Dimension | Source |
|---|---|
| Pick top-3 apps | data/sales_cache.json, 30-day downloads descending |
| Yesterday's downloads (per market) | data/sales_cache.json (iTunes Connect sales report) |
| Main market (single focus) | the country with the largest 30-day downloads |
| Title / subtitle | data/apps_full.json appInfo.localizations[picked_locale] |
| Keyword field | data/apps_full.json versions[latest].localizations[picked_locale] |
| Candidate tokenization | LLM semantic split (not regex / jieba) |
| Rank | iTunes Search Top-200 (same source as the App Store web page) |
| Heat (1-99) | keyword_local.lookup_popularity_batch — backed by data/keyword_reference_<region>.json |
| Difficulty (1-99) | same as above |
| Δ vs yesterday | data/aso_rank_snapshots.json comparing today's/yesterday's snapshot |
These notes are about parsing CJK App Store metadata (e.g. zh-Hans / ja / ko), not about the rendered output language.
| Approach | Problem |
|---|---|
| regex | long CJK runs (e.g. 网络翻译邮箱地图地球) cannot be split → rejected by _good_token's CJK ≥ 6 rule → real target words lost |
| jieba | boundary judgment is often wrong (便利贴 → 便利+贴), and it cannot recognize ASO-domain words (桌面便签, 云便签, etc.) |
| LLM | ✓ semantic understanding — recognizes compound words, brand variants, typos, domain words |
| Parameter | Value | Note |
|---|---|---|
TARGET_RANK_CEILING | 20 | rank ≤ this value enters the target keyword group (monitoring view) |
| Top-N | 3 | default top 3 apps |
# from the plugin repo root
# existing automatic version (regex tokenization — misses long CJK runs)
python3 scripts/aso_daily.py
# new version (LLM tokenization): two steps
# Step 1: run analyze separately for each top-3 app with the v2 tool
python3 scripts/aso_optimize_v2.py analyze "<app 1>"
python3 scripts/aso_optimize_v2.py analyze "<app 2>"
python3 scripts/aso_optimize_v2.py analyze "<app 3>"
# Step 2-3: paste the 3 phase_a JSONs to Claude, who does the LLM
# tokenization + validate + render
aso-optimize skill (aso_optimize_v2.py analyze <app>) for a deep optimization.aso-optimize skill outputs new metadata → the user updates App Store Connect → a few days later the daily report shows the rank change.aso-optimize, which sees the full set).