Store Visual Assets
Production-ready graphics for the app store listings. Copy (descriptions, short description, keywords) lives in ../store-listings.md; this folder holds the rendered images. Design contract: .planning/phases/91/UI-SPEC.md (Phase 91 — Store Visual Asset Set).
All screenshots are real live app captures (demo account, dark mode, localhost:5173) composited with the Phase 91 overlay-band treatment — not CSS mockups.
Google Play (google-play/)
| File | Dimensions | Play Console field | Overlay copy |
|---|---|---|---|
feature-graphic-1024x500.png | 1024×500 | Feature graphic | "Objectuve / Daily goals. Real accountability. No ads." (real app icon + 2 live screenshots) |
phone-1-hook.png | 1080×2340 | Phone screenshots | "Build any goal — and actually stick to it." |
phone-2-daily-loop.png | 1080×2340 | Phone screenshots | "One tap. Your streak grows." |
phone-3-gamification.png | 1080×2340 | Phone screenshots | "Earn XP. Unlock badges. Climb ten ranks." |
phone-4-streak.png | 1080×2340 | Phone screenshots | "Streaks that survive real life." |
phone-5-coach.png | 1080×2340 | Phone screenshots | "Your Coach adapts as you build." (real Gemini chat reply) |
phone-6-pbc-values.png | 1080×2340 | Phone screenshots | "Free forever. No ads. No data selling." (Play only — no Apple 2.3.7 price-reference rule) |
tablet-1…6-*.png | 1600×2560 | 7" and 10" tablet screenshots | Same headlines; desktop-sidebar layout |
The tablet set (1600×2560) satisfies both the 7-inch and 10-inch required fields — upload the same six images to each. Video field: leave blank (no produced App Preview yet).
iOS App Store (ios/)
The app ships universal (iPhone + iPad), so App Store Connect requires both display sets. These are native captures at the exact iOS sizes — not upscaled from the Google Play set (1080×2340 / 1600×2560 do not satisfy the iOS dimensions), which is why they live as a separate set.
| File | Dimensions | ASC field | Overlay copy |
|---|---|---|---|
iphone-6.9/phone-1-hook.png | 1290×2796 | iPhone 6.9" Display | "Build any goal — and actually stick to it." |
iphone-6.9/phone-2-daily-loop.png | 1290×2796 | iPhone 6.9" Display | "One tap. Your streak grows." |
iphone-6.9/phone-3-gamification.png | 1290×2796 | iPhone 6.9" Display | "Earn XP. Unlock badges. Climb ten ranks." |
iphone-6.9/phone-4-streak.png | 1290×2796 | iPhone 6.9" Display | "Streaks that survive real life." |
iphone-6.9/phone-5-coach.png | 1290×2796 | iPhone 6.9" Display | "Your Coach adapts as you build." (real Coach reply) |
iphone-6.9/phone-6-pbc-values.png | 1290×2796 | iPhone 6.9" Display | "Built by a Public Benefit Company." (line breaks after "a", keeping "Public Benefit Company" intact) |
ipad-13/ipad-1…6-*.png | 2064×2752 | iPad 13" Display | Same six headlines; iPad layout |
The committed
ios/PNGs are stale. The slide-6 headline above reflects the currentscripts/capture-store-screenshots.mjssource, but the committediphone-6.9/,ipad-13/, and derivediphone-6.5/PNGs (dated 2026-06-09) still carry the old, Apple-rejected "Free forever" copy — the wording that drew the Guideline 2.3.7 citation on submission1772712c-42d6-436a-bfbf-80e43765d6e8(reviewed 2026-08-03, version 4.4.1 build 116); see the Guideline 2.3.7 note below. Regenerate before the next App Store submission (see Regenerating (iOS)).
Three sets — upload the one matching the slot ASC shows. This app's record (2026-06) shows an iPhone 6.5″ slot (does not accept 1290×2796) and an iPad 12.9″/13″ slot (accepts the native 2064×2752):
| Set | Dimensions | ASC display slot |
|---|---|---|
ios/iphone-6.5/ | 1284×2778 | iPhone 6.5″ Display ← use for this app |
ios/iphone-6.9/ | 1290×2796 | iPhone 6.9″ Display (newer records) |
ios/ipad-13/ | 2064×2752 | iPad 12.9″ or 13″ Display ← use for this app |
iphone-6.9/+ipad-13/are native captures;iphone-6.5/is an exact downscale ofiphone-6.9/(same content, sub-0.2 % resize, no cropping). The full submission procedure (listing fields, age rating, App Privacy, review notes) is in ../../operations/app-store-submission.md.
Regenerating (iOS)
Run scripts/capture-store-screenshots.mjs against the local stack with the fallback-token storageState:
# Both sets
STORAGE_STATE=/abs/path/state.json node scripts/capture-store-screenshots.mjs
# One device (default is both)
STORAGE_STATE=/abs/path/state.json node scripts/capture-store-screenshots.mjs --device iphone
STORAGE_STATE=/abs/path/state.json node scripts/capture-store-screenshots.mjs --device ipadSTORAGE_STATE(path to the fallback-token storageState JSON) is required;SCREENSHOT_URLis optional (defaults tohttp://localhost:5173).- Captured against local
localhost:5173with the demo account — the production demo account is polluted with smoke-test data (see the screenshot-regeneration memory note). - Never commit the storageState file — it contains the secret.
- For the Coach slide, bring up a real Coach first — see ../../development/testing-coach-locally.md.
Then derive the 6.5″ set from the native iphone-6.9/ captures with sips:
S=docs/marketing/store-assets/ios
for f in "$S"/iphone-6.9/*.png; do sips -z 2778 1284 "$f" --out "$S/iphone-6.5/$(basename "$f")"; doneProductHunt (producthunt/)
| File | Dimensions | Use |
|---|---|---|
gallery-slide1-1270x760.png | 1270×760 | PH gallery hero / thumbnail |
Brand / content guardrails honored
- No "AI" label in any asset — Coach surfaces say "Coach" (a backend-seeded
…AI coach…card is hidden at capture time; note it is still live in-app — separate cleanup). - Anti-social-app voice; PBC commitments shown plainly on slide 6.
- No price reference in any iOS slide band. App Store Guideline 2.3.7 counts references to free or discounted services as price references and bars them from screenshots (build 116 was rejected on this, 2026-08-03); treat trial framing the same way. Price framing is allowed in the App Store description only. Google Play has no equivalent rule, so its slide 6 still says "Free forever".
Regenerating
Screenshots are captured against local (localhost:5173) with the demo account — the shared production demo account is polluted with smoke-test data (see the screenshot-regeneration memory note). Auth uses a fallback-token storageState (Fallback <FALLBACK_AUTH_SECRET>:demo@objectuve.com in localStorage); never commit the storageState file — it contains the secret.
- Start the local stack (
localhost:5173+ native Rails on:3000). - For the Coach slides, bring up real Gemini first — see ../../development/testing-coach-locally.md.
- Capture each screen (dark mode), hiding non-brand cards:
.ai-insight-card,.coach-context,.coach-synopsis-card, and any.glass-cardcontaining an "AI" mention. - Composite each capture full-bleed under a gradient headline band (top, except slides 4 & 6 use a bottom band). Phone = 1080×2340; tablet = 1600×2560; feature graphic = exactly 1024×500.
- Feature graphic: embed the real app icon (from
ionic_frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png) and two live screenshots; keep the center 700–750px x-band clear (Play overlays the app name there).
The HTML source templates live in .planning/phases/91/mockups/ (feature-graphic.html, screenshot-slide-template.html, ph-gallery-slide1.html). Those Phase 91 mockups and .planning/phases/91/UI-SPEC.md predate the Guideline 2.3.7 fix and still show the old, rejected iOS slide-6 copy ("Free forever...") — scripts/capture-store-screenshots.mjs is the source of truth for current copy.
For the iOS native-sized set (ios/), the capture + composite step is fully scripted — run scripts/capture-store-screenshots.mjs (see Regenerating (iOS) above).
Last updated: 2026-08-31 (stale-PNG callout now cites the verified 2.3.7 submission 1772712c-42d6-436a-bfbf-80e43765d6e8, reviewed 2026-08-03, version 4.4.1 build 116)