Complete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.
日本語の概要は準備中です。原文の説明を表示しています。
One-shot NowStack Mobile iOS deployment with asc App Store Connect CLI. Use when preparing TestFlight/App Store releases, uploading IPAs, syncing screenshots/metadata, validating review readiness, or submitting the iOS app without EAS Submit.
インストール方法を見るインストールする前に、エージェントに与えられる指示の中身を確認できます。
This skill does not use EAS Submit for Apple uploads. The target flow is:
.ipa.asc with App Store Connect.asc to resolve the app, upload/publish the build, sync screenshots/metadata where possible, validate readiness, and submit.Build artifact generation is OS-aware: macOS may use local Xcode or local EAS, while Windows/Linux must load ns-setup-expo and use EAS cloud to produce the .ipa. App Store Connect automation belongs to asc.
</objective>
<when_to_use> Use this workflow when:
Do NOT use this for:
ns-deploy-android-app).npm run ios, npx expo start).<state_variables> Persist these values across the workflow:
| Variable | Type | Description |
|---|---|---|
{app_name} | string | App name from SiteConfig.title / Expo config. |
{slug} | string | Expo slug and URL scheme from SiteConfig.slug. |
{bundle_id} | string | iOS bundle identifier from SiteConfig.bundleId and ios.bundleIdentifier. |
{apple_team_id} | string | Apple Developer Team ID from SiteConfig.appleTeamId. |
{app_store_app_id} | string | Numeric App Store Connect app ID / Apple ID. |
{version} | string | App Store version string, usually from mobile-app/package.json / Expo config. |
{build_id} | string | App Store Connect build ID after upload/processing. |
{ipa_path} | string | Signed production .ipa path to upload. |
{convex_prod_url} | string | Production Convex cloud URL for EXPO_PUBLIC_CONVEX_URL. |
{convex_prod_site_url} | string | Production Convex site URL for EXPO_PUBLIC_CONVEX_SITE_URL. |
{iap_product_id} | string | Apple IAP product ID from SiteConfig.payment.iapProductId. |
{asc_key_id} | string | App Store Connect API key ID. Secret metadata; do not commit. |
{asc_issuer_id} | string | App Store Connect API issuer ID. Secret metadata; do not commit. |
{asc_p8_path} | string | Local path to the .p8 API private key. Never commit. |
{dry_run} | boolean | If true, print plans and run dry-run commands only. |
| </state_variables> |
<critical_safety>
.p8 keys, Apple account passwords, app-specific passwords, certificates, provisioning profiles, export option files with secrets, or .env files containing secrets.asc publish appstore --submit --confirm, asc review submit --confirm, or any asc web ... --confirm command until the user explicitly confirms the app ID, bundle ID, Apple team, version, IPA path, production Convex URLs, screenshots, metadata, and IAP product.asc dry runs and validation before mutation.asc web ... commands as optional escape hatches for App Store Connect web-only gaps. Use them only when the user is knowingly operating with their Apple session.
</critical_safety>gh repo view --json nameWithOwner,defaultBranchRef || true
git status --short --branch
node --version
npm --version
command -v asc && asc version
asc auth status --validate || asc auth doctor || true
cd mobile-app && npx expo config --type public
Read and verify these files:
site-config.ts
mobile-app/app.config.ts
mobile-app/package.json
mobile-app/lib/iap.ts
convex/payments/iap.ts
docs/templates/app-store-metadata.example.json
docs/templates/store-screenshot-manifest.example.json
Confirm:
SiteConfig.bundleId equals ios.bundleIdentifier in generated Expo config.SiteConfig.slug equals the Expo scheme used by screenshot/deep-link automation.SiteConfig.appleTeamId belongs to the intended Apple Developer team.SiteConfig.easProjectId being placeholder is not a blocker if this flow is not using EAS.SiteConfig.payment.iapProductId, StoreKit config, and convex/payments/iap.ts are aligned.asc validate.
</preflight>
<install_and_auth>
If asc is missing, install it:
brew install asc
or:
curl -fsSL https://asccli.sh/install | bash
If {asc_key_id}, {asc_issuer_id}, or {asc_p8_path} are unknown, run the ns-find-asc-credentials skill first — it locates .p8 keys on disk, reads the issuer ID from the user's signed-in browser session (App Store Connect web UI, via dev-browser CDP), and verifies the key is active before login.
Authenticate with an App Store Connect API key:
asc auth login \
--name "NowStack" \
--key-id "KEY_ID" \
--issuer-id "ISSUER_ID" \
--private-key "/secure/local/AuthKey_KEY_ID.p8" \
--network
For CI/headless shells where keychain access is not available:
asc auth login \
--bypass-keychain \
--name "NowStack CI" \
--key-id "KEY_ID" \
--issuer-id "ISSUER_ID" \
--private-key "/secure/local/AuthKey_KEY_ID.p8"
Then validate:
asc auth status --validate
asc auth doctor
asc apps list --output table
</install_and_auth>
<app_store_connect_setup>
Use asc as the Apple control plane:
asc apps list --output table to resolve {app_store_app_id}.asc status --app "{app_store_app_id}" --output table for release state.asc localizations list --app "{app_store_app_id}" for metadata/localization status.asc screenshots list --app "{app_store_app_id}" for store media status.asc validate --app "{app_store_app_id}" --version "{version}" --platform IOS --output table for readiness.asc validate iap --app "{app_store_app_id}" --output table when IAP is enabled.asc validate subscriptions --app "{app_store_app_id}" --output table if subscriptions are used.Manual or web-session gates that may still exist:
<metadata_and_screenshot_automation>
Before binary publish or review submission, run .agents/skills/ns-generate-store-screenshots and require its manifest to be upload-ready.
Automation target:
ns-generate-store-screenshots creates iOS PNGs and manifest.json.docs/templates/app-store-metadata.example.json remains the repo source template for copy/review details.asc is the preferred tool for App Store Connect metadata, localizations, screenshots, build upload, validation, and submission.<build_ipa>
This skill needs a signed production .ipa. Detect the OS before choosing the build path:
uname -s || node -p "process.platform"
.agents/skills/ns-setup-expo/SKILL.md, verify eas-cli, eas whoami, linked easProjectId, and expo-doctor, then use EAS cloud to produce the .ipa.Local Expo/Xcode path:
cd mobile-app
npm run env:prod
npx expo prebuild --clean --platform ios
Then archive/export with Xcode or xcodebuild. Keep ExportOptions.plist and signing material free of secrets and confirm the exact workspace/scheme before running destructive clean/archive steps.
Optional Xcode Cloud path:
asc xcode-cloud run --app "{app_store_app_id}" --workflow "CI" --branch "main" --wait
Windows/Linux required cloud path, and optional macOS fallback only if the user explicitly allows EAS cloud for build artifact generation:
cd mobile-app
npm run env:prod
npx eas build --platform ios --profile production --non-interactive
Do not use npx eas submit. Once the .ipa exists, deployment continues with asc.
</build_ipa>
<asc_publish_flow> Before any mutation, run a dry run:
asc publish appstore \
--app "{app_store_app_id}" \
--ipa "{ipa_path}" \
--version "{version}" \
--submit \
--dry-run \
--output table
If the dry run is clean and the user confirms:
asc publish appstore \
--app "{app_store_app_id}" \
--ipa "{ipa_path}" \
--version "{version}" \
--submit \
--confirm
Add --wait when the command should wait for build processing before attaching/submitting:
asc publish appstore \
--app "{app_store_app_id}" \
--ipa "{ipa_path}" \
--version "{version}" \
--submit \
--wait \
--confirm
If the user wants a checkpoint before review submission, stage first:
asc release stage \
--app "{app_store_app_id}" \
--version "{version}" \
--build "{build_id}" \
--metadata-dir "./metadata/version/{version}" \
--dry-run \
--output table
asc release stage \
--app "{app_store_app_id}" \
--version "{version}" \
--build "{build_id}" \
--metadata-dir "./metadata/version/{version}" \
--confirm
Then submit explicitly:
asc review submit --app "{app_store_app_id}" --version "{version}" --build "{build_id}" --dry-run --output table
asc review submit --app "{app_store_app_id}" --version "{version}" --build "{build_id}" --confirm
</asc_publish_flow>
<post_submit_checklist>
After asc publish appstore or asc review submit succeeds:
asc status --app "{app_store_app_id}" --output table.asc submit status --version-id "{version_id}" or asc submit status --id "{submission_id}" if available.asc command outputs in the release summary.npm run env:prod changed local files:cd mobile-app
npm run env:dev
</post_submit_checklist>
<failure_modes>
asc is missing: install with brew install asc or the install script.asc auth status --validate fails: API key ID, issuer ID, private key path, keychain storage, or network access is wrong.{app_store_app_id}, bundle ID, or Apple team is mismatched.asc publish appstore cannot attach/submit: build processing is incomplete; rerun with --wait or monitor with asc status.asc validate blocks submission: fix metadata, screenshots, review details, content rights, encryption, app availability, App Privacy, IAP, or subscription readiness.asc validate iap, asc validate subscriptions, and the relevant attach/review commands; some first-time selections may still require App Store Connect UI or asc web ... with user approval..p8, passwords, app-specific passwords, or signing materials were stored in tracked files.
</failure_modes><success_metrics>
.ipa exists for the intended bundle ID/team.asc auth status --validate succeeds.asc publish appstore --dry-run or asc review submit --dry-run is clean before mutation.asc publish appstore --submit --confirm or asc review submit --confirm completes for the intended app/version.まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
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.
日本語の概要は準備中です。原文の説明を表示しています。