App Store Optimization (ASO) Skill This comprehensive skill provides complete ASO capabilities for successfully launching and optimizing mobile applications on the Apple App Store and Google Play Store. Scope, evidence and safe use The eight bundled modules are local standard-library calculators and draft generators. They do not fetch store listings, discover competitors, measure search demand, monitor rankings, translate text or certify store compliance. Supply real, dated, locale-specific inputs from authorized sources; mark missing data as unknown instead of inventing search volume or comp…

, '').replace(',', ''))\n\n roi_analysis = helper.calculate_localization_roi(\n market_codes,\n monthly_downloads,\n estimated_cost\n )\n\n return {\n 'target_markets': target_markets,\n 'roi_analysis': roi_analysis\n }\n","content_type":"text/x-python; charset=utf-8","language":"python","size":22897,"content_sha256":"bc9c2bc10ab71d53eb22f1a0bff64b63427da8e1820a14341d286eb85f5c6302"},{"filename":"metadata_optimizer.py","content":"\"\"\"\nMetadata optimization module for App Store Optimization.\nOptimizes titles, descriptions, and keyword fields with platform-specific character limit validation.\n\"\"\"\n\nfrom typing import Dict, List, Any, Optional, Tuple\nimport re\n\n\nclass MetadataOptimizer:\n \"\"\"Optimizes app store metadata for maximum discoverability and conversion.\"\"\"\n\n # Platform-specific character limits\n CHAR_LIMITS = {\n 'apple': {\n 'title': 30,\n 'subtitle': 30,\n 'promotional_text': 170,\n 'description': 4000,\n 'keywords': 100,\n 'whats_new': 4000\n },\n 'google': {\n 'title': 30,\n 'short_description': 80,\n 'full_description': 4000\n }\n }\n\n def __init__(self, platform: str = 'apple'):\n \"\"\"\n Initialize metadata optimizer.\n\n Args:\n platform: 'apple' or 'google'\n \"\"\"\n if platform not in ['apple', 'google']:\n raise ValueError(\"Platform must be 'apple' or 'google'\")\n\n self.platform = platform\n self.limits = self.CHAR_LIMITS[platform]\n\n def optimize_title(\n self,\n app_name: str,\n target_keywords: List[str],\n include_brand: bool = True\n ) -> Dict[str, Any]:\n \"\"\"\n Optimize app title with keyword integration.\n\n Args:\n app_name: Your app's brand name\n target_keywords: List of keywords to potentially include\n include_brand: Whether to include brand name\n\n Returns:\n Optimized title options with analysis\n \"\"\"\n max_length = self.limits['title']\n\n title_options = []\n\n # Option 1: Brand name only\n if include_brand:\n option1 = app_name[:max_length]\n title_options.append({\n 'title': option1,\n 'length': len(option1),\n 'remaining_chars': max_length - len(option1),\n 'keywords_included': [],\n 'strategy': 'brand_only',\n 'pros': ['Maximum brand recognition', 'Clean and simple'],\n 'cons': ['No keyword targeting', 'Lower discoverability']\n })\n\n # Option 2: Brand + Primary Keyword\n if target_keywords:\n primary_keyword = target_keywords[0]\n option2 = self._build_title_with_keywords(\n app_name,\n [primary_keyword],\n max_length\n )\n if option2:\n title_options.append({\n 'title': option2,\n 'length': len(option2),\n 'remaining_chars': max_length - len(option2),\n 'keywords_included': [primary_keyword],\n 'strategy': 'brand_plus_primary',\n 'pros': ['Targets main keyword', 'Maintains brand identity'],\n 'cons': ['Limited keyword coverage']\n })\n\n # Option 3: Brand + Multiple Keywords (if space allows)\n if len(target_keywords) > 1:\n option3 = self._build_title_with_keywords(\n app_name,\n target_keywords[:2],\n max_length\n )\n if option3:\n title_options.append({\n 'title': option3,\n 'length': len(option3),\n 'remaining_chars': max_length - len(option3),\n 'keywords_included': target_keywords[:2],\n 'strategy': 'brand_plus_multiple',\n 'pros': ['Multiple keyword targets', 'Better discoverability'],\n 'cons': ['May feel cluttered', 'Less brand focus']\n })\n\n # Option 4: Keyword-first approach (for new apps)\n if target_keywords and not include_brand:\n option4 = \" \".join(target_keywords[:2])[:max_length]\n title_options.append({\n 'title': option4,\n 'length': len(option4),\n 'remaining_chars': max_length - len(option4),\n 'keywords_included': target_keywords[:2],\n 'strategy': 'keyword_first',\n 'pros': ['Maximum SEO benefit', 'Clear functionality'],\n 'cons': ['No brand recognition', 'Generic appearance']\n })\n\n return {\n 'platform': self.platform,\n 'max_length': max_length,\n 'options': title_options,\n 'recommendation': self._recommend_title_option(title_options)\n }\n\n def optimize_description(\n self,\n app_info: Dict[str, Any],\n target_keywords: List[str],\n description_type: str = 'full'\n ) -> Dict[str, Any]:\n \"\"\"\n Optimize app description with keyword integration and conversion focus.\n\n Args:\n app_info: Dict with 'name', 'key_features', 'unique_value', 'target_audience'\n target_keywords: List of keywords to integrate naturally\n description_type: 'full', 'short' (Google), 'subtitle' (Apple)\n\n Returns:\n Optimized description with analysis\n \"\"\"\n if description_type == 'short' and self.platform == 'google':\n return self._optimize_short_description(app_info, target_keywords)\n elif description_type == 'subtitle' and self.platform == 'apple':\n return self._optimize_subtitle(app_info, target_keywords)\n else:\n return self._optimize_full_description(app_info, target_keywords)\n\n def optimize_keyword_field(\n self,\n target_keywords: List[str],\n app_title: str = \"\",\n app_description: str = \"\"\n ) -> Dict[str, Any]:\n \"\"\"\n Optimize Apple's 100-character keyword field.\n\n Rules:\n - No spaces between commas\n - No plural forms if singular exists\n - No duplicates\n - Keywords in title/subtitle are already indexed\n\n Args:\n target_keywords: List of target keywords\n app_title: Current app title (to avoid duplication)\n app_description: Current description (to check coverage)\n\n Returns:\n Optimized keyword field (comma-separated, no spaces)\n \"\"\"\n if self.platform != 'apple':\n return {'error': 'Keyword field optimization only applies to Apple App Store'}\n\n max_length = self.limits['keywords']\n\n # Extract words already in title (these don't need to be in keyword field)\n title_words = set(app_title.lower().split()) if app_title else set()\n\n # Process keywords\n processed_keywords = []\n for keyword in target_keywords:\n keyword_lower = keyword.lower().strip()\n\n # Skip if already in title\n if keyword_lower in title_words:\n continue\n\n # Remove duplicates and process\n words = keyword_lower.split()\n for word in words:\n if word not in processed_keywords and word not in title_words:\n processed_keywords.append(word)\n\n # Deduplicate exact terms without corrupting words such as business or iOS.\n deduplicated = self._remove_plural_duplicates(processed_keywords)\n\n # Build keyword field within 100 character limit\n keyword_field = self._build_keyword_field(deduplicated, max_length)\n\n # Calculate keyword density in description\n density = self._calculate_coverage(target_keywords, app_description)\n\n return {\n 'keyword_field': keyword_field,\n 'length': len(keyword_field.encode('utf-8')),\n 'length_unit': 'UTF-8 bytes',\n 'remaining_bytes': max_length - len(keyword_field.encode('utf-8')),\n 'keywords_included': keyword_field.split(',') if keyword_field else [],\n 'keywords_count': len(keyword_field.split(',')) if keyword_field else 0,\n 'keywords_excluded': [kw for kw in target_keywords if kw.lower() not in keyword_field],\n 'description_coverage': density,\n 'optimization_tips': [\n 'Keywords in title are auto-indexed - no need to repeat',\n 'Use singular forms only (Apple indexes plurals automatically)',\n 'No spaces between commas to maximize character usage',\n 'Update keyword field with each app update to test variations'\n ]\n }\n\n def validate_character_limits(\n self,\n metadata: Dict[str, str]\n ) -> Dict[str, Any]:\n \"\"\"\n Validate all metadata fields against platform character limits.\n\n Args:\n metadata: Dictionary of field_name: value\n\n Returns:\n Validation report with errors and warnings\n \"\"\"\n validation_results = {\n 'is_valid': True,\n 'errors': [],\n 'warnings': [],\n 'field_status': {}\n }\n\n for field_name, value in metadata.items():\n if field_name not in self.limits:\n validation_results['warnings'].append(\n f\"Unknown field '{field_name}' for {self.platform} platform\"\n )\n continue\n\n max_length = self.limits[field_name]\n actual_length = len(value.encode(\"utf-8\")) if self.platform == \"apple\" and field_name == \"keywords\" else len(value)\n remaining = max_length - actual_length\n\n field_status = {\n 'value': value,\n 'length': actual_length,\n 'limit': max_length,\n 'remaining': remaining,\n 'is_valid': actual_length \u003c= max_length,\n 'usage_percentage': round((actual_length / max_length) * 100, 1)\n }\n\n validation_results['field_status'][field_name] = field_status\n\n if actual_length > max_length:\n validation_results['is_valid'] = False\n validation_results['errors'].append(\n f\"'{field_name}' exceeds limit: {actual_length}/{max_length} chars\"\n )\n elif remaining > max_length * 0.2: # More than 20% unused\n validation_results['warnings'].append(\n f\"'{field_name}' under-utilizes space: {remaining} chars remaining\"\n )\n\n return validation_results\n\n def calculate_keyword_density(\n self,\n text: str,\n target_keywords: List[str]\n ) -> Dict[str, Any]:\n \"\"\"\n Calculate keyword density in text.\n\n Args:\n text: Text to analyze\n target_keywords: Keywords to check\n\n Returns:\n Density analysis\n \"\"\"\n text_lower = text.lower()\n total_words = len(text_lower.split())\n\n keyword_densities = {}\n for keyword in target_keywords:\n keyword_lower = keyword.lower()\n count = len(re.findall(r\"(?\u003c!\\w)\" + re.escape(keyword_lower) + r\"(?!\\w)\", text_lower)) if keyword_lower.strip() else 0\n density = (count / total_words * 100) if total_words > 0 else 0\n\n keyword_densities[keyword] = {\n 'occurrences': count,\n 'density_percentage': round(density, 2),\n 'status': self._assess_density(density)\n }\n\n # Overall assessment\n total_keyword_occurrences = sum(kw['occurrences'] for kw in keyword_densities.values())\n overall_density = (total_keyword_occurrences / total_words * 100) if total_words > 0 else 0\n\n return {\n 'total_words': total_words,\n 'keyword_densities': keyword_densities,\n 'overall_keyword_density': round(overall_density, 2),\n 'assessment': self._assess_overall_density(overall_density),\n 'recommendations': self._generate_density_recommendations(keyword_densities)\n }\n\n def _build_title_with_keywords(\n self,\n app_name: str,\n keywords: List[str],\n max_length: int\n ) -> Optional[str]:\n \"\"\"Build title combining app name and keywords within limit.\"\"\"\n separators = [' - ', ': ', ' | ']\n\n for sep in separators:\n title = f\"{app_name}{sep}{' & '.join(keywords)}\"\n if len(title) \u003c= max_length:\n return title\n\n return None\n\n def _optimize_short_description(\n self,\n app_info: Dict[str, Any],\n target_keywords: List[str]\n ) -> Dict[str, Any]:\n \"\"\"Optimize Google Play short description (80 chars).\"\"\"\n max_length = self.limits['short_description']\n\n # Focus on unique value proposition with primary keyword\n unique_value = app_info.get('unique_value', '')\n primary_keyword = target_keywords[0] if target_keywords else ''\n\n # Template: [Primary Keyword] - [Unique Value]\n short_desc = f\"{primary_keyword.title()} - {unique_value}\"[:max_length]\n\n return {\n 'short_description': short_desc,\n 'length': len(short_desc),\n 'remaining_chars': max_length - len(short_desc),\n 'keywords_included': [primary_keyword] if primary_keyword in short_desc.lower() else [],\n 'strategy': 'keyword_value_proposition'\n }\n\n def _optimize_subtitle(\n self,\n app_info: Dict[str, Any],\n target_keywords: List[str]\n ) -> Dict[str, Any]:\n \"\"\"Optimize Apple App Store subtitle (30 chars).\"\"\"\n max_length = self.limits['subtitle']\n\n # Very concise - primary keyword or key feature\n primary_keyword = target_keywords[0] if target_keywords else ''\n key_feature = app_info.get('key_features', [''])[0] if app_info.get('key_features') else ''\n\n options = [\n primary_keyword[:max_length],\n key_feature[:max_length],\n f\"{primary_keyword} App\"[:max_length]\n ]\n\n return {\n 'subtitle_options': [opt for opt in options if opt],\n 'max_length': max_length,\n 'recommendation': options[0] if options else ''\n }\n\n def _optimize_full_description(\n self,\n app_info: Dict[str, Any],\n target_keywords: List[str]\n ) -> Dict[str, Any]:\n \"\"\"Optimize full app description (4000 chars for both platforms).\"\"\"\n max_length = self.limits.get('description', self.limits.get('full_description', 4000))\n\n # Structure: Hook → Features → Benefits → Social Proof → CTA\n sections = []\n\n # Hook (with primary keyword)\n primary_keyword = target_keywords[0] if target_keywords else ''\n unique_value = app_info.get('unique_value', '')\n hook = f\"{unique_value} {primary_keyword.title()} that helps you achieve more.\\n\\n\"\n sections.append(hook)\n\n # Features (with keywords naturally integrated)\n features = app_info.get('key_features', [])\n if features:\n sections.append(\"KEY FEATURES:\\n\")\n for i, feature in enumerate(features[:5], 1):\n # Integrate keywords naturally\n feature_text = f\"• {feature}\"\n if i \u003c= len(target_keywords):\n keyword = target_keywords[i-1]\n if keyword.lower() not in feature.lower():\n feature_text = f\"• {feature} with {keyword}\"\n sections.append(f\"{feature_text}\\n\")\n sections.append(\"\\n\")\n\n # Benefits\n target_audience = app_info.get('target_audience', 'users')\n sections.append(f\"PERFECT FOR:\\n{target_audience}\\n\\n\")\n\n # Do not invent user counts, testimonials, or product claims.\n\n # CTA\n sections.append(\"Download now and start experiencing the difference!\")\n\n # Combine and validate length\n full_description = \"\".join(sections)\n if len(full_description) > max_length:\n full_description = full_description[:max_length-3] + \"...\"\n\n # Calculate keyword density\n density = self.calculate_keyword_density(full_description, target_keywords)\n\n return {\n 'full_description': full_description,\n 'length': len(full_description),\n 'remaining_chars': max_length - len(full_description),\n 'keyword_analysis': density,\n 'structure': {\n 'has_hook': True,\n 'has_features': len(features) > 0,\n 'has_benefits': True,\n 'has_cta': True\n }\n }\n\n def _remove_plural_duplicates(self, keywords: List[str]) -> List[str]:\n \"\"\"Remove plural forms if singular exists.\"\"\"\n return list(dict.fromkeys(keywords))\n\n def _build_keyword_field(self, keywords: List[str], max_length: int) -> str:\n \"\"\"Build comma-separated keyword field within character limit.\"\"\"\n keyword_field = \"\"\n\n for keyword in keywords:\n test_field = f\"{keyword_field},{keyword}\" if keyword_field else keyword\n if len(test_field.encode(\"utf-8\")) \u003c= max_length:\n keyword_field = test_field\n else:\n continue\n\n return keyword_field\n\n def _calculate_coverage(self, keywords: List[str], text: str) -> Dict[str, int]:\n \"\"\"Calculate how many keywords are covered in text.\"\"\"\n text_lower = text.lower()\n coverage = {}\n\n for keyword in keywords:\n coverage[keyword] = text_lower.count(keyword.lower())\n\n return coverage\n\n def _assess_density(self, density: float) -> str:\n \"\"\"Assess individual keyword density.\"\"\"\n if density \u003c 0.5:\n return \"too_low\"\n elif density \u003c= 2.5:\n return \"optimal\"\n else:\n return \"too_high\"\n\n def _assess_overall_density(self, density: float) -> str:\n \"\"\"Assess overall keyword density.\"\"\"\n if density \u003c 2:\n return \"Under-optimized: Consider adding more keyword variations\"\n elif density \u003c= 5:\n return \"Optimal: Good keyword integration without stuffing\"\n elif density \u003c= 8:\n return \"High: Approaching keyword stuffing - reduce keyword usage\"\n else:\n return \"Too High: Keyword stuffing detected - rewrite for natural flow\"\n\n def _generate_density_recommendations(\n self,\n keyword_densities: Dict[str, Dict[str, Any]]\n ) -> List[str]:\n \"\"\"Generate recommendations based on keyword density analysis.\"\"\"\n recommendations = []\n\n for keyword, data in keyword_densities.items():\n if data['status'] == 'too_low':\n recommendations.append(\n f\"Increase usage of '{keyword}' - currently only {data['occurrences']} times\"\n )\n elif data['status'] == 'too_high':\n recommendations.append(\n f\"Reduce usage of '{keyword}' - appears {data['occurrences']} times (keyword stuffing risk)\"\n )\n\n if not recommendations:\n recommendations.append(\"Keyword density is well-balanced\")\n\n return recommendations\n\n def _recommend_title_option(self, options: List[Dict[str, Any]]) -> str:\n \"\"\"Recommend best title option based on strategy.\"\"\"\n if not options:\n return \"No valid options available\"\n\n # Prefer brand_plus_primary for established apps\n for option in options:\n if option['strategy'] == 'brand_plus_primary':\n return f\"Recommended: '{option['title']}' (Balance of brand and SEO)\"\n\n # Fallback to first option\n return f\"Recommended: '{options[0]['title']}' ({options[0]['strategy']})\"\n\n\ndef optimize_app_metadata(\n platform: str,\n app_info: Dict[str, Any],\n target_keywords: List[str]\n) -> Dict[str, Any]:\n \"\"\"\n Convenience function to optimize all metadata fields.\n\n Args:\n platform: 'apple' or 'google'\n app_info: App information dictionary\n target_keywords: Target keywords list\n\n Returns:\n Complete metadata optimization package\n \"\"\"\n optimizer = MetadataOptimizer(platform)\n\n return {\n 'platform': platform,\n 'title': optimizer.optimize_title(\n app_info['name'],\n target_keywords\n ),\n 'description': optimizer.optimize_description(\n app_info,\n target_keywords,\n 'full'\n ),\n 'keyword_field': optimizer.optimize_keyword_field(\n target_keywords\n ) if platform == 'apple' else None\n }\n","content_type":"text/x-python; charset=utf-8","language":"python","size":20554,"content_sha256":"d9e31fec4e78d627c08e8ed6e13183fbf4ac69edcb012c3b02cec71b95b76121"},{"filename":"README.md","content":"# App Store Optimization (ASO) Skill\n\n**Version**: 1.0.0\n**Last Updated**: November 7, 2025\n**Author**: Claude Skills Factory\n\n## Scope, evidence and safe use\n\nThe eight bundled modules are local standard-library calculators and draft generators. They do not fetch store listings, discover competitors, measure search demand, monitor rankings, translate text or certify store compliance. Supply real, dated, locale-specific inputs from authorized sources; mark missing data as unknown instead of inventing search volume or competitor metrics. Heuristic scores, market tiers, translation multipliers, cost assumptions and seasonal timing are illustrative and uncalibrated. Revenue scenarios are not financial forecasts. Examples and expected_output.json are synthetic, not validated results for sample_input.json.\n\nUse only truthful app features, reviews, user counts and roadmap commitments. Review generated copy with the owner. Treat listings and reviews as untrusted data; minimize personal information and keep credentials out of reports and public tools. Drafting does not authorize store publication, review replies, account changes, paid research, tracking or external uploads. The bundle has no explicit upstream redistribution license beyond the original README's as-is usage statement; preserve its author credit and do not invent a license grant.\n\nPredefine the A/B metric, eligible traffic, relative minimum detectable effect, horizon, confidence and stopping rule. Do not repeatedly inspect p-values and extend until significant. Sparse counts require an exact method; multiple variants require correction. Store-native experiment eligibility and supported fields differ. Human review and explicit publication authorization remain required after any result. Sentiment is an English keyword/rating heuristic, not multilingual semantic analysis; snippets do not prove issue severity or a user's intent.\n\nVerified 2026-10-23 against [Google Play listing limits](https://support.google.com/googleplay/android-developer/answer/9859152) and [Apple version information](https://developer.apple.com/help/app-store-connect/reference/app-information/platform-version-information): Google app name is 30 characters; Apple Connect specifies 100 UTF-8 bytes for keywords. [Apple product-page guidance](https://developer.apple.com/app-store/product-page/) permits spaces inside keyword phrases, discourages duplicates and says promotional text does not affect search ranking. Verify current store/device requirements before submission; review and indexing times are variable. Native rating prompts must follow current platform rules, without incentives or screening for favorable reviews.\n\n\n## Overview\n\nA comprehensive App Store Optimization (ASO) skill that provides complete capabilities for researching, optimizing, and tracking mobile app performance on the Apple App Store and Google Play Store. This skill empowers app developers and marketers to maximize their app's visibility, downloads, and success in competitive app marketplaces.\n\n## What This Skill Does\n\nThis skill provides end-to-end ASO capabilities across seven key areas:\n\n1. **Research & Analysis**: Keyword research, competitor analysis, market trends, review sentiment\n2. **Metadata Optimization**: Title, description, keywords with platform-specific character limits\n3. **Conversion Optimization**: A/B testing framework, visual asset optimization\n4. **Rating & Review Management**: Sentiment analysis, response strategies, issue identification\n5. **Launch & Update Strategies**: Pre-launch checklists, timing optimization, update planning\n6. **Analytics & Tracking**: ASO scoring, keyword rankings, performance benchmarking\n7. **Localization**: Multi-language strategy, translation management, ROI analysis\n\n## Key Features\n\n### Comprehensive Keyword Research\n- Search volume and competition analysis\n- Long-tail keyword discovery\n- Competitor keyword extraction\n- Keyword difficulty scoring\n- Strategic prioritization\n\n### Platform-Specific Metadata Optimization\n- **Apple App Store**:\n - Title (30 chars)\n - Subtitle (30 chars)\n - Promotional Text (170 chars)\n - Description (4000 chars)\n - Keywords field (100 UTF-8 bytes)\n- **Google Play Store**:\n - Title (30 chars)\n - Short Description (80 chars)\n - Full Description (4000 chars)\n- Character limit validation\n- Keyword density analysis\n- Multiple optimization strategies\n\n### Competitor Intelligence\n- Analysis of supplied competitor records\n- Metadata strategy analysis\n- Visual asset assessment\n- Gap identification\n- Competitive positioning\n\n### ASO Health Scoring\n- 0-100 overall score\n- Four-category breakdown (Metadata, Ratings, Keywords, Conversion)\n- Strengths and weaknesses identification\n- Prioritized action recommendations\n- Expected impact estimates\n\n### Approximate A/B Planning\n- Test design and hypothesis formulation\n- Sample size calculation\n- Statistical significance analysis\n- Duration estimation\n- Implementation recommendations\n\n### Global Localization\n- Market prioritization (Tier 1/2/3)\n- Translation cost estimation\n- Character limit adaptation by language\n- Cultural keyword considerations\n- ROI analysis\n\n### Review Intelligence\n- Sentiment analysis\n- Common theme extraction\n- Bug and issue identification\n- Feature request clustering\n- Professional response templates\n\n### Launch Planning\n- Platform-specific checklists\n- Timeline generation\n- Compliance validation\n- Optimal timing recommendations\n- Seasonal campaign planning\n\n## Python Modules\n\nThis skill includes 8 powerful Python modules:\n\n### 1. keyword_analyzer.py\n**Purpose**: Analyzes keywords for search volume, competition, and relevance\n\n**Key Functions**:\n- `analyze_keyword()`: Single keyword analysis\n- `compare_keywords()`: Multi-keyword comparison and ranking\n- `find_long_tail_opportunities()`: Generate long-tail variations\n- `calculate_keyword_density()`: Analyze keyword usage in text\n- `extract_keywords_from_text()`: Extract keywords from reviews/descriptions\n\n### 2. metadata_optimizer.py\n**Purpose**: Optimizes titles, descriptions, keywords with character limit validation\n\n**Key Functions**:\n- `optimize_title()`: Generate optimal title options\n- `optimize_description()`: Create conversion-focused descriptions\n- `optimize_keyword_field()`: Maximize Apple's 100-char keyword field\n- `validate_character_limits()`: Ensure platform compliance\n- `calculate_keyword_density()`: Analyze keyword integration\n\n### 3. competitor_analyzer.py\n**Purpose**: Analyzes competitor ASO strategies\n\n**Key Functions**:\n- `analyze_competitor()`: Single competitor deep-dive\n- `compare_competitors()`: Multi-competitor analysis\n- `identify_gaps()`: Find competitive opportunities\n- `_calculate_competitive_strength()`: Score competitor ASO quality\n\n### 4. aso_scorer.py\n**Purpose**: Calculates comprehensive ASO health score\n\n**Key Functions**:\n- `calculate_overall_score()`: 0-100 ASO health score\n- `score_metadata_quality()`: Evaluate metadata optimization\n- `score_ratings_reviews()`: Assess rating quality and volume\n- `score_keyword_performance()`: Analyze ranking positions\n- `score_conversion_metrics()`: Evaluate conversion rates\n- `generate_recommendations()`: Prioritized improvement actions\n\n### 5. ab_test_planner.py\n**Purpose**: Plans and tracks A/B tests for ASO elements\n\n**Key Functions**:\n- `design_test()`: Create test hypothesis and structure\n- `calculate_sample_size()`: Determine required visitors\n- `calculate_significance()`: Assess statistical validity\n- `track_test_results()`: Monitor ongoing tests\n- `generate_test_report()`: Create comprehensive test reports\n\n### 6. localization_helper.py\n**Purpose**: Manages multi-language ASO optimization\n\n**Key Functions**:\n- `identify_target_markets()`: Prioritize localization markets\n- `translate_metadata()`: Adapt metadata for languages\n- `adapt_keywords()`: Cultural keyword adaptation\n- `validate_translations()`: Character limit validation\n- `calculate_localization_roi()`: Estimate investment returns\n\n### 7. review_analyzer.py\n**Purpose**: Analyzes user reviews for actionable insights\n\n**Key Functions**:\n- `analyze_sentiment()`: Calculate sentiment distribution\n- `extract_common_themes()`: Identify frequent topics\n- `identify_issues()`: Surface bugs and problems\n- `find_feature_requests()`: Extract desired features\n- `track_sentiment_trends()`: Monitor changes over time\n- `generate_response_templates()`: Create review responses\n\n### 8. launch_checklist.py\n**Purpose**: Generates comprehensive launch and update checklists\n\n**Key Functions**:\n- `generate_prelaunch_checklist()`: Complete submission validation\n- `validate_app_store_compliance()`: Check guidelines compliance\n- `create_update_plan()`: Plan update cadence\n- `optimize_launch_timing()`: Recommend launch dates\n- `plan_seasonal_campaigns()`: Identify seasonal opportunities\n\n## Installation\n\n### For Claude Code (Desktop/CLI)\n\n#### Project-Level Installation\n```bash\n# Copy skill folder to project\ncp -r app-store-optimization /path/to/your/project/.claude/skills/\n\n# Claude will auto-load the skill when working in this project\n```\n\n#### User-Level Installation (Available in All Projects)\n```bash\n# Copy skill folder to user-level skills\ncp -r app-store-optimization ~/.claude/skills/\n\n# Claude will load this skill in all your projects\n```\n\n### For Claude Apps (Browser)\n\n1. Use the `skill-creator` skill to import the skill\n2. Or manually import via Claude Apps interface\n\n### Verification\n\nTo verify installation:\n```bash\n# Check if skill folder exists\nls ~/.claude/skills/app-store-optimization/\n\n# You should see:\n# SKILL.md\n# keyword_analyzer.py\n# metadata_optimizer.py\n# competitor_analyzer.py\n# aso_scorer.py\n# ab_test_planner.py\n# localization_helper.py\n# review_analyzer.py\n# launch_checklist.py\n# sample_input.json\n# expected_output.json\n# HOW_TO_USE.md\n# README.md\n```\n\n## Usage Examples\n\n### Example 1: Complete Keyword Research\n\n```\nHey Claude—I just added the \"app-store-optimization\" skill. Can you research keywords for my fitness app? I'm targeting people who want home workouts, yoga, and meal planning. Analyze top competitors like Nike Training Club and Peloton.\n```\n\n**What Claude will do**:\n- Use `keyword_analyzer.py` to research keywords\n- Use `competitor_analyzer.py` to analyze Nike Training Club and Peloton\n- Provide prioritized keyword list with search volumes, competition levels\n- Identify gaps and long-tail opportunities\n- Recommend primary keywords for title and secondary keywords for description\n\n### Example 2: Optimize App Store Metadata\n\n```\nHey Claude—I just added the \"app-store-optimization\" skill. Optimize my app's metadata for both Apple App Store and Google Play Store:\n- App: FitFlow\n- Category: Health & Fitness\n- Features: AI workout plans, nutrition tracking, progress photos\n- Keywords: fitness app, workout planner, home fitness\n```\n\n**What Claude will do**:\n- Use `metadata_optimizer.py` to create optimized titles (multiple options)\n- Generate platform-specific descriptions (short and full)\n- Optimize Apple's 100-byte keyword field\n- Validate all character limits\n- Calculate keyword density\n- Provide before/after comparison\n\n### Example 3: Calculate ASO Health Score\n\n```\nHey Claude—I just added the \"app-store-optimization\" skill. Calculate my app's ASO score:\n- Average rating: 4.3 stars (8,200 ratings)\n- Keywords in top 10: 4\n- Keywords in top 50: 15\n- Conversion rate: 3.8%\n- Title: \"FitFlow - Home Workouts\"\n- Description: 1,500 characters with 3 keyword mentions\n```\n\n**What Claude will do**:\n- Use `aso_scorer.py` to calculate overall score (0-100)\n- Break down by category (Metadata: X/25, Ratings: X/25, Keywords: X/25, Conversion: X/25)\n- Identify strengths and weaknesses\n- Generate prioritized recommendations\n- Estimate impact of improvements\n\n### Example 4: A/B Test Planning\n\n```\nHey Claude—I just added the \"app-store-optimization\" skill. I want to A/B test my app icon. My current conversion rate is 4.2%. How many visitors do I need and how long should I run the test?\n```\n\n**What Claude will do**:\n- Use `ab_test_planner.py` to design test\n- Calculate required sample size (based on minimum detectable effect)\n- Estimate test duration for low/medium/high traffic scenarios\n- Provide test structure and success metrics\n- Explain how to analyze results\n\n### Example 5: Review Sentiment Analysis\n\n```\nHey Claude—I just added the \"app-store-optimization\" skill. Analyze my last 500 reviews and tell me:\n- Overall sentiment\n- Most common complaints\n- Top feature requests\n- Bugs needing immediate fixes\n```\n\n**What Claude will do**:\n- Use `review_analyzer.py` to process reviews\n- Calculate sentiment distribution\n- Extract common themes\n- Identify and prioritize issues\n- Cluster feature requests\n- Generate response templates\n\n### Example 6: Pre-Launch Checklist\n\n```\nHey Claude—I just added the \"app-store-optimization\" skill. Generate a complete pre-launch checklist for both app stores. My launch date is March 15, 2026.\n```\n\n**What Claude will do**:\n- Use `launch_checklist.py` to generate checklists\n- Create Apple App Store checklist (metadata, assets, technical, legal)\n- Create Google Play Store checklist (metadata, assets, technical, legal)\n- Add universal checklist (marketing, QA, support)\n- Generate timeline with milestones\n- Calculate completion percentage\n\n## Best Practices\n\n### Keyword Research\n1. Start with 20-30 seed keywords\n2. Analyze top 5 competitors in your category\n3. Balance high-volume and long-tail keywords\n4. Prioritize relevance over search volume\n5. Update keyword research quarterly\n\n### Metadata Optimization\n1. Front-load keywords in title (first 15 characters most important)\n2. Use every available character (don't waste space)\n3. Write for humans first, search engines second\n4. A/B test major changes before committing\n5. Update descriptions with each major release\n\n### A/B Testing\n1. Test one element at a time (icon vs. screenshots vs. title)\n2. Run tests to their prespecified horizon; evaluate the planned threshold once\n3. Test high-impact elements first (icon has biggest impact)\n4. Allow sufficient duration (at least 1 week, preferably 2-3)\n5. Document learnings for future tests\n\n### Localization\n1. Start with top 5 revenue markets (US, China, Japan, Germany, UK)\n2. Use professional translators, not machine translation\n3. Test translations with native speakers\n4. Adapt keywords for cultural context\n5. Monitor ROI by market\n\n### Review Management\n1. Respond to reviews within 24-48 hours\n2. Always be professional, even with negative reviews\n3. Address specific issues raised\n4. Thank users for positive feedback\n5. Use insights to prioritize product improvements\n\n## Technical Requirements\n\n- **Python**: 3.8+ (for Python modules)\n- **Platform Support**: Apple App Store, Google Play Store\n- **Data Formats**: JSON input/output\n- **Dependencies**: Standard library only (no external packages required)\n\n## Limitations\n\n### Data Dependencies\n- Keyword search volumes are estimates (no official Apple/Google data)\n- Competitor data limited to publicly available information\n- Review analysis requires access to public reviews\n- Historical data may not be available for new apps\n\n### Platform Constraints\n- Apple: Metadata changes require app submission (except Promotional Text)\n- Google: Review and indexing times vary\n- A/B testing requires significant traffic for statistical significance\n- Store algorithms are proprietary and change without notice\n\n### Scope\n- Does not include paid user acquisition (Apple Search Ads, Google Ads)\n- Does not cover in-app analytics implementation\n- Does not handle technical app development\n- Focuses on organic discovery and conversion optimization\n\n## Troubleshooting\n\n### Issue: Python modules not found\n**Solution**: Ensure all .py files are in the same directory as SKILL.md\n\n### Issue: Character limit validation failing\n**Solution**: Check that you're using the correct platform ('apple' or 'google')\n\n### Issue: Keyword research returning limited results\n**Solution**: Provide more context about your app, features, and target audience\n\n### Issue: ASO score seems inaccurate\n**Solution**: Ensure you're providing accurate metrics (ratings, keyword rankings, conversion rate)\n\n## Version History\n\n### Version 1.0.0 (November 7, 2025)\n- Initial release\n- 8 Python modules with comprehensive ASO capabilities\n- Support for both Apple App Store and Google Play Store\n- Keyword research, metadata optimization, competitor analysis\n- ASO scoring, A/B testing, localization, review analysis\n- Launch planning and seasonal campaign tools\n\n## Support & Feedback\n\nThis skill is designed to help app developers and marketers succeed in competitive app marketplaces. For the best results:\n\n1. Provide detailed context about your app\n2. Include specific metrics when available\n3. Ask follow-up questions for clarification\n4. Iterate based on results\n\n## Credits\n\nDeveloped by Claude Skills Factory\nBased on industry-standard ASO best practices\nPlatform requirements current as of November 2025\n\n## License\n\nThis skill is provided as-is for use with Claude Code and Claude Apps. Customize and extend as needed for your specific use cases.\n\n---\n\n**Ready to optimize your app?** Start with keyword research, then move to metadata optimization, and finally implement A/B testing for continuous improvement. The skill handles everything from pre-launch planning to ongoing optimization.\n\nFor detailed usage examples, see [HOW_TO_USE.md](HOW_TO_USE.md).\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":17503,"content_sha256":"b9e27302f4b0c97c8168bd7048717e213e6da4bd091c527105f872a48b81b093"},{"filename":"review_analyzer.py","content":"\"\"\"\nReview analysis module for App Store Optimization.\nAnalyzes user reviews for sentiment, issues, and feature requests.\n\"\"\"\n\nfrom typing import Dict, List, Any, Optional, Tuple\nfrom collections import Counter\nimport re\n\n\nclass ReviewAnalyzer:\n \"\"\"Analyzes user reviews for actionable insights.\"\"\"\n\n # Sentiment keywords\n POSITIVE_KEYWORDS = [\n 'great', 'awesome', 'excellent', 'amazing', 'love', 'best', 'perfect',\n 'fantastic', 'wonderful', 'brilliant', 'outstanding', 'superb'\n ]\n\n NEGATIVE_KEYWORDS = [\n 'bad', 'terrible', 'awful', 'horrible', 'hate', 'worst', 'useless',\n 'broken', 'crash', 'bug', 'slow', 'disappointing', 'frustrating'\n ]\n\n # Issue indicators\n ISSUE_KEYWORDS = [\n 'crash', 'bug', 'error', 'broken', 'not working', 'doesnt work',\n 'freezes', 'slow', 'laggy', 'glitch', 'problem', 'issue', 'fail'\n ]\n\n # Feature request indicators\n FEATURE_REQUEST_KEYWORDS = [\n 'wish', 'would be nice', 'should add', 'need', 'want', 'hope',\n 'please add', 'missing', 'lacks', 'feature request'\n ]\n\n def __init__(self, app_name: str):\n \"\"\"\n Initialize review analyzer.\n\n Args:\n app_name: Name of the app\n \"\"\"\n self.app_name = app_name\n self.reviews = []\n self.analysis_cache = {}\n\n def analyze_sentiment(\n self,\n reviews: List[Dict[str, Any]]\n ) -> Dict[str, Any]:\n \"\"\"\n Analyze sentiment across reviews.\n\n Args:\n reviews: List of review dicts with 'text', 'rating', 'date'\n\n Returns:\n Sentiment analysis summary\n \"\"\"\n self.reviews = reviews\n\n sentiment_counts = {\n 'positive': 0,\n 'neutral': 0,\n 'negative': 0\n }\n\n detailed_sentiments = []\n\n for review in reviews:\n text = review.get('text', '').lower()\n rating = review.get('rating', 3)\n\n # Calculate sentiment score\n sentiment_score = self._calculate_sentiment_score(text, rating)\n sentiment_category = self._categorize_sentiment(sentiment_score)\n\n sentiment_counts[sentiment_category] += 1\n\n detailed_sentiments.append({\n 'review_id': review.get('id', ''),\n 'rating': rating,\n 'sentiment_score': sentiment_score,\n 'sentiment': sentiment_category,\n 'text_preview': text[:100] + '...' if len(text) > 100 else text\n })\n\n # Calculate percentages\n total = len(reviews)\n sentiment_distribution = {\n 'positive': round((sentiment_counts['positive'] / total) * 100, 1) if total > 0 else 0,\n 'neutral': round((sentiment_counts['neutral'] / total) * 100, 1) if total > 0 else 0,\n 'negative': round((sentiment_counts['negative'] / total) * 100, 1) if total > 0 else 0\n }\n\n # Calculate average rating\n avg_rating = sum(r.get('rating', 0) for r in reviews) / total if total > 0 else 0\n\n return {\n 'total_reviews_analyzed': total,\n 'average_rating': round(avg_rating, 2),\n 'sentiment_distribution': sentiment_distribution,\n 'sentiment_counts': sentiment_counts,\n 'sentiment_trend': self._assess_sentiment_trend(sentiment_distribution) if total else 'insufficient_data',\n 'detailed_sentiments': detailed_sentiments[:50] # Limit output\n }\n\n def extract_common_themes(\n self,\n reviews: List[Dict[str, Any]],\n min_mentions: int = 3\n ) -> Dict[str, Any]:\n \"\"\"\n Extract frequently mentioned themes and topics.\n\n Args:\n reviews: List of review dicts\n min_mentions: Minimum mentions to be considered common\n\n Returns:\n Common themes analysis\n \"\"\"\n # Extract all words from reviews\n all_words = []\n all_phrases = []\n\n for review in reviews:\n text = review.get('text', '').lower()\n # Clean text\n text = re.sub(r'[^\\w\\s]', ' ', text)\n words = text.split()\n\n # Filter out common words\n stop_words = {\n 'the', 'and', 'for', 'with', 'this', 'that', 'from', 'have',\n 'app', 'apps', 'very', 'really', 'just', 'but', 'not', 'you'\n }\n words = [w for w in words if w not in stop_words and len(w) > 3]\n\n all_words.extend(words)\n\n # Extract 2-3 word phrases\n for i in range(len(words) - 1):\n phrase = f\"{words[i]} {words[i+1]}\"\n all_phrases.append(phrase)\n\n # Count frequency\n word_freq = Counter(all_words)\n phrase_freq = Counter(all_phrases)\n\n # Filter by min_mentions\n common_words = [\n {'word': word, 'mentions': count}\n for word, count in word_freq.most_common(30)\n if count >= min_mentions\n ]\n\n common_phrases = [\n {'phrase': phrase, 'mentions': count}\n for phrase, count in phrase_freq.most_common(20)\n if count >= min_mentions\n ]\n\n # Categorize themes\n themes = self._categorize_themes(common_words, common_phrases)\n\n return {\n 'common_words': common_words,\n 'common_phrases': common_phrases,\n 'identified_themes': themes,\n 'insights': self._generate_theme_insights(themes)\n }\n\n def identify_issues(\n self,\n reviews: List[Dict[str, Any]],\n rating_threshold: int = 3\n ) -> Dict[str, Any]:\n \"\"\"\n Identify bugs, crashes, and other issues from reviews.\n\n Args:\n reviews: List of review dicts\n rating_threshold: Only analyze reviews at or below this rating\n\n Returns:\n Issue identification report\n \"\"\"\n issues = []\n\n for review in reviews:\n rating = review.get('rating', 5)\n if rating > rating_threshold:\n continue\n\n text = review.get('text', '').lower()\n\n # Check for issue keywords\n mentioned_issues = []\n for keyword in self.ISSUE_KEYWORDS:\n if keyword in text:\n mentioned_issues.append(keyword)\n\n if mentioned_issues:\n issues.append({\n 'review_id': review.get('id', ''),\n 'rating': rating,\n 'date': review.get('date', ''),\n 'issue_keywords': mentioned_issues,\n 'text': text[:200] + '...' if len(text) > 200 else text\n })\n\n # Group by issue type\n issue_frequency = Counter()\n for issue in issues:\n for keyword in issue['issue_keywords']:\n issue_frequency[keyword] += 1\n\n # Categorize issues\n categorized_issues = self._categorize_issues(issues)\n\n # Calculate issue severity\n severity_scores = self._calculate_issue_severity(\n categorized_issues,\n len(reviews)\n )\n\n return {\n 'total_issues_found': len(issues),\n 'issue_frequency': dict(issue_frequency.most_common(15)),\n 'categorized_issues': categorized_issues,\n 'severity_scores': severity_scores,\n 'top_issues': self._rank_issues_by_severity(severity_scores),\n 'recommendations': self._generate_issue_recommendations(\n categorized_issues,\n severity_scores\n )\n }\n\n def find_feature_requests(\n self,\n reviews: List[Dict[str, Any]]\n ) -> Dict[str, Any]:\n \"\"\"\n Extract feature requests and desired improvements.\n\n Args:\n reviews: List of review dicts\n\n Returns:\n Feature request analysis\n \"\"\"\n feature_requests = []\n\n for review in reviews:\n text = review.get('text', '').lower()\n rating = review.get('rating', 3)\n\n # Check for feature request indicators\n is_feature_request = any(\n keyword in text\n for keyword in self.FEATURE_REQUEST_KEYWORDS\n )\n\n if is_feature_request:\n # Extract the specific request\n request_text = self._extract_feature_request_text(text)\n\n feature_requests.append({\n 'review_id': review.get('id', ''),\n 'rating': rating,\n 'date': review.get('date', ''),\n 'request_text': request_text,\n 'full_review': text[:200] + '...' if len(text) > 200 else text\n })\n\n # Cluster similar requests\n clustered_requests = self._cluster_feature_requests(feature_requests)\n\n # Prioritize based on frequency and rating context\n prioritized_requests = self._prioritize_feature_requests(clustered_requests)\n\n return {\n 'total_feature_requests': len(feature_requests),\n 'clustered_requests': clustered_requests,\n 'prioritized_requests': prioritized_requests,\n 'implementation_recommendations': self._generate_feature_recommendations(\n prioritized_requests\n )\n }\n\n def track_sentiment_trends(\n self,\n reviews_by_period: Dict[str, List[Dict[str, Any]]]\n ) -> Dict[str, Any]:\n \"\"\"\n Track sentiment changes over time.\n\n Args:\n reviews_by_period: Dict of period_name: reviews\n\n Returns:\n Trend analysis\n \"\"\"\n trends = []\n\n for period, reviews in reviews_by_period.items():\n sentiment = self.analyze_sentiment(reviews)\n\n trends.append({\n 'period': period,\n 'total_reviews': len(reviews),\n 'average_rating': sentiment['average_rating'],\n 'positive_percentage': sentiment['sentiment_distribution']['positive'],\n 'negative_percentage': sentiment['sentiment_distribution']['negative']\n })\n\n # Calculate trend direction\n if len(trends) >= 2:\n first_period = trends[0]\n last_period = trends[-1]\n\n rating_change = last_period['average_rating'] - first_period['average_rating']\n sentiment_change = last_period['positive_percentage'] - first_period['positive_percentage']\n\n trend_direction = self._determine_trend_direction(\n rating_change,\n sentiment_change\n )\n else:\n trend_direction = 'insufficient_data'\n\n return {\n 'periods_analyzed': len(trends),\n 'trend_data': trends,\n 'trend_direction': trend_direction,\n 'insights': self._generate_trend_insights(trends, trend_direction)\n }\n\n def generate_response_templates(\n self,\n issue_category: str\n ) -> List[Dict[str, str]]:\n \"\"\"\n Generate response templates for common review scenarios.\n\n Args:\n issue_category: Category of issue ('crash', 'feature_request', 'positive', etc.)\n\n Returns:\n Response templates\n \"\"\"\n templates = {\n 'crash': [\n {\n 'scenario': 'App crash reported',\n 'template': \"Thank you for bringing this to our attention. We're sorry you experienced a crash. \"\n \"Our team is investigating this issue. Could you please share more details about when \"\n \"this occurred (device model, iOS/Android version) by contacting support@[company].com? \"\n \"We're committed to fixing this quickly.\"\n },\n {\n 'scenario': 'Crash already fixed',\n 'template': \"Thank you for your feedback. We've identified and fixed this crash issue in version [X.X]. \"\n \"Please update to the latest version. If the problem persists, please reach out to \"\n \"support@[company].com and we'll help you directly.\"\n }\n ],\n 'bug': [\n {\n 'scenario': 'Bug reported',\n 'template': \"Thanks for reporting this bug. We take these issues seriously. Our team is looking into it \"\n \"and we'll have a fix in an upcoming update. We appreciate your patience and will notify you \"\n \"when it's resolved.\"\n }\n ],\n 'feature_request': [\n {\n 'scenario': 'Feature request received',\n 'template': \"Thank you for this suggestion! We're always looking to improve [app_name]. We've added your \"\n \"request to our roadmap and will consider it for a future update. Follow us @[social] for \"\n \"updates on new features.\"\n },\n {\n 'scenario': 'Feature already planned',\n 'template': \"Great news! This feature is already on our roadmap and we're working on it. Stay tuned for \"\n \"updates in the coming months. Thanks for your feedback!\"\n }\n ],\n 'positive': [\n {\n 'scenario': 'Positive review',\n 'template': \"Thank you so much for your kind words! We're thrilled that you're enjoying [app_name]. \"\n \"Reviews like yours motivate our team to keep improving. If you ever have suggestions, \"\n \"we'd love to hear them!\"\n }\n ],\n 'negative_general': [\n {\n 'scenario': 'General complaint',\n 'template': \"We're sorry to hear you're not satisfied with your experience. We'd like to make this right. \"\n \"Please contact us at support@[company].com so we can understand the issue better and help \"\n \"you directly. Thank you for giving us a chance to improve.\"\n }\n ]\n }\n\n return templates.get(issue_category, templates['negative_general'])\n\n def _calculate_sentiment_score(self, text: str, rating: int) -> float:\n \"\"\"Calculate sentiment score (-1 to 1).\"\"\"\n # Start with rating-based score\n rating_score = (rating - 3) / 2 # Convert 1-5 to -1 to 1\n\n # Adjust based on text sentiment\n positive_count = sum(1 for keyword in self.POSITIVE_KEYWORDS if keyword in text)\n negative_count = sum(1 for keyword in self.NEGATIVE_KEYWORDS if keyword in text)\n\n text_score = (positive_count - negative_count) / 10 # Normalize\n\n # Weighted average (60% rating, 40% text)\n final_score = (rating_score * 0.6) + (text_score * 0.4)\n\n return max(min(final_score, 1.0), -1.0)\n\n def _categorize_sentiment(self, score: float) -> str:\n \"\"\"Categorize sentiment score.\"\"\"\n if score > 0.3:\n return 'positive'\n elif score \u003c -0.3:\n return 'negative'\n else:\n return 'neutral'\n\n def _assess_sentiment_trend(self, distribution: Dict[str, float]) -> str:\n \"\"\"Assess overall sentiment trend.\"\"\"\n positive = distribution['positive']\n negative = distribution['negative']\n\n if positive > 70:\n return 'very_positive'\n elif positive > 50:\n return 'positive'\n elif negative > 50:\n return 'critical'\n elif negative > 30:\n return 'concerning'\n else:\n return 'mixed'\n\n def _categorize_themes(\n self,\n common_words: List[Dict[str, Any]],\n common_phrases: List[Dict[str, Any]]\n ) -> Dict[str, List[str]]:\n \"\"\"Categorize themes from words and phrases.\"\"\"\n themes = {\n 'features': [],\n 'performance': [],\n 'usability': [],\n 'support': [],\n 'pricing': []\n }\n\n # Keywords for each category\n feature_keywords = {'feature', 'functionality', 'option', 'tool'}\n performance_keywords = {'fast', 'slow', 'crash', 'lag', 'speed', 'performance'}\n usability_keywords = {'easy', 'difficult', 'intuitive', 'confusing', 'interface', 'design'}\n support_keywords = {'support', 'help', 'customer', 'service', 'response'}\n pricing_keywords = {'price', 'cost', 'expensive', 'cheap', 'subscription', 'free'}\n\n for word_data in common_words:\n word = word_data['word']\n if any(kw in word for kw in feature_keywords):\n themes['features'].append(word)\n elif any(kw in word for kw in performance_keywords):\n themes['performance'].append(word)\n elif any(kw in word for kw in usability_keywords):\n themes['usability'].append(word)\n elif any(kw in word for kw in support_keywords):\n themes['support'].append(word)\n elif any(kw in word for kw in pricing_keywords):\n themes['pricing'].append(word)\n\n return {k: v for k, v in themes.items() if v} # Remove empty categories\n\n def _generate_theme_insights(self, themes: Dict[str, List[str]]) -> List[str]:\n \"\"\"Generate insights from themes.\"\"\"\n insights = []\n\n for category, keywords in themes.items():\n if keywords:\n insights.append(\n f\"{category.title()}: Users frequently mention {', '.join(keywords[:3])}\"\n )\n\n return insights[:5]\n\n def _categorize_issues(self, issues: List[Dict[str, Any]]) -> Dict[str, List[Dict[str, Any]]]:\n \"\"\"Categorize issues by type.\"\"\"\n categories = {\n 'crashes': [],\n 'bugs': [],\n 'performance': [],\n 'compatibility': []\n }\n\n for issue in issues:\n keywords = issue['issue_keywords']\n\n if 'crash' in keywords or 'freezes' in keywords:\n categories['crashes'].append(issue)\n elif 'bug' in keywords or 'error' in keywords or 'broken' in keywords:\n categories['bugs'].append(issue)\n elif 'slow' in keywords or 'laggy' in keywords:\n categories['performance'].append(issue)\n else:\n categories['compatibility'].append(issue)\n\n return {k: v for k, v in categories.items() if v}\n\n def _calculate_issue_severity(\n self,\n categorized_issues: Dict[str, List[Dict[str, Any]]],\n total_reviews: int\n ) -> Dict[str, Dict[str, Any]]:\n \"\"\"Calculate severity scores for each issue category.\"\"\"\n severity_scores = {}\n\n for category, issues in categorized_issues.items():\n count = len(issues)\n percentage = (count / total_reviews) * 100 if total_reviews > 0 else 0\n\n # Calculate average rating of affected reviews\n avg_rating = sum(i['rating'] for i in issues) / count if count > 0 else 0\n\n # Severity score (0-100)\n severity = min((percentage * 10) + ((5 - avg_rating) * 10), 100)\n\n severity_scores[category] = {\n 'count': count,\n 'percentage': round(percentage, 2),\n 'average_rating': round(avg_rating, 2),\n 'severity_score': round(severity, 1),\n 'priority': 'critical' if severity > 70 else ('high' if severity > 40 else 'medium')\n }\n\n return severity_scores\n\n def _rank_issues_by_severity(\n self,\n severity_scores: Dict[str, Dict[str, Any]]\n ) -> List[Dict[str, Any]]:\n \"\"\"Rank issues by severity score.\"\"\"\n ranked = sorted(\n [{'category': cat, **data} for cat, data in severity_scores.items()],\n key=lambda x: x['severity_score'],\n reverse=True\n )\n return ranked\n\n def _generate_issue_recommendations(\n self,\n categorized_issues: Dict[str, List[Dict[str, Any]]],\n severity_scores: Dict[str, Dict[str, Any]]\n ) -> List[str]:\n \"\"\"Generate recommendations for addressing issues.\"\"\"\n recommendations = []\n\n for category, score_data in severity_scores.items():\n if score_data['priority'] == 'critical':\n recommendations.append(\n f\"URGENT: Address {category} issues immediately - affecting {score_data['percentage']}% of reviews\"\n )\n elif score_data['priority'] == 'high':\n recommendations.append(\n f\"HIGH PRIORITY: Focus on {category} issues in next update\"\n )\n\n return recommendations\n\n def _extract_feature_request_text(self, text: str) -> str:\n \"\"\"Extract the specific feature request from review text.\"\"\"\n # Simple extraction - find sentence with feature request keywords\n sentences = text.split('.')\n for sentence in sentences:\n if any(keyword in sentence for keyword in self.FEATURE_REQUEST_KEYWORDS):\n return sentence.strip()\n return text[:100] # Fallback\n\n def _cluster_feature_requests(\n self,\n feature_requests: List[Dict[str, Any]]\n ) -> List[Dict[str, Any]]:\n \"\"\"Cluster similar feature requests.\"\"\"\n # Simplified clustering - group by common keywords\n clusters = {}\n\n for request in feature_requests:\n text = request['request_text'].lower()\n # Extract key words\n words = [w for w in text.split() if len(w) > 4]\n\n # Try to find matching cluster\n matched = False\n for cluster_key in clusters:\n if any(word in cluster_key for word in words[:3]):\n clusters[cluster_key].append(request)\n matched = True\n break\n\n if not matched and words:\n cluster_key = ' '.join(words[:2])\n clusters[cluster_key] = [request]\n\n return [\n {'feature_theme': theme, 'request_count': len(requests), 'examples': requests[:3]}\n for theme, requests in clusters.items()\n ]\n\n def _prioritize_feature_requests(\n self,\n clustered_requests: List[Dict[str, Any]]\n ) -> List[Dict[str, Any]]:\n \"\"\"Prioritize feature requests by frequency.\"\"\"\n return sorted(\n clustered_requests,\n key=lambda x: x['request_count'],\n reverse=True\n )[:10]\n\n def _generate_feature_recommendations(\n self,\n prioritized_requests: List[Dict[str, Any]]\n ) -> List[str]:\n \"\"\"Generate recommendations for feature requests.\"\"\"\n recommendations = []\n\n if prioritized_requests:\n top_request = prioritized_requests[0]\n recommendations.append(\n f\"Most requested feature: {top_request['feature_theme']} \"\n f\"({top_request['request_count']} mentions) - consider for next major release\"\n )\n\n if len(prioritized_requests) > 1:\n recommendations.append(\n f\"Also consider: {prioritized_requests[1]['feature_theme']}\"\n )\n\n return recommendations\n\n def _determine_trend_direction(\n self,\n rating_change: float,\n sentiment_change: float\n ) -> str:\n \"\"\"Determine overall trend direction.\"\"\"\n if rating_change > 0.2 and sentiment_change > 5:\n return 'improving'\n elif rating_change \u003c -0.2 and sentiment_change \u003c -5:\n return 'declining'\n else:\n return 'stable'\n\n def _generate_trend_insights(\n self,\n trends: List[Dict[str, Any]],\n trend_direction: str\n ) -> List[str]:\n \"\"\"Generate insights from trend analysis.\"\"\"\n insights = []\n\n if trend_direction == 'improving':\n insights.append(\"Positive trend: User satisfaction is increasing over time\")\n elif trend_direction == 'declining':\n insights.append(\"WARNING: User satisfaction is declining - immediate action needed\")\n elif trend_direction == \"insufficient_data\":\n insights.append(\"Insufficient time periods to establish a trend\")\n else:\n insights.append(\"Sentiment is stable in the supplied sample\")\n\n # Review velocity insight\n if len(trends) >= 2:\n recent_reviews = trends[-1]['total_reviews']\n previous_reviews = trends[-2]['total_reviews']\n\n if recent_reviews > previous_reviews * 1.5:\n insights.append(\"Review volume increasing - growing user base or recent controversy\")\n\n return insights\n\n\ndef analyze_reviews(\n app_name: str,\n reviews: List[Dict[str, Any]]\n) -> Dict[str, Any]:\n \"\"\"\n Convenience function to perform comprehensive review analysis.\n\n Args:\n app_name: App name\n reviews: List of review dictionaries\n\n Returns:\n Complete review analysis\n \"\"\"\n analyzer = ReviewAnalyzer(app_name)\n\n return {\n 'sentiment_analysis': analyzer.analyze_sentiment(reviews),\n 'common_themes': analyzer.extract_common_themes(reviews),\n 'issues_identified': analyzer.identify_issues(reviews),\n 'feature_requests': analyzer.find_feature_requests(reviews)\n }\n","content_type":"text/x-python; charset=utf-8","language":"python","size":25722,"content_sha256":"b73d5bb2e0540a1fa666669df60f2257c0e98a6ddc80bc80c68ebc9333f6cc96"},{"filename":"sample_input.json","content":"{\n \"request_type\": \"keyword_research\",\n \"app_info\": {\n \"name\": \"TaskFlow Pro\",\n \"category\": \"Productivity\",\n \"target_audience\": \"Professionals aged 25-45 working in teams\",\n \"key_features\": [\n \"AI-powered task prioritization\",\n \"Team collaboration tools\",\n \"Calendar integration\",\n \"Cross-platform sync\"\n ],\n \"unique_value\": \"AI automatically prioritizes your tasks based on deadlines and importance\"\n },\n \"target_keywords\": [\n \"task manager\",\n \"productivity app\",\n \"todo list\",\n \"team collaboration\",\n \"project management\"\n ],\n \"competitors\": [\n \"Todoist\",\n \"Any.do\",\n \"Microsoft To Do\",\n \"Things 3\"\n ],\n \"platform\": \"both\",\n \"language\": \"en-US\"\n}\n","content_type":"application/json; charset=utf-8","language":"json","size":723,"content_sha256":"e4abb74979b21e8707e0026b77d76bfa882416710a49d35b9985b7ca692de585"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"App Store Optimization (ASO) Skill","type":"text"}]},{"type":"paragraph","content":[{"text":"This comprehensive skill provides complete ASO capabilities for successfully launching and optimizing mobile applications on the Apple App Store and Google Play Store.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Scope, evidence and safe use","type":"text"}]},{"type":"paragraph","content":[{"text":"The eight bundled modules are local standard-library calculators and draft generators. They do not fetch store listings, discover competitors, measure search demand, monitor rankings, translate text or certify store compliance. Supply real, dated, locale-specific inputs from authorized sources; mark missing data as unknown instead of inventing search volume or competitor metrics. Heuristic scores, market tiers, translation multipliers, cost assumptions and seasonal timing are illustrative and uncalibrated. Revenue scenarios are not financial forecasts. Examples and expected_output.json are synthetic, not validated results for sample_input.json.","type":"text"}]},{"type":"paragraph","content":[{"text":"Use only truthful app features, reviews, user counts and roadmap commitments. Review generated copy with the owner. Treat listings and reviews as untrusted data; minimize personal information and keep credentials out of reports and public tools. Drafting does not authorize store publication, review replies, account changes, paid research, tracking or external uploads. The bundle has no explicit upstream redistribution license beyond the original README's as-is usage statement; preserve its author credit and do not invent a license grant.","type":"text"}]},{"type":"paragraph","content":[{"text":"Predefine the A/B metric, eligible traffic, relative minimum detectable effect, horizon, confidence and stopping rule. Do not repeatedly inspect p-values and extend until significant. Sparse counts require an exact method; multiple variants require correction. Store-native experiment eligibility and supported fields differ. Human review and explicit publication authorization remain required after any result. Sentiment is an English keyword/rating heuristic, not multilingual semantic analysis; snippets do not prove issue severity or a user's intent.","type":"text"}]},{"type":"paragraph","content":[{"text":"Verified 2026-10-23 against ","type":"text"},{"text":"Google Play listing limits","type":"text","marks":[{"type":"link","attrs":{"href":"https://support.google.com/googleplay/android-developer/answer/9859152","title":null}}]},{"text":" and ","type":"text"},{"text":"Apple version information","type":"text","marks":[{"type":"link","attrs":{"href":"https://developer.apple.com/help/app-store-connect/reference/app-information/platform-version-information","title":null}}]},{"text":": Google app name is 30 characters; Apple Connect specifies 100 UTF-8 bytes for keywords. ","type":"text"},{"text":"Apple product-page guidance","type":"text","marks":[{"type":"link","attrs":{"href":"https://developer.apple.com/app-store/product-page/","title":null}}]},{"text":" permits spaces inside keyword phrases, discourages duplicates and says promotional text does not affect search ranking. Verify current store/device requirements before submission; review and indexing times are variable. Native rating prompts must follow current platform rules, without incentives or screening for favorable reviews.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Capabilities","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Research & Analysis","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keyword Research","type":"text","marks":[{"type":"strong"}]},{"text":": Analyze keyword volume, competition, and relevance for app discovery","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Competitor Analysis","type":"text","marks":[{"type":"strong"}]},{"text":": Deep-dive into top-performing apps in your category","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Market Trend Analysis","type":"text","marks":[{"type":"strong"}]},{"text":": Identify emerging trends and opportunities in your app category","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Review Sentiment Analysis","type":"text","marks":[{"type":"strong"}]},{"text":": Extract insights from user reviews to identify strengths and issues","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Category Analysis","type":"text","marks":[{"type":"strong"}]},{"text":": Evaluate optimal category and subcategory placement strategies","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Metadata Optimization","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Title Optimization","type":"text","marks":[{"type":"strong"}]},{"text":": Create compelling titles with optimal keyword placement (platform-specific character limits)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Description Optimization","type":"text","marks":[{"type":"strong"}]},{"text":": Craft both short and full descriptions that convert and rank","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Subtitle/Promotional Text","type":"text","marks":[{"type":"strong"}]},{"text":": Optimize Apple-specific subtitle (30 chars) and promotional text (170 chars)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keyword Field","type":"text","marks":[{"type":"strong"}]},{"text":": Maximize Apple's 100-byte keyword field with strategic selection","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Category Selection","type":"text","marks":[{"type":"strong"}]},{"text":": Data-driven recommendations for primary and secondary categories","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Icon Best Practices","type":"text","marks":[{"type":"strong"}]},{"text":": Guidelines for designing high-converting app icons","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Screenshot Optimization","type":"text","marks":[{"type":"strong"}]},{"text":": Strategies for creating screenshots that drive installs","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Preview Video","type":"text","marks":[{"type":"strong"}]},{"text":": Best practices for app preview videos","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Localization","type":"text","marks":[{"type":"strong"}]},{"text":": Multi-language optimization strategies for global reach","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Conversion Optimization","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"A/B Testing Framework","type":"text","marks":[{"type":"strong"}]},{"text":": Plan and track metadata experiments for continuous improvement","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Visual Asset Testing","type":"text","marks":[{"type":"strong"}]},{"text":": Test icons, screenshots, and videos for maximum conversion","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Store Listing Optimization","type":"text","marks":[{"type":"strong"}]},{"text":": Comprehensive page optimization for impression-to-install conversion","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Call-to-Action","type":"text","marks":[{"type":"strong"}]},{"text":": Optimize CTAs in descriptions and promotional materials","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Rating & Review Management","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Review Monitoring","type":"text","marks":[{"type":"strong"}]},{"text":": Track and analyze user reviews for actionable insights","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Response Strategies","type":"text","marks":[{"type":"strong"}]},{"text":": Templates and best practices for responding to reviews","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Rating Improvement","type":"text","marks":[{"type":"strong"}]},{"text":": Tactical approaches to improve app ratings organically","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Issue Identification","type":"text","marks":[{"type":"strong"}]},{"text":": Surface common problems and feature requests from reviews","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Launch & Update Strategies","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Pre-Launch Checklist","type":"text","marks":[{"type":"strong"}]},{"text":": Complete validation before submitting to stores","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Launch Timing","type":"text","marks":[{"type":"strong"}]},{"text":": Optimize release timing for maximum visibility and downloads","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Update Cadence","type":"text","marks":[{"type":"strong"}]},{"text":": Plan optimal update frequency and feature rollouts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Feature Announcements","type":"text","marks":[{"type":"strong"}]},{"text":": Craft \"What's New\" sections that re-engage users","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Seasonal Optimization","type":"text","marks":[{"type":"strong"}]},{"text":": Leverage seasonal trends and events","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Analytics & Tracking","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"ASO Score","type":"text","marks":[{"type":"strong"}]},{"text":": Calculate overall ASO health score across multiple factors","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keyword Rankings","type":"text","marks":[{"type":"strong"}]},{"text":": Track keyword position changes over time","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Conversion Metrics","type":"text","marks":[{"type":"strong"}]},{"text":": Monitor impression-to-install conversion rates","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Download Velocity","type":"text","marks":[{"type":"strong"}]},{"text":": Track download trends and momentum","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Performance Benchmarking","type":"text","marks":[{"type":"strong"}]},{"text":": Compare against category averages and competitors","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Platform-Specific Requirements","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Apple App Store","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Title: 30 characters","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Subtitle: 30 characters","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Promotional Text: 170 characters (editable without app update)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Description: 4,000 characters","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keywords: 100 UTF-8 bytes (comma-separated, no spaces)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"What's New: 4,000 characters","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Google Play Store","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Title: 30 characters","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Short Description: 80 characters","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Full Description: 4,000 characters","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"No separate keyword field (keywords extracted from title and description)","type":"text"}]}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Input Requirements","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Keyword Research","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"app_name\": \"MyApp\",\n \"category\": \"Productivity\",\n \"target_keywords\": [\"task manager\", \"productivity\", \"todo list\"],\n \"competitors\": [\"Todoist\", \"Any.do\", \"Microsoft To Do\"],\n \"language\": \"en-US\"\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Metadata Optimization","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"platform\": \"apple\" | \"google\",\n \"app_info\": {\n \"name\": \"MyApp\",\n \"category\": \"Productivity\",\n \"target_audience\": \"Professionals aged 25-45\",\n \"key_features\": [\"Task management\", \"Team collaboration\", \"AI assistance\"],\n \"unique_value\": \"AI-powered task prioritization\"\n },\n \"current_metadata\": {\n \"title\": \"Current Title\",\n \"subtitle\": \"Current Subtitle\",\n \"description\": \"Current description...\"\n },\n \"target_keywords\": [\"productivity\", \"task manager\", \"todo\"]\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Review Analysis","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"app_id\": \"com.myapp.app\",\n \"platform\": \"apple\" | \"google\",\n \"date_range\": \"last_30_days\" | \"last_90_days\" | \"all_time\",\n \"rating_filter\": [1, 2, 3, 4, 5],\n \"language\": \"en\"\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"ASO Score Calculation","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"metadata\": {\n \"title_quality\": 0.8,\n \"description_quality\": 0.7,\n \"keyword_density\": 0.6\n },\n \"ratings\": {\n \"average_rating\": 4.5,\n \"total_ratings\": 15000\n },\n \"conversion\": {\n \"impression_to_install\": 0.05\n },\n \"keyword_rankings\": {\n \"top_10\": 5,\n \"top_50\": 12,\n \"top_100\": 18\n }\n}","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Output Formats","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Keyword Research Report","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"List of recommended keywords with search volume estimates","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Competition level analysis (low/medium/high)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Relevance scores for each keyword","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Strategic recommendations for primary vs. secondary keywords","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Long-tail keyword opportunities","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Optimized Metadata Package","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Platform-specific title (with character count validation)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Subtitle/promotional text (Apple)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Short description (Google)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Full description (both platforms)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keyword field (Apple - 100 chars)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Character count validation for all fields","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keyword density analysis","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Before/after comparison","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Competitor Analysis Report","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Top 10 competitors in category","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Their metadata strategies","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keyword overlap analysis","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Visual asset assessment","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Rating and review volume comparison","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identified gaps and opportunities","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"ASO Health Score","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Overall score (0-100)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Category breakdown:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Metadata Quality (0-25)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Ratings & Reviews (0-25)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keyword Performance (0-25)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Conversion Metrics (0-25)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Specific improvement recommendations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Priority action items","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"A/B Test Plan","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Hypothesis and test variables","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Test duration recommendations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Success metrics definition","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Sample size calculations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Statistical significance thresholds","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Launch Checklist","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Pre-submission validation (all required assets, metadata)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Store compliance verification","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Testing checklist (devices, OS versions)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Marketing preparation items","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Post-launch monitoring plan","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"How to Use","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Keyword Research","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Hey Claude—I just added the \"app-store-optimization\" skill. Can you research the best keywords for a productivity app targeting professionals? Focus on keywords with good search volume but lower competition.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Optimize App Store Listing","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Hey Claude—I just added the \"app-store-optimization\" skill. Can you optimize my app's metadata for the Apple App Store? Here's my current listing: [provide current metadata]. I want to rank for \"task management\" and \"productivity tools\".","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Analyze Competitor Strategy","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Hey Claude—I just added the \"app-store-optimization\" skill. Can you analyze the ASO strategies of Todoist, Any.do, and Microsoft To Do? I want to understand what they're doing well and where there are opportunities.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Review Sentiment Analysis","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Hey Claude—I just added the \"app-store-optimization\" skill. Can you analyze recent reviews for my app (com.myapp.ios) and identify the most common user complaints and feature requests?","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Calculate ASO Score","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Hey Claude—I just added the \"app-store-optimization\" skill. Can you calculate my app's overall ASO health score and provide specific recommendations for improvement?","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Plan A/B Test","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Hey Claude—I just added the \"app-store-optimization\" skill. I want to A/B test my app icon and first screenshot. Can you help me design the test and determine how long to run it?","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Pre-Launch Checklist","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Hey Claude—I just added the \"app-store-optimization\" skill. Can you generate a comprehensive pre-launch checklist for submitting my app to both Apple App Store and Google Play Store?","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Scripts","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"keyword_analyzer.py","type":"text"}]},{"type":"paragraph","content":[{"text":"Analyzes keywords for search volume, competition, and relevance. Provides strategic recommendations for primary and secondary keywords.","type":"text"}]},{"type":"paragraph","content":[{"text":"Key Functions:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"analyze_keyword()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Analyze single keyword metrics","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"compare_keywords()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Compare multiple keywords","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"find_long_tail()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Discover long-tail keyword opportunities","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"calculate_keyword_difficulty()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Assess competition level","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"metadata_optimizer.py","type":"text"}]},{"type":"paragraph","content":[{"text":"Optimizes titles, descriptions, and keyword fields with platform-specific character limit validation.","type":"text"}]},{"type":"paragraph","content":[{"text":"Key Functions:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"optimize_title()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Create compelling, keyword-rich titles","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"optimize_description()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Generate conversion-focused descriptions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"optimize_keyword_field()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Maximize Apple's 100-char keyword field","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"validate_character_limits()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Ensure compliance with platform limits","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"calculate_keyword_density()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Analyze keyword usage in metadata","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"competitor_analyzer.py","type":"text"}]},{"type":"paragraph","content":[{"text":"Analyzes top competitors' ASO strategies and identifies opportunities.","type":"text"}]},{"type":"paragraph","content":[{"text":"Key Functions:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"get_top_competitors()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Identify category leaders","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"analyze_competitor_metadata()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Extract and analyze competitor keywords","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"compare_visual_assets()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Evaluate icons and screenshots","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"identify_gaps()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Find competitive opportunities","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"aso_scorer.py","type":"text"}]},{"type":"paragraph","content":[{"text":"Calculates comprehensive ASO health score across multiple dimensions.","type":"text"}]},{"type":"paragraph","content":[{"text":"Key Functions:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"calculate_overall_score()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Compute 0-100 ASO score","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"score_metadata_quality()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Evaluate title, description, keywords","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"score_ratings_reviews()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Assess rating quality and volume","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"score_keyword_performance()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Analyze ranking positions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"score_conversion_metrics()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Evaluate impression-to-install rates","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"generate_recommendations()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Provide prioritized action items","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"ab_test_planner.py","type":"text"}]},{"type":"paragraph","content":[{"text":"Plans and tracks A/B tests for metadata and visual assets.","type":"text"}]},{"type":"paragraph","content":[{"text":"Key Functions:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"design_test()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Create test hypothesis and variables","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"calculate_sample_size()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Determine required test duration","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"calculate_significance()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Assess statistical significance","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"track_results()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Monitor test performance","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"generate_report()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Summarize test outcomes","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"localization_helper.py","type":"text"}]},{"type":"paragraph","content":[{"text":"Manages multi-language ASO optimization strategies.","type":"text"}]},{"type":"paragraph","content":[{"text":"Key Functions:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"identify_target_markets()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Recommend localization priorities","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"translate_metadata()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Generate localized metadata","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"adapt_keywords()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Research locale-specific keywords","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"validate_translations()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Check character limits per language","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"calculate_localization_roi()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Estimate impact of localization","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"review_analyzer.py","type":"text"}]},{"type":"paragraph","content":[{"text":"Analyzes user reviews for sentiment, issues, and feature requests.","type":"text"}]},{"type":"paragraph","content":[{"text":"Key Functions:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"analyze_sentiment()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Calculate positive/negative/neutral ratios","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"extract_common_themes()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Identify frequently mentioned topics","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"identify_issues()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Surface bugs and user complaints","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"find_feature_requests()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Extract desired features","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"track_sentiment_trends()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Monitor sentiment over time","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"generate_response_templates()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Create review response drafts","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"launch_checklist.py","type":"text"}]},{"type":"paragraph","content":[{"text":"Generates comprehensive pre-launch and update checklists.","type":"text"}]},{"type":"paragraph","content":[{"text":"Key Functions:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"generate_prelaunch_checklist()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Complete submission validation","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"validate_app_store_compliance()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Check Apple guidelines","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"validate_play_store_compliance()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Check Google policies","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"create_update_plan()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Plan update cadence and features","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"optimize_launch_timing()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Recommend release dates","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"plan_seasonal_campaigns()","type":"text","marks":[{"type":"code_inline"}]},{"text":": Identify seasonal opportunities","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Best Practices","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Keyword Research","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Volume vs. Competition","type":"text","marks":[{"type":"strong"}]},{"text":": Balance high-volume keywords with achievable rankings","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Relevance First","type":"text","marks":[{"type":"strong"}]},{"text":": Only target keywords genuinely relevant to your app","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Long-Tail Strategy","type":"text","marks":[{"type":"strong"}]},{"text":": Include 3-4 word phrases with lower competition","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Continuous Research","type":"text","marks":[{"type":"strong"}]},{"text":": Keyword trends change—research quarterly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Competitor Keywords","type":"text","marks":[{"type":"strong"}]},{"text":": Don't copy blindly; ensure relevance to your features","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Metadata Optimization","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Front-Load Keywords","type":"text","marks":[{"type":"strong"}]},{"text":": Place most important keywords early in title/description","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Natural Language","type":"text","marks":[{"type":"strong"}]},{"text":": Write for humans first, SEO second","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Feature Benefits","type":"text","marks":[{"type":"strong"}]},{"text":": Focus on user benefits, not just features","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"A/B Test Everything","type":"text","marks":[{"type":"strong"}]},{"text":": Test titles, descriptions, screenshots systematically","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Update Regularly","type":"text","marks":[{"type":"strong"}]},{"text":": Refresh metadata every major update","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Character Limits","type":"text","marks":[{"type":"strong"}]},{"text":": Use every character—don't waste valuable space","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Apple Keyword Field","type":"text","marks":[{"type":"strong"}]},{"text":": No plurals, duplicates, or spaces between commas","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Visual Assets","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Icon","type":"text","marks":[{"type":"strong"}]},{"text":": Must be recognizable at small sizes (60x60px)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Screenshots","type":"text","marks":[{"type":"strong"}]},{"text":": First 2-3 are critical—most users don't scroll","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Captions","type":"text","marks":[{"type":"strong"}]},{"text":": Use screenshot captions to tell your value story","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Consistency","type":"text","marks":[{"type":"strong"}]},{"text":": Match visual style to app design","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"A/B Test Icons","type":"text","marks":[{"type":"strong"}]},{"text":": Icon is the single most important visual element","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Reviews & Ratings","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Respond Quickly","type":"text","marks":[{"type":"strong"}]},{"text":": Reply to reviews within 24-48 hours","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Professional Tone","type":"text","marks":[{"type":"strong"}]},{"text":": Always courteous, even with negative reviews","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Address Issues","type":"text","marks":[{"type":"strong"}]},{"text":": Show you're actively fixing reported problems","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Thank Supporters","type":"text","marks":[{"type":"strong"}]},{"text":": Acknowledge positive reviews","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Prompt Strategically","type":"text","marks":[{"type":"strong"}]},{"text":": Ask for ratings after positive experiences","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Launch Strategy","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Soft Launch","type":"text","marks":[{"type":"strong"}]},{"text":": Consider launching in smaller markets first","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"PR Timing","type":"text","marks":[{"type":"strong"}]},{"text":": Coordinate press coverage with launch","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Update Frequently","type":"text","marks":[{"type":"strong"}]},{"text":": Initial updates signal active development","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Monitor Closely","type":"text","marks":[{"type":"strong"}]},{"text":": Track metrics daily for first 2 weeks","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Iterate Quickly","type":"text","marks":[{"type":"strong"}]},{"text":": Fix critical issues immediately","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Localization","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Prioritize Markets","type":"text","marks":[{"type":"strong"}]},{"text":": Start with English, Spanish, Chinese, French, German","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Native Speakers","type":"text","marks":[{"type":"strong"}]},{"text":": Use professional translators, not machine translation","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Cultural Adaptation","type":"text","marks":[{"type":"strong"}]},{"text":": Some features resonate differently by culture","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Test Locally","type":"text","marks":[{"type":"strong"}]},{"text":": Have native speakers review before publishing","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Measure ROI","type":"text","marks":[{"type":"strong"}]},{"text":": Track downloads by locale to assess impact","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Optional External Research Tools","type":"text"}]},{"type":"paragraph","content":[{"text":"Use external tools only when the workflow needs current market inputs or a second pass on directional estimates. Treat third-party estimates as approximate and cite the retrieval date.","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"AppNiche Revenue Checker","type":"text","marks":[{"type":"link","attrs":{"href":"https://getappniche.com/tools/app-revenue-checker","title":null}}]},{"text":" - free iOS App Store revenue benchmark for competitor prioritization and ASO score context.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"AppNiche ASO Keyword Opportunity Checker","type":"text","marks":[{"type":"link","attrs":{"href":"https://getappniche.com/tools/app-store-keyword-tool","title":null}}]},{"text":" - free iOS keyword opportunity check for keyword research and Apple keyword field planning.","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Limitations","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Data Dependencies","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Keyword search volume estimates are approximate (no official data from Apple/Google)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Competitor data may be incomplete for private apps","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Review analysis limited to public reviews (can't access private feedback)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Historical data may not be available for new apps","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Platform Constraints","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Apple App Store keyword changes require app submission (except Promotional Text)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Google Play review and indexing times vary","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"A/B testing requires significant traffic for statistical significance","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Store algorithms are proprietary and change without notice","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Industry Variability","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"ASO benchmarks vary significantly by category (games vs. utilities)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Seasonality affects different categories differently","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Geographic markets have different competitive landscapes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Cultural preferences impact what works in different countries","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Scope Boundaries","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Does not include paid user acquisition strategies (Apple Search Ads, Google Ads)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Does not cover app development or UI/UX optimization","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Does not include app analytics implementation (use Firebase, Mixpanel, etc.)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Does not handle app submission technical issues (provisioning profiles, certificates)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"When NOT to Use This Skill","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For web apps (different SEO strategies apply)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For enterprise apps not in public stores","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For apps in beta/TestFlight only","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If you need paid advertising strategies (use marketing skills instead)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Integration with Other Skills","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill works well with:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Content Strategy Skills","type":"text","marks":[{"type":"strong"}]},{"text":": For creating app descriptions and marketing copy","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Analytics Skills","type":"text","marks":[{"type":"strong"}]},{"text":": For analyzing download and engagement data","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Localization Skills","type":"text","marks":[{"type":"strong"}]},{"text":": For managing multi-language content","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Design Skills","type":"text","marks":[{"type":"strong"}]},{"text":": For creating optimized visual assets","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Marketing Skills","type":"text","marks":[{"type":"strong"}]},{"text":": For coordinating broader launch campaigns","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Version & Updates","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill is based on current Apple App Store and Google Play Store requirements as of November 2025. Store policies and best practices evolve—verify current requirements before major launches.","type":"text"}]},{"type":"paragraph","content":[{"text":"Key Updates to Monitor:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Apple App Store Connect updates (apple.com/app-store/review/guidelines)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Google Play Console updates (play.google.com/console/about/guides/releasewithconfidence)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"iOS/Android version adoption rates (affects device testing)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Store algorithm changes (follow ASO blogs and communities)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When to Use","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill is applicable to execute the workflow or actions described in the overview.","type":"text"}]}]},"metadata":{"date":"2026-11-02","name":"app-store-optimization","risk":"critical","author":"@skillopedia","source":{"stars":49040,"repo_name":"agentic-awesome-skills","origin_url":"https://github.com/sickn33/agentic-awesome-skills/blob/HEAD/skills/app-store-optimization/SKILL.md","repo_owner":"sickn33","body_sha256":"5f253eeb140c36b3c06600c263b654cbd3e1fc7179b13ec9532d932d16269615","cluster_key":"b70cf785595024d03c1c10a07ed4cea86de1d98b1574908be1bbc9cefd9ed86c","clean_bundle":{"format":"clean-skill-bundle-v1","source":"sickn33/agentic-awesome-skills/skills/app-store-optimization/SKILL.md","text_bytes":214493,"source_commit":"b4bd5a153dd1e0a66789b6c971f731cdcf492a46","skills_sh_rank":9027,"attachment_count":12,"text_attachments":12,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"skills/app-store-optimization/SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"v1","category":"business-sales-marketing","category_label":"Business"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"business-sales-marketing","date_added":"2026-02-27","import_tag":"skills-sh-top20k-2026-11","description":"Complete App Store Optimization (ASO) toolkit for researching, optimizing, and tracking mobile app performance on Apple App Store and Google Play Store"}},"renderedAt":1793661569850}

App Store Optimization (ASO) Skill This comprehensive skill provides complete ASO capabilities for successfully launching and optimizing mobile applications on the Apple App Store and Google Play Store. Scope, evidence and safe use The eight bundled modules are local standard-library calculators and draft generators. They do not fetch store listings, discover competitors, measure search demand, monitor rankings, translate text or certify store compliance. Supply real, dated, locale-specific inputs from authorized sources; mark missing data as unknown instead of inventing search volume or comp…