CommunityImagegithub.com

erberkk/store-screenshots

Use when producing or updating App Store and Google Play screenshots and the Play feature graphic - planning a connected "panorama" story across frames, capturing real in-app screens with the app's own test/screenshot harness at each device's logical size and pixel ratio, covering the full device matrix (iPhone 6.9", the required medium Dynamic Island slot, iPhone Duo outer and inner displays, iPad 13" if the app runs on iPad, Play phone, 7" and 10" tablets, 1024x500 feature graphic), checking for alpha channels and wrong sizes, and uploading in order via the App Store Connect and Google Play APIs.

What is store-screenshots?

store-screenshots is a Claude Code agent skill that use when producing or updating App Store and Google Play screenshots and the Play feature graphic - planning a connected "panorama" story across frames, capturing real in-app screens with the app's own test/screenshot harness at each device's logical size and pixel ratio, covering the full device matrix (iPhone 6.9", the required medium Dynamic Island slot, iPhone Duo outer and inner displays, iPad 13" if the app runs on iPad, Play phone, 7" and 10" tablets, 1024x500 feature graphic), checking for alpha channels and wrong sizes, and uploading in order via the App Store Connect and Google Play APIs.

Works with~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/erberkk/mobile-app-launch-skills/tree/HEAD/skills/store-screenshots

Installed? Explore more Image skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

Store screenshots

Purpose

Screenshots that convert, are true to the app, and fit every slot the stores require, produced by a script so they can be regenerated in minutes when the UI changes.

Prerequisites

  • A build whose UI is final for this release.
  • A capture harness in the app (Flutter golden/integration tests, XCUITest, Espresso/Compose screenshot tests, or Fastlane snapshot) that can render screens with deterministic demo data.
  • Node.js 18+ and Chrome/Chromium for rendering (npm i in scripts/).
  • API credentials (accounts-and-tax) for upload.

Principles

  1. Real captures, not mockups. Every phone screen inside a frame is a capture of the shipped app. Redrawn or "improved" UI misleads (guideline 2.3) and gets out of date.
  2. Numbers must match the app. If a frame shows "1,850 steps" or "12 min", the app must produce exactly that for the demo data. Generate the demo data in the harness and assert on it in the same test.
  3. If a screenshot shows something the app doesn't do, fix one of them. Either build the feature or change the frame. Never ship the gap.
  4. No other platform in the frames. No Android status/navigation bars on iOS, no Apple UI or "App Store" on Play (2.3.10).
  5. Keep the same frame order in every locale and on every device.

Device matrix

Full table with logical sizes and API identifiers: references/device-matrix.md. Summary (verify at Apple screenshot specifications and Play preview assets):

SlotPixels (portrait)Required?
iPhone large Dynamic Island (6.9")1320×2868 (also 1290×2796, 1260×2736)Recommended main set
iPhone medium Dynamic Island1206×2622 or 1179×2556At least one screenshot required
iPhone Duo outer display1398×2034Required from April 2027 for apps built with the iOS 27.1 SDK or later; adds the "optimized for iPhone Duo" badge
iPhone Duo inner display2007×2853Same as outer
iPad 13"2064×2752 (or 2048×2732)Required only if the app runs on iPad (not for iPhone-only apps)
Play phonee.g. 1080×1920 or 1080×2160 (sides 320–3840 px, long side ≤ 2× short side)≥ 2 screenshots to publish; ≥ 4 at ≥ 1080 px recommended
Play 7" and 10" tablet1080–7680 px, 9:16 or 16:9Recommended if the app supports tablets
Play feature graphic1024×500Required
Play icon512×512, 32-bit PNGRequired

Apple: up to 10 per size; PNG or JPEG; no alpha channel or transparency. Play: up to 8 per device type; JPEG or 24-bit PNG (no alpha).

App Store product-page creative assets (newer App Store Connect, "Header and Search Results" tab):

  • Header: one wide image at the top of the product page, 3840×1646 or 5244×2950. Optional (submission passes without it).
  • Search Results: 5244×2950, 3840×2560 or 1920×1280; if empty, screenshots and previews are used.
  • Upload through the version page or the Asset Library (Upload Creative Assets), then pick it with Browse Assets. Assets uploaded to the library stay there for later use.
  • Design note: the store overlays the icon, name and Get button on part of the header, so check the result in the console preview.
  • These slots are locked while the version is Waiting for Review. Add them before submitting.

Procedure

1. Plan the story (APPROVAL of the storyboard)

Write a storyboard of 5–8 frames: one headline (≤ 6 words), one supporting line, one capture each. Optional "panorama" layout (what the bundled template does): frames are slices of one wide canvas, so shapes continue across frame edges. Whatever the layout, any offer shown (free start, trial) must be true.

2. Capture real screens

Capture each screen at the target device's logical size × pixel ratio, so text and layout are exactly what that device shows. Flutter example (widget/golden test):

// 6.9" iPhone: 440 x 956 logical points @3x = 1320 x 2868 px
tester.view.physicalSize = const Size(1320, 2868);
tester.view.devicePixelRatio = 3.0;
await tester.pumpWidget(App(demo: DemoData.storeShots(locale: 'en')));
await tester.pumpAndSettle();
expect(find.text('1,850 steps'), findsOneWidget);       // the number in the headline is real
await expectLater(find.byType(App), matchesGoldenFile('captures/en/iphone69/01_home.png'));
  • Load fonts in tests (otherwise the test font renders boxes).
  • Fixed clock, fixed demo data, no network.
  • Hide debug banners; set the status bar to a clean state (or crop it and draw none).
  • Capture each locale separately; never place English UI inside a localized frame.

3. Compose frames

Template: templates/panorama.html, renderer: scripts/render.mjs.

cd scripts && npm i
node render.mjs ../templates/frames.example.json out/

The renderer lays all frames on one canvas (width = frames × frame width), loads the captures, waits for fonts, and screenshots each frame slice at exact pixel size, for every device in the config. It also renders the 1024×500 feature graphic.

4. Check

node check-images.mjs out/

Fails on: wrong dimensions for the folder's device, alpha channel present (PNG color type 4/6 or tRNS chunk), more than 10 (Apple) / 8 (Play) files, gaps in numbering. Then look at every image at 100% zoom: cut-off text, other-platform UI, placeholder strings, outdated numbers.

5. Upload via APIs (APPROVAL before replacing live sets)

  • App Store Connect — scripts/upload-asc.mjs: find the editable appStoreVersion → its appStoreVersionLocalizations → appScreenshotSets per screenshotDisplayType → delete old screenshots → reserve (POST /v1/appScreenshots with fileName, fileSize) → upload the parts from uploadOperations → commit (PATCH with uploaded: true and the MD5 sourceFileChecksum) → set the order on the set's appScreenshots relationship. Docs: Uploading assets.
  • Google Play — scripts/upload-play.mjs: edits.insert → edits.images.deleteall per language and image type → edits.images.upload in order (phoneScreenshots, sevenInchScreenshots, tenInchScreenshots, featureGraphic) → edits.commit. Docs: edits.images.upload.

Both scripts default to dry run; set DRY_RUN=0 to write.

6. Read back

List the uploaded assets per locale and device (both APIs) and compare count and order with the local folder. Apple processes uploads asynchronously; wait until every asset reports COMPLETE delivery state.

Decision points needing human approval

Storyboard and headlines, final visual direction, replacing a live screenshot set, committing the Play edit.

Verification

  • check-images.mjs passes; every required Apple slot has at least one image; Play has phone shots and the feature graphic.
  • Read-back order matches; no failed asset states.
  • Each number and feature in the frames was checked against the build.

Common pitfalls

  • Uploading only 6.9" and missing the required medium Dynamic Island slot.
  • PNGs exported with an alpha channel (common from design tools and headless browsers with transparent backgrounds — always set an opaque body background).
  • Using the 6.9" 1320×2868 image on Play: its aspect ratio exceeds Play's 2:1 limit; render a Play-specific size.
  • iPad screenshots for an iPhone-only app (not needed) — or missing them when the app does run on iPad.
  • A frame showing a settings row or result the app does not have.
  • Headline translated but the capture still in English.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

erberkk/privacy-and-declarations

Use when filling in or auditing App Store privacy and compliance answers and Google Play App content declarations - Apple App Privacy labels, Play Data safety (CSV import), Health apps declaration and Health Connect permissions, advertising ID, PrivacyInfo.xcprivacy and required-reason APIs, export compliance (ITSAppUsesNonExemptEncryption), age rating, account deletion (in-app, web URL, re-authentication), consent and disclosure for AI features, and rules for health data. Derives every answer from a code and SDK scan so the forms, the privacy policy and the in-app text say the same thing.

erberkk/review-readiness

Use before submitting an app version or a first subscription for App Store or Google Play review, or after receiving a rejection. Runs a go/no-go checklist and writes a report - demo account that signs in with a password (no email one-time code), filled with data and premium unlocked; review notes; in-app purchases visible and purchasable (guideline 2.1(b)); iPad compatibility mode for iPhone-only apps; no placeholders or "coming soon"; metadata matching the app; live privacy URLs; crash-free cold start - and gives a playbook for replying in Resolution Center and deciding when to appeal.

erberkk/social-publishing

Use when setting up scheduled publishing of an app's marketing content to Instagram (Reels, carousels, Stories), Threads, X and TikTok through official APIs - self-hosting Postiz in Docker behind a Cloudflare Tunnel, creating the Meta app with the newer use-case flow (business portfolio, Facebook Page linked to the Instagram professional account, Threads tester invite), X developer pay-per-use credits and spend cap, TikTok and YouTube audit limits, safe OAuth account selection when one browser holds personal and brand accounts, resource limits, and phasing a posting calendar around real launch events.

erberkk/web-presence-and-seo

Use when building, checking or deploying the website that a mobile app needs for its store listings and launch - privacy policy, terms, support and web account-deletion pages that work signed-out; hosting apple-app-site-association and assetlinks.json; invite/referral pages (/i/<code>) that open the app or fall back to the store with the Play install referrer; a landing page with store badges and honest per-country prices filled at the edge; Open Graph images; technical SEO (hreflang, canonical, sitemap, robots.txt, JSON-LD); Search Console, Bing Webmaster and IndexNow; AI crawler policy and llms.txt; and a Cloudflare Worker deploy with a production approval gate. Includes a site checker and an IndexNow ping script.

Related Skills