open source · cli · built for expo & react native teams
storepulse pulls release status for every iOS & Android app you manage — versions, review states, rollout percentages, test tracks — into a single terminal board. Read-only by design. Your store credentials never leave your machine.
$ storepulse · one board, both stores APP OS PRODUCTION BETA / TESTFLIGHT INTERNAL ───────────────────────────────────────────────────────────────────────────────────────────── Aurora [prod] iOS 2.4.1 LIVE · 2.5.0 REVIEW 2.5.0 LIVE (108) — Android 2.4.1 50% (241) 2.5.0 LIVE (250) 2.5.1 draft (251) Aurora Dev [dev] iOS — 2.6.0 LIVE (12) — Android — — 2.6.0 LIVE (12) Borealis [prod] iOS 1.9.2 LIVE · 1.9.3 REJECTED 1.9.3 LIVE (87) — Android 1.9.2 LIVE (192) 1.10.0 LIVE (200) —
why
Read-only by design
storepulse never submits, promotes, or halts anything. It asks both stores one question — "what state are my releases in?" — and renders the answer. Nothing to break, nothing to fear.
Credentials stay local
Calls go straight from your machine to Apple and Google. No server,
no account, no telemetry. Secrets live in your .env,
which is git-ignored from day one.
A library first
The core is a credential-injected library; the CLI and the web dashboard are just its first surfaces. Notifiers are next — same engine, more screens. Add your own source by implementing two methods.
features
production / beta / internal)
× states (live, in-review, rollout, rejected…).
2.4.1 50% means half your users have it.
2.4.1 LIVE · 2.5.0 REVIEW side by side — the
in-between moment both consoles make you dig for.
npx storepulse demo renders the full board with sample
data — evaluate the tool before creating a single API key.
storepulse serve opens an auto-refreshing board in your
browser, bound to 127.0.0.1 by default. Optional groups
appear one at a time; the selector stays hidden only when every
target is ungrouped.
Each app card separates iOS and Android, puts the latest bundle next
to its delivery channels, and expands into release notes, dates, and
TestFlight expiry. OS chips filter the platform rows.
storepulse snapshot exports it as JSON.
latestTesterUrl or exact,
provider-returned installLinks by versionCode;
storepulse never guesses a download URL, and warns before older
builds that may require uninstalling the current app.
EAS_TOKEN and a per-app
easProjectId, and every store version links back to
the EAS build that produced it: commit, build profile, submission
status.
storepulse check --fail-on rejected,halted turns store
states into a CI decision. Exit codes distinguish a clean run,
policy violations, and collection errors; --format json
is ready for automation.
quick start
$ npx storepulse demo
No clone, no install — Node.js ≥ 20.12 is all it takes. Prefer a
browser? npx storepulse serve --demo opens the same
board at 127.0.0.1:4780.
Apps go in storepulse.config.json; secrets go in
.env (an App Store Connect API key + a Play service
account — both are five-minute, one-time setups).
$ npx storepulse init # scaffolds both files — then fill them in
roadmap