vybekiit 0.7.25 → 0.7.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +3891 -1301
- package/dist/global-skills/aws-cdk/SKILL.md +19 -5
- package/dist/global-skills/aws-cdk/references/fast-deployments.md +191 -0
- package/dist/global-skills/aws-cdk/references/troubleshooting-deployment.md +16 -0
- package/dist/global-skills/aws-cloudformation/SKILL.md +16 -26
- package/dist/global-skills/aws-cloudformation/references/check-cloudformation-template-compliance.script.md +7 -3
- package/dist/global-skills/aws-cloudformation/references/cloudformation-language-server.md +177 -0
- package/dist/global-skills/aws-cloudformation/references/cloudformation-pre-deploy-validation.script.md +8 -2
- package/dist/global-skills/aws-cloudformation/references/persist-template-context.script.md +5 -8
- package/dist/global-skills/aws-cloudformation/references/retrieve-template-context.script.md +1 -1
- package/dist/global-skills/aws-cloudformation/references/security-considerations.md +51 -0
- package/dist/global-skills/aws-cloudformation/references/troubleshoot-failed-stack.script.md +138 -0
- package/dist/global-skills/aws-cloudformation/references/{validate-cloudformation-template.script.md → validate-with-cfn-lint.script.md} +15 -27
- package/dist/global-skills/aws-cloudformation/references/validate-with-cloudformation-validate.script.md +181 -0
- package/dist/global-skills/aws-cloudformation/references/validation-tool-selection.md +44 -0
- package/dist/global-skills/aws-serverless/SKILL.md +9 -1
- package/dist/global-skills/aws-serverless/references/architecture.md +3 -1
- package/dist/global-skills/aws-serverless/references/lambda.md +3 -1
- package/dist/global-skills/aws-serverless/references/orchestration.md +1 -0
- package/dist/global-skills/better-auth-best-practices/SKILL.md +18 -8
- package/dist/global-skills/eas-app-stores/SKILL.md +31 -15
- package/dist/global-skills/eas-app-stores/agents/openai.yaml +2 -2
- package/dist/global-skills/eas-app-stores/references/ios-app-store.md +37 -32
- package/dist/global-skills/eas-app-stores/references/native-ios.md +167 -0
- package/dist/global-skills/eas-app-stores/references/play-store.md +3 -7
- package/dist/global-skills/eas-app-stores/references/testflight.md +39 -35
- package/dist/global-skills/eas-simulator/SKILL.md +48 -26
- package/dist/global-skills/eas-simulator/references/controllers.md +32 -3
- package/dist/global-skills/eas-simulator/references/run-your-app.md +34 -4
- package/dist/global-skills/eas-simulator/references/troubleshooting.md +8 -4
- package/dist/global-skills/eas-update/SKILL.md +146 -0
- package/dist/global-skills/eas-update/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-animation/RECIPES.md +2 -2
- package/dist/global-skills/expo-animation/SKILL.md +9 -2
- package/dist/global-skills/expo-brownfield/SKILL.md +18 -11
- package/dist/global-skills/expo-brownfield/agents/openai.yaml +2 -2
- package/dist/global-skills/expo-brownfield/references/brownfield-integrated.md +94 -69
- package/dist/global-skills/expo-brownfield/references/brownfield-isolated.md +40 -42
- package/dist/global-skills/expo-brownfield/references/comparison.md +5 -5
- package/dist/global-skills/expo-brownfield/references/feature-integration.md +163 -0
- package/dist/global-skills/expo-brownfield/references/troubleshooting.md +17 -17
- package/dist/global-skills/expo-brownfield/references/version-compatibility.md +40 -0
- package/dist/global-skills/expo-data-fetching/SKILL.md +27 -6
- package/dist/global-skills/expo-design-system/SKILL.md +27 -7
- package/dist/global-skills/expo-design-system/references/audit.md +7 -2
- package/dist/global-skills/expo-design-system/references/native-slop.md +74 -0
- package/dist/global-skills/expo-examples/SKILL.md +0 -1
- package/dist/global-skills/expo-examples/references/catalog.md +1 -1
- package/dist/global-skills/expo-migrate-module/SKILL.md +21 -10
- package/dist/global-skills/expo-migrate-module/references/compatibility.md +80 -23
- package/dist/global-skills/expo-migrate-module/references/migration-map.md +162 -11
- package/dist/global-skills/expo-native-ui/SKILL.md +25 -16
- package/dist/global-skills/expo-native-ui/agents/openai.yaml +2 -2
- package/dist/global-skills/expo-native-ui/references/controls.md +5 -46
- package/dist/global-skills/expo-native-ui/references/icons.md +21 -2
- package/dist/global-skills/expo-native-ui/references/media.md +15 -20
- package/dist/global-skills/expo-native-ui/references/visual-effects.md +12 -11
- package/dist/global-skills/expo-overview/SKILL.md +17 -12
- package/dist/global-skills/expo-router/SKILL.md +5 -3
- package/dist/global-skills/expo-router/references/tabs.md +5 -5
- package/dist/global-skills/expo-skill-eval/scripts/check-static.sh +0 -0
- package/dist/global-skills/expo-skill-eval/scripts/clean-fixture.sh +0 -0
- package/dist/global-skills/expo-skill-eval/scripts/latest-sdk.sh +0 -0
- package/dist/global-skills/expo-skill-eval/scripts/make-fixture.sh +0 -0
- package/dist/global-skills/expo-skill-eval/scripts/make-workspace.sh +0 -0
- package/dist/global-skills/expo-skill-eval/scripts/snapshot-android.sh +0 -0
- package/dist/global-skills/expo-skill-eval/scripts/snapshot-ios.sh +0 -0
- package/dist/global-skills/expo-skill-eval/scripts/snapshot-web.sh +0 -0
- package/dist/global-skills/expo-upgrade/SKILL.md +3 -1
- package/dist/global-skills/expo-web-to-native/references/false-friends.md +2 -2
- package/dist/global-skills/expo-web-to-native/references/native-patterns.md +1 -1
- package/dist/global-skills/firebase-ai-logic-basics/SKILL.md +13 -16
- package/dist/global-skills/firebase-ai-logic-basics/references/ios_setup.md +4 -5
- package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_android.md +4 -4
- package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_web.md +3 -3
- package/dist/global-skills/firebase-auth-basics/SKILL.md +11 -6
- package/dist/global-skills/firebase-auth-basics/references/client_sdk_android.md +4 -5
- package/dist/global-skills/firebase-auth-basics/references/client_sdk_web.md +3 -3
- package/dist/global-skills/firebase-auth-basics/references/flutter_setup.md +24 -25
- package/dist/global-skills/firebase-auth-basics/references/security_rules.md +4 -2
- package/dist/global-skills/firebase-crashlytics/references/android_setup.md +7 -4
- package/dist/global-skills/firebase-crashlytics/references/ios_setup.md +2 -3
- package/dist/global-skills/firebase-data-connect/SKILL.md +2 -1
- package/dist/global-skills/firebase-data-connect/examples.md +4 -4
- package/dist/global-skills/firebase-data-connect/reference/config.md +5 -4
- package/dist/global-skills/firebase-data-connect/reference/realtime.md +1 -2
- package/dist/global-skills/firebase-data-connect/reference/sdk_flutter.md +2 -2
- package/dist/global-skills/firebase-data-connect/reference/sdk_ios.md +2 -2
- package/dist/global-skills/firebase-data-connect/reference/sdk_web.md +17 -6
- package/dist/global-skills/firebase-data-connect/reference/security.md +5 -5
- package/dist/global-skills/firebase-data-connect/templates.md +2 -1
- package/dist/global-skills/firebase-firestore/SKILL.md +20 -8
- package/dist/global-skills/firebase-firestore/references/enterprise/android_sdk_usage.md +5 -4
- package/dist/global-skills/firebase-firestore/references/enterprise/data_model.md +12 -3
- package/dist/global-skills/firebase-firestore/references/enterprise/indexes.md +16 -18
- package/dist/global-skills/firebase-firestore/references/enterprise/provisioning.md +1 -1
- package/dist/global-skills/firebase-firestore/references/enterprise/python_sdk_usage.md +5 -1
- package/dist/global-skills/firebase-firestore/references/enterprise/web_sdk_usage.md +7 -7
- package/dist/global-skills/firebase-firestore/references/standard/android_sdk_usage.md +5 -5
- package/dist/global-skills/firebase-firestore/references/standard/flutter_setup.md +4 -4
- package/dist/global-skills/firebase-firestore/references/standard/indexes.md +16 -18
- package/dist/global-skills/firebase-firestore/references/standard/provisioning.md +1 -1
- package/dist/global-skills/firebase-remote-config-basics/SKILL.md +0 -5
- package/dist/global-skills/firebase-remote-config-basics/references/android_setup.md +36 -8
- package/dist/global-skills/firebase-remote-config-basics/references/ios_setup.md +1 -7
- package/dist/global-skills/firebase-security-rules-auditor/SKILL.md +17 -6
- package/dist/global-skills/{firebase-firestore/references/standard/security_rules.md → firestore-rules-creation/SKILL.md} +24 -13
- package/dist/global-skills/grow-my-customers/SKILL.md +23 -0
- package/dist/global-skills/instrument-feature-flags/SKILL.md +25 -25
- package/dist/global-skills/instrument-feature-flags/references/adding-feature-flag-code.md +141 -285
- package/dist/global-skills/instrument-feature-flags/references/android.md +6 -15
- package/dist/global-skills/instrument-feature-flags/references/api.md +4 -11
- package/dist/global-skills/instrument-feature-flags/references/best-practices.md +1 -13
- package/dist/global-skills/instrument-feature-flags/references/django.md +14 -27
- package/dist/global-skills/instrument-feature-flags/references/dotnet.md +20 -79
- package/dist/global-skills/instrument-feature-flags/references/elixir.md +1 -9
- package/dist/global-skills/instrument-feature-flags/references/flask.md +13 -13
- package/dist/global-skills/instrument-feature-flags/references/flutter.md +3 -24
- package/dist/global-skills/instrument-feature-flags/references/go.md +3 -15
- package/dist/global-skills/instrument-feature-flags/references/ios.md +4 -17
- package/dist/global-skills/instrument-feature-flags/references/java.md +5 -13
- package/dist/global-skills/instrument-feature-flags/references/laravel.md +13 -17
- package/dist/global-skills/instrument-feature-flags/references/next-js.md +25 -32
- package/dist/global-skills/instrument-feature-flags/references/nodejs.md +8 -15
- package/dist/global-skills/instrument-feature-flags/references/php.md +1 -15
- package/dist/global-skills/instrument-feature-flags/references/python.md +2 -15
- package/dist/global-skills/instrument-feature-flags/references/react-native.md +13 -15
- package/dist/global-skills/instrument-feature-flags/references/react.md +17 -21
- package/dist/global-skills/instrument-feature-flags/references/ruby-on-rails.md +37 -83
- package/dist/global-skills/instrument-feature-flags/references/ruby.md +2 -15
- package/dist/global-skills/instrument-feature-flags/references/rust.md +13 -25
- package/dist/global-skills/instrument-feature-flags/references/usage.md +14 -63
- package/dist/global-skills/instrument-feature-flags/references/web.md +9 -14
- package/dist/global-skills/instrument-product-analytics/SKILL.md +29 -29
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-hybrid.md +3 -1
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-ssr.md +3 -1
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-static.md +3 -1
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-view-transitions.md +3 -1
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-ruby-on-rails.md +3 -1
- package/dist/global-skills/instrument-product-analytics/references/android.md +72 -107
- package/dist/global-skills/instrument-product-analytics/references/angular.md +26 -28
- package/dist/global-skills/instrument-product-analytics/references/astro.md +13 -24
- package/dist/global-skills/instrument-product-analytics/references/configuration.md +45 -63
- package/dist/global-skills/instrument-product-analytics/references/django.md +14 -27
- package/dist/global-skills/instrument-product-analytics/references/dotnet.md +20 -79
- package/dist/global-skills/instrument-product-analytics/references/elixir.md +47 -49
- package/dist/global-skills/instrument-product-analytics/references/flask.md +13 -13
- package/dist/global-skills/instrument-product-analytics/references/flutter.md +60 -90
- package/dist/global-skills/instrument-product-analytics/references/go.md +17 -56
- package/dist/global-skills/instrument-product-analytics/references/identify-users.md +15 -15
- package/dist/global-skills/instrument-product-analytics/references/ios.md +11 -15
- package/dist/global-skills/instrument-product-analytics/references/laravel.md +13 -17
- package/dist/global-skills/instrument-product-analytics/references/next-js.md +25 -32
- package/dist/global-skills/instrument-product-analytics/references/nuxt-js-3-6.md +13 -27
- package/dist/global-skills/instrument-product-analytics/references/nuxt-js.md +14 -28
- package/dist/global-skills/instrument-product-analytics/references/php.md +33 -84
- package/dist/global-skills/instrument-product-analytics/references/posthog-python.md +229 -9
- package/dist/global-skills/instrument-product-analytics/references/python.md +415 -106
- package/dist/global-skills/instrument-product-analytics/references/react-native.md +161 -155
- package/dist/global-skills/instrument-product-analytics/references/react-router-v6.md +12 -33
- package/dist/global-skills/instrument-product-analytics/references/react-router-v7-data-mode.md +15 -33
- package/dist/global-skills/instrument-product-analytics/references/react-router-v7-declarative-mode.md +12 -33
- package/dist/global-skills/instrument-product-analytics/references/react-router-v7-framework-mode.md +26 -41
- package/dist/global-skills/instrument-product-analytics/references/ruby-on-rails.md +37 -83
- package/dist/global-skills/instrument-product-analytics/references/ruby.md +48 -108
- package/dist/global-skills/instrument-product-analytics/references/svelte.md +18 -24
- package/dist/global-skills/instrument-product-analytics/references/tanstack-start.md +17 -19
- package/dist/global-skills/instrument-product-analytics/references/usage.md +14 -63
- package/dist/global-skills/instrument-product-analytics/references/vue-js.md +29 -28
- package/dist/global-skills/manifest.json +8 -2
- package/dist/global-skills/mongodb-search-and-ai/SKILL.md +28 -37
- package/dist/global-skills/mongodb-search-and-ai/references/automated-embedding.md +438 -0
- package/dist/global-skills/mongodb-search-and-ai/references/hybrid-search.md +60 -4
- package/dist/global-skills/mongodb-search-and-ai/references/vector-search.md +46 -108
- package/dist/global-skills/neon/SKILL.md +207 -213
- package/dist/global-skills/neon/references/auth.md +12 -0
- package/dist/global-skills/neon/references/claimable-neon.md +10 -14
- package/dist/global-skills/neon/references/function-triggers.md +53 -0
- package/dist/global-skills/neon/references/logs-loki.md +61 -0
- package/dist/global-skills/neon/references/parse-env.md +32 -0
- package/dist/global-skills/neon/references/sdk.md +7 -0
- package/dist/global-skills/neon-ai-gateway/SKILL.md +14 -16
- package/dist/global-skills/neon-auth/SKILL.md +155 -0
- package/dist/global-skills/neon-auth/references/managed-auth.md +173 -0
- package/dist/global-skills/neon-auth/references/self-managed.md +25 -0
- package/dist/global-skills/neon-functions/SKILL.md +159 -84
- package/dist/global-skills/neon-functions/references/ai-sdk.md +4 -6
- package/dist/global-skills/neon-functions/references/function-triggers.md +249 -0
- package/dist/global-skills/neon-functions/references/mastra-studio.md +3 -3
- package/dist/global-skills/neon-functions/references/mcp.md +1 -1
- package/dist/global-skills/neon-functions/references/production-hardening.md +340 -0
- package/dist/global-skills/neon-functions/references/sse.md +8 -5
- package/dist/global-skills/neon-object-storage/SKILL.md +10 -11
- package/dist/global-skills/neon-postgres/SKILL.md +120 -17
- package/dist/global-skills/neon-postgres/references/full-text-search.md +99 -0
- package/dist/global-skills/neon-postgres/references/hybrid-search.md +90 -0
- package/dist/global-skills/neon-postgres/references/lakebase-search-drizzle.md +172 -0
- package/dist/global-skills/neon-postgres/references/vector-search.md +137 -0
- package/dist/global-skills/neon-postgres-branches/SKILL.md +3 -3
- package/dist/global-skills/neon-postgres-egress-optimizer/SKILL.md +1 -1
- package/dist/global-skills/onboarding/SKILL.md +8 -6
- package/dist/global-skills/resend/SKILL.md +4 -2
- package/dist/global-skills/resend/references/broadcasts.md +6 -1
- package/dist/global-skills/resend/references/receiving.md +29 -10
- package/dist/global-skills/resend/references/sending/email-management.md +14 -4
- package/dist/global-skills/resend/references/topics.md +9 -6
- package/dist/global-skills/resend/references/usage.md +117 -0
- package/dist/global-skills/resend/references/webhooks.md +59 -2
- package/dist/global-skills/stripe-best-practices/SKILL.md +35 -29
- package/dist/global-skills/stripe-best-practices/references/billing.md +9 -2
- package/dist/global-skills/stripe-best-practices/references/payments.md +4 -2
- package/dist/global-skills/stripe-best-practices/references/security.md +3 -1
- package/dist/global-skills/stripe-best-practices/references/tax.md +39 -20
- package/dist/global-skills/supabase/SKILL.md +6 -0
- package/dist/global-skills/use-railway/SKILL.md +42 -22
- package/dist/global-skills/use-railway/references/analyze-db.md +7 -6
- package/dist/global-skills/use-railway/references/cloud-agents.md +70 -0
- package/dist/global-skills/use-railway/references/configure.md +17 -2
- package/dist/global-skills/use-railway/references/databases.md +107 -0
- package/dist/global-skills/use-railway/references/deploy.md +5 -5
- package/dist/global-skills/use-railway/references/feature-flags.md +25 -13
- package/dist/global-skills/use-railway/references/iac.md +66 -77
- package/dist/global-skills/use-railway/references/operate.md +26 -3
- package/dist/global-skills/use-railway/references/request.md +31 -23
- package/dist/global-skills/use-railway/references/setup.md +16 -5
- package/dist/global-skills/use-railway/references/tracing.md +261 -0
- package/dist/global-skills/use-railway/references/usage.md +52 -0
- package/dist/global-skills/use-railway/scripts/analyze-mongo.py +0 -0
- package/dist/global-skills/use-railway/scripts/analyze-mysql.py +0 -0
- package/dist/global-skills/use-railway/scripts/analyze-postgres.py +0 -0
- package/dist/global-skills/use-railway/scripts/analyze-redis.py +0 -0
- package/dist/global-skills/use-railway/scripts/enable-pg-stats.py +0 -0
- package/dist/global-skills/use-railway/scripts/pg-extensions.py +0 -0
- package/dist/global-skills/use-railway/scripts/railway-api.sh +0 -0
- package/dist/global-skills/validate-my-idea/SKILL.md +54 -0
- package/dist/global-skills/{feedback → vybekiit-feedback}/SKILL.md +16 -12
- package/dist/global-skills/watch-my-app/SKILL.md +53 -0
- package/dist/global-skills/workers-best-practices/SKILL.md +36 -103
- package/dist/global-skills/workers-best-practices/references/configuration.md +139 -0
- package/dist/global-skills/workers-best-practices/references/platform-apis.md +51 -0
- package/dist/global-skills/workers-best-practices/references/{rules.md → runtime-patterns.md} +13 -137
- package/dist/global-skills/wrangler/SKILL.md +48 -901
- package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Sources/main.swift +19 -15
- package/package.json +22 -22
- package/dist/global-skills/expo-native-ui/references/animations.md +0 -220
- package/dist/global-skills/firebase-firestore/references/enterprise/security_rules.md +0 -577
- package/dist/global-skills/workers-best-practices/references/review.md +0 -174
|
@@ -5,7 +5,17 @@ description: Configure Better Auth server and client, set up database adapters,
|
|
|
5
5
|
|
|
6
6
|
# Better Auth Integration Guide
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
## Documentation Version
|
|
9
|
+
|
|
10
|
+
Use documentation that matches the Better Auth version installed in the project. APIs and plugin names can differ across maintained release lines.
|
|
11
|
+
|
|
12
|
+
1. Prefer a version explicitly named by the user.
|
|
13
|
+
2. Otherwise, inspect the resolved `better-auth` version in the lockfile, falling back to the package manifest when no lockfile is available.
|
|
14
|
+
3. When the Better Auth MCP is available, call `get_doc` with `/llms.txt` to resolve that package version to a documentation identifier. Pass the identifier to every `search_docs` call and pass result paths to `get_doc` unchanged.
|
|
15
|
+
4. Without MCP, start at [better-auth.com/llms.txt](https://better-auth.com/llms.txt) and follow the matching version index.
|
|
16
|
+
5. Use the latest documentation only when the project version cannot be determined or the user explicitly asks about the latest release or an upgrade.
|
|
17
|
+
|
|
18
|
+
When planning an upgrade, separate guidance for the currently installed version from guidance for the target version.
|
|
9
19
|
|
|
10
20
|
---
|
|
11
21
|
|
|
@@ -16,9 +26,9 @@ description: Configure Better Auth server and client, set up database adapters,
|
|
|
16
26
|
3. Create `auth.ts` with database + config
|
|
17
27
|
4. Create route handler for your framework
|
|
18
28
|
5. Run migrations:
|
|
19
|
-
- **Built-in adapter:** `npx
|
|
20
|
-
- **Drizzle:** `npx
|
|
21
|
-
- **Prisma:** `npx
|
|
29
|
+
- **Built-in adapter:** `npx auth@latest migrate`
|
|
30
|
+
- **Drizzle:** `npx auth@latest generate --output src/db/auth-schema.ts` then `npx drizzle-kit push` (dev) or `npx drizzle-kit generate && npx drizzle-kit migrate` (prod)
|
|
31
|
+
- **Prisma:** `npx auth@latest generate --output prisma/schema.prisma` then `npx prisma migrate dev`
|
|
22
32
|
6. Verify: call `GET /api/auth/ok` — should return `{ status: "ok" }`
|
|
23
33
|
|
|
24
34
|
---
|
|
@@ -35,9 +45,9 @@ Only define `baseURL`/`secret` in config if env vars are NOT set.
|
|
|
35
45
|
CLI looks for `auth.ts` in: `./`, `./lib`, `./utils`, or under `./src`. Use `--config` for custom path.
|
|
36
46
|
|
|
37
47
|
### CLI Commands
|
|
38
|
-
- `npx
|
|
39
|
-
- `npx
|
|
40
|
-
- `npx @
|
|
48
|
+
- `npx auth@latest migrate` - Apply schema (built-in adapter)
|
|
49
|
+
- `npx auth@latest generate` - Generate schema for Prisma/Drizzle
|
|
50
|
+
- `npx auth@latest mcp --cursor` - Add MCP to AI tools
|
|
41
51
|
|
|
42
52
|
**Re-run after adding/changing plugins.**
|
|
43
53
|
|
|
@@ -179,4 +189,4 @@ For separate client/server projects: `createAuthClient<typeof auth>()`.
|
|
|
179
189
|
- [Options Reference](https://better-auth.com/docs/reference/options)
|
|
180
190
|
- [LLMs.txt](https://better-auth.com/llms.txt)
|
|
181
191
|
- [GitHub](https://github.com/better-auth/better-auth)
|
|
182
|
-
- [Init Options Source](https://github.com/better-auth/better-auth/blob/main/packages/core/src/types/init-options.ts)
|
|
192
|
+
- [Init Options Source](https://github.com/better-auth/better-auth/blob/main/packages/core/src/types/init-options.ts)
|
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: eas-app-stores
|
|
3
|
-
description: EAS service (paid).
|
|
4
|
-
version: 1.
|
|
3
|
+
description: EAS service (paid). Build and submit iOS and Android apps with EAS to TestFlight, the App Store, or Google Play. Supports Expo and other React Native projects, plus existing native apps. Use for eas.json setup, release pipelines, signing, app versions and build numbers, store submissions, and listing metadata. For Expo websites and API routes, use eas-hosting; for adding React Native screens to a native app, use expo-brownfield.
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
license: MIT
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# App Store Deployment
|
|
9
9
|
|
|
10
|
-
> **EAS service - costs apply.**
|
|
10
|
+
> **EAS service - costs apply.** Cloud builds use EAS plan resources, and EAS services have free-tier and paid-plan limits. Apple Developer and Google Play memberships are separate. Check https://expo.dev/pricing for the requested service.
|
|
11
11
|
|
|
12
|
-
This skill covers building and releasing
|
|
12
|
+
This skill covers building and releasing iOS and Android apps with EAS: Expo and other React Native projects, plus existing native apps. EAS is a delivery service; native apps can use it without adding Expo or React Native to their runtime. The native setup walkthrough currently covers SwiftUI/UIKit on iOS.
|
|
13
|
+
|
|
14
|
+
## Choose the project path
|
|
15
|
+
|
|
16
|
+
- **SwiftUI/UIKit app with no React Native runtime:** read [references/native-ios.md](references/native-ios.md) before changing its build configuration. Keep the Xcode project and Swift code as the app's source of truth. The Expo/React Native quick-start and development-client examples below do not apply to this path.
|
|
17
|
+
- **Native Android app with no React Native runtime:** preserve its existing native build setup. See [references/play-store.md](references/play-store.md) for submission; the Swift/iOS setup instructions do not apply. A dedicated native Android setup walkthrough is not yet included.
|
|
18
|
+
- **Expo/React Native app:** use the quick-start below, then the relevant store reference.
|
|
19
|
+
- **Adding React Native screens to an existing native app:** use `expo-brownfield` for that integration; return here for distribution.
|
|
20
|
+
|
|
21
|
+
Use the archive and icon checks in [references/native-ios.md](references/native-ios.md) during initial native iOS setup, after changing versioning, bundle IDs, or icons, or when diagnosing a rejected upload. Routine releases follow the EAS build/submit flow and the processing and availability checks in [references/testflight.md](references/testflight.md). A successful EAS build or a queued submission does not establish Apple acceptance, tester access, or an App Store release.
|
|
13
22
|
|
|
14
23
|
## References
|
|
15
24
|
|
|
@@ -20,8 +29,9 @@ Consult these resources as needed:
|
|
|
20
29
|
- ./references/app-store-metadata.md -- Managing App Store metadata and ASO optimization
|
|
21
30
|
- ./references/play-store.md -- Submitting Android builds to Google Play Store
|
|
22
31
|
- ./references/ios-app-store.md -- iOS App Store submission and review process
|
|
32
|
+
- ./references/native-ios.md -- Native Swift/SwiftUI/UIKit setup, versioning, and archive verification without an Expo runtime
|
|
23
33
|
|
|
24
|
-
## Quick Start
|
|
34
|
+
## Expo / React Native Quick Start
|
|
25
35
|
|
|
26
36
|
### Install EAS CLI
|
|
27
37
|
|
|
@@ -36,7 +46,7 @@ eas login
|
|
|
36
46
|
npx eas-cli@latest init
|
|
37
47
|
```
|
|
38
48
|
|
|
39
|
-
|
|
49
|
+
`eas init` links or creates the EAS project. Run `eas build:configure` to create build profiles in `eas.json`; preserve existing project and store identifiers when a release setup already exists.
|
|
40
50
|
|
|
41
51
|
## Build Commands
|
|
42
52
|
|
|
@@ -57,12 +67,12 @@ npx eas-cli@latest build --profile production
|
|
|
57
67
|
|
|
58
68
|
```bash
|
|
59
69
|
# iOS: Build and submit to App Store Connect
|
|
60
|
-
npx eas-cli@latest build -p ios --profile production --submit
|
|
70
|
+
npx eas-cli@latest build -p ios --profile production --auto-submit
|
|
61
71
|
|
|
62
72
|
# Android: Build and submit to Play Store
|
|
63
|
-
npx eas-cli@latest build -p android --profile production --submit
|
|
73
|
+
npx eas-cli@latest build -p android --profile production --auto-submit
|
|
64
74
|
|
|
65
|
-
#
|
|
75
|
+
# Expo / React Native shortcut for iOS TestFlight
|
|
66
76
|
npx testflight
|
|
67
77
|
```
|
|
68
78
|
|
|
@@ -72,7 +82,7 @@ Deploying an Expo website or Expo Router API routes to EAS Hosting (`npx expo ex
|
|
|
72
82
|
|
|
73
83
|
## EAS Configuration
|
|
74
84
|
|
|
75
|
-
|
|
85
|
+
Example for an Expo / React Native project (native Swift profiles are in `references/native-ios.md`):
|
|
76
86
|
|
|
77
87
|
```json
|
|
78
88
|
{
|
|
@@ -111,7 +121,8 @@ Standard `eas.json` for production deployments:
|
|
|
111
121
|
|
|
112
122
|
### iOS
|
|
113
123
|
|
|
114
|
-
-
|
|
124
|
+
- For native Swift apps, use the explicit build/submit flow in `references/native-ios.md`
|
|
125
|
+
- For Expo / React Native apps, `npx testflight` provides a quick TestFlight flow
|
|
115
126
|
- Configure Apple credentials via `eas credentials`
|
|
116
127
|
- See ./references/testflight.md for credential setup
|
|
117
128
|
- See ./references/ios-app-store.md for App Store submission
|
|
@@ -135,9 +146,11 @@ EAS manages version numbers automatically with `appVersionSource: "remote"`:
|
|
|
135
146
|
eas build:version:get
|
|
136
147
|
|
|
137
148
|
# Manually set version
|
|
138
|
-
eas build:version:set -p ios
|
|
149
|
+
eas build:version:set -p ios
|
|
139
150
|
```
|
|
140
151
|
|
|
152
|
+
The version-set command prompts for the value. When setting up or changing native iOS versioning, or diagnosing a duplicate build number, inspect the archived `CFBundleVersion`: the remote counter alone does not prove that Xcode used it.
|
|
153
|
+
|
|
141
154
|
## Monitoring
|
|
142
155
|
|
|
143
156
|
```bash
|
|
@@ -145,12 +158,15 @@ eas build:version:set -p ios --build-number 42
|
|
|
145
158
|
eas build:list
|
|
146
159
|
|
|
147
160
|
# Check build status
|
|
148
|
-
eas build:view
|
|
161
|
+
eas build:view BUILD_ID
|
|
149
162
|
|
|
150
|
-
#
|
|
151
|
-
eas submit:list
|
|
163
|
+
# Inspect submissions (verified with EAS CLI 23.2.0)
|
|
164
|
+
eas submit:list -p ios --json
|
|
165
|
+
eas submit:view SUBMISSION_ID --json
|
|
152
166
|
```
|
|
153
167
|
|
|
168
|
+
Check the CLI version before interpreting a missing command: these submission commands are available in 23.2.0 but not in the tested 18.6.0 installation. A pinned `npx eas-cli@23.2.0` invocation can use them without changing the global installation. See `references/testflight.md` for live Apple status and retry guidance. Follow the returned log URLs when the JSON result omits the underlying failure. Report the exact build ID/version and the furthest verified release state.
|
|
169
|
+
|
|
154
170
|
## Submitting Feedback
|
|
155
171
|
If you encounter errors, misleading or outdated information in this skill, report it so Expo can improve:
|
|
156
172
|
```bash
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
interface:
|
|
2
2
|
display_name: "EAS App Stores"
|
|
3
|
-
short_description: "Paid EAS service. Build and submit
|
|
4
|
-
default_prompt: "Use $eas-app-stores
|
|
3
|
+
short_description: "Paid EAS service. Build and submit iOS and Android apps."
|
|
4
|
+
default_prompt: "Use $eas-app-stores to set up or verify EAS builds, TestFlight and store submissions, signing, versioning, and store metadata for iOS and Android apps: Expo and other React Native projects, plus existing native apps."
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Submitting to iOS App Store
|
|
2
2
|
|
|
3
|
+
For native SwiftUI/UIKit apps without a React Native runtime, configure the Xcode/EAS path in [native-ios.md](native-ios.md) first. The signing, App Store Connect, and review stages below apply to both native Swift and Expo/React Native apps.
|
|
4
|
+
|
|
3
5
|
## Contents
|
|
4
6
|
|
|
5
7
|
- [Prerequisites](#prerequisites)
|
|
@@ -7,6 +9,7 @@
|
|
|
7
9
|
- [Submission Commands](#submission-commands)
|
|
8
10
|
- [App Store Connect Configuration](#app-store-connect-configuration)
|
|
9
11
|
- [TestFlight vs App Store](#testflight-vs-app-store)
|
|
12
|
+
- [Complete the Public Release](#complete-the-public-release)
|
|
10
13
|
- [App Review Process](#app-review-process)
|
|
11
14
|
- [Version and Build Numbers](#version-and-build-numbers)
|
|
12
15
|
- [Release Options](#release-options)
|
|
@@ -39,10 +42,7 @@ This interactive flow helps you:
|
|
|
39
42
|
|
|
40
43
|
API keys avoid 2FA prompts in CI/CD:
|
|
41
44
|
|
|
42
|
-
|
|
43
|
-
2. Click "+" to create a new key
|
|
44
|
-
3. Select "App Manager" role (minimum for submissions)
|
|
45
|
-
4. Download the `.p8` key file
|
|
45
|
+
Use `eas credentials -p ios` to select the build profile and configure its App Store Connect API key. Reuse a working managed key when one already exists. For an existing local team API key, configure the submit profile explicitly:
|
|
46
46
|
|
|
47
47
|
Configure in `eas.json`:
|
|
48
48
|
|
|
@@ -60,13 +60,7 @@ Configure in `eas.json`:
|
|
|
60
60
|
}
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
```bash
|
|
66
|
-
EXPO_ASC_API_KEY_PATH=./AuthKey.p8
|
|
67
|
-
EXPO_ASC_API_KEY_ISSUER_ID=xxxxx-xxxx-xxxx-xxxx-xxxxx
|
|
68
|
-
EXPO_ASC_API_KEY_ID=XXXXXXXXXX
|
|
69
|
-
```
|
|
63
|
+
Keep private key material outside version control. Use the installed CLI's credential flow and current documentation when setting up a different key type.
|
|
70
64
|
|
|
71
65
|
### Apple ID Authentication (Alternative)
|
|
72
66
|
|
|
@@ -75,23 +69,21 @@ For manual submissions, you can use Apple ID:
|
|
|
75
69
|
```bash
|
|
76
70
|
EXPO_APPLE_ID=your@email.com
|
|
77
71
|
EXPO_APPLE_TEAM_ID=XXXXXXXXXX
|
|
72
|
+
EXPO_APPLE_APP_SPECIFIC_PASSWORD=xxxx-xxxx-xxxx-xxxx
|
|
78
73
|
```
|
|
79
74
|
|
|
80
|
-
|
|
75
|
+
The app-specific password is for the upload flow. Interactive Apple Developer signing setup has a separate authentication flow.
|
|
81
76
|
|
|
82
77
|
## Submission Commands
|
|
83
78
|
|
|
84
79
|
```bash
|
|
85
80
|
# Build and submit to App Store Connect
|
|
86
|
-
eas build -p ios --profile production --submit
|
|
81
|
+
eas build -p ios --profile production --auto-submit
|
|
87
82
|
|
|
88
|
-
# Submit
|
|
89
|
-
eas submit -p ios --
|
|
83
|
+
# Submit the verified build
|
|
84
|
+
eas submit -p ios --profile production --id BUILD_ID
|
|
90
85
|
|
|
91
|
-
#
|
|
92
|
-
eas submit -p ios --id BUILD_ID
|
|
93
|
-
|
|
94
|
-
# Quick TestFlight submission
|
|
86
|
+
# Expo / React Native TestFlight shortcut
|
|
95
87
|
npx testflight
|
|
96
88
|
```
|
|
97
89
|
|
|
@@ -103,7 +95,7 @@ Before submitting, complete in App Store Connect:
|
|
|
103
95
|
|
|
104
96
|
1. **App Information**
|
|
105
97
|
- Primary language
|
|
106
|
-
- Bundle ID (must match
|
|
98
|
+
- Bundle ID (must match the archive; Xcode is authoritative for checked-in native projects)
|
|
107
99
|
- SKU (unique identifier)
|
|
108
100
|
|
|
109
101
|
2. **Pricing and Availability**
|
|
@@ -153,8 +145,8 @@ Find `ascAppId` in App Store Connect → App Information → Apple ID.
|
|
|
153
145
|
|
|
154
146
|
### TestFlight (Beta Testing)
|
|
155
147
|
|
|
156
|
-
- Builds
|
|
157
|
-
- Internal testers (up to 100) -
|
|
148
|
+
- Builds appear after Apple processing; compliance and group assignment may still need attention
|
|
149
|
+
- Internal testers (up to 100) - verify the build is available to the intended group
|
|
158
150
|
- External testers (up to 10,000) - requires beta review
|
|
159
151
|
- Builds expire after 90 days
|
|
160
152
|
|
|
@@ -164,6 +156,18 @@ Find `ascAppId` in App Store Connect → App Information → Apple ID.
|
|
|
164
156
|
- Submit for review from App Store Connect
|
|
165
157
|
- Choose release timing (immediate, scheduled, manual)
|
|
166
158
|
|
|
159
|
+
## Complete the Public Release
|
|
160
|
+
|
|
161
|
+
EAS Submit uploads the binary to App Store Connect. Public distribution continues through the app version's App Review and release flow, as described in the [EAS Submit guide](https://docs.expo.dev/submit/ios/).
|
|
162
|
+
|
|
163
|
+
1. Open the correct app and iOS version in App Store Connect. In its Build section, select the exact processed version/build you verified. Reuse an eligible TestFlight build when its code, icon, and configuration are ready for production; build again when those must change. Confirm the build is selectable for the App Store version. See [Apple's build-selection guide](https://developer.apple.com/help/app-store-connect/manage-builds/choose-a-build-to-submit/).
|
|
164
|
+
2. Complete the required listing and review information: screenshots, description, support/privacy URLs, age rating, privacy declarations, export compliance, reviewer contact/login, and pricing/availability as applicable. Resolve the version's outstanding requirements before submission.
|
|
165
|
+
3. Choose the requested release timing: manual release, automatic release after approval, or automatic release no earlier than a chosen date. Approval is still required for the date-based option.
|
|
166
|
+
4. Click **Add for Review**, inspect the draft submission, then **Submit for Review**. Adding to a draft alone does not send it to Apple. Handle review messages and verify the resulting status. See [Apple's submission steps](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/submit-an-app/).
|
|
167
|
+
5. After approval, follow the selected release timing. For manual release, the version waits in **Pending Developer Release** until **Release This Version** is completed. Verify availability in the intended storefronts before reporting it live. See [Apple's release options](https://developer.apple.com/help/app-store-connect/manage-your-apps-availability/select-an-app-store-version-release-option/).
|
|
168
|
+
|
|
169
|
+
Perform these publication steps only within the requested release scope. Preparing documentation or uploading a TestFlight beta does not itself request a public launch. Report the exact version/build and distinguish uploaded, submitted for review, approved, and publicly available.
|
|
170
|
+
|
|
167
171
|
## App Review Process
|
|
168
172
|
|
|
169
173
|
### What Reviewers Check
|
|
@@ -201,7 +205,7 @@ iOS uses two version identifiers:
|
|
|
201
205
|
- **Version** (`CFBundleShortVersionString`): User-facing, e.g., "1.2.3"
|
|
202
206
|
- **Build Number** (`CFBundleVersion`): Internal, must increment for each upload
|
|
203
207
|
|
|
204
|
-
|
|
208
|
+
For Expo projects whose native files are generated from app config, configure in `app.json`:
|
|
205
209
|
|
|
206
210
|
```json
|
|
207
211
|
{
|
|
@@ -214,10 +218,12 @@ Configure in `app.json`:
|
|
|
214
218
|
}
|
|
215
219
|
```
|
|
216
220
|
|
|
217
|
-
With `autoIncrement: true
|
|
221
|
+
With `autoIncrement: true` and remote versioning, EAS increments its counter and writes native version metadata during the build. When setting up or changing native Swift versioning, or diagnosing a duplicate build number, verify the archive's `CFBundleVersion` as described in [native-ios.md](native-ios.md). A changing remote counter does not prove Xcode used it.
|
|
218
222
|
|
|
219
223
|
## Release Options
|
|
220
224
|
|
|
225
|
+
These JSON examples are fragments of `store.config.json` for EAS Metadata. They configure release timing; uploading with EAS Submit still requires selecting the processed build and completing App Review before a public release.
|
|
226
|
+
|
|
221
227
|
### Automatic Release
|
|
222
228
|
|
|
223
229
|
Release immediately when approved:
|
|
@@ -279,9 +285,6 @@ Rollout: Day 1 (1%) → Day 2 (2%) → Day 3 (5%) → Day 4 (10%) → Day 5 (20%
|
|
|
279
285
|
|
|
280
286
|
```bash
|
|
281
287
|
eas credentials -p ios
|
|
282
|
-
|
|
283
|
-
# Sync with Apple Developer Portal
|
|
284
|
-
eas credentials -p ios --sync
|
|
285
288
|
```
|
|
286
289
|
|
|
287
290
|
## App Store Metadata
|
|
@@ -306,11 +309,11 @@ Create the app in App Store Connect first with matching bundle ID.
|
|
|
306
309
|
|
|
307
310
|
### "The bundle version must be higher"
|
|
308
311
|
|
|
309
|
-
|
|
312
|
+
Compare the number inside the rejected archive with EAS's remote counter. For native Swift, check the plist/build-setting ownership described in [native-ios.md](native-ios.md), then rebuild and submit the corrected artifact.
|
|
310
313
|
|
|
311
314
|
### "Missing compliance information"
|
|
312
315
|
|
|
313
|
-
|
|
316
|
+
Review the app's actual encryption use and complete Apple's export-compliance requirements. For an Expo app generated from app config, an exempt app can declare:
|
|
314
317
|
|
|
315
318
|
```json
|
|
316
319
|
{
|
|
@@ -324,10 +327,12 @@ Add export compliance to `app.json`:
|
|
|
324
327
|
}
|
|
325
328
|
```
|
|
326
329
|
|
|
330
|
+
For a checked-in Swift app, the equivalent declaration belongs in its native Info.plist as `ITSAppUsesNonExemptEncryption`. Use the value appropriate to the app; changing app.json alone does not update its native plist.
|
|
331
|
+
|
|
327
332
|
### "Invalid provisioning profile"
|
|
328
333
|
|
|
329
334
|
```bash
|
|
330
|
-
eas credentials -p ios
|
|
335
|
+
eas credentials -p ios
|
|
331
336
|
```
|
|
332
337
|
|
|
333
338
|
### Build stuck in "Processing"
|
|
@@ -340,7 +345,7 @@ For automated submissions in CI/CD:
|
|
|
340
345
|
|
|
341
346
|
```yaml
|
|
342
347
|
# .eas/workflows/release.yml
|
|
343
|
-
name:
|
|
348
|
+
name: Upload production iOS build
|
|
344
349
|
|
|
345
350
|
on:
|
|
346
351
|
push:
|
|
@@ -357,7 +362,7 @@ jobs:
|
|
|
357
362
|
type: submit
|
|
358
363
|
needs: [build]
|
|
359
364
|
params:
|
|
360
|
-
|
|
365
|
+
build_id: ${{ needs.build.outputs.build_id }}
|
|
361
366
|
profile: production
|
|
362
367
|
```
|
|
363
368
|
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# Native Swift iOS apps on EAS
|
|
2
|
+
|
|
3
|
+
Use this path when the app runs SwiftUI or UIKit and the task is to build or distribute it with EAS. Adding React Native screens is a different task. [EAS Build supports native projects without Expo or React Native](https://docs.expo.dev/build/introduction/), but the main setup tutorials assume a React Native project.
|
|
4
|
+
|
|
5
|
+
## Keep the delivery wrapper small
|
|
6
|
+
|
|
7
|
+
Inspect the Xcode project, shared scheme, Swift entry point, dependencies, signing settings, and current release configuration first. Keep hand-maintained native code checked in. Running `expo prebuild --clean` would regenerate native directories; it is not a setup step for this path.
|
|
8
|
+
|
|
9
|
+
The default EAS iOS pipeline expects a project beneath `ios/`. A typical layout is:
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
app.json
|
|
13
|
+
eas.json
|
|
14
|
+
package.json
|
|
15
|
+
package-lock.json
|
|
16
|
+
ios/
|
|
17
|
+
Podfile
|
|
18
|
+
MyApp.xcodeproj/
|
|
19
|
+
MyApp/
|
|
20
|
+
MyApp.swift
|
|
21
|
+
Info.plist
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
The package file is tooling metadata, not a JavaScript app. A project with no Node dependencies can use:
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"name": "my-app",
|
|
29
|
+
"version": "1.0.0",
|
|
30
|
+
"private": true
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Keep a matching lockfile for the chosen package manager. Do not add `expo`, `react`, `react-native`, an `index.js`, Metro, or `expo-dev-client` merely to use EAS. Preserve those dependencies if the app actually uses them. EAS CLI can read a minimal `app.json` without an installed Expo SDK:
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"expo": {
|
|
39
|
+
"name": "My App",
|
|
40
|
+
"slug": "my-app",
|
|
41
|
+
"ios": { "bundleIdentifier": "com.example.myapp" }
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
`eas init` links the project and writes `extra.eas.projectId`. Reuse the existing ID when one exists. The `expo` JSON key is EAS configuration here, not evidence of an Expo runtime. Xcode's bundle identifier is authoritative for a checked-in native project; keep any duplicate app-config identifier consistent, particularly for GitHub-triggered builds.
|
|
47
|
+
|
|
48
|
+
The [default iOS worker](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/builders/ios.ts) skips prebuild for checked-in native projects but still runs `pod install`. For an app with no pods, a minimal `Podfile` can serve as an adapter:
|
|
49
|
+
|
|
50
|
+
```ruby
|
|
51
|
+
platform :ios, '17.0'
|
|
52
|
+
|
|
53
|
+
target 'MyApp' do
|
|
54
|
+
end
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Use the app's real deployment target and target name. This does not add React Native pods. If the project must avoid CocoaPods or has a different layout, use a [custom EAS build](https://docs.expo.dev/custom-builds/get-started/) or archive/export with Xcode and submit the resulting IPA. Do not relocate an established native project just to match this example.
|
|
58
|
+
|
|
59
|
+
## Build and submit profiles
|
|
60
|
+
|
|
61
|
+
Select the actual shared scheme. Set `ios.image` from the [current build-image list](https://docs.expo.dev/build-reference/infrastructure/) when a particular Xcode/SDK is required. Use explicit build configurations; `developmentClient: true` configures Expo's development client, not generic Swift debugging.
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"cli": { "appVersionSource": "remote" },
|
|
66
|
+
"build": {
|
|
67
|
+
"base": { "ios": { "scheme": "MyApp" } },
|
|
68
|
+
"simulator": {
|
|
69
|
+
"extends": "base",
|
|
70
|
+
"ios": { "simulator": true, "buildConfiguration": "Debug" }
|
|
71
|
+
},
|
|
72
|
+
"testflight": {
|
|
73
|
+
"extends": "base",
|
|
74
|
+
"distribution": "store",
|
|
75
|
+
"autoIncrement": true,
|
|
76
|
+
"ios": { "buildConfiguration": "Release" }
|
|
77
|
+
},
|
|
78
|
+
"production": {
|
|
79
|
+
"extends": "base",
|
|
80
|
+
"distribution": "store",
|
|
81
|
+
"autoIncrement": true,
|
|
82
|
+
"ios": { "buildConfiguration": "Release" }
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"submit": {
|
|
86
|
+
"testflight": { "ios": { "ascAppId": "1234567890" } },
|
|
87
|
+
"production": { "ios": { "ascAppId": "1234567890" } }
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
The IDs and target names above are examples. `ascAppId` is the numeric App Store Connect app ID, not the EAS project UUID, bundle ID, or Apple team ID. Verify the selected Apple team, the native bundle ID, and the app record together; one Apple login may belong to multiple organizations.
|
|
93
|
+
|
|
94
|
+
A pure Swift wrapper with neither Expo dependencies nor Expo SDK metadata needs no Expo Doctor or JavaScript-bundling skip flags. Existing native build phases and actual dependency integrations still need inspection. Avoid carrying unexplained environment overrides from a React Native template; keep native compiler settings in the Xcode project or xcconfig and retain Release debug symbols for crash reports.
|
|
95
|
+
|
|
96
|
+
For icon selection or other native build preparation, use an EAS lifecycle hook such as `eas-build-post-install` when necessary. An Expo config/prebuild plugin will not run on this native path. Preserve an existing hook rather than replacing its other work.
|
|
97
|
+
|
|
98
|
+
## Versioning and icon troubleshooting
|
|
99
|
+
|
|
100
|
+
These checks address two failures encountered while testing a SwiftUI release: a stale archive build number and a default icon with an alpha channel. Use the relevant check during initial setup, after changing versioning, bundle IDs, or icons, or to diagnose a rejected upload. Routine releases use the EAS build/submit flow below.
|
|
101
|
+
|
|
102
|
+
EAS remote versioning increments a counter. The [native version updater](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/build/ios/version.ts) writes `CFBundleVersion` to the target's explicit `INFOPLIST_FILE`. A generated plist with a fixed `CURRENT_PROJECT_VERSION` can leave every archive reporting build 1 even while the EAS dashboard reports increasing numbers.
|
|
103
|
+
|
|
104
|
+
For the default pipeline, an explicit app plist is a tested approach:
|
|
105
|
+
|
|
106
|
+
```text
|
|
107
|
+
GENERATE_INFOPLIST_FILE = NO
|
|
108
|
+
INFOPLIST_FILE = MyApp/Info.plist
|
|
109
|
+
MARKETING_VERSION = 1.0.0
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Include these entries in the complete app plist:
|
|
113
|
+
|
|
114
|
+
```xml
|
|
115
|
+
<key>CFBundleShortVersionString</key>
|
|
116
|
+
<string>$(MARKETING_VERSION)</string>
|
|
117
|
+
<key>CFBundleVersion</key>
|
|
118
|
+
<string>1</string>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
That local build number is a starting value; EAS writes the remote value during the store build. Apply the settings to the app's relevant configurations and preserve the rest of its metadata: identity, privacy usage descriptions, scene/launch configuration, orientations and supported devices. Do not replace a full plist with this excerpt or change test targets indiscriminately. Review extension targets' version synchronization separately.
|
|
122
|
+
|
|
123
|
+
An existing generated-plist setup can also work if its build process explicitly sets `CURRENT_PROJECT_VERSION` before archiving. Keep it when verified; do not migrate every native project automatically. Changing only `app.json` or observing an incremented remote counter is insufficient evidence.
|
|
124
|
+
|
|
125
|
+
When setting up or changing versioning or the bundle ID, or diagnosing a rejected upload, inspect the built app's plist with macOS's built-in tools:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
plutil -p "/path/to/MyApp.xcarchive/Products/Applications/MyApp.app/Info.plist"
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
For a downloaded `.ipa`, unzip it into a temporary directory and inspect `Payload/MyApp.app/Info.plist`; for a built `.app`, inspect its `Info.plist` directly. Compare `CFBundleIdentifier`, `CFBundleShortVersionString`, and `CFBundleVersion` with the intended release. Values must be resolved strings, and `CFBundleSupportedPlatforms` must contain `iPhoneOS`, not `iPhoneSimulator`. `eas build:view BUILD_ID --json` provides build details and the artifact URL; its reported version is not a substitute for checking the archive.
|
|
132
|
+
|
|
133
|
+
When adding or changing a default (Any/light) 1024px AppIcon PNG, or diagnosing an icon rejection, inspect the source selected by that build profile:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
sips -g pixelWidth -g pixelHeight -g hasAlpha "/path/to/AppIcon.appiconset/icon.png"
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
The default icon should be 1024×1024 with no alpha channel, even if every pixel looks opaque. Preserve transparency in dark variants and Icon Composer layers; follow [Apple's guidance for each appearance](https://developer.apple.com/documentation/xcode/configuring-your-app-icon). These local checks help diagnose the artifact; use the EAS submission logs and Apple processing status to verify acceptance.
|
|
140
|
+
|
|
141
|
+
Check privacy usage descriptions against the features used by the app. Set the encryption declaration according to the app's actual encryption use; do not copy `false` solely to suppress an export-compliance prompt.
|
|
142
|
+
|
|
143
|
+
## Ship the exact build
|
|
144
|
+
|
|
145
|
+
Reuse established EAS/Apple credentials. For a new setup, configure signing with `eas credentials -p ios` and select the correct team. An App Store Connect API key supports unattended submission without changing the app's owner or bundle ID.
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
eas build --platform ios --profile testflight --no-wait --non-interactive
|
|
149
|
+
# Record the returned build ID; verify its result and source revision.
|
|
150
|
+
eas submit --platform ios --profile testflight --id BUILD_ID --non-interactive
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
For an IPA exported elsewhere:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
eas submit --platform ios --profile testflight --path /path/to/MyApp.ipa
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Use the explicit ID when multiple builds exist. Keep the distribution scope the user requested. Follow the submission's worker logs through Apple processing, then check tester availability in App Store Connect. A successful upload does not create tester access or release the app publicly.
|
|
160
|
+
|
|
161
|
+
For production, reuse an eligible uploaded build when it already has the intended release code, icon, configuration, and version. If the beta build uses a preview icon or different configuration, create and verify a production-profile build, then upload that exact archive. A second upload is not required solely to move an eligible tested build into App Review.
|
|
162
|
+
|
|
163
|
+
Complete the [public release steps in App Store Connect](ios-app-store.md#complete-the-public-release): select the processed build, finish the listing/privacy/review information, submit for App Review, and apply the requested release timing. The [official EAS Submit guide](https://docs.expo.dev/submit/ios/) describes this handoff. TestFlight distribution alone does not authorize publishing an App Store release.
|
|
164
|
+
|
|
165
|
+
## Verification scope
|
|
166
|
+
|
|
167
|
+
This approach was exercised with a SwiftUI app on EAS CLI 18.6.0 and Xcode 26.2: an isolated default-pipeline simulator build succeeded without Expo/React/React Native dependencies or skip flags. The explicit-plist and opaque-icon fixes were also verified by a signed device build accepted by Apple. Recheck worker/CLI behavior when updating tooling; project layout, custom hooks, extensions and signing requirements can differ.
|
|
@@ -133,7 +133,7 @@ This releases to 10% of users. Increase via Play Console or subsequent submissio
|
|
|
133
133
|
|
|
134
134
|
```bash
|
|
135
135
|
# Build and submit to internal track
|
|
136
|
-
eas build -p android --profile production --submit
|
|
136
|
+
eas build -p android --profile production --auto-submit
|
|
137
137
|
|
|
138
138
|
# Submit existing build to Play Store
|
|
139
139
|
eas submit -p android --latest
|
|
@@ -231,13 +231,9 @@ Or use EAS Update for OTA updates to existing installs.
|
|
|
231
231
|
|
|
232
232
|
## Monitoring Submissions
|
|
233
233
|
|
|
234
|
-
|
|
235
|
-
# Check submission status
|
|
236
|
-
eas submit:list -p android
|
|
234
|
+
Follow the submission URL returned by `eas submit` for status and logs. Check Play Console for the resulting track and release state.
|
|
237
235
|
|
|
238
|
-
|
|
239
|
-
eas submit:view SUBMISSION_ID
|
|
240
|
-
```
|
|
236
|
+
With EAS CLI 23.2.0, `eas submit:list -p android --json` and `eas submit:view SUBMISSION_ID --json` report EAS submission jobs. `submit:status` currently reads Apple status only; do not treat an EAS job's success as confirmation of Play Console rollout.
|
|
241
237
|
|
|
242
238
|
## Tips
|
|
243
239
|
|