$npx -y skills add hanamizuki/solopreneur --skill gplay-screenshot-automationManage, validate, and upload Google Play listing screenshots and graphics with the gplay CLI. Use when organizing screenshots by locale and device type and pushing them to a Play listing via gplay images upload, sync import-images, or a release.
| 1 | # Google Play Screenshot Management |
| 2 | |
| 3 | Use this skill to organize, validate, and upload Android screenshots and store graphics to a Google Play listing with `gplay`. This skill covers the gplay-specific upload/validate flow — not screenshot *capture*. |
| 4 | |
| 5 | Capturing the raw images is standard Android tooling and not gplay-specific: take them with `adb shell screencap` (then `adb pull`), or drive state-based captures with an Espresso / UI Automator instrumentation test, switching emulator locale via `setprop persist.sys.locale` when you need per-language shots. Produce PNGs organized by locale and device type, then use the commands below. |
| 6 | |
| 7 | ## Directory layout |
| 8 | |
| 9 | gplay expects a Fastlane-style tree. `sync import-images` and `release --screenshots-dir` both read this shape: |
| 10 | |
| 11 | ``` |
| 12 | metadata/ |
| 13 | en-US/ |
| 14 | images/ |
| 15 | phoneScreenshots/ |
| 16 | 1_home.png |
| 17 | 2_search.png |
| 18 | tenInchScreenshots/ |
| 19 | 1_home.png |
| 20 | featureGraphic.png |
| 21 | de-DE/ |
| 22 | images/ |
| 23 | phoneScreenshots/ |
| 24 | 1_home.png |
| 25 | ``` |
| 26 | |
| 27 | Screenshots upload in filename order, so prefix with `1_`, `2_`, etc. to control ordering on the store. |
| 28 | |
| 29 | ## Image types |
| 30 | |
| 31 | | Type | Usage | |
| 32 | |------|-------| |
| 33 | | `phoneScreenshots` | Phone screenshots (required, 2-8) | |
| 34 | | `sevenInchScreenshots` | 7-inch tablet screenshots | |
| 35 | | `tenInchScreenshots` | 10-inch tablet screenshots | |
| 36 | | `tvScreenshots` | Android TV screenshots | |
| 37 | | `wearScreenshots` | Wear OS screenshots | |
| 38 | | `featureGraphic` | Feature graphic (1024x500) | |
| 39 | | `promoGraphic` | Promo graphic (180x120) | |
| 40 | | `icon` | App icon (512x512) | |
| 41 | | `tvBanner` | TV banner (1280x720) | |
| 42 | |
| 43 | Google Play requires PNG or JPEG (PNG recommended), max 8 MB per image. |
| 44 | |
| 45 | ## 1) Validate before uploading |
| 46 | |
| 47 | Always validate the directory first — this catches count/dimension/format issues before you spend an upload: |
| 48 | |
| 49 | ```bash |
| 50 | # Validate all locales |
| 51 | gplay validate screenshots --dir ./metadata --output table |
| 52 | |
| 53 | # Validate a single locale |
| 54 | gplay validate screenshots --dir ./metadata --locale en-US --output table |
| 55 | ``` |
| 56 | |
| 57 | ## 2) Upload |
| 58 | |
| 59 | ### Option A — bulk import (preferred) |
| 60 | |
| 61 | Imports every image in the Fastlane tree in one command. Requires an open edit: |
| 62 | |
| 63 | ```bash |
| 64 | EDIT_ID=$(gplay edits create --package com.example.app | jq -r '.id') |
| 65 | |
| 66 | gplay sync import-images \ |
| 67 | --package com.example.app \ |
| 68 | --edit "$EDIT_ID" \ |
| 69 | --dir ./metadata # add --locale en-US to import one locale, --dry-run to preview |
| 70 | |
| 71 | gplay edits validate --package com.example.app --edit "$EDIT_ID" |
| 72 | gplay edits commit --package com.example.app --edit "$EDIT_ID" |
| 73 | ``` |
| 74 | |
| 75 | ### Option B — individual images |
| 76 | |
| 77 | Use when you need fine control over specific files: |
| 78 | |
| 79 | ```bash |
| 80 | EDIT_ID=$(gplay edits create --package com.example.app | jq -r '.id') |
| 81 | |
| 82 | gplay images upload \ |
| 83 | --package com.example.app \ |
| 84 | --edit "$EDIT_ID" \ |
| 85 | --locale en-US \ |
| 86 | --type phoneScreenshots \ |
| 87 | --file ./metadata/en-US/images/phoneScreenshots/1_home.png |
| 88 | |
| 89 | gplay images upload \ |
| 90 | --package com.example.app \ |
| 91 | --edit "$EDIT_ID" \ |
| 92 | --locale en-US \ |
| 93 | --type featureGraphic \ |
| 94 | --file ./metadata/en-US/images/featureGraphic.png |
| 95 | |
| 96 | gplay edits validate --package com.example.app --edit "$EDIT_ID" |
| 97 | gplay edits commit --package com.example.app --edit "$EDIT_ID" |
| 98 | ``` |
| 99 | |
| 100 | ### Option C — as part of a release |
| 101 | |
| 102 | Upload screenshots alongside a bundle in one release flow: |
| 103 | |
| 104 | ```bash |
| 105 | gplay release \ |
| 106 | --package com.example.app \ |
| 107 | --track production \ |
| 108 | --bundle app-release.aab \ |
| 109 | --screenshots-dir ./metadata \ |
| 110 | --release-notes @release-notes.json |
| 111 | ``` |
| 112 | |
| 113 | ## 3) Replace existing screenshots |
| 114 | |
| 115 | `delete-all` clears a type for a locale before re-uploading. It defaults `--confirm` to `false` and will refuse without it, so `--confirm` is REQUIRED: |
| 116 | |
| 117 | ```bash |
| 118 | EDIT_ID=$(gplay edits create --package com.example.app | jq -r '.id') |
| 119 | |
| 120 | gplay images delete-all \ |
| 121 | --package com.example.app \ |
| 122 | --edit "$EDIT_ID" \ |
| 123 | --locale en-US \ |
| 124 | --type phoneScreenshots \ |
| 125 | --confirm |
| 126 | |
| 127 | gplay images upload \ |
| 128 | --package com.example.app \ |
| 129 | --edit "$EDIT_ID" \ |
| 130 | --locale en-US \ |
| 131 | --type phoneScreenshots \ |
| 132 | --file ./metadata/en-US/images/phoneScreenshots/1_home.png |
| 133 | |
| 134 | gplay edits validate --package com.example.app --edit "$EDIT_ID" |
| 135 | gplay edits commit --package com.example.app --edit "$EDIT_ID" |
| 136 | ``` |
| 137 | |
| 138 | ## 4) Verify what's live |
| 139 | |
| 140 | ```bash |
| 141 | gplay images list \ |
| 142 | --package com.example.app \ |
| 143 | --edit "$EDIT_ID" \ |
| 144 | --locale en-US \ |
| 145 | --type phoneScreenshots \ |
| 146 | --output table |
| 147 | ``` |
| 148 | |
| 149 | ## Agent behavior |
| 150 | |
| 151 | - Confirm exact flags with `--help` before running commands. |
| 152 | - Always run `gplay validate screenshots` before uploading. |
| 153 | - Prefer `gplay sync import-images` over many individual `gplay images upload` calls. |
| 154 | - Every write goes through an edit: create → upload/import → validate → commit. |
| 155 | - `images delete-all` needs `--co |