From rn-launch-harness
Captures app store screenshots using Maestro on iOS Simulator or Android Emulator for React Native/Expo apps. Hides ads via EXPO_PUBLIC_HIDE_ADS env var.
How this skill is triggered — by the user, by Claude, or both
Slash command
/rn-launch-harness:rn-harness-screenshotThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Capture store screenshots by running the app on a real simulator/emulator with Maestro. Ads are hidden during capture via environment variable.
Capture store screenshots by running the app on a real simulator/emulator with Maestro. Ads are hidden during capture via environment variable.
This is NOT image generation. Maestro physically controls the simulator:
Called by the orchestrator as Phase 9.
docs/harness/plans/YYYY-MM-DD-prd.md (screen structure)curl -Ls "https://get.maestro.mobile.dev" | bash)Store screenshots must NOT show ads. Before capturing, ensure the ad-hiding mechanism is in place.
Check src/features/ads/ui/AdBanner.tsx:
export function AdBanner({ size = BannerAdSize.ANCHORED_ADAPTIVE_BANNER }: IAdBannerProps) {
// Hide ads during screenshot capture
if (process.env.EXPO_PUBLIC_HIDE_ADS === 'true') return null;
return (
<BannerAd
unitId={getAdUnitId('BANNER')}
size={size}
requestOptions={{ requestNonPersonalizedAdsOnly: true }}
/>
);
}
If not present, add the EXPO_PUBLIC_HIDE_ADS check to:
AdBanner.tsx — banner componentuse-interstitial.ts — interstitial hook (skip show())use-rewarded.ts — rewarded hook (skip show())use-app-open-ad.ts — app open ad hook (skip)EXPO_PUBLIC_HIDE_ADS=true npx expo start --dev-client
Or if using expo run:*:
EXPO_PUBLIC_HIDE_ADS=true npx expo run:ios
EXPO_PUBLIC_HIDE_ADS=true npx expo run:android
Select 5-8 key screens from PRD for store listing:
# Check Maestro
which maestro && echo "MAESTRO=yes" || echo "MAESTRO=no"
# Check running simulators
xcrun simctl list devices 2>/dev/null | grep "Booted" || true
adb devices 2>/dev/null | grep -v "List" | grep "device" || true
If Maestro is NOT available: → Skip to Step 6 (Manual Fallback)
maestro/screenshots.yaml:
appId: com.company.app
---
# Wait for app to fully load
- waitForAnimationToEnd
# 1. First screen (login/onboarding/home)
- takeScreenshot: docs/harness/store-assets/ios/01-first
# 2. Navigate to home (if login needed, use test account)
- tapOn: "Home"
- waitForAnimationToEnd
- takeScreenshot: docs/harness/store-assets/ios/02-home
# 3. Core feature
- tapOn: "[Feature Button]"
- waitForAnimationToEnd
- takeScreenshot: docs/harness/store-assets/ios/03-feature
# 4. Detail screen
- tapOn:
index: 0
- waitForAnimationToEnd
- takeScreenshot: docs/harness/store-assets/ios/04-detail
# 5. Profile
- tapOn: "Profile"
- waitForAnimationToEnd
- takeScreenshot: docs/harness/store-assets/ios/05-profile
Customize the flow based on actual app screens and navigation. Use assertVisible to verify correct screen before capturing.
# iPhone 6.7" (Required — iPhone 15 Pro Max / iPhone 16 Pro Max)
maestro --device "iPhone 15 Pro Max" test maestro/screenshots.yaml
# iPhone 6.5" (Required — iPhone 11 Pro Max)
# Reuse 6.7" screenshots if similar resolution
iPad screenshots NOT needed (supportsTablet: false in app.config.ts).
# Phone (Required)
maestro test maestro/screenshots.yaml
docs/harness/store-assets/
├── ios/
│ ├── 01-first.png
│ ├── 02-home.png
│ ├── 03-feature.png
│ ├── 04-detail.png
│ └── 05-profile.png
├── android/
│ └── phone/
│ ├── 01-first.png
│ ├── 02-home.png
│ └── ...
├── icon.png # 512x512 (for Google Play)
├── feature_graphic.png # 1024x500 (for Google Play)
└── metadata/
└── ko-KR/
├── title.txt
├── short_description.txt
├── full_description.txt
└── release_notes.txt
If Maestro is not installed:
AskUserQuestion:
Maestro is not installed, so automatic screenshot capture is unavailable.
Please capture screenshots manually:
1. Run the app: EXPO_PUBLIC_HIDE_ADS=true npx expo start --dev-client
2. Navigate to each key screen
3. Take screenshots (Cmd+S in iOS Simulator, or device screenshot)
4. Save to docs/harness/store-assets/ios/ and android/phone/
Screens to capture:
1. [screen 1]
2. [screen 2]
...
Or install Maestro to automate:
curl -Ls "https://get.maestro.mobile.dev" | bash
Press Enter when screenshots are ready, or type "install" to install Maestro.
Create metadata files from PRD:
docs/harness/store-assets/metadata/ko-KR/title.txt:
[앱 이름] (30 chars max)
docs/harness/store-assets/metadata/ko-KR/subtitle.txt (iOS only):
[부제] (30 chars max)
docs/harness/store-assets/metadata/ko-KR/short_description.txt (Android):
[짧은 설명] (80 chars max)
docs/harness/store-assets/metadata/ko-KR/full_description.txt:
[전체 설명] (4000 chars max, includes key features, value proposition)
docs/harness/store-assets/metadata/ko-KR/keywords.txt (iOS only):
CRITICAL: iOS App Store keywords field has a 100-character limit INCLUDING commas. This field is one of the most important ASO (App Store Optimization) factors. Fill it to the MAXIMUM — generate keywords until the total exceeds 100 characters, then trim down.
Rules:
Process:
k1,k2,k3,...Example (coffee subscription tracker app):
구독관리,커피,정기배송,지출관리,가계부,알림,통계,지출분석,예산,subscription,coffee,tracker,monthly,bill,reminder,budget,spending
Count: 97 characters ✓ (uses full budget)
Bad example (too short):
커피,구독,관리
Count: 9 characters ✗ (wastes 91 characters of search opportunity)
docs/harness/store-assets/metadata/ko-KR/release_notes.txt:
[출시 노트]
docs/harness/store-assets/metadata/ko-KR/screenshot_captions.md:
Screenshot caption copy for store listings. These are the short marketing headlines overlaid on each screenshot. Written based on what each screenshot actually shows. 5-8 captions, matched 1:1 with the captured screenshot order.
Rules:
Format template:
# Screenshot Captions — [App Name]
## 01 — First screen (splash / login / onboarding)
**Headline:** 하루 한 번, 돈 관리
**Subheadline:** 3초 가계부로 충분해요
**Matches:** docs/harness/store-assets/ios/01-first.png
## 02 — Home / main screen
**Headline:** 이번 달 얼마 썼지?
**Subheadline:** 카테고리별 지출 한눈에 보기
**Matches:** docs/harness/store-assets/ios/02-home.png
## 03 — Core feature (ex: quick entry)
**Headline:** 손가락 한 번으로 기록
**Subheadline:** 커피 한 잔, 택시비, 바로 입력
**Matches:** docs/harness/store-assets/ios/03-feature.png
## 04 — Secondary feature (ex: statistics)
**Headline:** 내 소비 패턴이 보여요
**Subheadline:** 주간·월간 리포트 자동 생성
**Matches:** docs/harness/store-assets/ios/04-detail.png
## 05 — Last screen (premium / settings / achievement)
**Headline:** 목표 달성까지 D-23
**Subheadline:** 매일 알림으로 잊지 않기
**Matches:** docs/harness/store-assets/ios/05-profile.png
Process:
Why this matters: Screenshots on the store are viewed at thumbnail size. A user scrolling decides to install in 2-3 seconds based on these captions. A screenshot without a clear headline wastes that opportunity.
AskUserQuestion:
Screenshots and metadata are ready. Please review:
Screenshots: docs/harness/store-assets/
Metadata: docs/harness/store-assets/metadata/ko-KR/
Checklist:
- [ ] Screenshots look clean (no ads visible)
- [ ] App name correct
- [ ] Description accurate
- [ ] Privacy policy URL: [URL from config]
- [ ] Screenshot captions match what's actually on screen (screenshot_captions.md)
- [ ] iOS keywords.txt uses 95-100 chars
Any changes needed? (Press Enter to proceed, or describe what to change)
docs/harness/store-assets/ — screenshots + metadatamaestro/screenshots.yaml — Maestro flowcurrent_phase: submit
next_role: rn-harness-submit
npx claudepluginhub tjdrhs90/rn-launch-harness --plugin rn-launch-harnessProvides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.