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.
- appstore_review_cli-0.1.0/.github/workflows/ci.yml +31 -0
- appstore_review_cli-0.1.0/.github/workflows/publish.yml +30 -0
- appstore_review_cli-0.1.0/.gitignore +17 -0
- appstore_review_cli-0.1.0/CLAUDE.md +179 -0
- appstore_review_cli-0.1.0/LICENSE +21 -0
- appstore_review_cli-0.1.0/PKG-INFO +294 -0
- appstore_review_cli-0.1.0/README.md +264 -0
- appstore_review_cli-0.1.0/SKILL.md +174 -0
- appstore_review_cli-0.1.0/appinsight/__init__.py +8 -0
- appstore_review_cli-0.1.0/appinsight/analyzer.py +142 -0
- appstore_review_cli-0.1.0/appinsight/cli.py +427 -0
- appstore_review_cli-0.1.0/appinsight/compare.py +255 -0
- appstore_review_cli-0.1.0/appinsight/dataframe.py +116 -0
- appstore_review_cli-0.1.0/appinsight/filters.py +86 -0
- appstore_review_cli-0.1.0/appinsight/formatters.py +97 -0
- appstore_review_cli-0.1.0/appinsight/google_play.py +124 -0
- appstore_review_cli-0.1.0/appinsight/instructions/__init__.py +0 -0
- appstore_review_cli-0.1.0/appinsight/instructions/claude.md +179 -0
- appstore_review_cli-0.1.0/appinsight/instructions/copilot.md +174 -0
- appstore_review_cli-0.1.0/appinsight/scraper.py +203 -0
- appstore_review_cli-0.1.0/appinsight/setup.py +82 -0
- appstore_review_cli-0.1.0/appinsight/trend.py +232 -0
- appstore_review_cli-0.1.0/appinsight/version_diff.py +291 -0
- appstore_review_cli-0.1.0/cli.py +6 -0
- appstore_review_cli-0.1.0/docs/MCP_RATING.md +55 -0
- appstore_review_cli-0.1.0/pyproject.toml +64 -0
- appstore_review_cli-0.1.0/tests/__init__.py +0 -0
- appstore_review_cli-0.1.0/tests/test_compare.py +85 -0
- appstore_review_cli-0.1.0/tests/test_export.py +174 -0
- appstore_review_cli-0.1.0/tests/test_filters.py +213 -0
- appstore_review_cli-0.1.0/tests/test_formatters.py +152 -0
- appstore_review_cli-0.1.0/tests/test_google_play.py +249 -0
- appstore_review_cli-0.1.0/tests/test_scraper.py +93 -0
- appstore_review_cli-0.1.0/tests/test_trend.py +129 -0
- 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,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
|
+
[](https://github.com/vkayatas/appstore-review-cli/actions/workflows/ci.yml)
|
|
34
|
+
[](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
|