One static binary
Written in Go. No Ruby, no Node, no Python in your CI image: one file, fast cold start, trivial caching.
gplay is a single static binary for the Google Play Developer API: releases, staged rollouts, store listings, reviews, compliance, and team management, driven from a CI pipeline or a coding agent. JSON output is the API response verbatim, and no Ruby ships with your image: gplay replaces Fastlane supply.
$ brew install PollyGlot/tap/gplay more options ↓
$ gplay releases upload app.aab --track internal \
--release-notes-dir ./whatsnew
versionCode: 421
track: internal
status: completed
userFraction: 1
releaseName: 421
locales: [en-US fr-FR]
$ gplay releases promote --from internal --to beta
$ gplay releases rollout --track production \
--staged 0.10 --confirm Every design decision is documented in public architecture decision records. These are the load-bearing ones.
Written in Go. No Ruby, no Node, no Python in your CI image: one file, fast cold start, trivial caching.
TTY-aware: tables for humans, raw Google Play API JSON in pipes and CI. stdout carries data only; logs go to stderr.
Exit 40/50 mean "retry me", exit 3 names the missing safety flag, the rest fail fast. Retry logic without parsing error text.
Uploads and promotions to production land as drafts. Reaching real users always takes an explicit --complete or --staged, plus --confirm.
Pull listings and images into a fastlane-compatible tree, validate offline, diff with --dry-run, apply additively. Deletion is opt-in.
Dry-runs announce the safety flags a write needs, the API schema is introspectable offline, and the docs ship as llms.txt.
131 commands across 24 namespaces. Every page of the
CLI reference is generated from the binary's own --help,
so docs never drift from the tool.
gplay apps Manage Android packages registered with gplay
gplay appstore [experimental] Alternative app store operations (catalog export, hosted app review)
gplay auth Manage gplay credentials
gplay compliance Manage an app's regulatory declarations (Data Safety, ...)
gplay customapps [experimental] Create managed Google Play private apps (organisation-scoped)
gplay device-tiers [experimental] Manage device tier configs (device-targeting for tiered delivery)
gplay edits Manage explicit Edit transactions (begin, validate, commit, discard, status)
gplay exit-codes Explain gplay's semantic exit codes
gplay games [experimental] Configure a game's Play Games Services resources (achievements, leaderboards)
gplay iap [experimental] Pull and apply the app's one-time-product catalog as files (declarative)
gplay install-skills Install the gplay companion agent skills (requires git)
gplay metadata Manage Store front Listings (per-locale title/description/video)
gplay orders [experimental] Look up, refund and reconcile Google Play orders (admin commerce surface)
gplay recovery [experimental] Manage app recovery actions (incident-response remediation for a bad release)
gplay releases Manage app releases (upload, promote, rollout)
gplay reports [experimental] Read the monthly Bulk reports (installs, ...) from the Reporting bucket
gplay reviews Read and reply to user reviews
gplay schema [experimental] Introspect the Android Publisher API surface offline
gplay signing [experimental] Manage Play App Signing with a self-hosted Cloud KMS key (enterprise key custody)
gplay subscriptions [experimental] Pull and apply the app's subscription catalog as files (declarative)
gplay team Manage the Developer account's members and permissions (users, grants)
gplay testers Manage the Google Groups authorized to test a track
gplay tracks Inspect and create release tracks (standard and custom closed)
gplay vitals Read post-launch quality signals (crashes, ANRs, …) from Play vitals
Nothing in gplay assumes a human at the keyboard. JSON output mirrors the Google
Play API schemas verbatim. A refused write names the exact safety flag it needs
(exit code 3) instead of dead-ending. --dry-run
previews any mutation without HTTP, and on team writes it returns a
requires array announcing the gates ahead.
The docs you're reading ship as llms.txt and llms-full.txt, including the full generated command reference. The agent guide spells out the whole contract.
Ready-made skills
$ gplay install-skills
Seventeen skills, one per workflow plus a conventions foundation, each documenting the safe command sequence it covers, for Claude Code and compatible tools. Fetched with git from a pinned commit, so no package runner and no Node. Browse the roster.
One binary, four ways to get it. Then the quickstart takes you from login to a release upload in five commands.
$ brew install PollyGlot/tap/gplay macOS and Linux.
$ curl -fsSL https://gplay.sh/install | sh Detects your OS and architecture; ideal for CI images.
$ go install github.com/PollyGlot/google-play-cli/cmd/gplay@latest Builds from source with your Go toolchain.
Pre-built archives for Linux, macOS, and Windows, with checksums and signatures.
gplay is an open-source command-line interface for the Google Play Developer API, shipped as a single static Go binary. It uploads and promotes releases, runs staged rollouts, manages tracks and testers, syncs store listings and images, replies to reviews, pushes Data Safety declarations, and administers Play Console users and permissions.
No Ruby runtime: gplay is one static binary, so CI images stay small and cold starts stay fast. Output is machine-stable (raw API JSON in pipes), exit codes are semantic so scripts know what is retryable, and production uploads default to draft releases instead of publishing to 100% of users. An existing fastlane metadata tree drops in unchanged.
Yes, that is its home turf. Credentials inject via the GPLAY_SERVICE_ACCOUNT environment variable (file path or inline JSON), CI=true switches output to JSON automatically, no command ever prompts interactively, and exit codes 40/50 mark exactly the failures worth retrying.
Yes, by design. JSON output mirrors the Google Play API schemas, refusals are machine-resolvable (exit 3 names the missing acknowledgment flag), --dry-run previews any write without HTTP, gplay schema answers API-shape questions offline, and this site publishes llms.txt and llms-full.txt. A companion repo ships ready-made agent skills, installed with gplay install-skills from a commit pinned inside the binary.
Yes, open source under the MIT license. The source, issue tracker, and architecture decision records are public on GitHub.
No. gplay is an independent open-source project that uses the public Google Play Developer API. It is not endorsed by, affiliated with, or sponsored by Google LLC. "Google Play" is a trademark of Google LLC.