No browser. No clicking. Just ship.
gpc bundles upload --file app.aab --track productionInstall Β· Quick Start Β· Commands Β· CI/CD
| π€ The Old Way | π The GPC Way |
|---|---|
| Open browser, navigate menus, wait... | gpc bundles upload --track internal |
| Copy-paste release notes manually | gpc listings sync --dir ./metadata/ |
| Check reviews one by one | gpc reviews list --min-rating 1 | jq |
| Complex CI/CD setup | Single binary + env vars |
| "Is it uploaded yet?" | Instant feedback |
Inspired by App Store Connect CLI β the same philosophy, now for Android.
# Homebrew (recommended)
brew tap AndroidPoet/tap && brew install playconsole-cli
# Install script (Linux/macOS)
curl -fsSL https://raw.githubusercontent.com/AndroidPoet/playconsole-cli/main/install.sh | bash
# Build from source
git clone https://github.com/AndroidPoet/playconsole-cli.git
cd playconsole-cli && make buildAfter install, you can use either playconsole-cli or the shorter alias gpc.
1. Create a service account (Google Cloud Console)
mkdir -p ~/.config/gpc
mv ~/Downloads/your-key.json ~/.config/gpc/service-account.json
chmod 600 ~/.config/gpc/service-account.json2. Enable the API β Enable Google Play Android Developer API
3. Grant access in Play Console API Settings
4. Configure & verify
gpc auth login --credentials ~/.config/gpc/service-account.json
gpc apps list # See your apps5. Deploy! π
gpc bundles upload --file app.aab --track internal
gpc tracks promote --from internal --to production --rollout 1030 command groups, 80+ subcommands. Full reference β
gpc bundles upload --file app.aab --track internal # Upload
gpc tracks list # List tracks
gpc tracks promote --from internal --to beta # Promote
gpc tracks update --track production --rollout 50 # Staged rollout
gpc tracks halt --track production # Emergency halt
gpc deobfuscation upload --version-code 42 --file mapping.txt # Crash symbolicationgpc listings sync --dir ./metadata/ # Sync all listings
gpc listings update --locale en-US --title "My App" # Update listing
gpc images sync --dir ./screenshots/ # Sync screenshots
gpc availability list --track production # Country targetinggpc reviews list --min-rating 1 --max-rating 2 # Negative reviews
gpc reviews reply --review-id "gp:..." --text "Thanks!"
gpc reviews list | jq '[.[] | select(.rating == 5)]' # Filter with jqgpc products list # In-app products
gpc subscriptions list # Subscriptions
gpc offers list --product-id sub_id --base-plan monthly # Subscription offers
gpc purchases verify --token "..." --product-id premium
gpc orders get --order-id GPA.1234 # Order details
gpc orders refund --order-id GPA.1234 --confirm # Issue refund
gpc external-transactions create --file tx.json # Alternative billinggpc vitals overview # Health summary
gpc vitals crashes --days 7 # Crash rate
gpc vitals anr --days 28 # ANR rate
gpc vitals slow-start --days 28 # Slow startup rate
gpc vitals slow-rendering --days 28 # Frame rendering
gpc vitals wakeups --days 28 # Battery: wakeup alarms
gpc vitals wakelocks --days 28 # Battery: stuck wakelocks
gpc vitals memory --days 28 # Low memory killer rate
gpc vitals errors issues # Grouped error issuesgpc devices list # Supported devices
gpc devices stats # Device distribution
gpc device-tiers list # Device tier configsgpc reports list # Available reports
gpc reports types # Report type infogpc testing internal-sharing upload --file app.aab # Instant test link
gpc testing testers add --track beta --email "dev@company.com"gpc users list
gpc users grant --email "dev@company.com" --role releaseManagergpc doctor # Validate setup
gpc init --package com.example.app # Create project config
gpc diff # Compare draft vs live
gpc recovery list # App recovery actions
gpc completion zsh > "${fpath[1]}/_gpc" # Shell completionsname: Deploy to Play Store
on:
push:
tags: ['v*']
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build
run: ./gradlew bundleRelease
- name: Install GPC
run: |
curl -fsSL https://raw.githubusercontent.com/AndroidPoet/playconsole-cli/main/install.sh | bash
echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Deploy
env:
GPC_CREDENTIALS_B64: ${{ secrets.PLAY_CREDENTIALS }}
GPC_PACKAGE: com.yourcompany.app
run: |
gpc bundles upload --file app/build/outputs/bundle/release/app-release.aab --track internal
gpc tracks promote --from internal --to production --rollout 10base64 < service-account.json | pbcopy # macOS
base64 < service-account.json | xclip # Linux
# Add as GPC_CREDENTIALS_B64 secret| Variable | Description |
|---|---|
GPC_CREDENTIALS_PATH |
Path to service account JSON |
GPC_CREDENTIALS_B64 |
Base64-encoded credentials (CI) |
GPC_PACKAGE |
Default package name |
GPC_PROFILE |
Auth profile to use |
GPC_OUTPUT |
Format: json | table | tsv | csv | yaml |
gpc tracks list # JSON (default, for scripting)
gpc tracks list --pretty # Pretty JSON
gpc tracks list -o table # ASCII table
gpc tracks list -o tsv # Tab-separated values
gpc tracks list -o csv # Comma-separated values
gpc tracks list -o yaml # YAML
gpc tracks list -o minimal # First field only (piping)- Credentials stored with
0600permissions - Service account keys never logged
- Base64 encoding for CI/CD secrets
- No credentials in command history
Apps shipped using Play Console CLI:
| App | Creator |
|---|---|
| Wally | @AndroidPoet |
π Add your app to the Wall!
Using GPC to ship your app? Get featured here!
- Fork this repo
- Edit
docs/wall-of-apps.json - Add your app:
{
"app": "Your App Name",
"link": "https://play.google.com/store/apps/details?id=your.package",
"creator": "YourGitHubUsername"
}- Submit a PR!
PRs welcome! Please open an issue first to discuss major changes.
make build # Build
make test # Test
make lint # LintMIT
Not affiliated with Google. Google Play is a trademark of Google LLC.