storebound/examples/demo-game
CRT d942275920 shots: glyph coverage check per language, automatic Noto fallbacks, check errors on fallback / system-font glyphs
Lilita One lacks most of Latin Extended-A (Turkish s-cedilla, g-breve, dotted I ...), so Turkish titles were drawn
with a silent browser fallback while shots check passed. shots fonts now reads the cmap of every face (pure TS,
TTF/OTF/WOFF/WOFF2), adds a Noto fallback per missing character or fails with language + characters; render
measures which face drew each character (CDP probes) and records it in report.json; check errors on fallbacks the
config did not choose (shots.fonts.fallback) and on system-font glyphs. Default game title font: Paytone One.
2026-10-12 03:05:23 +08:00
..
store site: hero demo shows real CLI output in four scenes (screenshots, pre-flight, store forms, icons); demos gain dataSafety and an icon artwork 2026-10-11 03:50:16 +08:00
web Demo game: Prism Puddle (fictional, procedural canvas art) with a storebound config for screenshots, variants and video 2026-10-10 22:33:01 +08:00
.gitignore site: hero demo shows real CLI output in four scenes (screenshots, pre-flight, store forms, icons); demos gain dataSafety and an icon artwork 2026-10-11 03:50:16 +08:00
README.md storebound scan: Google Play parity 2026-10-12 00:05:35 +08:00
serve.ts Demo game: Prism Puddle (fictional, procedural canvas art) with a storebound config for screenshots, variants and video 2026-10-10 22:33:01 +08:00
storebound.config.ts shots: glyph coverage check per language, automatic Noto fallbacks, check errors on fallback / system-font glyphs 2026-10-12 03:05:23 +08:00

Prism Puddle (demo game)

A tiny fictional game made only to show storebound's screenshot and video pipeline end to end. Drops fall into puddles; tap a puddle to switch its color so the next drop matches. Everything is drawn on a canvas (no image files), and the game has the switches a real game needs for store captures: lang, seed, t (freeze at a moment), scene and auto=1 (hands-free play for video clips). The ids in storebound.config.ts are placeholders; nothing here talks to a store.

From this folder (needs Bun, ffmpeg, and Playwright's Chromium or Google Chrome):

bun serve.ts &                                  # the game on http://127.0.0.1:8740
bun ../../cli/index.ts shots capture            # raw frames: 4 languages x phone + tablet
bun ../../cli/index.ts shots fonts              # title / body fonts + Noto subsets for Japanese and Arabic
bun ../../cli/index.ts shots render --variants  # every store size, base + variant b (about 7 minutes)
bun ../../cli/index.ts shots record             # gameplay clips (autoplay) for the previews
bun ../../cli/index.ts shots video              # App Store preview + YouTube promo per language
bun ../../cli/index.ts shots check --variants   # store rules, exit 1 on errors
bun ../../cli/index.ts shots gallery            # store/renders/index.html, open it in a browser
bun ../../cli/index.ts icons                    # every icon from store/icon (artwork drawn in bg.svg + fg.svg)

Everything it writes (store/shots/frames, store/renders, store/video, store/icons, .storebound) is gitignored.

bun ../../cli/index.ts scan (offline rejection-risk scan) reports two findings, accepted on purpose in scan.ignore of the config: the com.example package name is the repo placeholder and is never uploaded (a real game picks its own), and there is no Play developer account type to set (a real game sets play.accountType). The game has no native project here, so the code checks (ATT, purpose strings, privacy manifest) have nothing to read.