Skip to content

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/)

FileDimensionsPlay Console fieldOverlay copy
feature-graphic-1024x500.png1024×500Feature graphic"Objectuve / Daily goals. Real accountability. No ads." (real app icon + 2 live screenshots)
phone-1-hook.png1080×2340Phone screenshots"Build any goal — and actually stick to it."
phone-2-daily-loop.png1080×2340Phone screenshots"One tap. Your streak grows."
phone-3-gamification.png1080×2340Phone screenshots"Earn XP. Unlock badges. Climb ten ranks."
phone-4-streak.png1080×2340Phone screenshots"Streaks that survive real life."
phone-5-coach.png1080×2340Phone screenshots"Your Coach adapts as you build." (real Gemini chat reply)
phone-6-pbc-values.png1080×2340Phone screenshots"Free forever. No ads. No data selling." (Play only — no Apple 2.3.7 price-reference rule)
tablet-1…6-*.png1600×25607" and 10" tablet screenshotsSame 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.

FileDimensionsASC fieldOverlay copy
iphone-6.9/phone-1-hook.png1290×2796iPhone 6.9" Display"Build any goal — and actually stick to it."
iphone-6.9/phone-2-daily-loop.png1290×2796iPhone 6.9" Display"One tap. Your streak grows."
iphone-6.9/phone-3-gamification.png1290×2796iPhone 6.9" Display"Earn XP. Unlock badges. Climb ten ranks."
iphone-6.9/phone-4-streak.png1290×2796iPhone 6.9" Display"Streaks that survive real life."
iphone-6.9/phone-5-coach.png1290×2796iPhone 6.9" Display"Your Coach adapts as you build." (real Coach reply)
iphone-6.9/phone-6-pbc-values.png1290×2796iPhone 6.9" Display"Built by a Public Benefit Company." (line breaks after "a", keeping "Public Benefit Company" intact)
ipad-13/ipad-1…6-*.png2064×2752iPad 13" DisplaySame six headlines; iPad layout

The committed ios/ PNGs are stale. The slide-6 headline above reflects the current scripts/capture-store-screenshots.mjs source, but the committed iphone-6.9/, ipad-13/, and derived iphone-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 submission 1772712c-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):

SetDimensionsASC display slot
ios/iphone-6.5/1284×2778iPhone 6.5″ Display ← use for this app
ios/iphone-6.9/1290×2796iPhone 6.9″ Display (newer records)
ios/ipad-13/2064×2752iPad 12.9″ or 13″ Display ← use for this app

iphone-6.9/ + ipad-13/ are native captures; iphone-6.5/ is an exact downscale of iphone-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:

bash
# 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 ipad
  • STORAGE_STATE (path to the fallback-token storageState JSON) is required; SCREENSHOT_URL is optional (defaults to http://localhost:5173).
  • Captured against local localhost:5173 with 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:

bash
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")"; done

ProductHunt (producthunt/)

FileDimensionsUse
gallery-slide1-1270x760.png1270×760PH 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.

  1. Start the local stack (localhost:5173 + native Rails on :3000).
  2. For the Coach slides, bring up real Gemini first — see ../../development/testing-coach-locally.md.
  3. Capture each screen (dark mode), hiding non-brand cards: .ai-insight-card, .coach-context, .coach-synopsis-card, and any .glass-card containing an "AI" mention.
  4. 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.
  5. 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)

Loading…