{"id":46665881,"url":"https://github.com/yasserstudio/gpc","last_synced_at":"2026-04-20T14:01:35.042Z","repository":{"id":342617740,"uuid":"1174577317","full_name":"yasserstudio/gpc","owner":"yasserstudio","description":"GPC — Google Play Console CLI. 204 API endpoints, preflight scanner, RTDN, vitals gates. Ship Android apps from your terminal.","archived":false,"fork":false,"pushed_at":"2026-04-11T17:09:48.000Z","size":10212,"stargazers_count":27,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-11T17:49:46.888Z","etag":null,"topics":["android","app-publishing","app-store","cli","developer-tools","devops","fastlane-alternative","google-play","google-play-console","google-play-console-cli","release-automation","typescript"],"latest_commit_sha":null,"homepage":"https://yasserstudio.github.io/gpc/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yasserstudio.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["yasserstudio"]}},"created_at":"2026-03-06T15:49:30.000Z","updated_at":"2026-04-11T17:09:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/yasserstudio/gpc","commit_stats":null,"previous_names":["yasserstudio/gpc"],"tags_count":158,"template":false,"template_full_name":null,"purl":"pkg:github/yasserstudio/gpc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yasserstudio%2Fgpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yasserstudio%2Fgpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yasserstudio%2Fgpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yasserstudio%2Fgpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yasserstudio","download_url":"https://codeload.github.com/yasserstudio/gpc/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yasserstudio%2Fgpc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32050451,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T11:35:06.609Z","status":"ssl_error","status_checked_at":"2026-04-20T11:34:48.899Z","response_time":94,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","app-publishing","app-store","cli","developer-tools","devops","fastlane-alternative","google-play","google-play-console","google-play-console-cli","release-automation","typescript"],"created_at":"2026-03-08T18:01:11.500Z","updated_at":"2026-04-20T14:01:35.024Z","avatar_url":"https://github.com/yasserstudio.png","language":"TypeScript","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/icon-200.png\" alt=\"GPC icon\" width=\"120\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  by\u003cbr\u003e\n  \u003ca href=\"https://yasser.studio\"\u003e\u003cpicture\u003e\u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"./assets/yasser-studio-logo-white.svg\"\u003e\u003cimg src=\"./assets/yasser-studio-logo.svg\" alt=\"Yasser's Studio\" height=\"30\"\u003e\u003c/picture\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# GPC — Google Play Console CLI\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@gpc-cli/cli\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@gpc-cli/cli?style=for-the-badge\u0026color=00D26A\" alt=\"npm version\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/yasserstudio/gpc/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/yasserstudio/gpc?style=for-the-badge\" alt=\"GitHub Stars\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/TypeScript-5.x-3178C6?style=for-the-badge\u0026logo=typescript\" alt=\"TypeScript\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Node.js-20+-339933?style=for-the-badge\u0026logo=node.js\" alt=\"Node.js\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Free_to_use-Code_on_GitHub-yellow?style=for-the-badge\" alt=\"Free to use\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@gpc-cli/cli\"\u003e\u003cimg src=\"https://img.shields.io/npm/dm/@gpc-cli/cli?style=for-the-badge\u0026color=00BFA5\" alt=\"npm downloads\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://yasserstudio.github.io/gpc/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Docs-yasserstudio.github.io%2Fgpc-00D26A?style=for-the-badge\" alt=\"Documentation\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Tests-2037_passing-00D26A?style=for-the-badge\" alt=\"Tests\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Coverage-90%25+-00BFA5?style=for-the-badge\" alt=\"Coverage\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003cstrong\u003eShip Android apps from your terminal.\u003c/strong\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003csub\u003eBuilt for Android developers, release engineers, and DevOps teams who are done clicking through the Play Console.\u003c/sub\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\nThe complete CLI for Google Play — 217 API endpoints, one tool.\u003cbr\u003e\nReleases, rollouts, metadata, vitals, reviews, subscriptions, reports, Managed Google Play, and more.\u003cbr\u003e\n\u003cstrong\u003ePlus an offline compliance scanner that catches policy violations before you upload.\u003c/strong\u003e\u003cbr\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003ca href=\"#install\"\u003e\u003cstrong\u003eInstall in 30 seconds\u003c/strong\u003e\u003c/a\u003e · \u003ca href=\"https://yasserstudio.github.io/gpc/guide/quick-start\"\u003eQuick Start Guide\u003c/a\u003e · \u003ca href=\"https://github.com/yasserstudio/gpc\"\u003eGitHub\u003c/a\u003e\u003c/p\u003e\n\n---\n\n## Install\n\n```bash\n# npm (includes plugin support)\nnpm install -g @gpc-cli/cli\n\n# Homebrew (macOS/Linux)\nbrew install yasserstudio/tap/gpc\n\n# Standalone binary — macOS/Linux (no Node.js required)\ncurl -fsSL https://raw.githubusercontent.com/yasserstudio/gpc/main/scripts/install.sh | sh\n\n# Standalone binary — Windows (PowerShell)\niwr -useb https://raw.githubusercontent.com/yasserstudio/gpc/main/scripts/install.ps1 | iex\n```\n\nFree to use. No account required beyond your existing Google Play service account.\n\n---\n\n## Quick Start\n\n```bash\n# Authenticate\ngpc auth login --service-account path/to/key.json\n\n# Verify your setup\ngpc doctor\n\n# App health at a glance — releases, vitals, and reviews in one command\ngpc status\n\n# Upload and release\ngpc releases upload app.aab --track internal\n\n# Promote to production with staged rollout\ngpc releases promote --from internal --to production --rollout 10\n\n# Monitor reviews\ngpc reviews list --stars 1-3 --since 7d\n```\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/demo.svg\" alt=\"gpc status — releases, vitals, reviews at a glance\" width=\"680\"\u003e\n\u003c/p\u003e\n\n---\n\n## Why GPC?\n\nEvery Android release is the same ritual: open the Play Console, upload your AAB, copy-paste release notes, pick a track, set the rollout percentage, click through confirmation screens. Fifteen minutes of clicking, every single time.\n\nGPC covers the **entire Google Play Developer API** in one CLI. 217 endpoints. No Ruby. No browser. No ceremony.\n\n|                         | **GPC**                        | Fastlane supply | gradle-play-publisher | Console UI   |\n| ----------------------- | ------------------------------ | --------------- | --------------------- | ------------ |\n| API coverage            | **217 endpoints**              | ~20             | ~15                   | All (manual) |\n| Runtime                 | Node.js or standalone binary   | Ruby + Bundler  | JVM                   | Browser      |\n| Cold start              | \u003c500ms                         | 2-3s            | 3-5s                  | 5-10s        |\n| Reviews \u0026 Vitals        | Yes                            | No              | No                    | Yes (manual) |\n| Subscriptions \u0026 IAP     | Yes                            | No              | No                    | Yes (manual) |\n| **Managed Google Play** | **Yes (first CLI to support)** | No              | No                    | Yes (manual) |\n| CI/CD native            | JSON + exit codes + env vars   | Partial         | Gradle tasks          | No           |\n| Preflight scanner       | **9 offline policy checks**    | No              | No                    | No           |\n| Interactive mode        | Yes (guided prompts)           | No              | No                    | N/A          |\n| Test suite              | 2,037 tests, 90%+ coverage     |                 |                       |              |\n\nAlready on Fastlane? See the [migration guide](https://yasserstudio.github.io/gpc/migration/from-fastlane) — most commands map one-to-one.\n\n---\n\n## Ship\n\nFrom first upload to full production rollout, without touching a browser.\n\n```bash\ngpc publish app.aab --track beta --notes \"Bug fixes\"      # End-to-end flow\ngpc releases upload app.aab --track internal               # Upload to any track\ngpc releases promote --from beta --to production --rollout 5\ngpc releases rollout increase --track production --to 50\ngpc releases rollout halt --track production               # Emergency brake\ngpc validate app.aab --track beta                          # Dry-run before committing\n```\n\nManage store listings, screenshots, and localization. Works with Fastlane metadata format.\n\n```bash\ngpc listings pull --dir metadata/          # Download all listings\ngpc listings push --dir metadata/          # Upload local changes\ngpc listings images upload --lang en-US --type phoneScreenshots ./screens/*.png\n```\n\n---\n\n## Release Notes\n\nFrom git log to translated Play Store release notes, in one command.\n\n```bash\n# GitHub Release markdown from your commits — clusters, lints, LLM prompt\ngpc changelog generate                                     # paste into the GH Release body\ngpc changelog generate | gh release create v1.2.3 -F -    # one-command release\n\n# Per-locale Play Store \"What's new\" text (500-char budget enforced per locale)\ngpc changelog generate --target play-store --locales auto\n\n# Translate non-source locales via your own LLM key (BYO — no vendor lock-in)\ngpc changelog generate --target play-store --locales auto --ai\n```\n\n`--ai` auto-detects whichever provider key is set: `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GOOGLE_GENERATIVE_AI_API_KEY`, or `AI_GATEWAY_API_KEY` for the Vercel AI Gateway (20+ providers plus cost-per-run in USD). Non-reasoning model defaults so you don't pay for thinking tokens on a translation task.\n\n[Multilingual release notes guide](https://yasserstudio.github.io/gpc/guide/multilingual-release-notes) · [Generating release notes guide](https://yasserstudio.github.io/gpc/guide/changelog-generation)\n\n---\n\n## Monitor\n\nKnow if something broke before your users do.\n\n```bash\ngpc status                                 # Releases + vitals + reviews in one view\ngpc status --watch 60                      # Live polling every 60 seconds\ngpc status --all-apps                      # Check all your apps at once\ngpc vitals crashes --threshold 2.0         # Exit code 6 if breached — CI gate\ngpc reviews list --stars 1-2 --since 7d    # Filter reviews by stars and date\ngpc reviews reply \u003cid\u003e --text \"Thanks!\"    # Reply without opening a browser\n```\n\nHandle monetization from the terminal.\n\n```bash\ngpc subscriptions list\ngpc iap sync --dir products/\ngpc pricing convert --from USD --amount 9.99\n```\n\n---\n\n## Protect\n\nCatch problems before Google does. No other tool does this.\n\n```bash\ngpc preflight app.aab                        # Run all 9 scanners\ngpc preflight app.aab --fail-on error --json # CI quality gate (exit code 6)\ngpc preflight permissions app.aab            # 18 restricted permissions audit\ngpc preflight --source app/src               # Secrets, billing SDKs, tracking\n```\n\n9 scanners run in parallel: **manifest** (target SDK, debuggable, exported, foreground service types), **permissions** (18 restricted permissions), **native-libs** (64-bit compliance), **metadata** (listing limits, screenshots), **secrets** (AWS, Google, Stripe keys), **billing** (non-Play SDKs), **privacy** (tracking SDKs), **policy** (Families/COPPA), **size** (download warnings).\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/preflight.svg\" alt=\"gpc preflight — 9 offline compliance scanners\" width=\"680\"\u003e\n\u003c/p\u003e\n\nDiagnose your setup with 20 automated checks.\n\n```bash\ngpc doctor                  # Run all checks\ngpc doctor --fix            # Auto-fix what it can\ngpc doctor --json           # Structured output for CI\n```\n\nAnalyze bundle size and catch regressions.\n\n```bash\ngpc bundle analyze app.aab                   # Per-module breakdown\ngpc bundle compare old.aab new.aab           # Size diff between builds\ngpc bundle analyze app.aab --threshold 150   # CI gate if \u003e 150 MB\n```\n\n---\n\n## CI/CD\n\nDrop GPC into any pipeline. JSON output, semantic exit codes (0-6), env var config.\n\n### GitHub Actions\n\n```yaml\n- name: Install GPC\n  run: npm install -g @gpc-cli/cli\n\n- name: Preflight Compliance Check\n  run: gpc preflight app.aab --fail-on error\n\n- name: Upload to Internal Track\n  env:\n    GPC_SERVICE_ACCOUNT: ${{ secrets.GPC_SERVICE_ACCOUNT }}\n    GPC_APP: com.example.myapp\n  run: gpc releases upload app.aab --track internal\n\n- name: Gate on Vitals\n  run: |\n    gpc vitals crashes --output json | jq -e '.data.crashRate \u003c 2.0'\n```\n\n### GitLab CI\n\n```yaml\ndeploy:\n  image: node:20\n  script:\n    - npm install -g @gpc-cli/cli\n    - gpc releases upload app.aab --track production --rollout 10\n  variables:\n    GPC_SERVICE_ACCOUNT: $GPC_SERVICE_ACCOUNT\n    GPC_APP: com.example.myapp\n```\n\n### Exit Codes\n\n| Code | Meaning                               |\n| ---- | ------------------------------------- |\n| `0`  | Success                               |\n| `1`  | General error                         |\n| `2`  | Usage error (bad arguments)           |\n| `3`  | Authentication error                  |\n| `4`  | API error (rate limit, permission)    |\n| `5`  | Network error                         |\n| `6`  | Threshold breach (vitals CI alerting) |\n\nSee the full [CI/CD recipes](https://yasserstudio.github.io/gpc/ci-cd/) for GitHub Actions, GitLab CI, Bitbucket Pipelines, and CircleCI.\n\n---\n\n## Developer Experience\n\n- **Smart output** — formatted tables in your terminal, structured JSON when piped or in CI. Override with `--output json|yaml|markdown`.\n- **Dry run everything** — every write command supports `--dry-run`. Run your full pipeline against real data without publishing a thing.\n- **Interactive prompts** — miss a required flag and GPC asks. In CI, it fails fast instead. Disable with `--no-interactive`.\n- **Four auth methods** — service account, OAuth, env var, or Application Default Credentials.\n- **Multiple accounts** — `gpc auth profiles`, `gpc auth switch`, `gpc auth whoami`.\n\n---\n\n## Packages\n\nGPC is a TypeScript monorepo. Use the CLI from your terminal, or import the packages into your own projects as a standalone SDK.\n\n| Package                                                                    | Description                                  |\n| -------------------------------------------------------------------------- | -------------------------------------------- |\n| [`@gpc-cli/cli`](https://www.npmjs.com/package/@gpc-cli/cli)               | CLI entry point — the `gpc` command          |\n| [`@gpc-cli/core`](https://www.npmjs.com/package/@gpc-cli/core)             | Business logic and command orchestration     |\n| [`@gpc-cli/api`](https://www.npmjs.com/package/@gpc-cli/api)               | Typed Google Play Developer API v3 client    |\n| [`@gpc-cli/auth`](https://www.npmjs.com/package/@gpc-cli/auth)             | Authentication (service account, OAuth, ADC) |\n| [`@gpc-cli/config`](https://www.npmjs.com/package/@gpc-cli/config)         | Configuration loading and profiles           |\n| [`@gpc-cli/plugin-sdk`](https://www.npmjs.com/package/@gpc-cli/plugin-sdk) | Plugin interface for extensions              |\n| [`@gpc-cli/plugin-ci`](https://www.npmjs.com/package/@gpc-cli/plugin-ci)   | CI/CD helpers and step summaries             |\n\nSee the [SDK usage guide](https://yasserstudio.github.io/gpc/advanced/sdk-usage) for building custom integrations with `@gpc-cli/api`.\n\n---\n\n## Documentation\n\nFull docs at **[yasserstudio.github.io/gpc](https://yasserstudio.github.io/gpc/)**.\n\n- [Installation](https://yasserstudio.github.io/gpc/guide/installation)\n- [Quick Start](https://yasserstudio.github.io/gpc/guide/quick-start)\n- [Commands Reference](https://yasserstudio.github.io/gpc/commands/)\n- [CI/CD Recipes](https://yasserstudio.github.io/gpc/ci-cd/)\n- [Environment Variables](https://yasserstudio.github.io/gpc/reference/environment-variables)\n- [Architecture](https://yasserstudio.github.io/gpc/advanced/architecture)\n- [Security](https://yasserstudio.github.io/gpc/advanced/security)\n- [Migration from Fastlane](https://yasserstudio.github.io/gpc/migration/from-fastlane)\n\n---\n\n## Get Help\n\n- [GitHub Discussions](https://github.com/yasserstudio/gpc/discussions) — questions, ideas, show what you built\n- [Issues](https://github.com/yasserstudio/gpc/issues) — bug reports and feature requests\n- `gpc doctor` — diagnose setup problems locally\n\n---\n\n## License\n\nFree to use. The code is on GitHub. See [LICENSE](./LICENSE) for legal details.\n\n---\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=yasserstudio/gpc\u0026type=Date)](https://star-history.com/#yasserstudio/gpc\u0026Date)\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://yasser.studio\"\u003e\u003cpicture\u003e\u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"./assets/yasser-studio-logo-white.svg\"\u003e\u003cimg src=\"./assets/yasser-studio-logo.png\" alt=\"Yasser's Studio\" height=\"50\"\u003e\u003c/picture\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003csub\u003eMade by \u003ca href=\"https://yasser.studio\"\u003eYasser's Studio\u003c/a\u003e · \u003ca href=\"https://x.com/yassersstudio\"\u003e@yassersstudio\u003c/a\u003e\u003c/sub\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003csub\u003eGPC is an independent project. Not affiliated with, endorsed by, or sponsored by Google LLC. \"Google Play\" and the Google Play logo are trademarks of Google LLC. \"Android\" and \"Google\" are trademarks of Google LLC.\u003c/sub\u003e\n\u003c/p\u003e\n","funding_links":["https://github.com/sponsors/yasserstudio"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyasserstudio%2Fgpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyasserstudio%2Fgpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyasserstudio%2Fgpc/lists"}