README is a short front page (about 120 lines) with one real visual per section; every former section moved unchanged into docs/*.md with a docs/README.md index (journey, rejections, getting-started, commands, growth, studios, store-art, listing-languages, api, skills, mcp, safety, faq, project). The site tells the same story on one page: the teaser in the hero, real CLI output as text, the desktop app as a section with light/dark captures of eight screens and the per-system downloads (desktop/latest.json); /desktop/ redirects to /#download. New capture tools: tools/site-desktop-shots.ts (fixture-mode desktop frames) and tools/site-term-shots.ts (real CLI output as text and WebP). tests/docs-links.test.ts checks README, docs and site links resolve.
5.7 KiB
Store art: screenshots and previews
Screenshots and previews are one step of the journey, but the one that takes the longest by hand, so storebound
does a lot here. Two looks: shots.style: 'game' (sunburst, sparkles, badges) and shots.style: 'app' (calm
gradient, a clean device frame, headline + subline). Everything below was made by storebound itself from two tiny
fictional demos: a game ("Prism Puddle", procedural art) and an app
("Tidy Lists", one static page with sample data): raw frames captured from the web build, captions in several
languages, every store size, a review gallery and an app preview video. No store account needed to try it.
| Play feature graphic | App preview (App Store, 886 x 1920) |
|---|---|
![]() |
![]() |
How it works
-
Frames. Give your app or game a few switches (language, demo data or a fixed seed, no ads, jump to a screen, freeze, autoplay) and let
shots capturetake the frames: Playwright for a web build,simctlfor anything that runs in the iOS Simulator (Unity, Godot, Flutter, React Native, native, Capacitor),adbfor an Android emulator or device, or bring a folder of your own frames. The status bar is cropped off and redrawn clean (9:41, full battery). -
Copy. Per language and scene: eyebrow, two-line title, subtitle, badges. Fonts are subset from Google Fonts to exactly your characters, so Japanese, Chinese, Korean, Arabic (right to left) and Hindi just work.
shots fontschecks every character of every language against the font's cmap (TTF / OTF / WOFF / WOFF2, read in plain TypeScript): a glyph the font lacks gets an automatic Noto fallback (logged), no fallback is a clear error, and a render that drew any glyph with a fallback you did not choose, or with a system font, failsshots check.script title / body font (default stack) Latin incl. Latin Extended (tr, pl, cs, ro, hu ...) and Vietnamese your shots.fonts; default game Paytone One + Montserrat, app Inter (all cover them)Cyrillic, Greek Noto Sans (whole line) Arabic, Hebrew, Devanagari, Bengali, Thai Noto Sans Arabic / Hebrew / Devanagari / Bengali / Thai (whole line) Japanese, Korean, Chinese Noto Sans JP / KR / SC (TC for zh-Hant, TW, HK) (whole line) a character the stack lacks Noto Sans Display (titles) or Noto Sans (body), Noto Sans <Script>, then Noto Sans Symbols 2 / Symbols / Math: an ERROR in shots checkunless listed inshots.fonts.fallbackSome display fonts lack Latin Extended: Lilita One has no ş ğ İ ą ę ń ś ź ż ć ă ș ț č ř ě ů ő ű or Vietnamese, so Turkish, Polish, Czech, Romanian, Hungarian or Vietnamese titles need another title font (Paytone One, Baloo 2, Rowdies) or
fonts: { ..., fallback: ['Noto Sans Display'] }to accept the mixed glyphs.Your own brand font.
shots.fonts.title/body/fallback[]also take a local file (relative to the config; TTF, OTF, WOFF or WOFF2, checked by extension and signature) or{ family, file, weight?, style?, license? }:fonts: { title: { family: 'ER Display', file: 'apps/game/public/assets/fonts/er-display.woff2', license: 'OFL-1.1' }, body: 'Montserrat', fallback: ['Noto Sans Display'], // tried in order, before the automatic Noto fallbacks },shots fontsruns the same cmap check on the file (pl title: ę ł ą Ł not in ER Display -> Noto Sans Display), prints its size, glyph count, sha256 and license, and records it infonts.json. The file is never copied: render (andshots videocaptions) serve it from where it is, and a changed file changesfonts.css(the capture cache misses) and makesshots renderask forshots fontsagain.shots checkcounts the local font and listed fallbacks as configured, not as fallbacks, and warns when a local font has nolicensenote. -
Render. Every store size at exact pixels: iPhone 6.9" and 6.5", 13" iPad (if your app runs on iPad), Play phone, 7" and 10" tablets, the 1024 x 500 feature graphic. 24-bit RGB, no alpha (both stores reject it).
-
Check and review.
shots checkapplies the store rules locally (sources cited incli/shots/spec.ts);shots galleryputs everything on one page with problems outlined.validaterepeats the checks next to the store state. -
Variants. Other first screenshot, order or copy as
shots.variants, rendered side by side, for a Play store listing experiment or an App Store Product Page Optimization test (set up in the consoles; storebound makes and checks the images). -
Video.
shots recordfilms the autoplay mode,shots videocuts 15-30 s App Store previews (886 x 1920, 1200 x 1600) and a 9:16 / 16:9 promo for YouTube with captions in every language,apple previewsuploads them. Play takes a YouTube URL inplay.video.
Details: the store-screenshots and app-previews skills.





