play-console-cli
Health Pass
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Community trust — 42 GitHub stars
Code Fail
- rm -rf — Recursive force deletion command in install.sh
Permissions Pass
- Permissions — No dangerous permissions requested
This is a fast, scriptable command-line interface written in Go that allows developers to automate Google Play Console workflows, such as managing app releases, store listings, and monetization directly from the terminal.
Security Assessment
Because the tool interacts with the Google Play Console API, it inherently requires handling sensitive OAuth2 credentials and making external network requests. No hardcoded secrets were found during the scan, and it does not request dangerous system permissions. However, the automated audit flagged a recursive force deletion command (`rm -rf`) inside the `install.sh` script. While this is a common practice in many shell installers to clean up temporary directories, it poses a minor code-execution risk and should be quickly verified by the user before running the installation. Overall risk is rated as Medium due to the sensitive nature of the developer account data it handles.
Quality Assessment
The project exhibits strong health indicators. It is licensed under the permissive MIT license, ensuring clear open-source usage rights. Maintained actively, the repository received a push as recently as today. It has garnered 42 GitHub stars, showing a respectable and growing level of community trust and adoption for a niche developer tool. The README is comprehensive and clearly documents the tool's capabilities.
Verdict
Use with caution — the tool is actively maintained and well-documented, but you should manually review the `install.sh` script prior to execution to ensure the deletion commands are safe.
Fast CLI for Google Play Console, google play console cli
Google Play Console CLI (gplay)
A fast, lightweight, and scriptable CLI for Google Play Console. Automate your Android app workflows from your terminal.
Why gplay?
Stop clicking through Play Console. Ship your Android apps with a single command.
gplay vs Fastlane vs Raw API
| Capability | gplay | Fastlane (supply) |
Raw API + Agent |
|---|---|---|---|
| Setup | ✅ Single binary, zero deps | ⚠️ Ruby + gems + bundler | ❌ OAuth2 + HTTP + custom code |
| Agent-friendly output | ✅ JSON by default (saves tokens) | ❌ Human-oriented, colorized | ⚠️ Raw HTTP, must parse |
| No interactive prompts | ✅ --confirm flags, never blocks |
❌ Interactive by default | ✅ N/A |
| Dry-run mode | ✅ Built-in --dry-run |
❌ No | ❌ Must build yourself |
| Releases & tracks | ✅ Upload, promote, staged rollout | ⚠️ Upload only | ⚠️ Full (manual implementation) |
| Store listings & screenshots | ✅ Full CRUD + sync + validation | ⚠️ Metadata upload only | ⚠️ Full (manual implementation) |
| Monetization | ✅ Subscriptions, plans, offers, IAPs | ❌ No | ⚠️ Full (manual implementation) |
| Purchase verification | ✅ Built-in | ❌ No | ⚠️ Full (manual implementation) |
| Vitals (crashes, ANRs, perf) | ✅ Built-in | ❌ No | ⚠️ Separate Reporting API |
| Review management | ✅ Read + reply | ❌ No | ⚠️ Full (manual implementation) |
| Financial & stats reports | ✅ GCS download built-in | ❌ No | ❌ Not available via API |
| User & permission management | ✅ Built-in | ❌ No | ⚠️ Full (manual implementation) |
| Fastlane migration | ✅ gplay migrate fastlane |
➖ N/A | ❌ No |
| CI/CD ready | ✅ Works everywhere, no runtime | ⚠️ Needs Ruby in CI | ⚠️ Custom per-pipeline |
| Retries & timeouts | ✅ Configurable (GPLAY_MAX_RETRIES) |
⚠️ Basic | ❌ Must build yourself |
| Self-documenting | ✅ --help on every command |
⚠️ fastlane actions |
❌ Read API docs (1000s of tokens) |
| Startup time | ✅ Instant (compiled Go) | ❌ Slow (Ruby + gem loading) | ⚠️ Depends |
| Self-update | ✅ gplay update |
⚠️ gem update fastlane |
➖ N/A |
| ✅ 18 / 18 | ❌ 8 wins / 18 | ❌ 2 wins / 18 |
Publish & Release
- One-command releases: upload, configure track, and go live in a single step
- Staged rollouts with pause, resume, and percentage control
- Promote builds between tracks (internal → beta → production)
- Generate release notes automatically from your git history
- Upload bundles (AAB) or APKs, manage edits, and commit changes
Store Presence
- Update store listings, screenshots, and app details across all locales
- Manage images: phone screenshots, tablet screenshots, feature graphics, and more
- Sync metadata with your local directory — export, import, and diff
- Migrate from Fastlane metadata format with a single command
- Validate listings, screenshots, and bundles before you submit
- Manage data safety declarations
Monetization
- In-app products: create, update, and batch-manage managed products
- One-time products for single purchases
- Subscriptions with base plans and promotional offers
- Price conversion across regions
- External transaction reporting (EU compliance)
Purchases & Orders
- Verify in-app purchases and subscription tokens server-side
- Look up and refund orders
- Acknowledge purchases programmatically
Monitor Your App
- Crash clusters and detailed crash reports
- ANR and error issue tracking
- Performance metrics: startup time, rendering jank, and battery drain
- Read and reply to user reviews without opening a browser
Testing & Distribution
- Manage testers for closed testing tracks
- Internal app sharing for quick testing without review
- Check country availability for your tracks
- Download device-specific APKs generated from your app bundle
- Upload deobfuscation files (ProGuard/R8 mapping) for readable crash reports
- System APK creation and expansion file (OBB) management
- App recovery actions
Team & Permissions
- Manage developer account users: invite, update roles, or remove
- Fine-grained per-app permission grants
- Multiple profiles for different accounts or apps
Reports & Notifications
- Download financial reports (earnings, sales, payouts) from Google Cloud Storage
- Download statistics reports (installs, ratings, crashes, store performance)
- Send release notifications to Slack, Discord, or any webhook
Built for Automation
- Works in any CI/CD pipeline — GitHub Actions, GitLab CI, Jenkins, and more
- JSON output by default — pipe to
jq, scripts, or dashboards - Table and Markdown output for human-friendly views
- Dry-run mode to preview changes before they go live
- Shell completions for Bash, Zsh, Fish, and PowerShell
- Self-updating: checks for new versions and upgrades in place
- Instant startup: single binary, no dependencies, no runtime
- Project initialization and auth diagnostics (
init,auth doctor) - Auto-generated command documentation (
docs generate) - Device tier configuration management
Table of Contents
- Why gplay?
- Quick Start
- Commands
- Output Formats
- Design Philosophy
- Installation
- Authentication
- Configuration
- CI/CD Integration
- Security
- Contributing
- Agent Skills
- License
Quick Start
Install
# Via Homebrew (recommended)
brew tap tamtom/tap
brew install tamtom/tap/gplay
# Install script (macOS/Linux)
curl -fsSL https://raw.githubusercontent.com/tamtom/play-console-cli/main/install.sh | bash
# Build from source
git clone https://github.com/tamtom/play-console-cli.git
cd play-console-cli
make build
./gplay --help
Updates
gplay checks for updates on startup and shows upgrade hints. Disable with --no-update or GPLAY_NO_UPDATE=1.
Authenticate (Service Account)
Step 1: Create a Google Cloud Project
- Go to Google Cloud Console
- Create a new project or select an existing one
- Note your project ID
Step 2: Enable the API
- Go to APIs & Services > Library
- Search for "Google Play Android Developer API"
- Click Enable
Step 3: Create a Service Account
- Go to IAM & Admin > Service Accounts
- Click Create Service Account
- Give it a name (e.g., "gplay-cli")
- Click Create and Continue, then Done
- Click on the created service account
- Go to Keys > Add Key > Create new key > JSON
- Save the downloaded JSON file securely
Step 4: Grant Access in Play Console
- Go to Google Play Console
- Go to Users and permissions > Invite new users
- Enter the service account email (from the JSON file, looks like
[email protected]) - Set permissions (Admin or specific app access)
- Click Invite user
Step 5: Login with gplay
gplay auth login --service-account /path/to/service-account.json
# Verify it works
gplay auth doctor
Commands
Scripting Tips
- JSON output is default for easy parsing; add
--prettywhen debugging - Use
--paginateto automatically fetch all pages - Sort with
--sort(prefix-for descending):--sort -uploadedDate - Use
--limit+--nextfor manual pagination control
Publishing
# Edit lifecycle
gplay edits create --package com.example.app
gplay edits list --package com.example.app
gplay edits validate --package com.example.app --edit <id>
gplay edits commit --package com.example.app --edit <id>
# Upload artifacts
gplay bundles upload --package com.example.app --edit <id> --file app.aab
gplay apks upload --package com.example.app --edit <id> --file app.apk
# Manage tracks
gplay tracks list --package com.example.app --edit <id>
gplay tracks get --package com.example.app --edit <id> --track production
gplay tracks update --package com.example.app --edit <id> --track internal --json @release.json
High-Level Workflow
# One-command release (creates edit, uploads, updates track, commits)
gplay release --package com.example.app --track internal --bundle app.aab
# With release notes and staged rollout
gplay release --package com.example.app --track production --bundle app.aab \
--release-notes @notes.json --rollout 10
# Promote between tracks
gplay promote --package com.example.app --from internal --to beta
# Manage staged rollout
gplay rollout update --package com.example.app --track production --rollout 50
gplay rollout halt --package com.example.app --track production
gplay rollout resume --package com.example.app --track production
gplay rollout complete --package com.example.app --track production
# Release with metadata and screenshots
gplay release --package com.example.app --track production --bundle app.aab \
--listings-dir ./metadata --screenshots-dir ./screenshots
# Dry-run any command (intercepts write operations)
gplay --dry-run release --package com.example.app --track internal --bundle app.aab
App Management
# List apps accessible by your service account
gplay apps list
# Initialize project configuration
gplay init
gplay init --package com.example.app --service-account /path/to/sa.json
Vitals & Quality
# Crash reports
gplay vitals crashes clusters --package com.example.app
gplay vitals crashes reports --package com.example.app
# Performance metrics
gplay vitals performance startup --package com.example.app
gplay vitals performance rendering --package com.example.app
gplay vitals performance battery --package com.example.app
# Error tracking
gplay vitals errors issues --package com.example.app
gplay vitals errors reports --package com.example.app
User & Permission Management
# Manage developer account users
gplay users list --developer <id>
gplay users create --developer <id> --email [email protected] --json @permissions.json
gplay users delete --developer <id> --email [email protected] --confirm
# Manage per-app grants
gplay grants create --developer <id> --email [email protected] --package com.example.app --json @grant.json
gplay grants update --developer <id> --email [email protected] --package com.example.app --json @grant.json
gplay grants delete --developer <id> --email [email protected] --package com.example.app --confirm
Reports
Reports are stored as CSV/ZIP files in Google Cloud Storage buckets (pubsite_prod_rev_<developer_id>). The service account must have access to the GCS bucket (granted automatically when added to Play Console).
Important: The
--developerID for reports is not the developer ID in your Play Console URL. To find the correct ID, go to Play Console > Download reports > Copy Cloud Storage URI. The URI looks likegs://pubsite_prod_rev_XXXX/— the number afterpubsite_prod_rev_is your developer ID.
# Financial reports (earnings, sales, payouts)
gplay reports financial list --developer <id>
gplay reports financial list --developer <id> --type earnings --from 2026-01 --to 2026-06
gplay reports financial download --developer <id> --from 2026-01 --type earnings --dir ./reports
# Statistics reports (installs, ratings, crashes, store_performance, subscriptions)
gplay reports stats list --developer <id>
gplay reports stats list --developer <id> --package com.example.app --type installs
gplay reports stats download --developer <id> --package com.example.app --from 2026-01 --type installs --dir ./reports
Notifications
# Send webhook notifications (Slack, Discord, generic)
gplay notify send --webhook-url https://hooks.slack.com/... --message "Deploy complete" --format slack
gplay notify send --webhook-url https://discord.com/... --message "New release" --format discord
Store Listing
# Listings
gplay listings list --package com.example.app --edit <id>
gplay listings get --package com.example.app --edit <id> --locale en-US
gplay listings update --package com.example.app --edit <id> --locale en-US --json @listing.json
# Images
gplay images list --package com.example.app --edit <id> --locale en-US --type phoneScreenshots
gplay images upload --package com.example.app --edit <id> --locale en-US --type phoneScreenshots --file screenshot.png
# App details
gplay details get --package com.example.app --edit <id>
gplay details update --package com.example.app --edit <id> --contact-email [email protected]
Monetization
# In-app products
gplay iap list --package com.example.app
gplay iap create --package com.example.app --sku premium_upgrade --json @product.json
gplay iap update --package com.example.app --sku premium_upgrade --json @product.json
gplay iap batch-update --package com.example.app --json @products.json
# Subscriptions
gplay subscriptions list --package com.example.app
gplay subscriptions create --package com.example.app --json @subscription.json
# Base plans
gplay baseplans activate --package com.example.app --product-id sub_premium --base-plan monthly
gplay baseplans deactivate --package com.example.app --product-id sub_premium --base-plan monthly
# Offers
gplay offers list --package com.example.app --product-id sub_premium --base-plan monthly
gplay offers create --package com.example.app --product-id sub_premium --base-plan monthly --json @offer.json
# Price conversion
gplay pricing convert --package com.example.app --json @price.json
Purchase Management
# Verify purchases
gplay purchases products get --package com.example.app --product-id premium --token <token>
gplay purchases products acknowledge --package com.example.app --product-id premium --token <token>
gplay purchases subscriptions get --package com.example.app --token <token>
# Orders
gplay orders get --package com.example.app --order-id <id>
gplay orders refund --package com.example.app --order-id <id> --revoke
# External transactions (EU compliance)
gplay external-transactions create --package com.example.app --json @transaction.json
Reviews
# List and filter reviews
gplay reviews list --package com.example.app
gplay reviews list --package com.example.app --paginate
# Reply to reviews
gplay reviews get --package com.example.app --review-id <id>
gplay reviews reply --package com.example.app --review-id <id> --text "Thank you!"
Testing
# Manage testers
gplay testers list --package com.example.app --edit <id> --track internal
gplay testers update --package com.example.app --edit <id> --track internal --emails [email protected]
# Internal app sharing (quick sharing without review)
gplay internal-sharing upload-bundle --package com.example.app --file app.aab
gplay internal-sharing upload-apk --package com.example.app --file app.apk
FastLane Integration
# Export metadata to FastLane format
gplay sync export-listings --package com.example.app --dir ./fastlane/metadata/android
# Import metadata from FastLane format
gplay sync import-listings --package com.example.app --dir ./fastlane/metadata/android
# Compare local metadata with Play Store
gplay sync diff-listings --package com.example.app --dir ./fastlane/metadata/android
# Validate before upload
gplay validate listing --dir ./fastlane/metadata/android --locale en-US
gplay validate screenshots --dir ./fastlane/metadata/android/en-US/images
gplay validate bundle --file app.aab
Shell Completion
# Bash
gplay completion bash > /etc/bash_completion.d/gplay
# Zsh
gplay completion zsh > "${fpath[1]}/_gplay"
# Fish
gplay completion fish > ~/.config/fish/completions/gplay.fish
# PowerShell
gplay completion powershell >> $PROFILE
Output Formats
| Format | Flag | Use Case |
|---|---|---|
| JSON (minified) | default | Scripting, automation |
| JSON (pretty) | --pretty |
Debugging |
| Table | --output table |
Terminal display |
| Markdown | --output markdown |
Documentation |
# Parse with jq
gplay tracks list --package com.example.app | jq '.tracks[].track'
# Human-readable
gplay reviews list --package com.example.app --output table
Design Philosophy
Explicit Over Cryptic
# Good - self-documenting
gplay reviews list --package com.example.app --output table
# Avoid - cryptic flags (not supported)
# gplay reviews -p com.example.app -o table
JSON-First Output
All commands output minified JSON by default for easy parsing:
gplay tracks list --package com.example.app | jq '.tracks[] | select(.track == "production")'
No Interactive Prompts
Everything is flag-based for automation:
# Non-interactive (CI/CD safe)
gplay edits delete --package com.example.app --edit <id> --confirm
Installation
Homebrew (macOS)
brew tap tamtom/tap
brew install tamtom/tap/gplay
Install Script (macOS/Linux)
curl -fsSL https://raw.githubusercontent.com/tamtom/play-console-cli/main/install.sh | bash
Specify version:
GPLAY_VERSION=1.0.0 curl -fsSL https://raw.githubusercontent.com/tamtom/play-console-cli/main/install.sh | bash
From Source
git clone https://github.com/tamtom/play-console-cli.git
cd play-console-cli
make build
make install # Installs to /usr/local/bin
Authentication
Service Account Setup (Required)
Service accounts are required for the Google Play Android Developer API.
1. Create Google Cloud Project & Enable API
Google Cloud Console → Create Project → APIs & Services → Library
→ Search "Google Play Android Developer API" → Enable
2. Create Service Account & Download Key
IAM & Admin → Service Accounts → Create Service Account
→ Name it (e.g., "gplay-cli") → Create → Done
→ Click the account → Keys → Add Key → Create new key → JSON
→ Save the JSON file securely (never commit to git!)
3. Grant Access in Play Console
Play Console → Users and permissions → Invite new users
→ Paste service account email (from JSON: "client_email" field)
→ Set permissions (Admin, or per-app access)
→ Invite user
4. Configure gplay
# Option A: Login command (saves to profile)
gplay auth login --service-account /path/to/service-account.json
# Option B: Environment variable
export GPLAY_SERVICE_ACCOUNT=/path/to/service-account.json
# Verify setup
gplay auth doctor
Environment Variables
| Variable | Description |
|---|---|
GPLAY_SERVICE_ACCOUNT |
Path to service account JSON |
GPLAY_PACKAGE |
Default package name |
GPLAY_PROFILE |
Active profile name |
GPLAY_TIMEOUT |
Request timeout (e.g., 90s, 2m) |
GPLAY_UPLOAD_TIMEOUT |
Upload timeout (e.g., 5m, 10m) |
GPLAY_NO_UPDATE |
Disable update checks (set to 1) |
GPLAY_DEBUG |
Enable debug logging (1 or api) |
GPLAY_MAX_RETRIES |
Max retries for failed requests |
GPLAY_RETRY_DELAY |
Base delay between retries |
GPLAY_DEFAULT_OUTPUT |
Default output format (json, table, markdown) |
Configuration
Config File
Global: ~/.gplay/config.yaml
Local (takes precedence): ./.gplay/config.yaml
default_package: com.example.app
timeout: 120s
upload_timeout: 5m
max_retries: 3
debug: false
Profiles
# Add profiles for different accounts/apps
gplay auth login --profile work --service-account /path/to/work-sa.json
gplay auth login --profile personal --service-account /path/to/personal-sa.json
# Switch default profile
gplay auth switch --profile work
# Check current status
gplay auth status
# Use specific profile for a command
GPLAY_PROFILE=personal gplay tracks list --package com.example.app
CI/CD Integration
GitHub Actions
name: Deploy to Play Store
on:
push:
tags:
- 'v*'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up gplay
run: |
curl -fsSL https://raw.githubusercontent.com/tamtom/play-console-cli/main/install.sh | bash
echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Build app
run: ./gradlew bundleRelease
- name: Deploy to internal track
env:
GPLAY_SERVICE_ACCOUNT: ${{ secrets.PLAY_SERVICE_ACCOUNT }}
run: |
gplay release \
--package com.example.app \
--track internal \
--bundle app/build/outputs/bundle/release/app-release.aab
GitLab CI
deploy:
stage: deploy
image: ubuntu:latest
before_script:
- curl -fsSL https://raw.githubusercontent.com/tamtom/play-console-cli/main/install.sh | bash
- export PATH="$HOME/.local/bin:$PATH"
script:
- gplay release --package $PACKAGE_NAME --track internal --bundle app.aab
variables:
GPLAY_SERVICE_ACCOUNT: $PLAY_SERVICE_ACCOUNT
Security
- Never commit service account keys to version control
- Use environment variables or secrets management in CI/CD
- Limit service account permissions to only what's needed
- Rotate keys regularly
- Use separate service accounts for different environments
Credentials are stored in config with file path reference only (not the key content).
How to test in <10 minutes
make tools # installs gofumpt + golangci-lint
make format
make lint
make test
make build
./gplay --help
Contributing
Contributions are welcome! Please read CONTRIBUTING.md for details.
Documentation
- Agents.md - Guidelines for AI agents (CLI usage, structure, patterns)
- CONTRIBUTING.md - Contribution guidelines
Agent Skills
Use gplay with AI coding agents for assisted Android publishing workflows. Compatible with any agent that supports the Agent Skills format.
Install Skills
npx skills add tamtom/gplay-cli-skills
Available Skills
| Skill | Description |
|---|---|
gplay-cli-usage |
Guidance for running gplay commands (flags, pagination, output, auth) |
gplay-release-flow |
End-to-end release workflows for internal, beta, and production tracks |
gplay-gradle-build |
Build, sign, and package Android apps with Gradle before uploading |
gplay-metadata-sync |
Metadata and localization sync (including FastLane format) |
gplay-rollout-management |
Staged rollout orchestration and monitoring |
gplay-review-management |
Review monitoring, filtering, and automated responses |
gplay-iap-setup |
In-app products, subscriptions, base plans, and offers |
gplay-purchase-verification |
Server-side purchase verification |
gplay-testers-orchestration |
Beta testing groups and tester management |
gplay-signing-setup |
Android app signing, keystores, and Play App Signing |
gplay-vitals-monitoring |
App vitals monitoring for crashes, errors, and performance |
gplay-user-management |
Developer account user and permission grant management |
gplay-migrate-fastlane |
Migration from Fastlane metadata to gplay format |
gplay-reports-download |
Financial and statistics report listing/downloading from GCS |
Skills repository: github.com/tamtom/gplay-cli-skills
License
MIT License - see LICENSE for details.
Built with Go and the ffcli framework
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found