storepulse_

open source · cli · built for expo & react native teams

Which version is LIVE?
Which is stuck IN REVIEW?
One command. Both stores.

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.

~/work — zsh
$ 

  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

Built to be trusted with your store keys

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

Everything the two consoles show — in one table

normalized model
App Store states and Play tracks translated into one vocabulary: channels (production / beta / internal) × states (live, in-review, rollout, rejected…).
rollout tracking
iOS phased release day and Android staged rollout shown as a plain percentage — 2.4.1 50% means half your users have it.
review visibility
See 2.4.1 LIVE · 2.5.0 REVIEW side by side — the in-between moment both consoles make you dig for.
resilient board
One expired credential shows an error on its own row — it never blanks the rest of the board.
demo mode
npx storepulse demo renders the full board with sample data — evaluate the tool before creating a single API key.
web dashboard
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.
Android install catalog
The dedicated Installs page shows Production and Development together. Add a fixed 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.
expo-friendly
Works with any iOS/Android app, but built by an Expo team for Expo teams — set an 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.
CI policy gate
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

From zero to your real board in ~15 minutes

1

Try the demo — no credentials needed

$ 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.

2

List your apps, add your keys

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
3

Run it

$ npx storepulse

Your real board appears. Full step-by-step tutorial →

roadmap

Where this is going

core + connectors cli with demo mode eas connector web dashboard npx storepulse english / korean cli output snapshot diff ci policy gate Android install catalog official github action generic webhook events local watch mode