Not in the top 1,000 by GitHub stars
hristo2612/aso-cli
Free, local App Store Optimization CLI + agent skills: keyword popularity, difficulty, ranks, SQLite history, automatic Apple sign-in.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
skills/aso/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
0ff5a2b6097a → 0ff5a2b6097a
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 0ff5a2b6097a
No earlier version was observed for comparison.
skills/aso-audit/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
0ff5a2b6097a → 0ff5a2b6097a
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 0ff5a2b6097a
No earlier version was observed for comparison.
skills/aso-competitors/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
0ff5a2b6097a → 0ff5a2b6097a
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 0ff5a2b6097a
No earlier version was observed for comparison.
skills/aso-conversion/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
0ff5a2b6097a → 0ff5a2b6097a
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 0ff5a2b6097a
No earlier version was observed for comparison.
skills/aso-keyword-research/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
0ff5a2b6097a → 0ff5a2b6097a
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 0ff5a2b6097a
No earlier version was observed for comparison.
skills/aso-localization/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
0ff5a2b6097a → 0ff5a2b6097a
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 0ff5a2b6097a
No earlier version was observed for comparison.
skills/aso-metadata/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
0ff5a2b6097a → 0ff5a2b6097a
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 0ff5a2b6097a
No earlier version was observed for comparison.
skills/aso-tracking/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
0ff5a2b6097a → 0ff5a2b6097a
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 0ff5a2b6097a
No earlier version was observed for comparison.
Heat
1.8- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
- aso
skills/aso - aso-audit
skills/aso-audit - aso-competitors
skills/aso-competitors - aso-conversion
skills/aso-conversion - aso-keyword-research
skills/aso-keyword-research - aso-localization
skills/aso-localization - aso-metadata
skills/aso-metadata - aso-tracking
skills/aso-tracking
How it works
aso
When your agent uses it
Entry point and router for App Store Optimization (ASO) work on an iOS/macOS app using the `aso` CLI. Start here whenever a request is broad or ambiguous, such as "improve my ASO", "help with my App Store listing", "why isn't my app ranking", "do a full ASO pass", or just "ASO for my app", even if the user doesn't name a specific task. Checks the CLI is installed and signed in, explains Apple's search-indexing rules that every other ASO skill assumes you already know, then routes to the right specialized skill (aso-keyword-research, aso-metadata, aso-competitors, aso-audit, aso-tracking, aso-localization, aso-conversion). Skip straight to one of those instead when the request already names a specific job, like "write my subtitle" or "find my competitors".
What it loads into context
Frontmatter
187 tokensAlways available to the agent
SKILL.md
2,079 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Preflight
- Core Apple search facts (know these before touching metadata)
- Data caveats
- The CLI does not upload metadata
- Routing
- Google Play
Files
SKILL.mdcore8,861 bytesSKILL.mdcore8,861 bytes
Read SKILL.md
# ASO Router
Entry point for all ASO work with the `aso` CLI (`hristo2612/aso-cli` on GitHub, `aso-kit` on npm). Do preflight, know the core facts, then route.
## Preflight
Run once per session before any other `aso` command:
```bash
aso status
```
- If `aso: command not found`: install it with `npm i -g hristo2612/aso-cli` (needs Node.js 22.13+, also published as `aso-kit` on npm), or `curl -fsSL https://raw.githubusercontent.com/hristo2612/aso-cli/main/install.sh | bash`.
- If `aso status` shows no active session: run `aso setup` (interactive first-run, Apple ID, app, default country, then triggers login) or `aso login` if already configured. Both open Chrome and handle 2FA/Keychain in the user's own terminal.View the complete source on GitHubaso-audit
When your agent uses it
Use for a full App Store Optimization health check or report card on an existing app listing with the `aso` CLI, when the ask is "how healthy is my listing overall" rather than one specific fix. Trigger on "audit my ASO", "how is my app doing", "review my app store listing", "ASO health check", "what's wrong with my listing", or "give me a report card", even if the user is vague about what exactly to check. Grades metadata utilization, keyword coverage and ranks, ratings vs competitors, localization coverage, and conversion assets on an A-F scale, each dimension backed by a number from `aso app`, `aso keywords`, `aso lint`, and `aso search`, never a guess.
What it loads into context
Frontmatter
159 tokensAlways available to the agent
SKILL.md
1,453 tokensWhen the skill is activated
Reference documents
1,729 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Iron law
- Intake
- Step 1: Gather data
- Step 2: Set the brand-maturity tier first
- Step 3: Grade five dimensions (A-F)
- Step 4: Overall grade
- Step 5: Prioritized action items
- Output: report card
- Limitations, and Google Play (mental model only)
- Red flags
Files
SKILL.mdcore6,041 bytesSKILL.mdcore6,041 bytesSKILL.mdcore6,041 bytesreferences/grading-rubrics.mddoc5,509 bytesreferences/limitations-and-play.mddoc2,252 bytes
Read SKILL.md
# ASO Audit
Produce a data-backed report card, not an opinion. Every grade must trace back to a number from the CLI, and every dimension you can't measure gets marked unknown instead of guessed at. Preflight: see the `aso` router skill.
## Iron law
**Grade on data, not impressions.** "Your keywords look fine" is not an audit finding. A grade needs a metric behind it: a lint score, a rank, a rating count, a character count. If you don't have the metric, the dimension is "unknown," not a guessed grade.
## Intake
1. App ID (required), primary storefront (default US)
2. Additional storefronts to check? (locale coverage dimension needs this)
3. 1-3 competitor app IDs for the ratings/rank comparison (ask, or derive via `aso-competitors`'s Step 1)
View the complete source on GitHubaso-competitors
When your agent uses it
Use to analyze specific App Store competitors, compare listings side by side, or find keyword gaps between your app and named rival apps with the `aso` CLI. Trigger on "who are my competitors", "compare my app to X", "what keywords does Ring or Headspace rank for that I don't", or "keyword gap analysis", even if the user only names one competitor. Finds competitors via `aso search`, pulls their listings with `aso app`, and diffs keyword coverage against your app into quick-win, defend, battleground, aspirational, and ignore buckets. Not for general keyword brainstorming with no specific competitor in view, use `aso-keyword-research` for that.
What it loads into context
Frontmatter
147 tokensAlways available to the agent
SKILL.md
1,241 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Iron law
- Step 1: Identify competitors
- Step 2: Pull their listings
- Step 3: Keyword-gap analysis
- Step 4: Categorize
- Step 5: Present and hand off
- Step 6: Ongoing monitoring
- Rules
Files
SKILL.mdcore5,331 bytesSKILL.mdcore5,331 bytesSKILL.mdcore5,331 bytesSKILL.mdcore5,331 bytesSKILL.mdcore5,331 bytes
Read SKILL.md
# ASO Competitor Analysis
Find keyword gaps and ranking opportunities by looking at who already ranks: not to copy them, but to find what they've validated that you haven't targeted yet.
Preflight: see the `aso` router skill.
## Iron law
**This is gap analysis, not copying.** The #1 app for a term already owns it: chasing it head-on is expensive. The value is in terms *they* rank for that you don't, and terms where you can realistically outrank a specific competitor, not the whole field.
## Step 1: Identify competitors
If the user already named competitor apps, get their app IDs. If not, find them from your own keyword data or a live search:
View the complete source on GitHubaso-conversion
When your agent uses it
Use to improve App Store conversion assets, the icon, screenshots, preview video, Custom Product Pages, Product Page Optimization, or In-App Events, for an iOS app once people are already finding the listing. Trigger on "improve my screenshots", "app icon feedback", "conversion rate", "custom product pages", "product page optimization", "in-app events", or "why isn't my listing converting even though it ranks fine". Qualitative playbook plus whatever `aso app`/`aso search` can show about the current listing and competitors; it is not about keyword ranking, see `aso-keyword-research` and `aso-metadata` for that.
What it loads into context
Frontmatter
143 tokensAlways available to the agent
SKILL.md
1,476 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Iron law
- What the CLI can tell you
- Icon
- Screenshots
- Preview video
- Custom Product Pages (CPPs)
- Product Page Optimization (PPO)
- In-App Events
- Workflow
- Red flags
Files
SKILL.mdcore6,777 bytesSKILL.mdcore6,777 bytes
Read SKILL.md
# ASO Conversion Optimization
Getting found is `aso-keyword-research`/`aso-metadata`'s job. This skill is what happens after someone sees the listing: does it convert a view into an install. `aso` has no visual or analytics data, this is qualitative guidance plus what the CLI can show you about the current listing and competitors.
Preflight: see the `aso` router skill.
## Iron law
**Conversion assets carry no searchable text.** Icon, screenshots, preview video, and Custom Product Page content don't get indexed, so never claim screenshot captions or icon text rank for keywords; treat every recommendation here as a conversion lever only. Conversion rate and ratings are widely believed to feed back into ranking indirectly over time (see `aso`), which is why this work still matters for ASO, just not through indexing.
## What the CLI can tell you
```bash
aso app <appId> --lang en-US # your own listing: screenshot count context via description, ratings, versionView the complete source on GitHubaso-keyword-research
When your agent uses it
Use to find, discover, brainstorm, or expand candidate App Store keywords for an iOS/macOS app before writing metadata, backed by real `aso keywords`/`aso suggest` data rather than guessing. Trigger on "what keywords should I target", "help me find keywords", "keyword research for my app", "long-tail keywords for a new app", or "what should my next update focus on for search". Produces a ranked, scored keyword shortlist with tiers (primary, secondary, long-tail, defensive, competitor-gap) and a recommended token set, not a finished metadata draft, hand that to `aso-metadata`.
What it loads into context
Frontmatter
138 tokensAlways available to the agent
SKILL.md
1,504 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Iron law
- Step 1: Seed keywords
- Step 2: Expand each seed
- Step 3: Score in batches
- Step 4: Shortlist (relevance first, then opportunity)
- Long-tail strategy for new / small apps
- Keyword tiers
- Step 5: Output
Files
SKILL.mdcore6,054 bytesSKILL.mdcore6,054 bytesSKILL.mdcore6,054 bytes
Read SKILL.md
# ASO Keyword Research
Find keywords the app can realistically win, backed by `aso` data: never gut feel.
Preflight: see the `aso` router skill (CLI installed, session status). Popularity needs a session; difficulty/rank/opportunity work without one.
## Iron law
**Never shortlist a keyword without running it through `aso keywords`.** Popularity and difficulty come from the CLI, not intuition.
## Step 1: Seed keywords
Brainstorm 10-20 seeds across categories, not just the obvious core term:
View the complete source on GitHubaso-localization
When your agent uses it
Use to pick new App Store markets, research keywords natively per country, or exploit cross-locale keyword indexing with the `aso` CLI, the single most under-used ASO lever for most apps. Trigger on "localize my app", "target new markets", "international ASO", "which locales should I fill", "translate my keywords", or "how does cross-locale indexing work". Uses `aso storefronts` and the per-country `-c` flag for native market research plus `aso lint --fastlane` to validate every locale at once, and warns against ever just translating one locale's keywords into another instead of researching them fresh.
What it loads into context
Frontmatter
141 tokensAlways available to the agent
SKILL.md
1,456 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Iron law
- Step 1: Pick markets
- Step 2: Research per country, not per translation
- Step 3: Dedup across locales in the same storefront
- Step 4: Assemble and validate every locale at once
- Step 5: Apply and log
- Seasonal keyword calendar
- Output
- Red flags
Files
SKILL.mdcore6,442 bytesSKILL.mdcore6,442 bytesSKILL.mdcore6,442 bytesSKILL.mdcore6,442 bytesSKILL.mdcore6,442 bytes
Read SKILL.md
# ASO Localization
Fill more of a storefront's indexing capacity than the primary locale alone gives you: the single most under-used ASO lever for most apps.
Preflight: see the `aso` router skill.
## Iron law
**Research each locale natively: never translate.** A translated keyword is a guess about what a market searches; a keyword pulled from `aso suggest`/`aso keywords` with `-c <that country>` is measured. "Überwachungskamera" outperforms a literal translation of "security camera" in DE because it's what Germans actually type, not what English maps to.
## Step 1: Pick markets
```bash
aso storefrontsView the complete source on GitHubaso-metadata
When your agent uses it
Use to write, rewrite, or optimize App Store metadata, the title, subtitle, or keywords field, for one locale with the `aso` CLI, once you already have or can quickly gather candidate keywords. Trigger on "optimize my metadata", "write my app title", "improve my keywords field", "my app isn't ranking so fix the listing text", "rewrite my subtitle", or "draft a keyword field". Builds a token budget across fields, drafts two to three options, validates every draft with `aso lint`, and logs the shipped change with `aso log add`. If there's no keyword shortlist yet, run `aso-keyword-research` first rather than inventing keywords here.
What it loads into context
Frontmatter
149 tokensAlways available to the agent
SKILL.md
1,540 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Iron law
- Step 1: Gather inputs
- Step 2: Token budget
- Step 3: Build the compound-phrase matrix
- Step 4: Draft 2-3 full options
- Step 5: Validate every draft
- Step 6: Promotional text and What's New
- Step 7: Screenshot captions (brief)
- Step 8: Apply and log
Files
SKILL.mdcore6,700 bytesSKILL.mdcore6,700 bytesSKILL.mdcore6,700 bytesSKILL.mdcore6,700 bytes
Read SKILL.md
# ASO Metadata Optimizer
Craft title, subtitle, and keywords field for one locale so they both rank and convert.
Preflight: see the `aso` router skill.
## Iron law
**Never repeat a word across title, subtitle, and keywords.** Apple indexes all three independently and combines their tokens into phrases: repetition burns character budget for zero extra ranking benefit. Validate every draft with `aso lint` before presenting it.
## Step 1: Gather inputs
- Current metadata for the locale (ask the user, or read their fastlane `metadata/<locale>/{name.txt,subtitle.txt,keywords.txt}` if the project has one).
- A scored keyword shortlist. If you don't have one, run `aso-keyword-research` first: don't invent keywords here.View the complete source on GitHubaso-tracking
When your agent uses it
Use to set up, run, or review App Store keyword rank tracking over time with the `aso` CLI, especially to answer "did that metadata change actually help". Trigger on "track my keyword rankings", "set up rank tracking", "how are my rankings trending", "set up a cron job for ASO", or "check if my last update improved rank". Covers `aso track add`, `aso track run`, `aso track list`, `aso ranks`, `aso history`, and `aso log list`, plus the discipline of changing one field at a time and waiting 7 to 14 days before judging a result.
What it loads into context
Frontmatter
136 tokensAlways available to the agent
SKILL.md
1,034 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Step 1: Add keywords to track
- Step 2: Refresh and read current state
- Step 3: Automate with cron
- Step 4: Look at trend, not a single snapshot
- Step 5: Evaluate a shipped change
- Rules for change velocity
- Output when reviewing
Files
SKILL.mdcore4,121 bytesSKILL.mdcore4,121 bytesSKILL.mdcore4,121 bytesSKILL.mdcore4,121 bytesSKILL.mdcore4,121 bytesSKILL.mdcore4,121 bytesSKILL.mdcore4,121 bytes
Read SKILL.md
# ASO Rank Tracking
Rank tracking exists to answer one question: **did the change help?** Set it up once, then use it to evaluate every metadata change against a real before/after.
Preflight: see the `aso` router skill. Tracking data lives locally in SQLite at `~/.aso/aso.db`.
## Step 1: Add keywords to track
```bash
aso track add <appId> <term1> <term2> <term3> ...
```
Track: everything currently in the keywords field, the title/subtitle phrases, plus the shortlist from `aso-keyword-research` you intend to chase. Don't track everything you've ever considered, that just adds noise and cron runtime.
View the complete source on GitHubSkills included
- aso
- aso-audit
- aso-competitors
- aso-conversion
- aso-keyword-research
- aso-localization
- aso-metadata
- aso-tracking
Repository facts
- License
- MIT
- Created
- Sep 23, 2026
- Last pushed
- Oct 5, 2026
- Forks
- 4
- Open issues
- 0
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 5, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 23 notes
skills/aso/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-audit/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-audit/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-competitors/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-competitors/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-competitors/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-competitors/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-conversion/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-keyword-research/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-keyword-research/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-localization/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-localization/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-localization/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-localization/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-metadata/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-metadata/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-metadata/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-tracking/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-tracking/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/aso-tracking/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 2 dangerous shell commandsin 2 files: aso-tracking/SKILL.md:22 aso/SKILL.md:18
- 1 network referencein 1 file: aso/SKILL.md:18
- No hidden or obfuscated text
- No instruction overrides
- No executable scripts
- 3 references to secretsin 1 file: aso/SKILL.md:19
- No requests to vote in Hot
Show all 6 signals by file
skills/aso-tracking/SKILL.md
- Dangerous shell operationline 22
aso track rm <appId> <term> # stop tracking a term
skills/aso/SKILL.md
- Dangerous shell operationline 18
- If `aso: command not found`: install it with `npm i -g hristo2612/aso-cli` (needs Node.js 22.13+, also published as `aso-kit` on npm), or `curl -fsSL https://raw.githubusercontent.com/hristo2612/aso-cli/main/install.sh | bash`. - Network accessline 18
- If `aso: command not found`: install it with `npm i -g hristo2612/aso-cli` (needs Node.js 22.13+, also published as `aso-kit` on npm), or `curl -fsSL https://raw.githubusercontent.com/hristo2612/aso-cli/main/install.sh | bash`. - Access to secretsline 19
[Credential-related source omitted] - Access to secretsline 20
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted]
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Signal confidence: 6 facts
- Dangerous shell operation in code of the SKILL.mdaso-tracking/SKILL.md:22High confidence
- Dangerous shell operation in prose of the SKILL.mdaso/SKILL.md:18Low confidence
- Network access in prose of the SKILL.mdaso/SKILL.md:18Low confidence
- Access to secrets in prose of the SKILL.mdaso/SKILL.md:19Low confidence
- Access to secrets in prose of the SKILL.mdaso/SKILL.md:20Low confidence
- Access to secrets in prose of the SKILL.mdaso/SKILL.md:23Low confidence
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md skills/aso/SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md skills/aso/SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md skills/aso/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md skills/aso/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md skills/aso/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md skills/aso/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.