Skip to content

Work / Imposter / Wiki / Concepts

store-capture

Conceptverified 2026-10-30

Store capture

Screenshots are captured from the running app by goldie, never by hand and never drawn. .context/listing/goldie.config.ts holds the scenes and their copy, .argent/flows/store-*.yaml reach each screen, and src/config/seams.screenshot.ts is what makes two runs match. Commands: pnpm listing:capture, listing:shoot, listing:sync. Publishing after a build can break a capture: .context/ops/setup.md, section 3.

  • A capture build is this app with files swapped. Under EXPO_PUBLIC_SCREENSHOT_MODE=1, metro.config.js resolves @/a/b to src/a/b.screenshot.ts wherever that file exists: config/seams.ts (the die, the bag's memory, the clock, the MMKV file), lib/persist-storage.ts, and services/firebase.ts, rooms.ts and revenuecat.ts (a store that owns Pro and answers at once).
  • App code holds no flag and no capture branch, so a store binary contains nothing of what a capture build runs. It used to: the app read a SCREENSHOT_MODE boolean in six places, the fake store shipped dead in every store binary, and App Review rejected 1.0.3 under guideline 5.6 for features "hidden during the review process".
  • EXPO_PUBLIC_SCREENSHOT_MODE is set by the two scripts/build-screenshot-* files and nowhere else. src/config/seams.test.ts fails if it appears in eas.json, app.config.ts or any .env*, if any app file reads it or imports a .screenshot file, or if the swap stops doing what it says.
  • A new source of difference is a new export in seams.ts and its twin in seams.screenshot.ts, with a test — never a branch in app code. Import a swapped module as @/…, never by a relative path: the swap matches on that spelling.
  • goldie installs once per capture and cold-launches per scene. Anything persisted carries into the next scene, so a flow must not depend on a first launch.
  • Look at every picture before committing one. goldie verify checks sizes. The art keeps the design-rules: no urgency, and only the app's real counts.