Ios app store screenshots
Personal Agent Skills for AI coding agents — install and update with gh skill
npx -y skills add dbmrq/agent-skills --skill ios-app-store-screenshotsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Capture, compose, and upload iOS App Store screenshots via UI tests, xcresult export, Pillow marketing frames with named compositions, and the App Store Connect API. Use when the user asks to generate store screenshots, refresh App Store screenshots, explore composition variants, run capture-screenshots.sh / compose_store_assets.py / upload_store_assets.py, fix DemoMode or Ask/search screenshot fixtures, or submit screenshot sets to ASC — not for the full release/tag/TestFlight ship (use ios-app-store-release for that).
SKILL.md
8.1 KB, ~1.8k tokens by cl100k_base, as published. Nobody here has run it
iOS App Store Screenshots
Screenshot-only pipeline for apps that already have ASC release scripts (Gregor/Melvil pattern). For end-to-end ship (bump, Cloud archive, metadata, submit), use ios-app-store-release.
Expected repo layout
store-assets/
scenes.yaml # scene → composition, template, headline, raw, upload
compositions.yaml # named layouts (rising, hero-low, from-right, …)
templates/{light,dark}.json # colors, device/text shadow chrome
raw/<device>/…png # simulator captures
composed/<DISPLAY_TYPE>/… # locked marketing frames + manifest.json
composed/explore/… # optional contact sheet while iterating
scripts/
capture-screenshots.sh
export_xcresult_screenshots.py
compose_store_assets.py
upload_store_assets.py
asc/{client,constants,screenshots,metadata}.py
Tests/<App>UITests/ScreenshotTests.swift
Sources/…/Demo/DemoMode.swift # DEBUG-only fixture vault + screenshotScene
Credentials: ~/.config/app-store-connect/credentials.json. Deps: pip install -r scripts/requirements-asc.txt.
Agent workflow
Copy and track:
- [ ] Confirm APP_ID + version exists (PREPARE_FOR_SUBMISSION or editable)
- [ ] Confirm DemoMode + ScreenshotTests cover each scene in scenes.yaml
- [ ] Capture raw PNGs (light + dark as needed)
- [ ] Visually spot-check raw shots (no keyboard, correct screen, real content)
- [ ] Explore compositions if layouts are unsettled (--explore + contact sheet)
- [ ] Lock composition: + headlines in scenes.yaml; compose locked set
- [ ] Upload to ASC for marketing version
- [ ] Verify assetDeliveryState COMPLETE via API
1. Capture
Pin simulator name in the capture script (names drift with Xcode). Typical invocation:
./scripts/capture-screenshots.sh "iPhone 17 Pro Max" light collections
./scripts/capture-screenshots.sh "iPhone 17 Pro Max" dark collections
Argument order is device → appearance → scene. Swapping appearance/scene fails with a confusing error.
Inside the script:
xcodegen generateif the project is spec-drivenxcodebuild test -resultBundlePath build/screenshot-<basename>.xcresult -only-testing:…/ScreenshotTests/test…python3 scripts/export_xcresult_screenshots.py <xcresult> store-assets/raw/iphone
Do not rely on xcodebuild shell env for launchArguments/launchEnvironment reaching the UI test host reliably. Persist via:
- XCTest
XCTAttachment(lifetime.keepAlways) and - writing PNG under
STORE_ASSET_DIRfrom the test - export script honoring
SCREENSHOT_BASENAME(attachment suggested names include UUIDs)
Orchestrator pattern (all scenes) — keep in sync with capture-screenshots.sh / release.py:
for scene in ("collections", "collection-lists", "list-editor", "search-ask"):
for appearance in ("light", "dark"):
run(["./scripts/capture-screenshots.sh", DEVICE, appearance, scene])
If a UI test hangs (~600s “Failure collecting diagnostics from simulator”), shut down sims, re-boot the pinned device, and retry that scene only:
xcrun simctl shutdown all
xcrun simctl boot "<UDID-or-name>"
Iterate compose without re-capturing. Raw PNGs are expensive; composition + headline tweaks are cheap.
2. Demo / fixture rules
Store shots need rich content; App Store builds must not.
- Gate seeding with
#if DEBUG+ launch arg (e.g.-UITestDemo) / env (*_UI_TEST_DEMO=1) - Never ship bundled sample markdown via Release target membership or symlinks
- Review notes describe real first launch, not DemoMode fixtures
- Prefer
accessibilityIdentifieron navigation targets; labelCONTAINSpredicates are fragile - Marketing shots: dismiss keyboard before capture (tap results list / toolbar, or skip auto-focus when
DemoMode.isEnabled)
Search / Ask demo screenshots
Ask screens need deterministic content — do not wait on live Foundation Models / Spotlight in UI tests.
Pattern (Gregor NoteStore+Search / Melvil ListStore+Search):
DemoMode.screenshotScenefrom-UITestScene/SCREENSHOT_SCENE- When scene is
search-ask: setforceAskMode,demoQuery,demoSummaryand/ordemoAnswer,demoResultson the search context - Search view applies seeds in
.task/onAppear(applyDemoSeedIfNeeded) - UITest opens search via
*.searchaccessibility id, waits for Ask chrome / Answer section, dismisses keyboard, then captures
Seed answers/snippets from the demo vault (e.g. Japan trip packing gaps) so the shot looks real.
3. Compose
Locked set (upload path):
python3 scripts/compose_store_assets.py
Explore variants (iteration):
python3 scripts/compose_store_assets.py --explore --scene collections-light
# optional: --composition rising-leading --composition hero-low-leading
Writes composed/explore/<scene>__<composition>.png plus contact-sheet.png. Default compose requires composition: on each scene.
App Store upload set convention (Gregor/Melvil):
- Upload all light scenes in story order
- Upload one dark home/hero shot
- Mark remaining dark variants
upload: false(still compose for local review)
Composition schema, text placement, and chrome rules: references/compositions.md.
4. Copy (headlines)
- One title only — no faded subheads; put the whole message in
headline - Manual line breaks via YAML
|— compose must not auto-reflow (avoids orphans/widows) - Prefer short, quirky, app-specific lines over generic marketing speak
- Offer the user multiple options for unsettled scenes; lock picks in
scenes.yamlbefore ship
5. Upload
python3 scripts/upload_store_assets.py --version 1.0
# optional: --dry-run
Upload replaces the existing screenshot set for that display type (delete-all then re-upload). Pixel size must match DISPLAY_SIZES in scripts/asc/constants.py (e.g. APP_IPHONE_67 → 1290×2796) or ASC/client validation fails.
Via full release orchestrator when refresh_assets: true in releases/<ver>.yaml: capture → compose → upload as the assets step.
6. Verify
# After upload: each appScreenshots item should report COMPLETE
GET /appScreenshotSets/{id}/appScreenshots
→ attributes.assetDeliveryState.state == "COMPLETE"
Invalid screenshotDisplayType enums fail at set creation — see references/traps.md.
Hard-won rules
- Attachments + file write, not hope that xcodebuild env propagates into the test runner
- Honor
SCREENSHOT_BASENAMEwhen renaming exported attachments - No keyboard on marketing list/editor/Ask shots
- DemoMode is DEBUG-only; production stays empty / real bootstrap
- Pin simulator names; update when Xcode renames devices
- Upload order comes from composed manifest order; filename prefix
01-…,02-…is cosmetic for ASC - Capture once, compose many — explore compositions before re-running UITests
- Shadows rotate with tilted devices (build shadow in local space, then rotate with the shot)
- Prefer solid template backgrounds for marketing frames; patterned full-bleed art often loses to clean color fields (keep
backgroundImageoptional) - Screenshot-only work stops after COMPLETE verification — do not bump versions or tag unless asked
Related
- Full ship: ios-app-store-release
- Compositions / text layout: references/compositions.md
- Display-type / API traps: references/traps.md
Gives 0 of the 12 instructions most ship operate skills give in ~1.8k tokens
Counted across 779 of the 1,178 authors here whose files we hold, read 2026-08-06
- document a rollback plan before deploymentin 40 of 779, across 21 files
- create an annotated git tagin 21 of 779, across 20 files
- Run the test suitein 20 of 779
- update the changelogin 20 of 779, across 18 files
- verify deployment health after launchin 19 of 779, across 10 files
- clean up feature flags after full rolloutin 18 of 779, across 10 files
- verify the working tree is cleanin 18 of 779
- test both feature flag statesin 17 of 779, across 9 files
- Make database migrations backward-compatiblein 16 of 779, across 8 files
- set up error monitoring before launchin 15 of 779, across 7 files
- monitor metrics at each rollout stagein 14 of 779, across 5 files
- create a github releasein 14 of 779
Said here and by no other author read
- pin simulator names in the capture script
- capture raw pngs in light and dark modes
- visually spot-check raw shots
- iterate compositions without recapturing
- use debug flags for demo content
- dismiss the keyboard before capturing marketing shots
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.