Skip to content

Screenshots & graphics

metactl uploads your store-listing screenshots as part of metadata.yaml, with the same plan/apply/drift model as the rest of your metadata.

Add a base directory and a per-locale screenshots map (device key → ordered file list). Paths are resolved against screenshotsDir.

screenshotsDir: ./screenshots # base dir for the relative paths below
locales:
- locale: ja
name: "Sonir"
# …text fields…
screenshots:
iphone69: [iphone69/ja/01-record.png, iphone69/ja/02-measure.png]
ipad13: [ipad13/ja/01-measure.png]
play_phone: [play_phone/ja/01-record.png, play_phone/ja/02-measure.png]
play_tablet: [play_tablet/ja/01-measure.png]

The list order is the display order in the store.

Each key maps to one store’s screenshot slot:

Device key Store Slot
iphone69 App Store 6.9″ / 6.7″ iPhone (APP_IPHONE_67)
ipad13 App Store 13″ / 12.9″ iPad (APP_IPAD_PRO_3GEN_129)
play_phone Google Play phoneScreenshots
play_tablet Google Play 10″ tablet (tenInchScreenshots)

Apple shares one slot across 6.9″/6.7″ (and 13″/12.9″ iPad): upload the largest size and it covers both. Limits: App Store ≤10 per type, Google Play ≤8.

Idempotency is content-addressed — metactl hashes each local file and compares it to what the store holds (App Store sourceFileChecksum/MD5, Google Play sha256). So plan tells you exactly what changed:

+ screenshots ja/iphone69 → 3 shots # not set yet
~ screenshots ja/play_phone 2 shots → 3 shots # swapped/added in the console
= screenshots ja/ipad13 1 shots # matches — no upload

apply uploads only when the files differ (and re-applies your declared order). Re-running is a no-op once the store matches — the same exit codes and GitOps / cron wiring apply, so you can catch “someone replaced a screenshot in the console” continuously. See Drift detection.

Google Play’s store-listing feature graphic and icon go through the same image API, so metactl places them too — one of each, per locale, under playGraphics:

locales:
- locale: ja
playGraphics:
featureGraphic: feature/ja/feature.png # 1024×500, JPEG or 24-bit PNG (no alpha)
icon: icon/ja/icon.png # 512×512, 32-bit PNG (with alpha)

Same plan/apply/drift behavior as screenshots: metactl uploads only when the file’s hash differs from what Play holds.

  • App Store screenshots are editable only while the version is in an editable state (e.g. PREPARE_FOR_SUBMISSION) — same as text metadata. A locale needs its version localization to exist first (it’s created from your text fields).
  • App preview videos are out of scope.
  • metactl uploads the PNG as-is — it does not resize, crop, or rotate. Make sure each file already meets the store’s pixel-size requirements.
  • Apple revises its display-size enum roughly yearly as new devices ship; new sizes are added in a new metactl release.

Full field list and the rest of metadata.yaml are on the metactl page.