Complete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Audit a NowStack Mobile iOS app against the App Store Review Guidelines before submission - account deletion, IAP/Restore + no Stripe on iOS, Sign in with Apple parity, permission strings, App Privacy, AI disclosure, export compliance. Use for "ns ios audit" or "will my app pass App Store review".
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
Read the code, decide which App Store Review Guidelines actually apply to THIS app's feature set, check each one against the real files, and produce a clean report that tells the user exactly what to fix before submission. This is read-only by default — audit and report. Only fix code if the user asks.
<objective> Catch the rejections that App Review would catch, before the build is submitted. The output is a triaged report: each guideline marked PASS / BLOCKER / WARNING / MANUAL-GATE / N/A, every finding tied to a concrete file:line, and a copy-pasteable fix. The full guideline catalog with the why + fix per item lives in `references/guidelines.md` — read it before writing findings; do not re-derive guideline numbers from memory. </objective> <critical> - **Scope to the app's actual features.** Many guidelines (UGC 1.2, subscriptions 3.1.2, ATT, AI disclosure) only apply if the code uses that capability. Detect first (Phase 1), then only audit what applies. Marking an irrelevant guideline "N/A — app has no X" is a correct, valuable result. - **Ground every finding in a real file.** No finding without a `path:line`. If you can't point at code, it's a MANUAL-GATE, not a code finding. - **Read-only.** Do not edit code, change `site-config.ts`, or run store mutations. Recommend fixes; let the user run `/ns ios distribute` or implement. - This is the pre-flight before `ns-ios-distribute`. A clean audit ≠ a passed review (the App Privacy questionnaire and live web URLs are manual gates), but it removes the predictable rejections. </critical> <phase n="1" title="Detect what the app actually does"> Run these greps from repo root to learn the feature set — the results decide which guidelines apply.# Payment model: apple_iap vs stripe on iOS, one-time vs subscription
grep -nE "providers:|ios:|entitlementKey|priceDisplay" site-config.ts
grep -rnE "stripe|createCheckoutSession|Linking.openURL" mobile-app/app/\(flow\)/paywall.tsx
grep -rniE "restore|getAvailablePurchases" mobile-app/app mobile-app/lib/iap.ts
# Auth providers (4.8 Sign in with Apple parity)
grep -nE "enableAppleSignIn|enableGoogleSignIn|enable.*SignIn" site-config.ts
grep -nE "getEnabledAuthProviders|apple|google" convex/auth.ts
# Account deletion (5.1.1v)
grep -rniE "delete.?account|anonymize" mobile-app/app convex/users
# Apple review demo account — static-OTP login so the reviewer can sign in (2.1)
grep -nE "appstoretest@email.com|generateOTP|sendVerificationOTP|123456" convex/auth.ts
# Permissions / Info.plist (5.1.1i + export compliance)
grep -nE "Permission|UsageDescription|ITSAppUsesNonExemptEncryption|privacyManifest" mobile-app/app.config.ts
# AI / generative models (disclosure + moderation) — usually ZERO hits here
grep -rniE "anthropic|openai|@anthropic-ai|claude|gpt-|replicate|huggingface|generateText|streamText|ai/react" convex mobile-app/lib mobile-app/app
# Tracking / ATT — first-party analytics needs NO ATT
grep -rniE "idfa|adsupport|requestTrackingAuthorization|NSUserTracking" mobile-app
grep -nE "posthog|capture|identify" mobile-app/lib/posthog.ts
# UGC: is another user's content ever shown cross-user? (1.2)
grep -rniE "report|block|moderat" mobile-app/app
# + scan convex/ for queries returning other users' uploaded content
# Data inventory for App Privacy labels (5.1.2)
sed -n '1,60p' convex/schema.ts
# Privacy / terms / support URLs (5.1.1, 1.5)
grep -nE "privacy|terms|website|email" site-config.ts
Note for each: present / absent / placeholder. A placeholder URL or easProjectId/appStore id still at the boilerplate default is itself a finding.
</phase>
The non-negotiable BLOCKER set for this boilerplate:
ITSAppUsesNonExemptEncryption declared.convex/auth.ts (generateOTP returns "123456" for appstoretest@email.com; sendVerificationOTP short-circuits so no real email is needed). Verify BOTH code paths are intact AND that the same credentials are entered in App Store Connect → App Review Information (manual gate). A signed-in app with no reviewer login is an automatic rejection ("we were unable to sign in").Conditional (only if Phase 1 found the trigger): 1.2 UGC, AI disclosure, ATT, privacy manifest for custom native deps. </phase>
<phase n="3" title="Report"> Output exactly this shape. Lead with the verdict line so the user knows in one glance whether they can submit.## iOS App Store Audit — {SiteConfig.title} ({bundleId} v{version})
VERDICT: ❌ N blockers / ⚠️ M warnings / 🔒 K manual gates (or: ✅ Ready to submit — only manual gates remain)
### ❌ Blockers (fix before submit)
- [3.1.1] No Restore Purchases on iOS — paywall.tsx has no restore handler.
Fix: add a "Restore Purchases" action calling expo-iap getAvailablePurchases, reachable from the paywall/settings.
### ⚠️ Warnings (verify these apply to you)
- [4.8] Google sign-in enabled — Apple Sign In is also on ✓, but confirm APPLE_CLIENT_ID/SECRET are set on the prod Convex deployment.
### 🔒 Manual gates (you must do these — not provable from code)
- App Privacy questionnaire (web-only): https://appstoreconnect.apple.com/apps/{asc_app_id}/distribution/privacy
Declare: Contact Info (email, linked to identity), User Content, Usage Data — NOT used for tracking.
- Privacy policy + terms web pages must be LIVE before submit: {urls.privacy}, {urls.terms}
### ✅ Passing
- [5.1.1v] Account deletion — delete-account.tsx → anonymizeAccount() in convex/users/account.ts ✓
- [export] ITSAppUsesNonExemptEncryption: false ✓
### N/A (feature not present)
- [1.2 UGC] No cross-user content. [AI disclosure] No LLM/model usage in repo.
Rules for the report:
path:line. Manual gates cite the App Store Connect URL or the live web URL./ns ios distribute".
</phase>
<failure_modes>
Platform.OS branching before judging.<success_metrics>
references/guidelines.md has a verdict; inapplicable ones are explicitly N/A with the reason.path:line or a manual-gate URL.아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
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.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.