# Skill: iOS ASO Generator A Claude Code skill that scans your Swift/SwiftUI codebase and emits paste-ready App Store metadata — App Name, Subtitle, Keywords, Description, and more. category: Skill date: Sat May 02 2026 00:00:00 GMT+0000 (Coordinated Universal Time) reading-time: 6 min read excerpt: The whole searchable surface on the App Store is 160 characters — App Name (30) + Subtitle (30) + Keywords (100). This skill extracts signals from your codebase and generates a compliant, optimised ASO.md grounded in what your app actually does. --- # iOS App Store Optimization (ASO) Generator This skill scans an iOS Swift/SwiftUI codebase and emits a single English-only `ASO.md` at the repo root containing paste-ready App Store metadata plus a research-notes appendix. It encodes Apple's 2025–2026 metadata rules, WWDC25 changes (App Store Tags, CPP organic keywords, SAP collapse), and a codebase-signal extraction taxonomy. The whole searchable surface on the App Store is **160 characters total**: App Name (30) + Subtitle (30) + Keywords (100). Everything else exists for conversion or browse — not search ranking. Get those 160 right and the rest follows. ## Install ```bash /plugin marketplace add https://github.com/conorluddy/ASOMarketplace /plugin install ios-aso-plugin ``` Then in any iOS project: ``` /ios-aso ``` ## When this skill applies Trigger when you want to: - Generate ASO metadata for a new iOS app - Audit or improve an existing App Store listing - Pick keywords from your codebase - Choose a category, write a subtitle, draft a description, or prepare for submission - Check metadata for rejection risk (2.3.7) The skill assumes English (U.S.) primary locale. Cross-localization expansion (en-GB, en-AU, en-CA, es-MX) is offered as an optional appendix in the output. ## Workflow ### Step 1 — Confirm iOS project and find the brand Confirm the working directory is an iOS project: look for `*.xcodeproj`, `*.xcworkspace`, or a `Package.swift` declaring an iOS platform. Find the brand name in this precedence order: 1. `fastlane/metadata/en-US/name.txt` (if present, treat existing files as the source of truth and propose refinements rather than rewrites) 2. `CFBundleDisplayName` in the primary target's `Info.plist` 3. `CFBundleName` 4. The Xcode target name 5. The repo's README first heading ### Step 2 — Scan the codebase for signals Build a feature inventory by union-ing signals across Tier 1–4 sources: - **Tier 1**: `Info.plist` (`NS*UsageDescription` strings), `Localizable.strings` / `.xcstrings`, `fastlane/metadata`, README - **Tier 2**: `*.entitlements`, `PrivacyInfo.xcprivacy`, Xcode capabilities (widgets, Live Activities, App Clips, Background Modes) - **Tier 3**: App Intents (`AppIntent`, `AppShortcut`), StoreKit IAPs, SwiftUI/UIKit view + module names, Core Data / SwiftData entities, `Package.swift` / Podfile dependencies - **Tier 4**: Snapshot test names, accessibility identifiers Tokenize all user-facing strings, frequency-rank after stop-word filtering, and produce a candidate keyword pool of 30–50 single words. ### Step 3 — Synthesize the metadata **Pick the keyword set, not phrases.** Choose 10–20 single-word tokens that *recombine* across Title + Subtitle + Keywords into the highest-relevance 2- and 3-word phrases. Apple combines words across those three fields within a locale to form search phrases. Tokens multiply; phrases don't. Draft fields in this order: 1. **App Name (≤30 chars):** `Brand: Keyword Phrase` (colon is the most efficient separator). For new/indie apps put 1–2 of your strongest keywords here. 2. **Subtitle (≤30 chars):** A readable mini-sentence with 2–3 keyword tokens *not* used in the Name. Leave 1–2 chars headroom — the last word of a fully-packed subtitle occasionally fails to index. 3. **Keywords field (≤100 chars):** Comma-separated, **no spaces after commas**. Single words only. Exclude every word already in Name, Subtitle, primary category, and Apple's stop-word list. 4. **Primary category:** Drives browse placement AND is a text-relevance signal in search. 5. **Secondary category:** Browse only. 6. **Promotional Text (≤170):** Updatable anytime without a build — use for promos, new features, social proof. 7. **Description:** First 170 chars are the hook (above the "more" fold). Then 5–10 benefit-led bullets. 8. **What's New:** Template only. 9. **IAP names (≤30) and descriptions (≤45)** for each detected StoreKit product. 10. **Screenshot caption suggestions** — per WWDC25, captions feed Apple's AI tagging. ### Step 4 — Validate against the rules **Hard rules:** - App Name ≤30 chars; Subtitle ≤30; Keywords ≤100 - Keywords field has **no spaces after commas** — Apple counts them - **No word appears in more than one of Name/Subtitle/Keywords** (or in the primary category) - **No plurals** of singular forms used elsewhere (Apple stems English; `climb` and `climbs` are duplicates) - Single words only in the Keywords field **Apple Review 2.3.7 rejection triggers (default-exclude):** - Trademarks the developer doesn't own - Competitor brand names in the Keywords field - Superlatives without proof: `#1`, `Best`, `Top`, `World's Best` - Pricing language: `Free`, `50% Off`, `$0.99` - Generic catch-alls: `app`, `the`, `for`, `of`, `game`, `best`, `top` - "AI" claims without genuine AI integration ### Step 5 — Write `ASO.md` The skill writes a 16-section output file: | Section | Purpose | |---------|---------| | TL;DR | One-line summary of the strategy | | App Name | Final with char count | | Subtitle | Final with char count | | Keywords | Final comma-separated string | | Promotional Text | Updatable copy | | Description | Full with fold-break marked | | What's New | Template | | IAPs | Names + descriptions per product | | Categories | Primary + secondary | | Screenshot Captions | Per-screen suggestions | | Cross-Localization | Optional en-GB/AU/CA/MX appendix | | Custom Product Pages | CPP keyword targets | | ASA Seed | Apple Search Ads seed terms | | Pre-Submission Checklist | 2.3.7 and hard-rule verification | | Research Notes | Why each choice was made, citing codebase evidence | | Candidate Pool | Every considered keyword with evidence, for iteration | The **Research Notes** section is what you read to iterate — concrete evidence like "Picked `workout` because it appears 47× across `Localizable.strings` and the project depends on HealthKit." ## Notes on the post-September-2025 keyword research landscape The legacy Apple Search Ads "Search Popularity" score collapsed on Sept 29, 2025 — ~77% of U.S. keywords now floor to "5". Don't rely on it. Free signals that still work: - App Store autocomplete (Apple-direct) - App Store search results count + which apps rank for a term - Apple Ads' beta Monthly Search Term Rank Report (limited to legacy SAP ≥ 35 terms) If you have access to AppTweak / Sensor Tower / MobileAction / Appfigures / App Radar — cross-validate the skill's picks. The skill itself doesn't assume any paid tool. ## Iteration ASO is iterative. The skill produces a v1. Submit, wait ~4 weeks, track keyword rankings in App Store Connect Analytics, and replace bottom-quartile keywords with alternates from the Candidate Pool. Promotional Text refreshes every 30–90 days. Re-run the skill after major feature ships.