Complete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.
日本語の概要は準備中です。原文の説明を表示しています。
Generate App Store and Google Play screenshots for NowStack Mobile with an AI-assisted simulator/emulator workflow. Use when preparing store assets, App Review screenshots, Play listing screenshots, launch marketing captures, or when the user asks to automate mobile screenshots.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
This skill is part of the release pipeline. Screenshots are not a nice-to-have; they are a store submission gate. </objective>
<when_to_use> Use this workflow when:
ns-ios-deploy-app or ns-deploy-android-app and the store listing lacks fresh screenshots.Do NOT use this for:
<automation_principle> The goal is not "take a few screenshots by hand". The goal is an AI-assisted repeatable asset pipeline:
Manual hand-capture is not the target path. Store screenshots should be generated, QA-checked, named, and made upload-ready by automation; manual work is allowed only as a documented fallback or final human approval gate. </automation_principle>
<ninety_nine_percent_automation_architecture> For a real 90-99% automation setup, treat screenshots as code and keep the capture pipeline in the repo:
Use the safe dry-run-first wrapper before touching devices
mobile-app/: npm run screenshots:store to generate documents/store-screenshots/<date>/manifest.json and print the Maestro/simctl/adb commands without executing them.npm run screenshots:store:ios or npm run screenshots:store:android.-- --execute after the app, simulator/emulator, and demo data are ready. The script never uploads screenshots and does not require store credentials.-- --date YYYY-MM-DD, -- --locale fr-FR, -- --output ../documents/store-screenshots/YYYY-MM-DD, -- --skip-maestro, -- --ios-device booted, -- --android-device emulator-5554, -- --continue-on-maestro-failure.Maestro flows live under mobile-app/maestro/store/
mobile-app/maestro/store/ios-store-screenshots.example.yaml and mobile-app/maestro/store/android-store-screenshots.example.yaml.--execute path runs one Maestro flow per screenshot before taking that screenshot.mobile-app/maestro/store/<platform>/<slot>-<slug>.yaml or mobile-app/maestro/store/<platform>-<slot>-<slug>.yaml, e.g. maestro/store/ios/01-onboarding.yaml._maestro/ that launches the app by bundle/package id but opens nowstack://<route>?storeDemo=1&seed=nowstack-store-demo-v1&locale=<locale>, waits for animations, and asserts required visible text. Generated flows require real app deep-link/demo-mode support; failures are intentional release blockers.maestro test mobile-app/maestro/store/<flow>.yaml from the repo root, or from mobile-app with the relative path adjusted.Deterministic demo mode replaces human setup
STORE_SCREENSHOTS=1, STORE_DEMO_SEED=nowstack-store-demo-v1, STORE_LOCALE=fr-FR.nowstack://store/home?storeDemo=1&seed=nowstack-store-demo-v1&locale=fr-FR to jump directly to screenshot routes instead of clicking through long onboarding every run. ns comes from SiteConfig.slug / Expo scheme; com.nowstack.mobile remains the native bundle/package id used by Maestro launchApp.Native device capture is scripted per platform
xcrun simctl io <device_udid|booted> screenshot <path>.png after the per-shot Maestro flow reaches the expected state.adb [-s <serial>] exec-out screencap -p > <path>.png after the per-shot Maestro flow reaches the expected state.ios/iphone-67/fr-FR/01-onboarding.png.AI visual QA is manifest-driven
documents/store-screenshots/YYYY-MM-DD/manifest.json using docs/templates/store-screenshot-manifest.example.json as the schema/example.Optional frame/composite generation is a post-process
framed/ with overlay copy, device frames, and brand backgrounds.rawPath and framedPath when frames are generated.Upload integration comes after approval
asc for App Store Connect screenshots/metadata automation.gpc for Google Play listings, screenshots, release notes, and track assets. Fastlane supply remains the fallback if gpc is blocked.Manual remainder is explicit and small
This is the honest 99% line: preparation, navigation, capture, QA, naming, manifesting, and upload-ready packaging can be automated; platform account/compliance decisions and final approval cannot be truthfully eliminated. </ninety_nine_percent_automation_architecture>
<state_variables> Persist these values across the workflow:
| Variable | Type | Description |
|---|---|---|
{app_name} | string | App name from SiteConfig.title. |
{deep_link_scheme} | string | Expo deep-link scheme from SiteConfig.slug / mobile-app/app.config.ts. |
{brand_primary} | string | Primary color from site-config.ts. |
{ios_devices} | list | Target iOS screenshot device families, usually iPhone 6.7" and iPad if supported. |
{android_devices} | list | Target Android phone/tablet screenshot profiles. |
{shot_list} | list | Ordered screens to capture. |
{demo_account} | string | Demo login identity or bypass mode. Never include a real password in tracked files. |
{output_dir} | string | Default: documents/store-screenshots/<YYYY-MM-DD>/ or an untracked local folder. |
{upload_ready} | boolean | True only after visual QA passes and user approves. |
| </state_variables> |
<critical_safety>
<screenshot_spec> Create a short shot list before touching simulators. For NowStack Mobile, the first version should usually include:
For every shot, define:
<recommended_tooling> Default stack:
mobile-app/maestro/store/.mobile-app/scripts/store-screenshots.mjs, exposed as npm run screenshots:store* and dry-run by default.xcrun simctl io <udid|booted> screenshot; pass -- --ios-device <udid|booted> to the wrapper.adb [-s <serial>] exec-out screencap -p; pass -- --android-device <serial> when multiple devices are connected.manifest.json.asc for iOS or gpc for Android. Fastlane supply remains the Android fallback where needed.
</recommended_tooling>git status --short --branch
node --version
npm --version
cd mobile-app && npx expo config --type public
npm run screenshots:store -- --help
Then verify:
site-config.ts
mobile-app/app.config.ts
mobile-app/package.json
mobile-app/app/
Confirm:
scheme (nowstack://... by default), while Maestro appId uses the native bundle/package id (com.nowstack.mobile by default).<ios_capture_flow> Use this as the baseline iOS capture flow:
cd mobile-app
npm run screenshots:store:ios -- --date YYYY-MM-DD --skip-maestro
npm run env:prod
npx expo prebuild --platform ios
npx expo run:ios
npm run screenshots:store:ios -- --date YYYY-MM-DD --execute --ios-device booted
# Human reference flow. The wrapper itself runs per-shot flows, generating temporary deep-link flows if needed.
maestro test maestro/store/ios-store-screenshots.example.yaml
# Native capture command used by scripted runners after each per-shot Maestro flow:
mkdir -p ../documents/store-screenshots/ios
xcrun simctl io booted screenshot ../documents/store-screenshots/ios/01-onboarding.png
The repo wrapper is mobile-app/scripts/store-screenshots.mjs. It writes the manifest in dry-run mode. In --execute mode it runs a per-shot Maestro flow before each native capture, prefers checked-in per-shot flows, otherwise generates temporary deep-link flows under _maestro/, and calls xcrun simctl io <ios-device> screenshot for each canonical shot. Maestro failures skip that shot's native capture and make the command exit non-zero unless --continue-on-maestro-failure is passed; native failures always exit non-zero.
Restore dev env when done if env:prod mutated local files:
npm run env:dev
</ios_capture_flow>
<android_capture_flow> Use this as the baseline Android capture flow:
cd mobile-app
npm run screenshots:store:android -- --date YYYY-MM-DD --skip-maestro
npm run env:prod
npx expo prebuild --platform android
npx expo run:android
npm run screenshots:store:android -- --date YYYY-MM-DD --execute --android-device emulator-5554
# Human reference flow. The wrapper itself runs per-shot flows, generating temporary deep-link flows if needed.
maestro test maestro/store/android-store-screenshots.example.yaml
# Native capture command used by scripted runners after each per-shot Maestro flow:
mkdir -p ../documents/store-screenshots/android
adb -s emulator-5554 exec-out screencap -p > ../documents/store-screenshots/android/01-onboarding.png
The repo wrapper is mobile-app/scripts/store-screenshots.mjs. It writes the manifest in dry-run mode. In --execute mode it runs a per-shot Maestro flow before each native capture, prefers checked-in per-shot flows, otherwise generates temporary deep-link flows under _maestro/, and calls adb [-s <android-device>] exec-out screencap -p without shell redirection, writing stdout to the target PNG. Maestro failures skip that shot's native capture and make the command exit non-zero unless --continue-on-maestro-failure is passed; native failures always exit non-zero.
Restore dev env when done if needed:
npm run env:dev
</android_capture_flow>
<ai_visual_qa> After screenshots are captured, run an AI visual QA pass. The reviewer should answer for each image:
site-config.ts?Fail the screenshot set if any answer reveals broken UI, misleading claims, or sensitive data.
Use docs/templates/store-screenshot-manifest.example.json as the starting shape for the QA manifest. The manifest should be machine-readable so an agent can perform deterministic checks first, then visual inspection second.
</ai_visual_qa>
<export_structure> Write generated assets to an untracked folder by default:
documents/store-screenshots/YYYY-MM-DD/
manifest.json
ios/
iphone-67/fr-FR/01-onboarding.png
iphone-67/fr-FR/02-auth.png
iphone-67/fr-FR/03-home.png
iphone-67/fr-FR/04-core-feature.png
iphone-67/fr-FR/05-paywall.png
iphone-67/fr-FR/06-settings.png
android/
phone/fr-FR/01-onboarding.png
phone/fr-FR/02-auth.png
phone/fr-FR/03-home.png
phone/fr-FR/04-core-feature.png
phone/fr-FR/05-paywall.png
phone/fr-FR/06-settings.png
manifest.json should include device, OS, app version, git SHA, route/flow, and QA status for each screenshot.
</export_structure>
<integration_with_store_deploy>
ns-ios-deploy-app and ns-deploy-android-app must treat screenshots as a release gate:
<failure_modes>
site-config.ts, demo data, or env swap is incomplete.<success_metrics>
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Complete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.
日本語の概要は準備中です。原文の説明を表示しています。
Routes general Convex requests to the right project skill. Use when the user asks which Convex skill to use or gives an underspecified Convex app task.
日本語の概要は準備中です。原文の説明を表示しています。
Use when optimizing Convex database read bandwidth, documents-read cost, query indexes, full-table scans, function-level usage dashboard findings, or code that uses .filter(), unbounded .collect(), N+1 reads, or expensive reactive Convex queries.
日本語の概要は準備中です。原文の説明を表示しています。
Build reusable Convex components with isolated tables and app-facing wrappers. Use for defineComponent, app.use, ComponentApi, or shared backend modules.
日本語の概要は準備中です。原文の説明を表示しています。
Plan safe Convex schema and data migrations. Use for widen-migrate-narrow rollouts, backfills, breaking field changes, table splits, or failed schema deploys.
日本語の概要は準備中です。原文の説明を表示しています。
Audit Convex performance for hot reads, write contention, subscriptions, function limits, OCC conflicts, latency, read amplification, and expensive reactive queries.
日本語の概要は準備中です。原文の説明を表示しています。