appstore-review-cli 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. appstore_review_cli-0.1.0/.github/workflows/ci.yml +31 -0
  2. appstore_review_cli-0.1.0/.github/workflows/publish.yml +30 -0
  3. appstore_review_cli-0.1.0/.gitignore +17 -0
  4. appstore_review_cli-0.1.0/CLAUDE.md +179 -0
  5. appstore_review_cli-0.1.0/LICENSE +21 -0
  6. appstore_review_cli-0.1.0/PKG-INFO +294 -0
  7. appstore_review_cli-0.1.0/README.md +264 -0
  8. appstore_review_cli-0.1.0/SKILL.md +174 -0
  9. appstore_review_cli-0.1.0/appinsight/__init__.py +8 -0
  10. appstore_review_cli-0.1.0/appinsight/analyzer.py +142 -0
  11. appstore_review_cli-0.1.0/appinsight/cli.py +427 -0
  12. appstore_review_cli-0.1.0/appinsight/compare.py +255 -0
  13. appstore_review_cli-0.1.0/appinsight/dataframe.py +116 -0
  14. appstore_review_cli-0.1.0/appinsight/filters.py +86 -0
  15. appstore_review_cli-0.1.0/appinsight/formatters.py +97 -0
  16. appstore_review_cli-0.1.0/appinsight/google_play.py +124 -0
  17. appstore_review_cli-0.1.0/appinsight/instructions/__init__.py +0 -0
  18. appstore_review_cli-0.1.0/appinsight/instructions/claude.md +179 -0
  19. appstore_review_cli-0.1.0/appinsight/instructions/copilot.md +174 -0
  20. appstore_review_cli-0.1.0/appinsight/scraper.py +203 -0
  21. appstore_review_cli-0.1.0/appinsight/setup.py +82 -0
  22. appstore_review_cli-0.1.0/appinsight/trend.py +232 -0
  23. appstore_review_cli-0.1.0/appinsight/version_diff.py +291 -0
  24. appstore_review_cli-0.1.0/cli.py +6 -0
  25. appstore_review_cli-0.1.0/docs/MCP_RATING.md +55 -0
  26. appstore_review_cli-0.1.0/pyproject.toml +64 -0
  27. appstore_review_cli-0.1.0/tests/__init__.py +0 -0
  28. appstore_review_cli-0.1.0/tests/test_compare.py +85 -0
  29. appstore_review_cli-0.1.0/tests/test_export.py +174 -0
  30. appstore_review_cli-0.1.0/tests/test_filters.py +213 -0
  31. appstore_review_cli-0.1.0/tests/test_formatters.py +152 -0
  32. appstore_review_cli-0.1.0/tests/test_google_play.py +249 -0
  33. appstore_review_cli-0.1.0/tests/test_scraper.py +93 -0
  34. appstore_review_cli-0.1.0/tests/test_trend.py +129 -0
  35. appstore_review_cli-0.1.0/tests/test_version_diff.py +89 -0
@@ -0,0 +1,31 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+ branches: [master]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ python-version: ["3.10", "3.11", "3.12"]
15
+
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: Set up Python ${{ matrix.python-version }}
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: ${{ matrix.python-version }}
23
+
24
+ - name: Install dependencies
25
+ run: |
26
+ python -m pip install --upgrade pip
27
+ pip install -e ".[google]"
28
+ pip install pytest
29
+
30
+ - name: Run tests
31
+ run: pytest -q
@@ -0,0 +1,30 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ permissions:
8
+ id-token: write
9
+
10
+ jobs:
11
+ publish:
12
+ runs-on: ubuntu-latest
13
+ environment: pypi
14
+
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+
18
+ - name: Set up Python
19
+ uses: actions/setup-python@v5
20
+ with:
21
+ python-version: "3.12"
22
+
23
+ - name: Install build tools
24
+ run: python -m pip install --upgrade pip build
25
+
26
+ - name: Build package
27
+ run: python -m build
28
+
29
+ - name: Publish to PyPI
30
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,17 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.pyc
4
+ *.egg-info/
5
+ dist/
6
+ build/
7
+ uv.lock
8
+ .env
9
+ .DS_Store
10
+ *.egg
11
+ .mypy_cache/
12
+ .ruff_cache/
13
+ .pytest_cache/
14
+ *.swp
15
+ *.swo
16
+ .idea/
17
+ .vscode/
@@ -0,0 +1,179 @@
1
+ # appstore-review-cli — App Store & Google Play Review Scraper
2
+
3
+ <!-- This file was generated by: appstore-reviews setup claude -->
4
+ <!-- It teaches Claude Code about the appstore-reviews CLI. -->
5
+
6
+ The user has `appstore-review-cli` installed — a CLI tool for scraping Apple App Store and Google Play reviews. Use it to analyze competitor apps, find user complaints, and identify feature gaps.
7
+
8
+ **You ARE the analyzer.** Fetch reviews with the CLI, then reason over them directly. Do NOT suggest the user install Ollama or use the `analyze` command — you can do the analysis yourself.
9
+
10
+ ## Quick Reference
11
+
12
+ Search for an app:
13
+ ```bash
14
+ appstore-reviews search "app name"
15
+ ```
16
+ Fallback: `python3 cli.py search "app name"`
17
+
18
+ Search with more results or JSON output:
19
+ ```bash
20
+ appstore-reviews search "app name" --limit 10 --format json
21
+ ```
22
+
23
+ Fetch negative reviews:
24
+ ```bash
25
+ appstore-reviews reviews <APP_ID> --stars 2 --days 30 --format text
26
+ ```
27
+
28
+ Fetch only 3-star reviews (the nuanced ones):
29
+ ```bash
30
+ appstore-reviews reviews <APP_ID> --min-stars 3 --stars 3 --format text
31
+ ```
32
+
33
+ Sort by most helpful (votes) instead of date:
34
+ ```bash
35
+ appstore-reviews reviews <APP_ID> --stars 2 --sort votes --format text
36
+ ```
37
+
38
+ Export to CSV for data analysis:
39
+ ```bash
40
+ appstore-reviews reviews <APP_ID> --stars 2 --format csv > reviews.csv
41
+ ```
42
+
43
+ Fetch reviews with keyword filter:
44
+ ```bash
45
+ appstore-reviews reviews <APP_ID> --keywords crash,bug,slow --format text
46
+ ```
47
+
48
+ Combine filters (AND logic — all filters stack):
49
+ ```bash
50
+ appstore-reviews reviews <APP_ID> --stars 2 --days 30 --keywords crash,freeze --version 5.0.1
51
+ ```
52
+
53
+ Google Play - use `--store google` with package names:
54
+ ```bash
55
+ appstore-reviews --store google search "Slack"
56
+ appstore-reviews --store google reviews com.Slack --stars 2 --days 30 --format text
57
+ appstore-reviews --store google compare com.Slack com.microsoft.teams --stars 2 --pages 3
58
+ ```
59
+
60
+ Compare multiple apps side by side:
61
+ ```bash
62
+ appstore-reviews compare <APP_ID_1> <APP_ID_2> --stars 2 --pages 3
63
+ ```
64
+ Shows: overview table, rating distributions, top complaint categories, top keywords, shared vs unique complaints.
65
+
66
+ Compare sentiment between app versions:
67
+ ```bash
68
+ appstore-reviews version-diff <APP_ID> --pages 5
69
+ appstore-reviews version-diff <APP_ID> --old 4.23.0 --new 4.29.149
70
+ ```
71
+ Shows: version comparison table, category changes with arrows, new/resolved issues, top keywords per version. Auto-detects the two most reviewed versions if `--old`/`--new` are omitted.
72
+
73
+ Show rating trend over time:
74
+ ```bash
75
+ appstore-reviews trend <APP_ID> --pages 5
76
+ appstore-reviews trend <APP_ID> --period month --stars 2
77
+ ```
78
+ Shows: per-period average rating, review count, trend arrows (▲/▼), sparkline bars, star distributions, and overall trend direction.
79
+
80
+ Export compare/version-diff/trend to JSON or CSV:
81
+ ```bash
82
+ appstore-reviews compare <APP_ID_1> <APP_ID_2> --format json
83
+ appstore-reviews version-diff <APP_ID> --format csv > diff.csv
84
+ appstore-reviews trend <APP_ID> --format csv > trend.csv
85
+ ```
86
+
87
+ All options: `appstore-reviews reviews --help`
88
+
89
+ ## Important Behavior
90
+
91
+ - **Output streams**: Data goes to stdout, progress/status goes to stderr. Pipe-safe by default.
92
+ - **Review limit**: Apple's RSS feed returns max ~500 reviews per country (10 pages × 50). Use `--pages 10` for maximum coverage.
93
+ - **Deduplication**: Reviews are automatically deduplicated across pages.
94
+ - **Input validation**: `--stars` and `--min-stars` accept 1-5, `--pages` accepts 1-10. Invalid values are rejected.
95
+ - **Rating range**: `--stars 2` means 1-2 stars. Use `--min-stars 3 --stars 3` for only 3-star reviews.
96
+ - **Sorting**: `--sort date` (newest first, default), `--sort rating` (lowest first), `--sort votes` (most helpful first).
97
+ - **No results?**: "No reviews match the given filters" means filters are too narrow. Try fewer keywords, more days, or higher star ceiling.
98
+ - **Network errors**: If the App Store is unreachable, the CLI prints a clear error to stderr instead of a traceback.
99
+ - **Country codes**: Default is `us`. Common alternatives: `gb`, `de`, `fr`, `jp`, `au`, `ca`, `nl`, `br`, `kr`.
100
+ - **Google Play**: Use `--store google` with package names (e.g. `com.Slack`). Requires `pip install appstore-review-cli[google]`.
101
+ - **Google Play search**: The first result sometimes lacks a package name. Use the package name directly if needed (find it in the Google Play URL).
102
+
103
+ ## How to Analyze (You Do This Yourself)
104
+
105
+ When asked to analyze reviews, use the CLI to fetch them, then reason over the output directly:
106
+
107
+ 1. **Gap Finder**: Use `--stars 2` and look for "wish it had", "missing", "competitor does X". Group by feature category and rank by frequency.
108
+ 2. **Bug Hunter**: Use `--stars 2 --keywords crash,bug,freeze,error,broken,slow`. Group by symptom, identify affected versions, rank by severity.
109
+ 3. **Sentiment Snapshot**: Run with `--stats --pages 5` first to see the rating distribution before drilling into details.
110
+
111
+ Do NOT pipe output to Ollama or another external LLM. Analyze the review text yourself and present structured findings to the user.
112
+
113
+ ## Example Workflows
114
+
115
+ **User asks: "What are Slack users complaining about?"**
116
+ ```bash
117
+ appstore-reviews search "Slack"
118
+ # Get the app ID from results
119
+ appstore-reviews reviews 618783545 --stars 2 --days 60 --format text --stats
120
+ ```
121
+ Then categorize the complaints in your response: UX issues, missing features, bugs, performance. Rank by frequency.
122
+
123
+ **User asks: "Find crash reports for WhatsApp"**
124
+ ```bash
125
+ appstore-reviews search "WhatsApp"
126
+ appstore-reviews reviews <APP_ID> --stars 2 --keywords crash,freeze,error,broken,stuck --format text
127
+ ```
128
+ Group by symptom in your response, note affected versions, rank by severity.
129
+
130
+ **User asks: "Compare Spotify vs Apple Music reviews"**
131
+ ```bash
132
+ appstore-reviews compare 324684580 1108187390 --stars 2 --pages 5
133
+ ```
134
+ The compare command produces a structured report with per-app breakdowns, shared complaints, and unique weaknesses. You can supplement with additional analysis.
135
+
136
+ **User asks: "What do German users think of Duolingo?"**
137
+ ```bash
138
+ appstore-reviews search "Duolingo"
139
+ appstore-reviews reviews <APP_ID> --stars 2 --country de --days 90 --format text
140
+ ```
141
+ Analyze with awareness that reviews may be in German.
142
+
143
+ **User asks: "Find complaints about Spotify on Android"**
144
+ ```bash
145
+ appstore-reviews --store google reviews com.spotify.music --stars 2 --days 60 --format text
146
+ ```
147
+ Group complaints by category: performance, features, bugs.
148
+
149
+ **User asks: "What changed in the latest version of Notion?"**
150
+ ```bash
151
+ appstore-reviews search "Notion"
152
+ appstore-reviews version-diff <APP_ID> --pages 5
153
+ ```
154
+ The version-diff command shows exactly how sentiment shifted: rating changes, new/resolved complaint categories, and top keywords per version.
155
+
156
+ **User asks: "How has Slack's rating been trending?"**
157
+ ```bash
158
+ appstore-reviews search "Slack"
159
+ appstore-reviews trend <APP_ID> --pages 5
160
+ ```
161
+ The trend command shows weekly or monthly rating averages with sparkline visualizations. Use `--period month` for a broader view or `--stars 2` to track negative sentiment trends.
162
+
163
+ ## Python API
164
+
165
+ For programmatic use (e.g., in a script or notebook the user is building):
166
+ ```python
167
+ from appinsight import get_reviews, get_reviews_df
168
+
169
+ # As dicts (no pandas needed)
170
+ reviews = get_reviews(618783545, stars=2, days=30)
171
+
172
+ # Google Play
173
+ reviews = get_reviews("com.Slack", stars=2, days=30, store="google")
174
+
175
+ # As pandas DataFrame
176
+ df = get_reviews_df(618783545, stars=2, pages=5)
177
+ df.groupby("version")["rating"].mean()
178
+ ```
179
+ Requires: `pip install appstore-review-cli[pandas]`
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Vasilis Kayatas
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,294 @@
1
+ Metadata-Version: 2.4
2
+ Name: appstore-review-cli
3
+ Version: 0.1.0
4
+ Summary: Scrape App Store and Google Play reviews. Filter the noise. Feed the signal to your coding agent.
5
+ Project-URL: Homepage, https://github.com/vkayatas/appstore-review-cli
6
+ Project-URL: Repository, https://github.com/vkayatas/appstore-review-cli
7
+ Project-URL: Issues, https://github.com/vkayatas/appstore-review-cli/issues
8
+ Author: Vasilis Kayatas
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: ai-agent,app-reviews,app-store,cli,coding-agent,copilot,google-play,play-store,product-analytics,ratings,reviews,scraper,sentiment
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
21
+ Classifier: Topic :: Software Development :: Testing
22
+ Classifier: Typing :: Typed
23
+ Requires-Python: >=3.10
24
+ Requires-Dist: requests>=2.28
25
+ Provides-Extra: google
26
+ Requires-Dist: google-play-scraper>=1.2; extra == 'google'
27
+ Provides-Extra: pandas
28
+ Requires-Dist: pandas>=1.5; extra == 'pandas'
29
+ Description-Content-Type: text/markdown
30
+
31
+ # appstore-review-cli
32
+
33
+ [![CI](https://github.com/vkayatas/appstore-review-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/vkayatas/appstore-review-cli/actions/workflows/ci.yml)
34
+ [![PyPI](https://img.shields.io/pypi/v/appstore-review-cli)](https://pypi.org/project/appstore-review-cli/)
35
+
36
+ **Turn App Store and Google Play reviews into product intelligence - from the terminal or through your AI coding agent.**
37
+
38
+ App store reviews are the largest public dataset of unfiltered user feedback. But reading them on the store websites is painful: no filtering, no export, no way to search across versions or countries. This tool fixes that.
39
+
40
+ ## Why Use This?
41
+
42
+ - **Two stores**: Apple App Store and Google Play - same filters, same output, one tool.
43
+ - **Competitor research**: Pull 1-star reviews for any app and find the feature gaps your product can fill.
44
+ - **Bug triage**: Filter reviews by keywords like "crash", "freeze", "login" and group by app version.
45
+ - **Version monitoring**: Compare sentiment between releases - see what got better, what got worse, and what's new.
46
+ - **Multi-country insights**: Same app, different markets - compare complaints across `us`, `de`, `jp`, etc.
47
+ - **AI-native**: Your coding agent (Copilot, Claude Code, Cursor) can fetch and analyze reviews in natural language. No Ollama needed - the agent IS the LLM.
48
+
49
+ No API keys. No accounts. No servers. Just `pip install` and go.
50
+
51
+ ## Install
52
+
53
+ ```bash
54
+ pip install appstore-review-cli
55
+ ```
56
+
57
+ For Google Play support:
58
+ ```bash
59
+ pip install "appstore-review-cli[google]"
60
+ ```
61
+
62
+ ## Quick Start
63
+
64
+ ```bash
65
+ # Find an app
66
+ appstore-reviews search "Slack"
67
+
68
+ # Get negative reviews from the last 30 days
69
+ appstore-reviews reviews 803453959 --stars 2 --days 30
70
+
71
+ # Filter by keywords
72
+ appstore-reviews reviews 803453959 --keywords crash,freeze --stars 2
73
+
74
+ # Sort by most helpful
75
+ appstore-reviews reviews 803453959 --stars 2 --sort votes
76
+
77
+ # Get only 3-star reviews (the nuanced ones)
78
+ appstore-reviews reviews 803453959 --min-stars 3 --stars 3
79
+
80
+ # Export to CSV or JSON
81
+ appstore-reviews reviews 803453959 --stars 2 --format csv > reviews.csv
82
+ appstore-reviews reviews 803453959 --stars 2 --format json > reviews.json
83
+
84
+ # Compare two apps side by side
85
+ appstore-reviews compare 803453959 310633997 --stars 2 --pages 3
86
+
87
+ # Google Play - use --store google with package names
88
+ appstore-reviews --store google search "Slack"
89
+ appstore-reviews --store google reviews com.Slack --stars 2 --days 30
90
+ appstore-reviews --store google compare com.Slack com.microsoft.teams --stars 2
91
+
92
+ # Compare sentiment between app versions
93
+ appstore-reviews version-diff 803453959 --pages 5
94
+ appstore-reviews version-diff 803453959 --old 4.23.0 --new 4.29.149
95
+
96
+ # Show rating trend over time (weekly or monthly)
97
+ appstore-reviews trend 803453959 --pages 5
98
+ appstore-reviews trend 803453959 --period month --stars 2
99
+
100
+ # Export compare/version-diff/trend to JSON or CSV
101
+ appstore-reviews compare 803453959 310633997 --format json > compare.json
102
+ appstore-reviews version-diff 803453959 --format csv > diff.csv
103
+ appstore-reviews trend 803453959 --format csv > trend.csv
104
+ ```
105
+
106
+ ## Agent Integration
107
+
108
+ One command to teach your AI coding agent every command, filter, and workflow:
109
+
110
+ ```bash
111
+ appstore-reviews setup copilot # GitHub Copilot → creates SKILL.md
112
+ appstore-reviews setup claude # Claude Code → creates CLAUDE.md
113
+ appstore-reviews setup cursor # Cursor → creates .cursor/rules/appstore-reviews.md
114
+ appstore-reviews setup windsurf # Windsurf → creates .windsurfrules
115
+ ```
116
+
117
+ Then just ask in natural language:
118
+
119
+ - *"What are the top complaints about Slack this month?"*
120
+ - *"Find crash reports for WhatsApp in the last 30 days"*
121
+ - *"Compare Notion vs Obsidian - what do users hate about each?"*
122
+ - *"What features are German Duolingo users requesting?"*
123
+
124
+ The agent runs the CLI, fetches reviews, and analyzes them directly. No Ollama, no extra setup.
125
+
126
+ Use `--force` to overwrite an existing file, `--append` to add to one.
127
+
128
+ ### Without an agent
129
+
130
+ Use the built-in Ollama analysis, or pipe to any LLM:
131
+
132
+ ```bash
133
+ # Ollama (local, private)
134
+ ollama pull qwen3.5:4b
135
+ appstore-reviews analyze 803453959 --stars 2 --mode summary
136
+ appstore-reviews analyze 803453959 --stars 2 --mode gaps
137
+ appstore-reviews analyze 803453959 --stars 2 --mode bugs --keywords crash,freeze
138
+
139
+ # Or pipe raw output to any tool
140
+ appstore-reviews reviews 803453959 --stars 2 --format text | your-llm "Summarize:"
141
+ ```
142
+
143
+ ## All Options
144
+
145
+ ### Global flags (apply to all commands)
146
+
147
+ | Flag | Description |
148
+ |------|-------------|
149
+ | `--store google` | Use Google Play instead of Apple App Store (default: `apple`) |
150
+ | `--country de` | Store region (default: `us`) |
151
+
152
+ ### `search` - Find an app by name
153
+
154
+ | Flag | Description |
155
+ |------|-------------|
156
+ | `--limit 10` | Max results (default: 5) |
157
+ | `--format json` | Output as JSON instead of table |
158
+ | `--country de` | App Store region (default: `us`) |
159
+
160
+ For Google Play, app IDs are package names (e.g. `com.Slack`). For Apple, they're numeric (e.g. `803453959`).
161
+
162
+ ### `reviews <APP_ID>` - Fetch and filter reviews
163
+
164
+ | Flag | Description |
165
+ |------|-------------|
166
+ | `--stars 2` | Max star rating to include (1-5). `2` = 1-2 stars |
167
+ | `--min-stars 3` | Min star rating (1-5). `--min-stars 3 --stars 3` = only 3★ |
168
+ | `--days 30` | Only reviews from the last N days |
169
+ | `--keywords crash,bug` | Only reviews containing these words (case-insensitive) |
170
+ | `--version 5.0.1` | Only reviews for a specific app version |
171
+ | `--pages 5` | Pages to fetch (1-10, default 3; 10 ≈ 500 reviews) |
172
+ | `--format text` | Output as `text` \| `json` \| `csv` \| `markdown` |
173
+ | `--sort votes` | Sort by: `date` (newest) \| `rating` (lowest) \| `votes` (most helpful) |
174
+ | `--stats` | Show rating distribution |
175
+ | `--country de` | App Store region (default: `us`) |
176
+
177
+ All filters stack with AND logic.
178
+
179
+ ### `analyze <APP_ID>` - LLM analysis via Ollama
180
+
181
+ | Flag | Description |
182
+ |------|-------------|
183
+ | `--mode summary` | Analysis type: `summary` \| `gaps` \| `bugs` |
184
+ | `--model qwen3.5:4b` | Ollama model to use |
185
+ | `--list-models` | Show available Ollama models |
186
+
187
+ Plus all the same filters as `reviews` (`--stars`, `--min-stars`, `--days`, `--keywords`, `--version`, `--pages`, `--sort`, `--stats`, `--country`).
188
+
189
+ ### `compare <APP_ID> <APP_ID> [...]` - Compare multiple apps
190
+
191
+ | Flag | Description |
192
+ |------|-------------|
193
+ | `--stars 2` | Max star rating to include (1-5) |
194
+ | `--min-stars 3` | Min star rating (1-5) |
195
+ | `--days 30` | Only reviews from the last N days |
196
+ | `--keywords crash,bug` | Only reviews containing these words |
197
+ | `--pages 5` | Pages to fetch per app (1-10, default 3) |
198
+ | `--sort votes` | Sort by: `date` \| `rating` \| `votes` |
199
+ | `--country de` | App Store region (default: `us`) |
200
+ | `--format json` | Output format: `text` (default) \| `json` \| `csv` |
201
+
202
+ Outputs: overview table, per-app rating distribution, top complaint categories, top keywords, shared vs unique complaints.
203
+
204
+ ### `version-diff <APP_ID>` - Compare sentiment between versions
205
+
206
+ | Flag | Description |
207
+ |------|-------------|
208
+ | `--old 4.23.0` | Old version to compare (auto-detected if omitted) |
209
+ | `--new 4.29.149` | New version to compare (auto-detected if omitted) |
210
+ | `--stars 2` | Max star rating to include (1-5) |
211
+ | `--min-stars 3` | Min star rating (1-5) |
212
+ | `--days 90` | Only reviews from the last N days |
213
+ | `--keywords crash,bug` | Only reviews containing these words |
214
+ | `--pages 5` | Pages to fetch (1-10, default 5) |
215
+ | `--format json` | Output format: `text` (default) \| `json` \| `csv` |
216
+
217
+ Outputs: version comparison table, rating distributions, complaint category changes (with arrows), new/resolved issues, top keywords per version. Versions are auto-detected from the two most reviewed if not specified.
218
+
219
+ ### `trend <APP_ID>` - Show rating trend over time
220
+
221
+ | Flag | Description |
222
+ |------|-------------|
223
+ | `--period week` | Group by `week` (default) or `month` |
224
+ | `--stars 2` | Max star rating to include (1-5) |
225
+ | `--min-stars 3` | Min star rating (1-5) |
226
+ | `--days 90` | Only reviews from the last N days |
227
+ | `--keywords crash,bug` | Only reviews containing these words |
228
+ | `--pages 5` | Pages to fetch (1-10, default 5) |
229
+ | `--format json` | Output format: `text` (default) \| `json` \| `csv` |
230
+
231
+ Outputs: per-period table with average rating, review count, trend arrows (▲/▼), ASCII sparkline bars, mini star distributions, and overall trend summary.
232
+
233
+ ### `setup <agent>` - Install agent instructions
234
+
235
+ | Argument / Flag | Description |
236
+ |-----------------|-------------|
237
+ | `copilot` | Creates `SKILL.md` for GitHub Copilot |
238
+ | `claude` | Creates `CLAUDE.md` for Claude Code |
239
+ | `cursor` | Creates `.cursor/rules/appstore-reviews.md` |
240
+ | `windsurf` | Creates `.windsurfrules` |
241
+ | `--force` | Overwrite existing file |
242
+ | `--append` | Append to existing file |
243
+
244
+ **Country codes:** `us` (default), `gb`, `de`, `fr`, `jp`, `au`, `ca`, `nl`, `br`, `kr`
245
+
246
+ ## Python API
247
+
248
+ ```python
249
+ from appinsight import get_reviews, get_reviews_df, search
250
+
251
+ # Search
252
+ apps = search("Slack", limit=3)
253
+
254
+ # As dicts (no pandas needed)
255
+ reviews = get_reviews(618783545, stars=2, days=30)
256
+
257
+ # As pandas DataFrame
258
+ df = get_reviews_df(618783545, stars=2, pages=5)
259
+ df.groupby("version")["rating"].mean()
260
+ df[df["content"].str.contains("crash", case=False)]
261
+ # Google Play
262
+ reviews = get_reviews("com.Slack", stars=2, days=30, store="google")
263
+ df = get_reviews_df("com.Slack", stars=2, pages=5, store="google")
264
+ ```
265
+
266
+ Install with pandas: `pip install appstore-review-cli[pandas]`
267
+ Install with Google Play: `pip install appstore-review-cli[google]`
268
+
269
+ ## Good to Know
270
+
271
+ - **Pipe-safe**: Data goes to stdout, progress to stderr.
272
+ - **Review limit**: Apple returns max ~500 reviews per country (10 pages × 50). This is Apple's limit.
273
+ - **Deduplication**: Reviews are automatically deduplicated across pages.
274
+ - **Validation**: `--stars`/`--min-stars` accept 1-5, `--pages` accepts 1-10. Invalid values are rejected.
275
+ - **Google Play search**: The first search result sometimes lacks a package name (library limitation). Use the package name directly if your app doesn't appear (find it in the Google Play URL).
276
+ - **No results?** Filters are too narrow - try fewer keywords, more days, or a higher star ceiling.
277
+
278
+ ## Development
279
+
280
+ ```bash
281
+ git clone https://github.com/vkayatas/appstore-review-cli.git
282
+ cd appstore-review-cli
283
+ uv sync
284
+ uv run pytest
285
+ ```
286
+
287
+ ## Roadmap
288
+
289
+ - [x] Google Play Store support
290
+ - [x] Multi-app comparison command
291
+ - [x] Version diff (sentiment changes between releases)
292
+ - [x] Rating trend over time (weekly/monthly)
293
+ - [x] Export compare/version-diff/trend to JSON/CSV
294
+ - [x] PyPI publish with GitHub Actions CI