Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Alternative app store operations with gplay `appstore`. Use when operating a third-party Android app store, mirroring Play's catalog export or its update-event feed, or taking an app the store hosts through Google's review path (create, upload, update, publish-status).
.claude/skills/pollyglot-gplay-appstore/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -3% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -13% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -48% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -19% | 0% |
gplay appstore acts for the operator of a third-party Android app store: the catalog that store mirrors from Play, and the apps it hosts and must send to Google for review. Publishing your own app to Google Play is gplay-release-flow.
Shared conventions are in gplay-cli-usage. Read the current flags from gplay appstore <command> --help: it is long and complete, and this skill carries the order the commands go in and the traps between them.
| Flag | Role | Falls back to | |---|---|---| | --store-package | the caller, your app store's own package | $GPLAY_APP_STORE_PACKAGE (ADR-0043) | | --package | the subject, the hosted app acted on | the repo's .gplay/config.json pin |
Swapping the two is the standard failure here. The catalog reads take the caller only, and address the Play app as a positional argument: they ignore the repo pin, so a resolved .gplay/config.json still leaves --store-package required.
bashgplay appstore catalog view com.example.app --store-package com.mystore.app gplay appstore catalog events list \ --start-time 2026-07-01T00:00:00Z --end-time 2026-07-08T00:00:00Z
catalog events list is the incremental sync feed, and the reason to script this surface at all: each event is a MODIFICATION (re-fetch that app with catalog view) or a DELETION (delist it). Persist each run's --end-time and feed it back as the next run's --start-time.
The four writes are an ordered path: Google refuses everything else for an app until its record exists.
bash# 1. Once per hosted app: the record. gplay appstore create --package com.example.app --store-package com.mystore.app # 2. Upload each artifact; the printed id is the point of the call. gplay appstore upload apk ./base.apk --package com.example.app # → apkId gplay appstore upload image ./icon.png --package com.example.app # → imageId gplay appstore upload policy ./privacy.pdf --package com.example.app # → fileId # 3. Assemble those ids into one JSON body and submit to review. gplay appstore update --file ./hosted-app.json --dry-run # rehearse, zero HTTP gplay appstore update --file ./hosted-app.json --confirm # irrevocable # 4. Later, to withdraw the app from the store, or put it back: gplay appstore publish-status unpublished --package com.example.app gplay appstore publish-status published --package com.example.app
Two traps span the path: upload ids cannot be listed back, so store them the moment they print; create has no delete and a second run is exit 60, so a script that runs twice guards it.
The update body is one JSON file whose shape gplay appstore update --help prints. Keep it in version control: the API answers with no fields and offers no read-back, so the file is the only record of what was submitted and the base for the next one.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 13,864 | 6,935 | -50% | 1 | 1 | 0% | 2,186 | 2,125 | -3% | 0 | 0 | — |
case-02 | fail→pass | 11,563 | 8,404 | -27% | 1 | 1 | 0% | 2,259 | 2,451 | +8% | 0 | 0 | — |
case-03 | fail→pass | 11,928 | 4,496 | -62% | 1 | 1 | 0% | 1,800 | 1,561 | -13% | 0 | 0 | — |
case-04 | fail→pass | 18,067 | 5,688 | -69% | 1 | 1 | 0% | 3,036 | 1,585 | -48% | 0 | 0 | — |
case-05 | fail→pass | 15,625 | 8,226 | -47% | 1 | 1 | 0% | 2,571 | 2,095 | -19% | 0 | 0 | — |
case-06 | fail→pass | 17,638 | 9,811 | -44% | 1 | 1 | 0% | 3,023 | 2,170 | -28% | 0 | 0 | — |
case-07 | fail→pass | 10,712 | 8,208 | -23% | 1 | 1 | 0% | 1,635 | 1,540 | -6% | 0 | 0 | — |
case-08 | pass→pass | 7,526 | 3,508 | -53% | 1 | 1 | 0% | 1,056 | 1,344 | +27% | 0 | 0 | — |
case-09 | fail→pass | 11,363 | 3,193 | -72% | 1 | 1 | 0% | 1,456 | 1,244 | -15% | 0 | 0 | — |
case-10 | fail→pass | 7,643 | 5,421 | -29% | 1 | 1 | 0% | 1,046 | 1,660 | +59% | 0 | 0 | — |
case-11 | fail→pass | 19,082 | 10,228 | -46% | 1 | 1 | 0% | 2,944 | 2,437 | -17% | 0 | 0 | — |
case-12 | fail→pass | 17,865 | 6,261 | -65% | 1 | 1 | 0% | 2,957 | 1,789 | -39% | 0 | 0 | — |
case-13 | fail→pass | 14,240 | 5,132 | -64% | 1 | 1 | 0% | 2,121 | 1,484 | -30% | 0 | 0 | — |
case-14 | pass→pass | 12,803 | 3,825 | -70% | 1 | 1 | 0% | 1,736 | 1,321 | -24% | 0 | 0 | — |
case-15 | fail→pass | 10,394 | 3,176 | -69% | 1 | 1 | 0% | 1,772 | 1,242 | -30% | 0 | 0 | — |
case-16 | fail→pass | 26,619 | 3,629 | -86% | 1 | 1 | 0% | 4,564 | 1,266 | -72% | 0 | 0 | — |
case-17 | fail→pass | 27,812 | 3,020 | -89% | 1 | 1 | 0% | 4,594 | 1,279 | -72% | 0 | 0 | — |
case-18 | fail→pass | 8,520 | 3,606 | -58% | 1 | 1 | 0% | 1,415 | 1,321 | -7% | 0 | 0 | — |
case-19 | fail→pass | 17,728 | 4,134 | -77% | 1 | 1 | 0% | 3,089 | 1,400 | -55% | 0 | 0 | — |
case-20 | fail→pass | 17,734 | 2,996 | -83% | 1 | 1 | 0% | 2,651 | 1,117 | -58% | 0 | 0 | — |
case-21 | fail→pass | 12,826 | 4,779 | -63% | 1 | 1 | 0% | 1,636 | 1,405 | -14% | 0 | 0 | — |
case-22 | fail→pass | 10,079 | 5,328 | -47% | 1 | 1 | 0% | 1,247 | 1,298 | +4% | 0 | 0 | — |
case-23 | fail→pass | 10,660 | 3,133 | -71% | 1 | 1 | 0% | 1,655 | 1,113 | -33% | 0 | 0 | — |
case-24 | pass→pass | 13,554 | 3,617 | -73% | 1 | 1 | 0% | 2,016 | 1,329 | -34% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted. The headline lift of +88 percentage points is the difference between those two pass rates over the 24 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.