A small read-only CLI for App Store review digests. It fetches or loads reviews, summarizes what changed in the selected window, flags urgent unanswered reviews, reports public-response coverage, groups recurring themes, and writes Markdown or JSON reports.
It is built for solo iOS and macOS developers who want something useful in a few minutes without a dashboard, database, scheduler, or reply-posting workflow.
npm install
npm run digest -- --fixture examples/reviews.jsonThe demo command writes reports/latest.md. The reports/ directory is ignored by git.
Write JSON instead:
npm run digest -- --fixture examples/reviews.json --json --out reports/latest.jsonFilter the report:
npm run digest -- --fixture examples/reviews.json --since 7d --territory US --min-rating 1Set these environment variables, or put them in a local .env file:
APP_STORE_CONNECT_KEY_ID=ABC123DEFG
APP_STORE_CONNECT_ISSUER_ID=00000000-0000-0000-0000-000000000000
APP_STORE_CONNECT_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nYOUR_PRIVATE_KEY_CONTENT\n-----END PRIVATE KEY-----"Then run:
npm run digest -- --app-id <APP_ID>The CLI reads customer reviews from App Store Connect and includes public response metadata when Apple returns it. It does not create, update, submit, publish, or delete review responses.
Apple's current setup flow is documented in:
- https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api
- https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api
Short version:
- Sign in to App Store Connect.
- Open Users and Access.
- Select the Integrations tab.
- Select App Store Connect API.
- Generate a Team Key or Individual Key with a role that can read app review data.
- Copy the key ID and issuer ID.
- Download the
.p8private key immediately. Apple only lets you download it once. - Store the key outside git, such as in a local
.envfile.
npm run digest -- --fixture examples/reviews.json
npm run digest -- --app-id <APP_ID>
npm run digest -- --fixture examples/reviews.json --json
npm run digest -- --fixture examples/reviews.json --out reports/custom.mdOptions:
--fixture <path>loads local review JSON without credentials.--app-id <id>fetches reviews from App Store Connect.--since <window>accepts values like7d,24h,2w, or an ISO date.--min-rating <1-5>keeps reviews with at least that rating.--territory <code>keeps one territory, such asUS.--jsonwrites a JSON report instead of Markdown.--out <path>chooses the output path. The default isreports/latest.mdorreports/latest.json.
Each Markdown report includes:
- Executive summary.
- New review count for the selected report window.
- Average rating and rating distribution.
- Worst recent reviews.
- Reviews needing attention.
- Unanswered review count and public-response coverage.
- Common themes with example snippets.
- Suggested next actions.
- Local-only draft response suggestions, clearly marked as drafts.
Draft suggestions are local notes only. The tool has no public reply-posting command.
Fixture mode accepts either:
- An object with a
reviewsarray. - A plain JSON array of reviews.
- An App Store Connect-style payload with
dataand optionalincludedresponse resources.
Minimal review shape:
{
"id": "review-001",
"rating": 1,
"title": "Crashes after update",
"body": "The app freezes on launch.",
"reviewerNickname": "ExampleReviewer",
"territory": "US",
"createdDate": "2026-07-01T15:30:00Z",
"response": null
}npm install
npm test
npm run build
npm run digest -- --fixture examples/reviews.json --out reports/latest.md
npm run digest -- --fixture examples/reviews.json --json --out reports/latest.json- Read-only against App Store Connect.
- No dashboard.
- No database.
- No scheduled cloud function.
- No email or messaging integration.
- No public reply posting.
- Generated reports stay in
reports/and are ignored by git.