#310 by GitHub stars
expo/skills
A collection of AI agent skills for working with Expo projects and Expo Application Services
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
plugins/expo-experiments/skills/expo-migrate-module/SKILL.md
Week of Nov 2, 2026 · +25 / −21 lines
Before Instructions only → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.0.0
- 14 Use `expo` `57.0.21` or newer. Earlier `57.x` versions can compile the macros but lack many of the 2.0 features and performance optimizations, so do not target them. Before editing, check the target's installed version (`expo` in `package.json`/lockfile, or `npm ls expo`). If it is older, stop and tell the user to upgrade first.
+ 13 Use `expo` `58.0.21` or newer. Earlier `58.0.x` releases lack tuple conversion and the `swift:check` and `swift:expand` commands of `expo-modules-cli`. Older ones also lack `lazy` `@JS` properties, `SharedRef<T>` subclasses in `@SharedObject`, static shared-object members, and `.withAsync`, and the oldest lack closure arguments and free-form `Any` return values. SDK 57 also lacks `.concurrent`, `@Union`, and module auto-discovery. Do not target either. Before editing, check the installed version (`npm ls expo`, or the lockfile). If it is older, stop and tell the user to upgrade first.
- 16 Check the example app's own `package.json` too, not only the module root. The example app is the integration surface you build and launch in step 4, so it needs the same floor.
+ 15 Check the example app's own dependencies too, not only the module root. The example app is the integration surface you build and launch in step 4, so it needs the same floor.
- 18 This is a floor, not a guarantee: the exact macro and core surface still varies within `57.x`, so step 2 must still verify the checked-out source.
+ 17 This is a floor, not a guarantee: the macro and core surface changed in almost every `58.0.x` patch release, so step 2 must still verify the installed source.
- 20 SDK 57 ships the macros as **experimental and undocumented**, with the official beta in SDK 58. The API can still change under you. Say this to the user before a large migration, and prefer incremental mixed mode over converting a module wholesale.
+ 19 The macros are still **experimental and undocumented**: SDK 58 has no page about them in the Expo docs, and the API can still change under you. Say this to the user before a large migration, and prefer incremental mixed mode over converting a module wholesale.
- 26 - Read `references/compatibility.md` when the checked-out `expo-modules-core` version or branch is not known to support every requested macro. It explains how to verify the actual compile-time and runtime surface instead of guessing from a version number, and lists what the macros plugin gained through `0.10.0`.
+ 25 - Read `references/compatibility.md` when the checked-out `expo-modules-core` version or branch is not known to support every requested macro. It explains how to verify the actual compile-time and runtime surface instead of guessing from a version number, gives the SDK 58 status of each capability, and shows how to run the module scanners and the `expo-modules-cli` checks.
- 37 - function names, arity, labels, defaults, nullability, sync/async behavior, errors, and queue/thread semantics (note which `AsyncFunction` bodies do blocking or long-running work, and any `.runOnQueue(...)`)
+ 36 - function names, arity, labels, defaults, nullability, sync/async behavior, errors, and queue/thread semantics (note which `AsyncFunction` bodies do blocking or long-running work, any `.runOnQueue(...)`, and sync/async pairs that share a body, such as `readSync` and `read`)
- 39 - event wire names and payload shapes
+ 38 - event wire names and payload shapes, including events sent with no body (1.0 `sendEvent("name")` sends `{}`)
+ 55 A DSL member that takes or returns `JavaScriptValue` does not compile on SDK 58, so it cannot stay in the DSL. Migrate it to `@JS` with a `borrowing JavaScriptValue` parameter, as described in `references/migration-map.md`.
+ 56
- 66 - Do not migrate same-JS-name overloads unless the checked-out macro groups and dispatches them.
- 67 - Preserve async threading behavior. A 1.0 `AsyncFunction` body ran off the JS thread; a 2.0 `async` `@JS` member starts on it and leaves only at the first `await`. A body that never awaits therefore blocks the JS thread, with no change to the JS signature. Audit what runs before the first `await`, and never leave blocking I/O on the JS actor. Fix with `@JS(.concurrent)`, or restructure onto Swift Concurrency or a continuation. Queue-pinned functions get the same treatment. See the threading section in `references/migration-map.md`.
- 68 - Verify core support before migrating views, unions, synchronous events, shared-object static members, or free-form `Any` arguments. The macros plugin has shipped ahead of core on every one of these, so check the checked-out core rather than a plugin version, and leave unsupported members on the 1.0 DSL. `references/compatibility.md` has the per-capability checks.
- 69 - Keep `expo-module.config.json` listing every module class under `apple.modules`. The entries are bare Swift class names, so renaming a class during migration detaches the module silently: it builds, then is absent at runtime. A migrated class must also stay `public` or `open`. SDK 58's auto-discovery is what retires these entries.
+ 67 - Keep same-JS-name overloads on the DSL. The plugin does not dispatch overloads, and it reports two `@JS` members with one JS name on one object as a build error.
+ 68 - Preserve async threading behavior. A 1.0 `AsyncFunction` body ran off the JS thread; a 2.0 `async` `@JS` member starts on it and leaves only at the first `await`. A body that never awaits therefore blocks the JS thread, with no change to the JS signature. Audit what runs before the first `await`, and never leave blocking I/O on the JS actor. Fix with `@JS(.concurrent)`, return a `Task.detached` from a synchronous function, or restructure onto Swift Concurrency or a continuation. A plain `Task { }` in a `@JS` function that is not `nonisolated` starts on the JS thread, so it does not help. Queue-pinned functions get the same treatment; `.runOnQueue(.main)` becomes a `@MainActor` `async` function. Merge a sync/async pair that shares a body into one function with `.withAsync("name")`. See the threading section in `references/migration-map.md`.
+ 69 - Do not use `@ViewProps`, `@ExpoView`, or `@Event(sync: true)`. The plugin implements them, but SDK 58 core does not declare the two view macros and has no runtime support for synchronous events, so none of them builds. Keep 1.0 views on the DSL. Check the installed core for each of these instead of trusting a plugin version. `references/compatibility.md` has the per-capability checks.
+ 70 - Keep the `OnAppContextDestroys`, `OnAppEntersForeground`, `OnAppEntersBackground`, and `OnAppBecomesActive` components in `definition()`. 2.0 has no hook for them.
+ 71 - Keep the JS payload of every event. A `() -> Void` `@Event` sends `undefined`, but a 1.0 `sendEvent("name")` without a body sent `{}`. When JS code reads that payload, give the event an empty `@Record` payload type, which encodes to `{}`, or ask the user before you change it.
+ 72 - Keep `expo-module.config.json` as it is. When it has an `apple.modules` list (even an empty one), autolinking links only those classes. The entries are bare Swift class names, so renaming a class during migration detaches the module silently: it builds, then is absent at runtime. Without the list, autolinking links the `public` or `open` `@ExpoModule` classes that it finds in the package sources. It does not find a class that is still on the 1.0 DSL alone. A migrated class must stay `public` or `open` in both cases. Remove the list only when the user asks and every module class qualifies.
- 88 - the `expo-modules-core` version/branch checked out
+ 91 - the installed `expo` version, or the `expo-modules-core` branch when the module builds against a checkout
- 98 1. Build or type-check the Apple module against the target `expo-modules-core`.
- 99 2. Run native unit tests and JS/TS tests.
- 100 3. Build and launch the example app when the repository provides one.
- 101 4. Confirm `expo-module.config.json` still names every module class under `apple.modules`, matching the Swift class names as they now stand. A stale entry builds clean and fails only at runtime, so the example app must actually resolve the module, not merely compile.
- 102 5. Compare the final exported surface with the inventory from step 1.
- 103 6. Search for stale `Name`, migrated `Function`/`AsyncFunction`/`StaticFunction`/`StaticAsyncFunction`/`Property`/`Constant`/`Events` entries, old `sendEvent` calls, `@Field`, and duplicate registrations. Search the source you wrote, not macro expansion output.
+ 101 1. Run `npx --no-install expo-modules swift:check ios` from the module package root. It reports macro errors and warnings in seconds, without a build. `references/compatibility.md` describes it.
+ 102 2. Build or type-check the Apple module against the target `expo-modules-core`.
+ 103 3. Run native unit tests and JS/TS tests.
+ 104 4. Build and launch the example app when the repository provides one.
+ 105 5. Confirm that autolinking still links every module class. With an `apple.modules` list, each entry must match a Swift class name as it now stands. Without the list, run the `scanModules` check in `references/compatibility.md` and confirm that it reports every class as `public` or `open`. A stale entry or a missed class builds clean and fails only at runtime, so the example app must actually resolve the module, not merely compile.
+ 106 6. Compare the final exported surface with the inventory from step 1. The `scanExports` check in `references/compatibility.md` lists the JS names, parameters, and sync/async shape of every migrated member. Members that stay in the DSL are not in its output.
+ 107 7. Search for stale `Name`, migrated `Function`/`AsyncFunction`/`StaticFunction`/`StaticAsyncFunction`/`Property`/`Constant`/`Events` entries, old `sendEvent` calls, `@Field`, and duplicate registrations. Search the source you wrote, not macro expansion output.
- 105 Expansion tests alone are insufficient: generated macro code can look correct while failing to link or run against a mismatched core. If dependencies changed or macro plugin flags are missing, reinstall JS dependencies as appropriate, run the repository's CocoaPods installation workflow, and restart Xcode before diagnosing plugin communication failures.
+ 109 Expansion alone is insufficient: `swift:check` runs only the macros, so generated code with no diagnostics can still fail to link or run against a mismatched core. If dependencies changed or macro plugin flags are missing, reinstall JS dependencies as appropriate, run the repository's CocoaPods installation workflow, and restart Xcode before diagnosing plugin communication failures.
- 109 Never print macro-generated or core-internal symbol names to the user. `references/compatibility.md` cites them so you can grep for them, but they are implementation details that change between plugin revisions, and they are noise in a report. Name a capability by its macro (`@JS static`, `@Event(sync:)`) and by observable JS behavior. Say "the installed core does not support decoding free-form dictionary arguments yet", not the name of the missing method. The exception is a tracking issue on `expo/expo`, where the specific missing hook is the point.
+ 113 Never print macro-generated or core-internal symbol names to the user. `references/compatibility.md` cites them so you can grep for them, and the `swift:expand` output is full of them, but they are implementation details that change between plugin revisions, and they are noise in a report. Name a capability by its macro (`@JS static`, `@Event(sync:)`) and by observable JS behavior. Say "the installed core does not support synchronous events yet", not the name of the missing method. The exception is a tracking issue on `expo/expo`, where the specific missing hook is the point.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/eas-app-stores/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Network or broad shell → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.1.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/eas-hosting/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Network or broad shell → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.0.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/eas-observe/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Network or broad shell → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.4.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/eas-simulator/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Network or broad shell → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.0.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/eas-update/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Network or broad shell → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.0.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/eas-update-insights/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Instructions only → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.0.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/eas-workflows/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Network or broad shell → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 5 version: 1.0.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-animation/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Instructions only → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.0.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-app-clip/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-brownfield/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Instructions only → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-data-fetching/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Network or broad shell → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.0.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-design-system/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Instructions only → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.0.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-dev-client/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Instructions only → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.1.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-dom/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Instructions only → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.0.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-examples/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Network or broad shell → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 5 version: 1.0.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-module/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Instructions only → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.0.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-native-ui/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Instructions only → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.1.1
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-overview/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Instructions only → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.2.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-project-structure/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Instructions only → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.0.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-router/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Instructions only → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.0.1
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-ui/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Network or broad shell → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.0.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-upgrade/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Network or broad shell → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.0.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
plugins/expo/skills/expo-web-to-native/SKILL.md
Week of Nov 2, 2026 · +0 / −1 lines
Before Network or broad shell → After Network or broad shell
8a0dc4fa57ae → a9e5bd3fa00b
- 4 version: 1.0.0
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 8a0dc4fa57ae
No earlier version was observed for comparison.
Verified commit a9e5bd3fa00b4e61f632e43f85da73aee1942582
git clone --filter=blob:none --no-checkout https://github.com/expo/skills.git .hotskills/expo-skills && git -C .hotskills/expo-skills checkout --detach a9e5bd3fa00b4e61f632e43f85da73aee1942582
# Copy each selected skill directory from .hotskills/expo-skills into .claude/skills/<skill-name>/git clone --filter=blob:none --no-checkout https://github.com/expo/skills.git .hotskills/expo-skills && git -C .hotskills/expo-skills checkout --detach a9e5bd3fa00b4e61f632e43f85da73aee1942582
# Copy each selected skill directory from .hotskills/expo-skills into .agents/skills/<skill-name>/Heat
7.1- Star growth, last 7 daysAhead of 93% of tracked repositories
- Star growth, last 24 hoursAhead of 85% of tracked repositories
- Rank movement, last 7 daysAhead of 58% of tracked repositories
- Commits, last 30 daysAhead of 77% of tracked repositories
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekAhead of 0% of tracked repositories
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
Individual skills in this repository
- expo-migrate-module
plugins/expo-experiments/skills/expo-migrate-module - eas-app-stores
plugins/expo/skills/eas-app-stores - eas-hosting
plugins/expo/skills/eas-hosting - eas-observe
plugins/expo/skills/eas-observe - eas-simulator
plugins/expo/skills/eas-simulator - eas-update
plugins/expo/skills/eas-update - eas-update-insights
plugins/expo/skills/eas-update-insights - eas-workflows
plugins/expo/skills/eas-workflows - expo-animation
plugins/expo/skills/expo-animation - expo-app-clip
plugins/expo/skills/expo-app-clip - expo-brownfield
plugins/expo/skills/expo-brownfield - expo-data-fetching
plugins/expo/skills/expo-data-fetching - expo-design-system
plugins/expo/skills/expo-design-system - expo-dev-client
plugins/expo/skills/expo-dev-client - expo-dom
plugins/expo/skills/expo-dom - expo-examples
plugins/expo/skills/expo-examples - expo-module
plugins/expo/skills/expo-module - expo-native-ui
plugins/expo/skills/expo-native-ui - expo-overview
plugins/expo/skills/expo-overview - expo-project-structure
plugins/expo/skills/expo-project-structure - expo-router
plugins/expo/skills/expo-router - expo-ui
plugins/expo/skills/expo-ui - expo-upgrade
plugins/expo/skills/expo-upgrade - expo-web-to-native
plugins/expo/skills/expo-web-to-native
How it works
expo-migrate-module
When your agent uses it
Migrate an existing Apple/Swift Expo native module from the Expo Modules API 1.0 definition DSL to the 2.0 macro API (sometimes called v2) while preserving its JavaScript and TypeScript contract. Use when converting or incrementally adopting @ExpoModule, @JS, @Event, @SharedObject, or @Record in an existing module. Do not use for creating a new module, general Expo SDK upgrades, or Android/Kotlin migrations.
What it loads into context
Frontmatter
106 tokensAlways available to the agent
SKILL.md
2,935 tokensWhen the skill is activated
Reference documents
13,115 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Prerequisite
- References
- Workflow
- Handoff
- Submitting Feedback
Files
../../../../.claude-plugin/marketplace.jsonasset585 bytes../../.claude-plugin/plugin.jsonasset292 bytesSKILL.mdcore12,920 bytesSKILL.mdcore12,920 bytesSKILL.mdcore12,920 bytesagents/openai.yamlasset306 bytesreferences/compatibility.mddoc20,410 bytesreferences/example.mddoc7,948 bytesreferences/migration-map.mddoc25,418 bytes../../../expo/.claude-plugin/plugin.jsonasset221 bytes
Read SKILL.md
# Migrate an Expo Module
Migrate the Swift side of an existing Expo module without changing its observable JS API. Treat the current JS/TypeScript surface and tests as the compatibility contract. Leave Kotlin on the 1.0 DSL unless the user explicitly expands the task.
## Prerequisite
Use `expo` `58.0.21` or newer. Earlier `58.0.x` releases lack tuple conversion and the `swift:check` and `swift:expand` commands of `expo-modules-cli`. Older ones also lack `lazy` `@JS` properties, `SharedRef<T>` subclasses in `@SharedObject`, static shared-object members, and `.withAsync`, and the oldest lack closure arguments and free-form `Any` return values. SDK 57 also lacks `.concurrent`, `@Union`, and module auto-discovery. Do not target either. Before editing, check the installed version (`npm ls expo`, or the lockfile). If it is older, stop and tell the user to upgrade first.
Check the example app's own dependencies too, not only the module root. The example app is the integration surface you build and launch in step 4, so it needs the same floor.
This is a floor, not a guarantee: the macro and core surface changed in almost every `58.0.x` patch release, so step 2 must still verify the installed source.
The macros are still **experimental and undocumented**: SDK 58 has no page about them in the Expo docs, and the API can still change under you. Say this to the user before a large migration, and prefer incremental mixed mode over converting a module wholesale.
View the complete source on GitHubeas-app-stores
When your agent uses it
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.
What it loads into context
Frontmatter
100 tokensAlways available to the agent
SKILL.md
1,681 tokensWhen the skill is activated
Reference documents
11,565 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Choose the project path
- References
- Expo / React Native Quick Start
- Build Commands
- Web & API Route Hosting
- EAS Configuration
- Platform-Specific Guides
- Automated Releases
- Version Management
- Monitoring
- Submitting Feedback
Files
SKILL.mdcore7,461 bytesSKILL.mdcore7,461 bytesSKILL.mdcore7,461 bytesSKILL.mdcore7,461 bytesSKILL.mdcore7,461 bytesSKILL.mdcore7,461 bytesSKILL.mdcore7,461 bytesSKILL.mdcore7,461 bytesSKILL.mdcore7,461 bytesagents/openai.yamlasset343 bytesreferences/app-store-metadata.mddoc13,898 bytesreferences/ios-app-store.mddoc11,545 bytesreferences/native-ios.mddoc10,180 bytesreferences/play-store.mddoc5,790 bytesreferences/testflight.mddoc5,973 bytesreferences/workflows.mddoc2,175 bytes
Read SKILL.md
# App Store Deployment
> **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.
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.
## Choose the project path
- **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.
- **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.
- **Expo/React Native app:** use the quick-start below, then the relevant store reference.
- **Adding React Native screens to an existing native app:** use `expo-brownfield` for that integration; return here for distribution.
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.View the complete source on GitHubeas-hosting
When your agent uses it
Deploy Expo websites and Expo Router API routes to EAS Hosting - export the web bundle, run eas deploy for production and PR preview URLs, manage environment secrets and custom domains, and work within the Cloudflare Workers runtime. Also covers authoring API routes (+api.ts handlers, HTTP methods, request handling, CORS). Use when deploying an Expo web app or API routes, setting up EAS Hosting, or configuring hosting environments and domains. Not for native builds or store releases - use the eas-app-stores skill for those.
What it loads into context
Frontmatter
117 tokensAlways available to the agent
SKILL.md
2,749 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use API Routes
- When NOT to Use API Routes
- File Structure
- Basic API Route
- HTTP Methods
- Dynamic Routes
- Request Handling
- Environment Variables
- CORS Headers
- Error Handling
- Testing Locally
- Deployment to EAS Hosting
- EAS Hosting Runtime (Cloudflare Workers)
- Calling API Routes from Client
- Common Patterns
- Rules
- Submitting Feedback
Files
SKILL.mdcore11,527 bytesSKILL.mdcore11,527 bytesSKILL.mdcore11,527 bytesSKILL.mdcore11,527 bytesSKILL.mdcore11,527 bytesSKILL.mdcore11,527 bytesSKILL.mdcore11,527 bytesagents/openai.yamlasset444 bytes
Read SKILL.md
# EAS Hosting
> **EAS service - costs apply.** EAS Hosting is a paid Expo Application Services product with free-tier limits; production deploys use your plan's request and bandwidth allowance. See https://expo.dev/pricing. Authoring API routes and exporting the web bundle are free and open source, and you can self-host the exported server output instead of EAS Hosting.
EAS Hosting deploys your Expo **web app and API routes** to Expo's managed edge (Cloudflare Workers). Export the web bundle with `npx expo export -p web` and ship it with `eas deploy` - the same command deploys any Expo Router API routes bundled alongside it. This skill covers deploying a website, authoring API routes, and the hosting runtime; see the Deployment section below for the deploy workflow.
## When to Use API Routes
Use API routes when you need:
- **Server-side secrets** — API keys, database credentials, or tokens that must never reach the client
- **Database operations** — Direct database queries that shouldn't be exposed
- **Third-party API proxies** — Hide API keys when calling external services (OpenAI, Stripe, etc.)
- **Server-side validation** — Validate data before database writesView the complete source on GitHubeas-observe
When your agent uses it
Use for anything related to EAS Observe - adding `expo-observe` to an Expo project (AppMetricsRoot/ObserveRoot HOC, markInteractive and ObserveInteractiveMarker, the useObserve hook, the Expo Router / React Navigation integrations for per-route metrics, the expo-image and Reanimated integrations, user-defined events via `Observe.logEvent`, error reporting via ObserveErrorBoundary and `Observe.reportError`, native crash reporting, source map upload for symbolicated stack traces, and runtime config such as sampleRate and dispatchInDebug), querying via the EAS CLI (`eas observe:metrics-summary`, `observe:metrics`, `observe:routes`, `observe:events`, `observe:session`, `observe:versions`, `observe:errors`, `observe:event`) or the Expo MCP `observe_*` tools, interpreting the resulting metrics (cold/warm launch, TTR, TTI, navigation cold/warm TTR, update download, and the TTI frameRate/device/network params for triaging slow startups), or shipping an Observe integration inside a third-party package.
What it loads into context
Frontmatter
228 tokensAlways available to the agent
SKILL.md
1,313 tokensWhen the skill is activated
Reference documents
17,247 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Which reference to read
- Quick links to the docs
- Submitting Feedback
Files
SKILL.mdcore5,842 bytesSKILL.mdcore5,842 bytesSKILL.mdcore5,842 bytesagents/openai.yamlasset449 bytesreferences/library-integrations.mddoc6,922 bytesreferences/metrics.mddoc8,755 bytesreferences/queries.mddoc23,028 bytesreferences/setup.mddoc28,020 bytesreferences/third-party.mddoc4,666 bytes
Read SKILL.md
# EAS Observe
> **EAS service - costs apply.** EAS Observe is an Expo Application Services product. The free EAS plan allows up to 10,000 monthly active users, with a limited set of features; higher usage requires a paid subscription. For details, see https://expo.dev/pricing#plan-features.
EAS Observe tracks startup, navigation, and custom-event performance from production Expo apps, and records JavaScript errors and native crashes. It needs a development or production build — the native library is not in Expo Go.
> **Source of truth:** https://docs.expo.dev/eas/observe/ — always consult the canonical docs when API details matter, especially get-started, configuration, integrations, and the metrics reference. EAS Observe is evolving; this skill's references are written to stay accurate but may lag the docs.
## Which reference to read
The five reference files in `./references/` cover what people typically need this skill for:
- **Adding EAS Observe to a project** → [`./references/setup.md`](./references/setup.md). Install, wrap the root layout (`AppMetricsRoot` on SDK 55, `ObserveRoot` on SDK 56+), mark the app interactive (global `markInteractive()` on SDK 55, the `useObserve()` hook or `<ObserveInteractiveMarker />` on SDK 56+), optional per-route navigation metrics through the Expo Router / React Navigation integrations, user-defined events via `Observe.logEvent` (SDK 56+), error reporting, and runtime configuration (sampling, dispatch, environments, custom endpoint).
- **Querying metrics from the terminal** → [`./references/queries.md`](./references/queries.md). The `eas observe:*` commands — `metrics-summary`, `metrics`, `routes`, `events`, `session`, `versions`, `errors`, `event` — with flags, metric aliases, table layouts, JSON shapes, and common workflows. Also the matching `observe_*` tools in the Expo MCP Server, and how their inputs differ from the CLI flags.View the complete source on GitHubeas-simulator
When your agent uses it
Run and control a user's app on a remote iOS/Android simulator hosted on EAS cloud. Read before running any `eas simulator:*` commands - it has the current syntax for this experimental API. Use whenever the user needs a simulator they can't run locally - 'run my app on a cloud simulator', 'use eas simulator to run/install/screenshot my app', 'I'm on Linux/Cursor and need an iOS device', 'no sim on this box / headless CI', 'let an agent click through my app and screenshot it', 'test my dev build on a remote sim with live reload', 'stream a sim to my browser' - even when they don't say 'EAS Simulator' or 'cloud'. On a host WITHOUT a local simulator (Linux, CI, cloud sandbox) it's the default; on macOS, do NOT auto-trigger for a plain 'run on the simulator' - use it only for a cloud/remote/shareable sim, an iOS version they lack, or an agent-driven session. NOT for local sims (expo run:ios, Xcode, Android Studio), EAS Build/Update, web preview, or physical devices.
What it loads into context
Frontmatter
311 tokensAlways available to the agent
SKILL.md
6,577 tokensWhen the skill is activated
Reference documents
14,952 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to use
- Cloud vs local: decide this first
- Prerequisites
- Session lifetime
- Check availability first
- The core loop (always the same)
- Always name the session
- Commands at a glance
- Running the user's app — pick a mode
- Driving the device (agent-device)
- When the app crashes: device logs and crash reports (iOS)
- Operating principles
- Stop and clean up
- References
- Submitting Feedback
Files
SKILL.mdcore26,727 bytesSKILL.mdcore26,727 bytesSKILL.mdcore26,727 bytesSKILL.mdcore26,727 bytesSKILL.mdcore26,727 bytesSKILL.mdcore26,727 bytesSKILL.mdcore26,727 bytesSKILL.mdcore26,727 bytesSKILL.mdcore26,727 bytesagents/openai.yamlasset426 bytesreferences/controllers.mddoc14,022 bytesreferences/logs-and-crashes.mddoc7,823 bytesreferences/run-your-app.mddoc22,142 bytesreferences/troubleshooting.mddoc14,872 bytes
Read SKILL.md
# EAS Simulator
> **EAS service - costs apply.** Sessions count toward your account's pricing and limits and stop at their maximum duration. Stop a session with `eas simulator:stop` when the task is done. See https://expo.dev/pricing for current terms.
EAS Simulator runs a remote iOS simulator or Android emulator on EAS infrastructure that you drive from your machine — from the CLI, from an AI agent (via `agent-device`), and from a browser preview. It's the unlock for **environments that can't run a simulator locally** (Linux boxes, cloud/background agents like Cursor Cloud), and for letting an agent *verify* a change on a real device instead of only reasoning about code.
The `simulator:*` commands are **experimental and hidden**, and need a recent eas-cli (≥ 20.3.0 as of writing) — which is why this skill runs everything via `npx --yes eas-cli@latest`. Flags and verbs may change; **the relevant subcommand's `--help` output is authoritative.**
## When to use
The frontmatter `description` carries the trigger phrases. In short: use this to get a user's app onto a **cloud** simulator and interact with it — especially from a Mac-less or cloud/sandbox agent. **Not** for local sims (`expo run:ios`, Xcode, Android Studio), store builds/signing (that's EAS Build), or physical devices. For the macOS case, see *Cloud vs local* next.
## Cloud vs local: decide this first
View the complete source on GitHubeas-update
When your agent uses it
Configure and use EAS Update for over-the-air JavaScript and asset updates with expo-updates and EAS CLI. Use when setting up OTA updates, running eas update:configure or eas update, publishing to preview/staging/production channels, explaining branches/channels/runtime versions, testing updates, or debugging why an installed build still shows old code. Load for TestFlight, preview, or production updates that do not appear, including questions about cold launches or reopening the app. Not for update health metrics; use eas-update-insights for adoption, crashes, and rollout monitoring.
What it loads into context
Frontmatter
153 tokensAlways available to the agent
SKILL.md
2,021 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Start with the supported configuration path
- Keep the model straight
- Decide whether an update is compatible
- Publish deliberately
- Test according to the build type
- Debug a build that did not update
- Advanced and adjacent workflows
- Official references
- Submitting Feedback
Files
SKILL.mdcore9,922 bytesSKILL.mdcore9,922 bytesSKILL.mdcore9,922 bytesSKILL.mdcore9,922 bytesSKILL.mdcore9,922 bytesSKILL.mdcore9,922 bytesagents/openai.yamlasset359 bytes
Read SKILL.md
# EAS Update
> **EAS service - costs apply.** EAS Update is available on the Free plan; publishing and delivery use update, bandwidth, and storage allowances, with higher limits on paid plans. See https://expo.dev/pricing.
Use EAS Update to deliver compatible JavaScript, styling, and asset changes to installed apps without submitting a new native binary. Native-code changes still require a new build.
## Start with the supported configuration path
Before changing anything, inspect `package.json`, the Expo app config, `eas.json` if present, and whether `ios/` or `android/` are tracked. Use what you find when reviewing the CLI's changes:
- Preserve existing dynamic or platform-specific app configuration.
- If `eas.json` exists, preserve its profiles and existing channel assignments. The CLI adds a channel matching the profile name only to build profiles that do not already have one.
- If `eas.json` is absent, do not create it by hand. The CLI may direct the user to run `eas build:configure` separately.
- With tracked native projects, expect the CLI to synchronize the platform's native Update configuration. Without them, expect Continuous Native Generation to apply the native configuration during a later build.View the complete source on GitHubeas-update-insights
When your agent uses it
Check the health of published EAS Update: crash rates, install/launch counts, unique users, payload size, and the split between embedded and OTA users per channel. Use when the user asks how an update is performing, whether a rollout is healthy, how many users are on the embedded build vs OTA, or wants to gate CI on update health.
What it loads into context
Frontmatter
95 tokensAlways available to the agent
SKILL.md
3,034 tokensWhen the skill is activated
Reference documents
1,435 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to use this skill
- Prerequisites
- Commands at a glance
- Discovering IDs
- `eas update:insights <groupId>`
- `eas update:view <groupId> --insights`
- `eas channel:insights --channel <name> --runtime-version <version>`
- Common workflows
- Output tips
- Limitations
- Submitting Feedback
Files
SKILL.mdcore12,275 bytesSKILL.mdcore12,275 bytesSKILL.mdcore12,275 bytesSKILL.mdcore12,275 bytesSKILL.mdcore12,275 bytesSKILL.mdcore12,275 bytesSKILL.mdcore12,275 bytesSKILL.mdcore12,275 bytesSKILL.mdcore12,275 bytesSKILL.mdcore12,275 bytesagents/openai.yamlasset394 bytesreferences/channel-insights-schema.mddoc2,404 bytesreferences/update-insights-schema.mddoc2,514 bytes
Read SKILL.md
# EAS Update Insights
> **EAS service - costs apply.** Insights cover updates published through EAS Update, a paid Expo Application Services product with free-tier limits. Update delivery and the data behind these commands count against your plan's EAS Update usage. Review https://expo.dev/pricing.
Query the health of published EAS Update directly from the CLI: launches, failed launches, crash rates, unique users, payload size, the embedded-vs-OTA user split per channel, and the most popular updates per runtime version. The data is the same data that powers the update and channel detail pages on expo.dev; these commands expose it in the terminal in human and JSON form.
## When to use this skill
Use this when the user wants to assess the health or adoption of a published EAS Update: crash rates, install counts, unique users, bundle size, or the split between embedded and OTA users on a channel.
Example prompts:
- "How is the latest update doing?"
- "Is the latest update healthy?"View the complete source on GitHubeas-workflows
When your agent uses it
Helps understand and write EAS workflow YAML files for Expo projects. Use this skill when the user asks about CI/CD or workflows in an Expo or EAS context, mentions .eas/workflows/, or wants help with EAS build pipelines or deployment automation.
What it loads into context
Frontmatter
87 tokensAlways available to the agent
SKILL.md
1,064 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Reference Documentation
- Workflow File Location
- Top-Level Structure
- Expressions
- Generating Workflows
- Validation
- Answering Questions
- Submitting Feedback
Scripts executed separately
scripts/fetch.jsscripts/package.json
Files
SKILL.mdcore4,839 bytesSKILL.mdcore4,839 bytesSKILL.mdcore4,839 bytesSKILL.mdcore4,839 bytesagents/openai.yamlasset331 bytesscripts/fetch.jsruns2,979 bytesscripts/package.jsonruns103 bytes
Read SKILL.md
# EAS Workflows Skill
> **EAS service - costs apply.** EAS Workflows run on Expo Application Services, a paid product with free-tier limits. Each workflow job consumes your plan's build/compute minutes, and jobs that build or submit also need paid Apple Developer and Google Play accounts. Review https://expo.dev/pricing before triggering runs.
Help developers write and edit EAS CI/CD workflow YAML files.
## Reference Documentation
Fetch these resources before generating or editing workflow files, or when answering syntax questions. First resolve this skill's directory, then use the fetch script in its `scripts/` directory. It is implemented using Node.js and caches responses using ETags for efficiency:
```bash
# Fetch resources
node <skill-dir>/scripts/fetch.js <url>
```View the complete source on GitHubexpo-animation
When your agent uses it
Build animations in React Native and Expo, making the decisions in the order that determines whether they feel right — should it animate, which thread it runs on, which properties, spring or timing, how the gesture hands off, how it degrades. Writes the implementation with Reanimated, Gesture Handler, Expo Router and expo-haptics. Use when animating anything in an Expo app, adding gestures, sheets, screen transitions, press feedback or haptics, or fixing motion that stutters on device. For web animation use `animate`.
What it loads into context
Frontmatter
118 tokensAlways available to the agent
SKILL.md
4,609 tokensWhen the skill is activated
Reference documents
4,158 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Operating Posture
- Hard Rules
- The Build Sequence
- Setup that silently breaks motion
- 120fps
- Recipes
- Never Ship
- Output
- Tone
- Submitting Feedback
Files
LICENSEasset1,070 bytesRECIPES.mddoc16,822 bytesSKILL.mdcore18,999 bytesSKILL.mdcore18,999 bytesSKILL.mdcore18,999 bytesagents/openai.yamlasset216 bytes
Read SKILL.md
# Building Animations in Expo
This skill was created in collaboration with [Emil Kowalski](https://github.com/emilkowalski) and can also be found in the [emilkowalski/skills](https://github.com/emilkowalski/skills) repository, along with other useful animation skills.
A construction skill for React Native. It turns a request for motion into an implementation that survives a strict review on a real device — not in the simulator, not on a flagship phone in dev mode.
Mobile changes three things about animation, and everything in this skill follows from them:
1. **There is no hover.** Every affordance the web puts in hover has to live in press, position, or nothing.
2. **There are two runtimes.** Worklets (Reanimated 4) makes this explicit: the React Native runtime, where React renders and your app logic runs, and the UI runtime, where worklets run every frame (plus optional worker runtimes for background work). An animation that touches the RN runtime stutters the moment the app does anything else. The whole craft is keeping motion on the UI runtime.
3. **The user's finger is on the element.** Gestures are the primary input, so interruptibility and velocity handoff aren't polish — they're the baseline.
## Operating Posture
View the complete source on GitHubexpo-app-clip
When your agent uses it
Add an iOS App Clip target to an Expo app. Use when the user mentions App Clip, AASA, apple-app-site-association, appclips, smart app banner, or wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.
What it loads into context
Frontmatter
63 tokensAlways available to the agent
SKILL.md
2,508 tokensWhen the skill is activated
Reference documents
532 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Set `bundleIdentifier` and `appleTeamId`
- 2. Add the App Clip target
- 3. Wire up associated domains
- 4. Register bundle IDs and create the App Store entry
- 5. Host the AASA file
- 6. Add the Smart App Banner meta tag
- 7. Deploy the website
- 8. Mirror permissions
- 9. Build and submit to TestFlight
- 10. Configure App Clip metadata
- What you get
- Native detection (optional)
- References
- Submitting Feedback
Files
SKILL.mdcore9,651 bytesSKILL.mdcore9,651 bytesSKILL.mdcore9,651 bytesSKILL.mdcore9,651 bytesSKILL.mdcore9,651 bytesSKILL.mdcore9,651 bytesSKILL.mdcore9,651 bytesSKILL.mdcore9,651 bytesSKILL.mdcore9,651 bytesSKILL.mdcore9,651 bytesSKILL.mdcore9,651 bytesSKILL.mdcore9,651 bytesagents/openai.yamlasset426 bytesreferences/native-module.mddoc2,305 bytes
Read SKILL.md
# Add an App Clip to an Expo App
> **Requirements.** Adding the App Clip target is open source. Shipping one requires an Apple Developer Program membership and App Store review, and the AASA file must be served over HTTPS on your domain (any HTTPS host works; EAS Hosting is one option). Building via EAS Build or `bunx testflight` uses your EAS plan's build minutes. See https://expo.dev/pricing and https://developer.apple.com/app-clips/.
Adds an iOS App Clip target to an Expo project. The Clip lives in `targets/clip/`, ships alongside the parent app, and is invoked from a URL on the app's domain via an Apple App Site Association (AASA) file.
The parent app's bundle ID becomes `com.<username>.<app-name>` and the Clip's is automatically derived as `<parent>.clip` (e.g. `com.bacon.may20.clip`).
## 1. Set `bundleIdentifier` and `appleTeamId`
`bun create target` warns if these are missing. Add to `app.json`:
```json
{View the complete source on GitHubexpo-brownfield
When your agent uses it
Integrate Expo and React Native into an existing native iOS or Android app. Use for brownfield, embedding a React Native screen in SwiftUI/UIKit or Kotlin, or AAR/XCFramework packaging. Covers isolated and integrated approaches. For building or distributing a purely native app with EAS, use eas-app-stores.
What it loads into context
Frontmatter
74 tokensAlways available to the agent
SKILL.md
1,174 tokensWhen the skill is activated
Reference documents
16,238 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Inspect the host first
- Pick an approach
- References
- Shared prerequisites
- Select compatible versions
- Verify the feature in the host
- Submitting Feedback
Files
SKILL.mdcore5,850 bytesSKILL.mdcore5,850 bytesagents/openai.yamlasset420 bytesreferences/brownfield-integrated.mddoc22,723 bytesreferences/brownfield-isolated.mddoc22,287 bytesreferences/comparison.mddoc6,797 bytesreferences/feature-integration.mddoc10,149 bytesreferences/troubleshooting.mddoc8,381 bytesreferences/version-compatibility.mddoc4,464 bytes
Read SKILL.md
# Expo Brownfield
A **brownfield** app is an existing native iOS or Android app that adopts React Native incrementally, as opposed to a **greenfield** app that is React Native from day one.
## Inspect the host first
Identify the existing app entry point, navigation owner, native build system, deployment targets, and any React Native runtime already linked. Record the installed Expo, React Native, and brownfield package versions from the lockfile. Adding EAS Build or Submit to a Swift app alone does not require React Native; route that task to `eas-app-stores`.
Preserve the host's SwiftUI `App` / UIKit window and native screens when embedding a feature. **Do not run prebuild in a manually maintained native host**, including during troubleshooting. An isolated Expo producer may use CNG; keep its generated `ios/` and `android/` separate from the consuming app.
Expo supports two distinct ways to add React Native to a brownfield project:
| Approach | What ships to the native app | When to choose |
| -------------- | ------------------------------------------------------------------- | -------------------------------------------------------------------------------- |View the complete source on GitHubexpo-data-fetching
When your agent uses it
Use when implementing or debugging ANY network request, API call, or data fetching. Covers fetch API, React Query, SWR, error handling, caching, offline support, loading/empty/error screen states, and Expo Router data loaders (`useLoaderData`).
What it loads into context
Frontmatter
64 tokensAlways available to the agent
SKILL.md
3,289 tokensWhen the skill is activated
Reference documents
2,722 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- References
- When to Use
- Preferences
- Every Screen Has Four States
- Common Issues & Solutions
- Decision Tree
- Common Mistakes
- Example Invocations
- Submitting Feedback
Files
SKILL.mdcore13,647 bytesSKILL.mdcore13,647 bytesagents/openai.yamlasset421 bytesreferences/expo-router-loaders.mddoc9,838 bytesreferences/offline-and-cancellation.mddoc1,400 bytes
Read SKILL.md
# Expo Networking
**You MUST use this skill for ANY networking work including API requests, data fetching, caching, or network debugging.**
## References
Consult these resources as needed:
```
references/
expo-router-loaders.md Route-level data loading with Expo Router loaders (web, SDK 55+)
offline-and-cancellation.md NetInfo network status, offline-first React Query, AbortController
```
View the complete source on GitHubexpo-design-system
When your agent uses it
Build and maintain a design system inside an Expo app - a reusable theme of design tokens (color, spacing, typography, radius, shadow, motion), reusable component structure with variant/size/state prop conventions, and rules for when to extract a repeated view into a shared component. Use when creating or organizing theme files and design tokens (theme.ts / theme/), extending an existing theme or styling library (NativeWind, Tamagui, Restyle, Unistyles) in its own idiom, standardizing styles so screens (including AI-generated ones) look consistent and polished, fixing an app that looks AI-generated or generic instead of native (the named native-slop tells), building an in-app component library, or auditing an app for design-system drift (hardcoded colors, spacing, fonts). For platform styling specifics (semantic colors, HIG rules, native controls) use expo-native-ui; for folder layout of a new app use expo-project-structure.
What it loads into context
Frontmatter
204 tokensAlways available to the agent
SKILL.md
4,548 tokensWhen the skill is activated
Reference documents
4,135 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- References
- Adopt Before You Build
- The Theme
- Reusable Components
- Where Decisions Live
- Self-Critique Pass
- Named Failures: Native Slop
- Auditing an Existing App
- Submitting Feedback
Files
SKILL.mdcore19,420 bytesSKILL.mdcore19,420 bytesSKILL.mdcore19,420 bytesSKILL.mdcore19,420 bytesagents/openai.yamlasset576 bytesreferences/audit.mddoc8,462 bytesreferences/native-slop.mddoc8,440 bytes
Read SKILL.md
# Expo Design Systems
Make every screen in an app draw from one visual source of truth: a token theme and a small set of reusable components. This skill defines where tokens live, what they cover, how reusable components are shaped, and when a repeated view earns promotion into the system.
Sibling skills own the layers around this one:
- `expo-native-ui` - platform styling rules (HIG, semantic colors, controls, shadows syntax). Follow it for **what values look native**; follow this skill for **where values live and how they're reused**.
- `expo-project-structure` - folder skeleton for new apps.
For Tailwind projects, keep tokens in `global.css` as CSS variables and follow the styling library's own setup guidance. The scales and naming in this skill still apply; only the storage format changes.
## References
Consult these resources as needed:View the complete source on GitHubexpo-dev-client
When your agent uses it
Build and distribute Expo development clients locally or via TestFlight for internal testing. For production TestFlight releases and store submission, use the eas-app-stores skill.
What it loads into context
Frontmatter
43 tokensAlways available to the agent
SKILL.md
1,287 tokensWhen the skill is activated
Reference documents
480 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Important: When Development Clients Are Needed
- EAS Configuration
- Building for TestFlight
- Building Locally
- Installing Local Builds
- Building for Specific Platform
- Checking Build Status
- Using the Dev Client
- Troubleshooting
- Submitting Feedback
Files
SKILL.mdcore5,449 bytesSKILL.mdcore5,449 bytesSKILL.mdcore5,449 bytesSKILL.mdcore5,449 bytesSKILL.mdcore5,449 bytesSKILL.mdcore5,449 bytesSKILL.mdcore5,449 bytesSKILL.mdcore5,449 bytesSKILL.mdcore5,449 bytesSKILL.mdcore5,449 bytesSKILL.mdcore5,449 bytesSKILL.mdcore5,449 bytesSKILL.mdcore5,449 bytesSKILL.mdcore5,449 bytesSKILL.mdcore5,449 bytesagents/openai.yamlasset331 bytes../expo-overview/references/launch-without-dev-menu.mddoc1,751 bytes
Read SKILL.md
Use EAS Build to create development clients for testing native code changes on physical devices. Use this for creating custom Expo Go clients for testing branches of your app.
> **Free locally; cloud builds are paid.** `expo-dev-client` itself is open source and building locally is free. Building or distributing via EAS Build/TestFlight uses your EAS plan's build minutes and needs a paid Apple Developer account for device/TestFlight distribution. See https://expo.dev/pricing.
## Important: When Development Clients Are Needed
**Development clients are the recommended setup for any real or production app.** Expo Go is a playground for learning and quick experiments with the native libraries it bundles; most apps outgrow it and move to a development client. See [Expo Go vs. development builds](https://docs.expo.dev/develop/development-builds/introduction/) for the full reasoning.
You need a dev client ONLY when using:
- Local Expo modules (custom native code)
- Apple targets (widgets, app clips, extensions)
- Third-party native modules not in Expo Go
- Config plugins, or testing remote push notifications and App/Universal LinksView the complete source on GitHubexpo-dom
When your agent uses it
Use Expo DOM components to run web code in a webview on native and as-is on web. Migrate web code to native incrementally. For the end-to-end migration of a whole web app, use the expo-web-to-native skill.
What it loads into context
Frontmatter
59 tokensAlways available to the agent
SKILL.md
2,526 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What are DOM Components?
- When to Use DOM Components
- When NOT to Use DOM Components
- Basic DOM Component
- Rules for DOM Components
- The `dom` Prop
- Exposing Native Actions to the Webview
- Using Web Libraries
- CSS in DOM Components
- Expo Router in DOM Components
- Detecting DOM Environment
- Assets
- Usage from Native Components
- Platform Behavior
- Tips
- Submitting Feedback
Files
SKILL.mdcore10,367 bytesSKILL.mdcore10,367 bytesagents/openai.yamlasset371 bytes
Read SKILL.md
## What are DOM Components?
DOM components allow web code to run verbatim in a webview on native platforms while rendering as-is on web. This enables using web-only libraries like `recharts`, `react-syntax-highlighter`, or any React web library in your Expo app without modification.
## When to Use DOM Components
Use DOM components when you need:
- **Web-only libraries** — Charts (recharts, chart.js), syntax highlighters, rich text editors, or any library that depends on DOM APIs
- **Migrating web code** — Bring existing React web components to native without rewriting
- **Complex HTML/CSS layouts** — When CSS features aren't available in React Native
- **iframes or embeds** — Embedding external content that requires a browser context
- **Canvas or WebGL** — Web graphics APIs not available natively
View the complete source on GitHubexpo-examples
When your agent uses it
Expo's official example projects - the expo/examples repo of ~70 `with-*` integrations (Stripe, Clerk, Supabase, OpenAI, maps, Reanimated, SQLite, Skia, NativeWind, and more). Use when integrating a third-party library or service into an existing Expo app and you want the canonical, version-matched pattern to adapt, or when scaffolding a new project from one with `npx create-expo --example`.
What it loads into context
Frontmatter
146 tokensAlways available to the agent
SKILL.md
1,622 tokensWhen the skill is activated
Reference documents
1,205 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Two modes
- Workflow
- Gotchas
- Related skills
- References
- Submitting Feedback
Files
SKILL.mdcore6,759 bytesSKILL.mdcore6,759 bytesSKILL.mdcore6,759 bytesSKILL.mdcore6,759 bytesSKILL.mdcore6,759 bytesSKILL.mdcore6,759 bytesSKILL.mdcore6,759 bytesSKILL.mdcore6,759 bytesagents/openai.yamlasset399 bytesreferences/catalog.mddoc4,353 bytes
Read SKILL.md
# Expo Examples
[expo/examples](https://github.com/expo/examples) is Expo's official library of ~70 **integration examples** — directories named `with-<library>` (e.g. `with-stripe`, `with-maps`), each built around **one** library or service. These are not full apps: they're **managed** projects (no `ios/`/`android/` dirs — native setup is via config plugins), and the typical one is a **single screen of ~100–200 lines**. Mine them for the canonical integration *pattern* — the dependency set, `app.json` config plugins, and minimal wiring Expo maintains against the current SDK — and adapt that into the user's app. Don't expect to lift an application architecture from them.
Reach for an example before hand-rolling an integration. (Kinds — full-stack, showcases, starters — are noted in `./references/catalog.md`.)
## Two modes
1. **Inspiration / adapt** (most common) — the user already has a project. Find the matching example, read its key files, and apply the *pattern* to their code.
2. **Scaffold** — greenfield. Start a fresh project directly from the example.
## Workflow
### 1. Find the right exampleView the complete source on GitHubexpo-module
When your agent uses it
Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript). Covers module definition DSL, native views, shared objects, config plugins, lifecycle hooks, autolinking, and type system. Use when building or modifying native modules for Expo. Not for migrating an existing Swift module from the definition DSL to the Expo Modules API 2.0 macros; use expo-migrate-module (from the expo-experiments plugin) for that.
What it loads into context
Frontmatter
107 tokensAlways available to the agent
SKILL.md
1,434 tokensWhen the skill is activated
Reference documents
6,147 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- When to Use
- References
- Quick Start
- Recommended Workflow
- Practical Scaffolding Rules
- Core File Shapes
- Module Structure Reference
- Submitting Feedback
Files
SKILL.mdcore6,535 bytesSKILL.mdcore6,535 bytesagents/openai.yamlasset367 bytesreferences/config-plugin.mddoc2,040 bytesreferences/create-expo-module.mddoc10,075 bytesreferences/lifecycle.mddoc3,763 bytesreferences/module-config.mddoc1,762 bytesreferences/native-module.mddoc5,869 bytesreferences/native-view.mddoc3,590 bytes
Read SKILL.md
# Writing Expo Modules
Complete reference for building native modules and views using the Expo Modules API. Covers Swift (iOS), Kotlin (Android), and TypeScript.
## When to Use
- Creating a new Expo native module or native view
- Adding native functionality (camera, sensors, system APIs) to an Expo app
- Wrapping platform SDKs for React Native consumption
- Building config plugins that modify native project files
- Adding Android, Apple, or web support to an existing Expo module
- Editing `expo-module.config.json`, config plugins, or lifecycle hooks
To migrate an existing Swift module from the definition DSL to the Expo Modules API 2.0 macros (`@ExpoModule`, `@JS`, `@Event`), use the `expo-migrate-module` skill (from the `expo-experiments` plugin) instead.View the complete source on GitHubexpo-native-ui
When your agent uses it
Build beautiful, native-feeling Expo screens. Covers Apple HIG styling, semantic colors, native controls, SF Symbols, media, visual effects, gradients, storage, and responsive layout. For routing and navigation, use the expo-router skill; for motion and animation, use the expo-animation skill.
What it loads into context
Frontmatter
70 tokensAlways available to the agent
SKILL.md
2,884 tokensWhen the skill is activated
Reference documents
11,216 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- References
- Running the App
- Code Style
- Library Preferences
- Responsiveness
- Behavior
- General Styling Rules
- Colors
- Text Styling
- Shadows
- Submitting Feedback
Files
SKILL.mdcore12,589 bytesSKILL.mdcore12,589 bytesagents/openai.yamlasset408 bytesreferences/controls.mddoc5,018 bytesreferences/gradients.mddoc2,717 bytesreferences/icons.mddoc5,849 bytesreferences/media.mddoc6,229 bytesreferences/storage.mddoc2,935 bytesreferences/visual-effects.mddoc5,201 bytesreferences/webgpu-three.mddoc14,466 bytes
Read SKILL.md
# Expo Native UI Guidelines
For routes, links, stacks, tabs, modals, sheets, and headers, use the `expo-router` skill. For any motion — entering/exiting, gestures, springs, keyboard-driven UI — use the `expo-animation` skill.
> **Before picking any UI component, check `expo-ui` first.** `@expo/ui` provides native equivalents — BottomSheet, Button, Picker, Slider, Menu, Section, Switch, SegmentedControl, and more — rendered as real SwiftUI on iOS and Jetpack Compose on Android, available in Expo Go on SDK 56+ with no custom build. Load the **`expo-ui`** skill to find the right component before falling back to React Native built-ins or community libraries. This skill (`expo-native-ui`) covers the surrounding structure: Expo Router navigation, layout, styling, and visual effects.
## References
Consult these resources as needed:
```
references/
controls.md Native iOS: Switch, Slider, SegmentedControl, DateTimePicker, Picker
gradients.md CSS gradients via experimental_backgroundImage (New Arch only)View the complete source on GitHubexpo-overview
When your agent uses it
Entry point and router for every Expo or EAS task. Load this skill first — before writing code and before choosing another expo-* / eas-* skill — when the request, PRD, or spec mentions Expo, EAS, Expo Go, or an expo-* package, or the project has an `expo` dependency in `package.json`. Within that gate it also covers app specs and designs to implement (tabs, stacks, maps, lists, navigation, building from a screenshot), and phrasings like 'implement a mobile app', 'make my app look native', 'add navigation', 'fetch some data', 'upgrade my SDK', 'add Expo to my existing native app', 'ship to the App Store', or 'I'm new to Expo, where do I start'. A fully specified request (SDK pinned, libraries named, layout given) still routes through here — the shared setup rules still apply. Do NOT load it when neither signal is present: a bare React Native project with no `expo` dependency is not Expo work. Detects the real goal, routes to the right expo-* / eas-* skill, and owns the shared setup rules.
What it loads into context
Frontmatter
245 tokensAlways available to the agent
SKILL.md
2,344 tokensWhen the skill is activated
Reference documents
480 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Start Here — read before doing anything
- Skill Map (by goal)
- Shared setup rules
- When to skip the router hop
- Submitting Feedback
Files
SKILL.mdcore9,588 bytesSKILL.mdcore9,588 bytesSKILL.mdcore9,588 bytesagents/openai.yamlasset650 bytesreferences/launch-without-dev-menu.mddoc1,751 bytes
Read SKILL.md
# `expo-overview` — router & shared rules for Expo / EAS
## Start Here — read before doing anything
**Do not guess the skill from project files alone.** Many Expo goals look similar from
the filesystem but need different skills.
1. **Confirm this is Expo or EAS work** — the request mentions Expo or EAS, or
`package.json` has an `expo` dependency. Otherwise this skill does not apply.
A native app using EAS for delivery qualifies without an Expo runtime.
2. **Read the user's goal** — what outcome do they want, in plain terms?
3. **Classify it** using the Skill Map below, translating casual phrasing to a goal.
4. **Confirm intent** if ambiguous ("Sounds like you want to ship to the stores — that's
`eas-app-stores`. Right?"), then load that skill's `SKILL.md` and follow it.View the complete source on GitHubexpo-project-structure
When your agent uses it
Folder structure for a new Expo app. Use when scaffolding or laying out a new Expo project with Expo Router, or deciding where a file should live in one. For new projects only — never restructure an existing app to match.
What it loads into context
Frontmatter
58 tokensAlways available to the agent
SKILL.md
1,570 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- `src/` and `src/app`
- components/ — reusable UI
- screens/ — screen bodies
- server/ + app/api/ — separate server code
- Platform-specific code
- Colocate styles and tests
- AI and config files
- Submitting Feedback
Files
SKILL.mdcore6,518 bytesSKILL.mdcore6,518 bytesagents/openai.yamlasset316 bytes
Read SKILL.md
# Expo Project Structure
A starting skeleton for a **new** Expo app — one with no committed folder structure yet.
**Apply only to new projects.** If the app already has a layout, follow its existing conventions and leave files where they are — a default to start from, never a standard to enforce or migrate toward. When unsure whether a project is new, ask before moving anything.
The whole layout, assembled from the rules below:
```
├── assets/
├── scripts/
├── src/
│ ├── app/ # Expo Router routes ONLY — every file is a route
│ │ ├── api/ # server API routes, grouped hereView the complete source on GitHubexpo-router
When your agent uses it
Navigation and routing for Expo Router. Covers file-based routes, groups and dynamic routes, folder organization, Link with previews and context menus, native Stack, page titles, modals and form sheets, NativeTabs, headers and toolbars, and header search bars.
What it loads into context
Frontmatter
62 tokensAlways available to the agent
SKILL.md
1,672 tokensWhen the skill is activated
Reference documents
10,415 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- References
- Code Style
- Routes
- Library Preferences
- Behavior
- Link
- Stack
- Context Menus
- Link Previews
- Modal
- Sheet
- Common route structure
- Submitting Feedback
Files
SKILL.mdcore7,050 bytesSKILL.mdcore7,050 bytesagents/openai.yamlasset422 bytesreferences/form-sheet.mddoc6,320 bytesreferences/route-structure.mddoc5,106 bytesreferences/search.mddoc5,173 bytesreferences/tabs.mddoc13,323 bytesreferences/toolbar-and-headers.mddoc8,061 bytesreferences/zoom-transitions.mddoc4,848 bytes
Read SKILL.md
# Expo Router Navigation
Navigation and routing for Expo Router apps. For screen styling, colors, controls, media, and visual effects, use the `expo-native-ui` skill; for motion and gestures, use `expo-animation`.
## References
Consult these resources as needed:
```
references/
route-structure.md Route conventions, dynamic routes, groups, folder organization
tabs.md NativeTabs, migration from JS tabs, iOS 26 features
toolbar-and-headers.md Stack headers and toolbar buttons, menus, search (iOS only)
form-sheet.md Form sheets in expo-router: configuration, footers and background interaction.View the complete source on GitHubexpo-ui
When your agent uses it
Build native UI with the @expo/ui package: real SwiftUI on iOS and Jetpack Compose on Android. Default to @expo/ui for sheets (BottomSheet), pickers, sliders, toggles, menus, and grouped-form sections — do NOT reach for Reanimated, @gorhom/bottom-sheet, or RN built-in Picker/Switch; use @expo/ui instead. Fall back to RN built-ins only when @expo/ui is missing the component. NOTE: @expo/ui List renders native grouped rows like an iOS Settings screen — it is NOT a virtualized list; use FlatList/FlashList for large datasets. Covers universal components (Host, Column, Row, Button, Text, List, BottomSheet, FieldGroup, Switch, Slider, Picker, Menu), drop-in replacements for RN community libraries, and platform-specific SwiftUI/Jetpack Compose trees. Not for Expo Router navigation, Reanimated, or data fetching.
What it loads into context
Frontmatter
218 tokensAlways available to the agent
SKILL.md
1,709 tokensWhen the skill is activated
Reference documents
3,977 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Installation
- Use @expo/ui by default — don't reach for RN alternatives first
- Choosing an approach
- References
- Submitting Feedback
Scripts executed separately
scripts/list-components.js
Files
SKILL.mdcore6,982 bytesSKILL.mdcore6,982 bytesSKILL.mdcore6,982 bytesSKILL.mdcore6,982 bytesSKILL.mdcore6,982 bytesagents/openai.yamlasset722 bytesreferences/drop-in-replacements.mddoc2,085 bytesreferences/jetpack-compose.mddoc5,517 bytesreferences/swift-ui.mddoc4,397 bytesreferences/universal.mddoc4,792 bytesscripts/list-components.jsruns7,343 bytes
Read SKILL.md
# Expo UI (`@expo/ui`)
`@expo/ui` renders real native UI from React: SwiftUI on iOS, Jetpack Compose on Android. It also ships drop-in replacements for migrating off RN community UI libraries.
> These instructions track the latest Expo SDK. The **universal** layer requires **SDK 56+** and works in Expo Go — no custom build needed. Drop-in replacements and the platform-specific layers also exist on SDK 55. For component details on a specific SDK, refer to the Expo UI docs for that version.
## Installation
```bash
npx expo install @expo/ui
```
Every `@expo/ui` tree — universal or platform-specific — must be wrapped in `Host`.
View the complete source on GitHubexpo-upgrade
When your agent uses it
Guidelines for upgrading Expo SDK versions and fixing dependency issues
What it loads into context
Frontmatter
22 tokensAlways available to the agent
SKILL.md
1,764 tokensWhen the skill is activated
Reference documents
5,076 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- References
- Beta/Preview Releases
- Step-by-Step Upgrade Process
- Breaking Changes Checklist
- Prebuild for Native Changes
- Clear caches for bare workflow
- Housekeeping
- Deprecated Packages
- expo.install.exclude
- Removing patches
- Postcss
- Metro
- Hermes engine v1
- New Architecture
- Submitting Feedback
Files
SKILL.mdcore7,698 bytesSKILL.mdcore7,698 bytesSKILL.mdcore7,698 bytesSKILL.mdcore7,698 bytesSKILL.mdcore7,698 bytesSKILL.mdcore7,698 bytesagents/openai.yamlasset373 bytesreferences/expo-av-to-audio.mddoc3,683 bytesreferences/expo-av-to-video.mddoc4,262 bytesreferences/native-tabs.mddoc3,520 bytesreferences/new-architecture.mddoc2,177 bytesreferences/react-19.mddoc1,875 bytesreferences/react-compiler.mddoc1,645 bytesreferences/react-navigation-to-expo-router.mddoc4,174 bytes
Read SKILL.md
## References
- ./references/react-19.md -- SDK +54: React 19 changes (useContext → use, Context.Provider → Context, forwardRef removal)
- ./references/new-architecture.md -- SDK +53: New Architecture migration guide
- ./references/react-compiler.md -- SDK +54: React Compiler setup and migration guide
- ./references/native-tabs.md -- SDK +55: Native tabs changes (Icon/Label/Badge now accessed via NativeTabs.Trigger.\*)
- ./references/expo-av-to-audio.md -- SDK +55: Migrate audio playback and recording from expo-av to expo-audio
- ./references/expo-av-to-video.md -- SDK +55: Migrate video playback from expo-av to expo-video
- ./references/react-navigation-to-expo-router.md -- SDK +56: Migrate `@react-navigation/*` imports to `expo-router` entry points (codemod + manual mapping)
## Beta/Preview Releases
Beta versions use `.preview` suffix (e.g., `55.0.0-preview.2`), published under `@next` tag.
View the complete source on GitHubexpo-web-to-native
When your agent uses it
Migrate an existing web React app to a native iOS/Android app with Expo. Use when the user wants to turn a website into a mobile app, port a Next.js/Vite/CRA React codebase to React Native, reuse web code on native incrementally, or asks how web idioms (the DOM, CSS, React Router, localStorage, window) map to native. This is the end-to-end migration guide; use the `expo-dom` skill for the DOM-component mechanism itself.
What it loads into context
Frontmatter
114 tokensAlways available to the agent
SKILL.md
2,525 tokensWhen the skill is activated
Reference documents
5,731 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Principles
- Run it as a loop (recommended)
- The migration
- Verify by running, not compiling
- References
- Submitting Feedback
Files
SKILL.mdcore10,405 bytesSKILL.mdcore10,405 bytesagents/openai.yamlasset406 bytesreferences/false-friends.mddoc10,116 bytesreferences/native-patterns.mddoc4,398 bytesreferences/run-as-goal.mddoc3,709 bytesreferences/verify-on-device.mddoc4,216 bytes
Read SKILL.md
# Web to Native
A web React app does not *convert* to native — there is no transpiler. It **migrates**, screen by screen, the way a strangler fig grows around a tree and slowly replaces it: stand up a native shell, run the whole web UI inside it on day one, then strangle each screen into native in priority order. This skill is the spine that orders the work; each step hands off to an existing Expo skill rather than re-explaining it. It operationalizes Expo's [From Web to Native with React](https://expo.dev/blog/from-web-to-native-with-react) — read that for the why.
```mermaid
flowchart TD
A1[1 · Assess: write the worklist] --> A2[2 · Scaffold Expo shell]
A2 --> A3[3 · DOM-component shell<br/>· expo-dom · SHIP DAY ONE]
A3 --> A4[4 · Strangle screens to native<br/>highest-value first · expo-router]
A4 -->|more screens| A4
A4 --> A5[5 · Wire data / auth / storage<br/>· expo-data-fetching]
A5 --> A6[6 · Ship · eas-app-stores]
```
View the complete source on GitHubSkills included
- expo-migrate-module
- eas-app-stores
- eas-hosting
- eas-observe
- eas-simulator
- eas-update
- eas-update-insights
- eas-workflows
- expo-animation
- expo-app-clip
- expo-brownfield
- expo-data-fetching
- expo-design-system
- expo-dev-client
- expo-dom
- expo-examples
- expo-module
- expo-native-ui
- expo-overview
- expo-project-structure
- expo-router
- expo-ui
- expo-upgrade
- expo-web-to-native
Repository facts
- License
- MIT
- Created
- Nov 30, 2025
- Last pushed
- Nov 5, 2026
- Forks
- 263
- Open issues
- 26
- Project activity
- Active
Rank over the last 12 weeks
Now #310 · best #307 · up 65 in 30 days
- #307 on Oct 31
- #308 on Nov 1
- #307 on Nov 2
- #311 from Nov 3 to Nov 4
- #309 on Nov 5
- #310 since Nov 6
76 earlier periods
- #325 on Aug 2
- #329 from Aug 7 to Aug 8
- #328 on Aug 9
- #338 on Aug 10
- #339 on Aug 11
- #332 on Aug 12
- #336 on Aug 13
- #337 on Aug 14
- #335 on Aug 15
- #338 on Aug 16
- #337 on Aug 17
- #344 on Aug 18
- #343 on Aug 19
- #342 on Aug 20
- #346 on Aug 21
- #341 on Aug 22
- #346 on Aug 23
- #350 from Aug 24 to Aug 28
- #348 on Aug 29
- #344 on Aug 30
- #353 on Aug 31
- #360 on Sep 1
- #357 on Sep 2
- #363 on Sep 3
- #356 on Sep 4
- #358 on Sep 5
- #357 on Sep 6
- #366 on Sep 7
- #363 on Sep 8
- #365 on Sep 9
- #367 on Sep 10
- #361 on Sep 11
- #365 on Sep 12
- #364 on Sep 13
- #369 on Sep 14
- #372 on Sep 15
- #374 on Sep 16
- #371 on Sep 17
- #370 on Sep 18
- #362 on Sep 19
- #373 on Sep 20
- #371 on Sep 21
- #375 on Sep 22
- #369 on Sep 23
- #368 on Sep 24
- #367 on Sep 25
- #363 on Sep 26
- #366 on Sep 27
- #370 on Sep 28
- #379 on Sep 29
- #377 from Sep 30 to Oct 1
- #378 on Oct 2
- #371 on Oct 3
- #372 from Oct 5 to Oct 6
- #374 on Oct 7
- #375 on Oct 8
- #383 on Oct 9
- #374 on Oct 10
- #370 on Oct 11
- #374 on Oct 12
- #372 on Oct 13
- #375 on Oct 14
- #371 on Oct 15
- #375 on Oct 16
- #367 on Oct 17
- #373 on Oct 18
- #374 on Oct 19
- #375 on Oct 20
- #372 on Oct 21
- #374 on Oct 22
- #373 on Oct 23
- #367 on Oct 24
- #382 on Oct 25
- #332 on Oct 28
- #320 on Oct 29
- #312 on Oct 30
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 4, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 99 notes
plugins/expo-experiments/skills/expo-migrate-module/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo-experiments/skills/expo-migrate-module/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-app-stores/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-app-stores/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-app-stores/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-app-stores/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-app-stores/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-app-stores/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-app-stores/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-app-stores/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-hosting/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-hosting/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-hosting/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-hosting/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-hosting/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-hosting/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-observe/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-observe/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-simulator/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedplugins/expo/skills/eas-simulator/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- 5 broad permissionsin 5 files: eas-simulator/SKILL.md:1 eas-update/SKILL.md:1 eas-workflows/SKILL.md:1 and 2 more
- 3 dangerous shell commandsin 3 files: eas-simulator/references/logs-and-crashes.md:57 expo-upgrade/SKILL.md:44 expo-upgrade/references/new-architecture.md:72
- 280 network referencesin 57 files: expo-data-fetching/SKILL.md:56 expo-router/references/zoom-transitions.md:16 expo-app-clip/SKILL.md:8 and 54 more
- 1 obfuscation signalin 1 file: expo-native-ui/references/media.md:183
- No instruction overrides
- 3 executable scriptsin 3 files: eas-workflows/scripts/fetch.js:1 eas-workflows/scripts/package.json:1 expo-ui/scripts/list-components.js:1
- 16 references to secretsin 5 files: eas-hosting/SKILL.md:148 eas-simulator/references/controllers.md:26 expo-module/references/config-plugin.md:31 and 2 more
- No requests to vote in Hot
Show all 308 signals by file
plugins/expo/skills/eas-app-stores/SKILL.md
- Network accessline 9
> **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.
plugins/expo/skills/eas-app-stores/references/app-store-metadata.md
- Network accessline 67
"releaseNotes": "What's new in this version...", "promoText": "Limited time offer!", "privacyPolicyUrl": "https://example.com/privacy", - Network accessline 68
"promoText": "Limited time offer!", "privacyPolicyUrl": "https://example.com/privacy", "supportUrl": "https://example.com/support", - Network accessline 69
"privacyPolicyUrl": "https://example.com/privacy", - Network accessline 70
"supportUrl": "https://example.com/support", - Network accessline 71
"marketingUrl": "https://example.com" - Network accessline 289
// Fetch translations from CMS/localization service const translations = await fetch( - Network accessline 290
const translations = await fetch( - Network accessline 291
"https://api.example.com/app-store-copy" - Network accessline 448
Install the [Expo Tools extension](https://marketplace.visualstudio.com/items?itemName=expo.vscode-expo-tools) for:
plugins/expo/skills/eas-app-stores/references/ios-app-store.md
- Network accessline 24
1. **Apple Developer Account** - Enroll at [developer.apple.com](https://developer.apple.com) - Network accessline 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/). - Network accessline 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; b - Network accessline 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 versio - Network accessline 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. 4. Click **Add for Review**, inspect the dra - Network accessline 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://develop - Network accessline 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 l
plugins/expo/skills/eas-app-stores/references/native-ios.md
- Network accessline 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/bu - Network accessline 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 - Network accessline 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/ - Network accessline 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 - Network accessline 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 pl - Network accessline 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/documen - Network accessline 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
plugins/expo/skills/eas-app-stores/references/play-store.md
- Network accessline 5
1. **Google Play Console Account** - Register at [play.google.com/console](https://play.google.com/console)
plugins/expo/skills/eas-app-stores/references/testflight.md
- Network accessline 45
[Apple's TestFlight overview](https://developer.apple.com/help/app-store-connect/test-a-beta-version/testflight-overview/) describes tester limits and beta review. Processing, compliance, group assignment and invitations affect availability - Network accessline 62
Use [EAS Submit for iOS](https://docs.expo.dev/submit/ios/) for current CLI/configuration guidance, and [Apple's internal-tester guide](https://developer.apple.com/help/app-store-connect/test-a-beta-version/add-internal-testers/) for group
plugins/expo/skills/eas-hosting/SKILL.md
- Network accessline 9
> **EAS service - costs apply.** EAS Hosting is a paid Expo Application Services product with free-tier limits; production deploys use your plan's request and bandwidth allowance. See https://expo.dev/pricing. Authoring API routes and expor - Network accessline 144
const response = await fetch("https://api.openai.com/v1/chat/completions", { - Access to secretsline 148
[Credential-related source omitted] - Network accessline 209
This starts a local server at `http://localhost:8081` with full API route support. - Network accessline 214
curl http://localhost:8081/api/hello - Network accessline 215
curl -X POST http://localhost:8081/api/users -H "Content-Type: application/json" -d '{"name":"Test"}' - Access to secretsline 248
[Credential-related source omitted] - Network accessline 271
# https://docs.expo.dev/eas/workflows/syntax/#deploy - Network accessline 318
// Use fetch instead of node-fetch const response = await fetch("https://api.example.com"); - Network accessline 319
const response = await fetch("https://api.example.com"); - Access to secretsline 345
[Credential-related source omitted] - Network accessline 357
// From React Native components const response = await fetch("/api/hello"); - Network accessline 358
const response = await fetch("/api/hello"); - Network accessline 361
// With body const response = await fetch("/api/users", { - Network accessline 362
const response = await fetch("/api/users", { - Network accessline 406
const response = await fetch( - Network accessline 407
[Credential-related source omitted] - Access to secretsline 407
[Credential-related source omitted]
plugins/expo/skills/eas-observe/SKILL.md
- Network accessline 9
> **EAS service - costs apply.** EAS Observe is an Expo Application Services product. The free EAS plan allows up to 10,000 monthly active users, with a limited set of features; higher usage requires a paid subscription. For details, see ht - Network accessline 13
> **Source of truth:** https://docs.expo.dev/eas/observe/ — always consult the canonical docs when API details matter, especially get-started, configuration, integrations, and the metrics reference. EAS Observe is evolving; this skill's ref - Network accessline 27
- Get started: https://docs.expo.dev/eas/observe/get-started/ - Network accessline 28
- Dashboard guide: https://docs.expo.dev/eas/observe/dashboard/ - Network accessline 29
- Querying with EAS CLI: https://docs.expo.dev/eas/observe/eas-cli/ - Network accessline 30
- Querying with the Expo MCP Server: https://docs.expo.dev/eas/observe/mcp/ - Network accessline 31
- Metrics reference: https://docs.expo.dev/eas/observe/reference/metrics/ - Network accessline 32
- Expo Router integration: https://docs.expo.dev/eas/observe/integrations/expo-router/ - Network accessline 33
- React Navigation integration: https://docs.expo.dev/eas/observe/integrations/react-navigation/ - Network accessline 34
- Expo Image integration: https://docs.expo.dev/eas/observe/integrations/expo-image/ - Network accessline 35
- Reanimated integration: https://docs.expo.dev/eas/observe/integrations/react-native-reanimated/ - Network accessline 36
- User-defined events: https://docs.expo.dev/eas/observe/events/ - Network accessline 37
- Error reporting: https://docs.expo.dev/eas/observe/errors/ - Network accessline 38
- Configuration: https://docs.expo.dev/eas/observe/configuration/ - Third-party integrations: https://docs.expo.dev/eas/observe/integrations/third-party/ - EAS Update download performance: https://docs.expo.dev/eas/observe/eas-update/ - Network accessline 39
- Third-party integrations: https://docs.expo.dev/eas/observe/integrations/third-party/ - EAS Update download performance: https://docs.expo.dev/eas/observe/eas-update/ - Troubleshooting: https://docs.expo.dev/eas/observe/reference/troubles - Network accessline 40
- EAS Update download performance: https://docs.expo.dev/eas/observe/eas-update/ - Network accessline 41
- Troubleshooting: https://docs.expo.dev/eas/observe/reference/troubleshooting/
plugins/expo/skills/eas-observe/references/library-integrations.md
plugins/expo/skills/eas-observe/references/metrics.md
- Network accessline 5
> Source: https://docs.expo.dev/eas/observe/reference/metrics/ — this is the canonical reference for metrics. Consult this page for the latest guidance, full prose definitions, optimization tips, and rationale. - Network accessline 7
All durations are in seconds. Metric data is retained for a minimum of 60 days. By default, every installation dispatches all of its events; high-volume apps can sample per installation with `configure({ sampleRate })` — see [Sampling](http - Network accessline 96
- Full metric definitions and optimization guidance: https://docs.expo.dev/eas/observe/reference/metrics/
plugins/expo/skills/eas-observe/references/queries.md
plugins/expo/skills/eas-observe/references/setup.md
- Network accessline 5
> Source: https://docs.expo.dev/eas/observe/get-started/ — consult this page for the latest guidance. - Network accessline 23
1. **An Expo account.** Sign up at [expo.dev/signup](https://expo.dev/signup) if needed. - Network accessline 24
2. **Expo SDK 55 or later.** Run `npx expo-doctor` to check, and `npx expo install --fix` to update dependencies. SDK 56+ unlocks the newer `ObserveRoot` / `useObserve` API. 3. **An EAS project.** The app must have `extra.eas.projectId` set - Network accessline 26
4. **A development build or a production build.** `expo-observe` is a native library, so it does **not** work in Expo Go. Testing the integration requires a [development build](https://docs.expo.dev/develop/development-builds/introduction/) - Network accessline 208
> By default, metrics collected from **debug builds** are not dispatched. A build is treated as a debug build when either the native app is a debug build or the JS bundle is a development bundle (`__DEV__` is `true`). To dispatch anyway whi - Network accessline 212
Open the **Observe** tab in the EAS dashboard at `https://expo.dev/accounts/[account]/projects/[project]/observe` to view metrics from the app. - Network accessline 224
Docs: https://docs.expo.dev/eas/observe/integrations/expo-router/ - Network accessline 258
Docs: https://docs.expo.dev/eas/observe/integrations/react-navigation/ - Network accessline 348
> Source: https://docs.expo.dev/eas/observe/events/ — consult this page for the latest guidance. - Network accessline 408
`expo-observe` records JavaScript errors and native crashes alongside the performance metrics. Errors are persisted on-device, batched, and dispatched on the next flush. They appear on the **Observe > Errors** page of the dashboard. Docs: h - Network accessline 514
{ "expo": { "extra": { "eas": { "observe": { "endpointUrl": "https://your-endpoint.com" } } } } }
plugins/expo/skills/eas-observe/references/third-party.md
- Network accessline 5
> Source: https://docs.expo.dev/eas/observe/integrations/third-party/ — consult this page for the latest guidance.
plugins/expo/skills/eas-simulator/SKILL.md
- Broad permissionsline 1
Bash(npx *eas-cli@*), Bash(npx *agent-device@*), Bash(npx expo *), Bash(eas *), Bash(expo *), Bash(xcodebuild*), Bash(pod*), Bash(argent *), Bash(ffmpeg*) - Network accessline 10
> **EAS service - costs apply.** Sessions count toward your account's pricing and limits and stop at their maximum duration. Stop a session with `eas simulator:stop` when the task is done. See https://expo.dev/pricing for current terms.
plugins/expo/skills/eas-simulator/references/controllers.md
- Access to secretsline 26
[Credential-related source omitted] - Network accessline 51
npx --yes eas-cli@latest simulator:get --id <session-id> --json # Select the recording in artifacts[] by filename/name and metadata; use its downloadUrl: curl --fail --location --max-time 600 --output ./capture.mp4 '<downloadUrl>' - Network accessline 53
curl --fail --location --max-time 600 --output ./capture.mp4 '<downloadUrl>' - Network accessline 58
Source: EAS CLI [simulator:get](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/commands/simulator/get.ts) exposes `artifacts[].{id,name,filename,metadata,downloadUrl}`. - Access to secretsline 62
[Credential-related source omitted] - Network accessline 78
To drive the connect yourself on a bare argent session (no launch flags), argent has `open-url`, which opens a scheme / deep link directly, so you can point a dev client at Metro without tapping through the launcher. Use the dev-client **cu - Access to secretsline 113
[Credential-related source omitted] - Access to secretsline 128
[Credential-related source omitted]
plugins/expo/skills/eas-simulator/references/logs-and-crashes.md
- Network accessline 28
# sim_api <path> [extra query]: call a preview route, keeping the token query. # printf is a shell builtin, so the URL goes to curl on stdin and stays out of `ps`. - Network accessline 29
# printf is a shell builtin, so the URL goes to curl on stdin and stays out of `ps`. - Network accessline 30
sim_api() { : "${API_BASE:?no preview API}" printf 'url = "%s"\n' "$API_BASE$1?$API_QUERY${2:+&$2}" | curl -sS --fail-with-body --max-time 20 -K - - Network accessline 31
: "${API_BASE:?no preview API}" printf 'url = "%s"\n' "$API_BASE$1?$API_QUERY${2:+&$2}" | curl -sS --fail-with-body --max-time 20 -K - } - Network accessline 32
printf 'url = "%s"\n' "$API_BASE$1?$API_QUERY${2:+&$2}" | curl -sS --fail-with-body --max-time 20 -K - - Network accessline 43
printf 'url = "%s"\n' "$API_BASE/crashes?$API_QUERY&tail=1" | curl -sSN --fail-with-body --max-time 300 -H 'Accept: text/event-stream' -K - > "$EVENTS.log" 2> "$EVENTS.err" & - Network accessline 44
curl -sSN --fail-with-body --max-time 300 -H 'Accept: text/event-stream' -K - > "$EVENTS.log" 2> "$EVENTS.err" & - Dangerous shell operationline 57
kill "$(cat "$EVENTS.pid")" 2>/dev/null; rm -f "$EVENTS.log" "$EVENTS.err" "$EVENTS.pid"
plugins/expo/skills/eas-simulator/references/run-your-app.md
- Network accessline 120
# 2. Build (no credentials prompt for a simulator build). Prints an artifact URL when done (~15-20 min). npx --yes eas-cli@latest build --platform ios --profile sim --non-interactive # → https://expo.dev/artifacts/eas/<hash>.tar.gz - Network accessline 122
# → https://expo.dev/artifacts/eas/<hash>.tar.gz - Network accessline 124
# 3. Start a session, then install-from-source so the VM downloads the artifact (no local upload) ART="https://expo.dev/artifacts/eas/<hash>.tar.gz" - Network accessline 125
ART="https://expo.dev/artifacts/eas/<hash>.tar.gz" - Network accessline 157
# 1. Start Metro with a tunnel on your own free port (tunnel-backend details at the end of this mode). EXPO_UNSTABLE_TUNNEL_V2=1 npx expo start --tunnel --port <your-free-port> # background it durably # Capture the manifest host. Headl - Network accessline 158
EXPO_UNSTABLE_TUNNEL_V2=1 npx expo start --tunnel --port <your-free-port> # background it durably # Capture the manifest host. Headless runs won't print it — read ngrok's API (curl -s 127.0.0.1:4040/api/tunnels) # or the manifest (c - Network accessline 159
# Capture the manifest host. Headless runs won't print it — read ngrok's API (curl -s 127.0.0.1:4040/api/tunnels) - Network accessline 160
# or the manifest (curl -s -H "expo-platform: ios" localhost:<port>/ → launchAsset.url). - Network accessline 195
# install: a local .app uploads over the tunnel; an EAS artifact uses install-from-source (VM downloads it): npx --yes eas-cli@latest simulator:exec npx agent-device@latest install <bundleId> "$DEVAPP" --platform ios # (EAS artifact inste - Network accessline 197
# (EAS artifact instead: install-from-source "https://expo.dev/artifacts/eas/<hash>.tar.gz" --platform ios) - Network accessline 228
Mode C needs a route from the EAS VM to your local Metro server. The account-signed Expo tunnel is the normal transport for this workflow: it forwards requests to `http://localhost:<your-free-port>` so the remote app can fetch its developme - Network accessline 248
Source: Expo CLI's [AsyncWsTunnel.ts](https://github.com/expo/expo/blob/main/packages/%40expo/cli/src/start/server/AsyncWsTunnel.ts) resolves the Expo account, requests a signed URL, and sets the local target port. Verify the installed CLI'
plugins/expo/skills/eas-update-insights/SKILL.md
- Network accessline 10
> **EAS service - costs apply.** Insights cover updates published through EAS Update, a paid Expo Application Services product with free-tier limits. Update delivery and the data behind these commands count against your plan's EAS Update us
plugins/expo/skills/eas-update/SKILL.md
- Broad permissionsline 1
Bash(npx expo *), Bash(npx *eas-cli@*), Bash(eas *) - Network accessline 10
> **EAS service - costs apply.** EAS Update is available on the Free plan; publishing and delivery use update, bandwidth, and storage allowances, with higher limits on paid plans. See https://expo.dev/pricing. - Network accessline 41
For dynamic app config, non-EAS builds, or a command that cannot complete automatically, follow the current setup documentation instead of guessing: https://docs.expo.dev/eas-update/getting-started.md. - Network accessline 68
Create a new native build when a change adds or modifies native code or native configuration, including most native-library additions and SDK upgrades. Do not work around a runtime mismatch or imply that publishing can add native capabiliti - Network accessline 93
Prefer a preview or staging channel for validation. When promoting a tested update, use the documented deployment flow so production receives the same artifact where possible: https://docs.expo.dev/eas-update/deployment.md. - Network accessline 119
4. Inspect the channel-to-branch mapping and the active update on that branch. 5. Fully terminate the release build and allow for the normal download-then-apply lifecycle. 6. Use the current debugging guide for native logs, export problems, - Network accessline 121
6. Use the current debugging guide for native logs, export problems, and configuration checks: https://docs.expo.dev/eas-update/debug.md. - Network accessline 127
- **Channel surfing:** an individual release build can override its `expo-channel-name` request header to request another compatible channel. This differs from changing the server-side channel-to-branch mapping. Follow https://docs.expo.dev - Network accessline 133
- Setup: https://docs.expo.dev/eas-update/getting-started.md - Network accessline 134
- Concepts and matching: https://docs.expo.dev/eas-update/how-it-works.md - Network accessline 135
- Deployment: https://docs.expo.dev/eas-update/deployment.md - Network accessline 136
- Debugging: https://docs.expo.dev/eas-update/debug.md - Network accessline 137
- Current EAS CLI reference: https://docs.expo.dev/eas/cli.md
plugins/expo/skills/eas-workflows/SKILL.md
- Broad permissionsline 1
Read,Write,Bash(node:*),Bash(npx *eas-cli@*) - Network accessline 10
> **EAS service - costs apply.** EAS Workflows run on Expo Application Services, a paid product with free-tier limits. Each workflow job consumes your plan's build/compute minutes, and jobs that build or submit also need paid Apple Develope - Network accessline 23
1. **JSON Schema** — https://api.expo.dev/v2/workflows/schema - It is NECESSARY to fetch this schema - Network accessline 30
2. **Syntax Documentation** — https://raw.githubusercontent.com/expo/expo/refs/heads/main/docs/pages/eas/workflows/syntax.mdx - Network accessline 35
3. **Pre-packaged Jobs** — https://raw.githubusercontent.com/expo/expo/refs/heads/main/docs/pages/eas/workflows/pre-packaged-jobs.mdx
plugins/expo/skills/eas-workflows/scripts/fetch.js
plugins/expo/skills/eas-workflows/scripts/package.json
- Executable scriptline 1
Executable file
plugins/expo/skills/expo-animation/RECIPES.md
- Network accessline 177
Before writing this: gesture-handler ships [`ReanimatedSwipeable`](https://docs.swmansion.com/react-native-gesture-handler/docs/components/reanimated_swipeable/), which already does swipe-to-reveal actions — thresholds, overshoot, open/clos - Network accessline 255
Needs its own module and a one-time provider ([Expo keyboard guide](https://docs.expo.dev/guides/keyboard-handling/)): - Network accessline 335
`formSheet` is native on both platforms, but not the same on both — the [Expo modal docs](https://docs.expo.dev/router/advanced/modals/#form-sheet-presentation) have the full list:
plugins/expo/skills/expo-animation/SKILL.md
- Network accessline 9
This skill was created in collaboration with [Emil Kowalski](https://github.com/emilkowalski) and can also be found in the [emilkowalski/skills](https://github.com/emilkowalski/skills) repository, along with other useful animation skills.
plugins/expo/skills/expo-app-clip/SKILL.md
- Network accessline 8
> **Requirements.** Adding the App Clip target is open source. Shipping one requires an Apple Developer Program membership and App Store review, and the AASA file must be served over HTTPS on your domain (any HTTPS host works; EAS Hosting i - Network accessline 35
This installs [`@bacons/apple-targets`](https://github.com/EvanBacon/expo-apple-targets), adds it to the `plugins` array in `app.json`, and writes: - Network accessline 66
module.exports = (config) => ({ type: "clip", icon: "https://github.com/expo.png", - Network accessline 67
type: "clip", icon: "https://github.com/expo.png", entitlements: { - Network accessline 68
icon: "https://github.com/expo.png", - Network accessline 125
- The `appclips` block is what lets a URL on the domain launch the Clip. - `webcredentials` is used for sharing credentials between the website, parent app, and the App Clip. - `activitycontinuation` is optional and used for sharing the lin - Network accessline 126
- `webcredentials` is used for sharing credentials between the website, parent app, and the App Clip. - `activitycontinuation` is optional and used for sharing the link between mobile and desktop. Must be used with `Head` from expo-router — - Network accessline 127
- `activitycontinuation` is optional and used for sharing the link between mobile and desktop. Must be used with `Head` from expo-router — see https://docs.expo.dev/router/advanced/apple-handoff/ - Network accessline 128
- Notation and route-disabling details: https://sosumi.ai/documentation/xcode/supporting-associated-domains - Network accessline 170
The AASA file must be live before iOS will trust the association. Use [EAS Hosting](https://docs.expo.dev/eas/hosting/): - Network accessline 180
curl https://may20.expo.app/.well-known/apple-app-site-association - Network accessline 237
"releaseWithAppStoreVersion": true, "reviewDetail": { "invocationUrls": ["https://may20.expo.app/", null, null] - Network accessline 238
"reviewDetail": { "invocationUrls": ["https://may20.expo.app/", null, null] }, - Network accessline 239
"invocationUrls": ["https://may20.expo.app/", null, null] - Network accessline 261
Apple's recommended App Clip metadata guidelines: https://sosumi.ai/documentation/appclip/configuring-the-launch-experience-of-your-app-clip - Network accessline 265
- Parent app target: `com.bacon.may20` - App Clip target: `com.bacon.may20.clip`, lives in `targets/clip/` - AASA hosted at `https://may20.expo.app/.well-known/apple-app-site-association` - Network accessline 266
- App Clip target: `com.bacon.may20.clip`, lives in `targets/clip/` - AASA hosted at `https://may20.expo.app/.well-known/apple-app-site-association` - Smart App Banner meta tag on every web route - Network accessline 267
- AASA hosted at `https://may20.expo.app/.well-known/apple-app-site-association`
plugins/expo/skills/expo-app-clip/references/native-module.md
plugins/expo/skills/expo-brownfield/SKILL.md
- Network accessline 42
More information available at https://docs.expo.dev/brownfield/overview/
plugins/expo/skills/expo-brownfield/references/brownfield-integrated.md
- Network accessline 61
Register the React Native Gradle plugin and Expo autolinking. Reference: [bare-minimum template `settings.gradle`](https://github.com/expo/expo/blob/sdk-57/templates/expo-template-bare-minimum/android/settings.gradle). - Network accessline 117
google() mavenCentral() maven { url 'https://www.jitpack.io' } - Network accessline 118
mavenCentral() maven { url 'https://www.jitpack.io' } } - Network accessline 119
maven { url 'https://www.jitpack.io' } - Network accessline 129
Apply the React Native plugin and configure the `react { ... }` block. The full template is at [bare-minimum `app/build.gradle`](https://github.com/expo/expo/blob/sdk-57/templates/expo-template-bare-minimum/android/app/build.gradle); the mi - Network accessline 281
Create (or update) `ios/Podfile` based on the [bare-minimum Podfile](https://github.com/expo/expo/blob/sdk-57/templates/expo-template-bare-minimum/ios/Podfile). The following excerpt follows SDK 57. For another SDK, adapt its matching templ
plugins/expo/skills/expo-brownfield/references/brownfield-isolated.md
plugins/expo/skills/expo-brownfield/references/feature-integration.md
- Network accessline 149
Use the [Expo lifecycle guide](https://docs.expo.dev/brownfield/lifecycle-listeners/) and the installed delegate source to choose callbacks. Test the actual modules in use, including warm/cold deep links or push registration where applicabl - Network accessline 159
For runnable examples of both SwiftUI hosts, see the [iOS brownfield playgrounds](https://github.com/expo/skills/tree/main/tests/fixtures/expo-brownfield). - Network accessline 161
EAS Build/Submit can distribute the host after this integration works; they do not implement the runtime boundary. EAS Update requires an updates-enabled RN runtime and separate brownfield setup, not just an EAS project ID. Consult the [exi - Network accessline 163
Select the matching SDK/API using [version compatibility](./version-compatibility.md). Current reference: [Brownfield API](https://docs.expo.dev/versions/latest/sdk/brownfield/); implementation: [Expo SDK 57 brownfield](https://github.com/e
plugins/expo/skills/expo-brownfield/references/troubleshooting.md
- Network accessline 11
- **Integrated approach:** keep the hand-maintained host intact. Run `npx expo install --check` in the JS project, apply SDK-matched native template changes selectively, then run `bundle exec pod install` (or `pod install` without Bundler)
plugins/expo/skills/expo-brownfield/references/version-compatibility.md
- Network accessline 7
1. Read the producer's `package.json` and lockfile; record resolved `expo`, `react-native`, and `expo-brownfield` versions. Check the host's deployment targets, Xcode/Node versions, and native dependency graph, including any existing RN run - Network accessline 8
2. For new work, check the [Expo releases](https://expo.dev/changelog/) and [SDK compatibility table](https://docs.expo.dev/versions/latest/#each-expo-sdk-version-depends-on-a-react-native-version). `npm view expo dist-tags --json` can conf - Network accessline 40
Sources: [SDK requirements](https://docs.expo.dev/versions/latest/), [SDK 57 Brownfield API](https://docs.expo.dev/versions/v57.0.0/sdk/brownfield/), [SDK 57 native template](https://github.com/expo/expo/tree/sdk-57/templates/expo-template-
plugins/expo/skills/expo-data-fetching/SKILL.md
- Network accessline 56
const fetchUser = async (userId: string) => { const response = await fetch(`https://api.example.com/users/${userId}`); - Network accessline 57
const response = await fetch(`https://api.example.com/users/${userId}`); - Network accessline 70
const createUser = async (userData: UserData) => { const response = await fetch("https://api.example.com/users", { - Network accessline 71
const response = await fetch("https://api.example.com/users", { - Network accessline 183
const fetchWithErrorHandling = async (url: string, options?: RequestInit) => { try { const response = await fetch(url, options); - Network accessline 185
const response = await fetch(url, options); - Access to secretsline 236
[Credential-related source omitted] - Network accessline 248
return fetch(url, { - Network accessline 297
[Credential-related source omitted] - Access to secretsline 297
[Credential-related source omitted] - Network accessline 298
EXPO_PUBLIC_API_URL=https://api.example.com - Network accessline 304
const fetchUsers = async () => { const response = await fetch(`${API_URL}/users`); - Network accessline 305
const response = await fetch(`${API_URL}/users`); - Network accessline 313
// .env.development EXPO_PUBLIC_API_URL=http://localhost:3000 - Network accessline 314
EXPO_PUBLIC_API_URL=http://localhost:3000 - Network accessline 316
// .env.production EXPO_PUBLIC_API_URL=https://api.production.com - Network accessline 317
EXPO_PUBLIC_API_URL=https://api.production.com - Network accessline 330
export const apiClient = { get: async <T,>(path: string): Promise<T> => { const response = await fetch(`${BASE_URL}${path}`); - Network accessline 331
get: async <T,>(path: string): Promise<T> => { const response = await fetch(`${BASE_URL}${path}`); if (!response.ok) throw new Error(`HTTP ${response.status}`); - Network accessline 332
const response = await fetch(`${BASE_URL}${path}`); - Network accessline 337
post: async <T,>(path: string, body: unknown): Promise<T> => { const response = await fetch(`${BASE_URL}${path}`, { - Network accessline 338
const response = await fetch(`${BASE_URL}${path}`, { - Access to secretsline 409
[Credential-related source omitted] - Network accessline 424
const data = await fetch(url).then((r) => r.json()); - Network accessline 430
const response = await fetch(url);
plugins/expo/skills/expo-data-fetching/references/expo-router-loaders.md
- Network accessline 76
export async function loader() { const response = await fetch("https://api.example.com/posts"); - Network accessline 77
const response = await fetch("https://api.example.com/posts"); - Network accessline 125
) => { const id = params.id as string; const response = await fetch(`https://api.example.com/posts/${id}`); - Network accessline 127
const response = await fetch(`https://api.example.com/posts/${id}`); - Network accessline 200
params, ) => { const data = await fetch("https://api.stripe.com/v1/balance", { - Network accessline 201
) => { const data = await fetch("https://api.stripe.com/v1/balance", { headers: { - Network accessline 202
const data = await fetch("https://api.stripe.com/v1/balance", { - Access to secretsline 204
[Credential-related source omitted] - Network accessline 265
export async function loader() { const response = await fetch("https://api.example.com/posts"); - Network accessline 266
const response = await fetch("https://api.example.com/posts");
plugins/expo/skills/expo-data-fetching/references/offline-and-cancellation.md
- Network accessline 50
fetch(url, { signal: controller.signal })
plugins/expo/skills/expo-design-system/SKILL.md
- Network accessline 344
After building or changing a screen, screenshot it and check it against these principles (from [Expo's design-principles guide](https://expo.dev/blog/how-to-apply-professional-design-principles-in-ai-app-development)). Each one maps to a sy
plugins/expo/skills/expo-design-system/references/native-slop.md
- Network accessline 30
For confirmation choices, follow [Apple’s alert guidance](https://developer.apple.com/design/human-interface-guidelines/alerts): uncommon irreversible actions warrant confirmation; routine undoable actions generally do not.
plugins/expo/skills/expo-dev-client/SKILL.md
- Network accessline 9
> **Free locally; cloud builds are paid.** `expo-dev-client` itself is open source and building locally is free. Building or distributing via EAS Build/TestFlight uses your EAS plan's build minutes and needs a paid Apple Developer account f - Network accessline 13
**Development clients are the recommended setup for any real or production app.** Expo Go is a playground for learning and quick experiments with the native libraries it bundles; most apps outgrow it and move to a development client. See [E
plugins/expo/skills/expo-examples/SKILL.md
- Broad permissionsline 1
Read,Bash(gh api:*),Bash(git clone:*),Bash(npx create-expo:*),Bash(npx degit:*),Bash(bun create:*) - Network accessline 10
[expo/examples](https://github.com/expo/examples) is Expo's official library of ~70 **integration examples** — directories named `with-<library>` (e.g. `with-stripe`, `with-maps`), each built around **one** library or service. These are not - Network accessline 48
gh api repos/expo/examples/contents/with-stripe/utils/stripe-server.ts --jq '.content' | base64 -d # No gh? Raw URL (branch is master): curl -s https://raw.githubusercontent.com/expo/examples/master/with-stripe/utils/stripe-server.ts - Network accessline 50
curl -s https://raw.githubusercontent.com/expo/examples/master/with-stripe/utils/stripe-server.ts - Network accessline 56
npx degit expo/examples/with-stripe /tmp/expo-ref/with-stripe # clean copy, no git history # fallback without degit (sparse-checkout, no full ~64 MB clone): git clone --depth 1 --filter=blob:none --sparse https://github.com/expo/examples. - Network accessline 57
# fallback without degit (sparse-checkout, no full ~64 MB clone): git clone --depth 1 --filter=blob:none --sparse https://github.com/expo/examples.git /tmp/expo-ref/examples \ && (cd /tmp/expo-ref/examples && git sparse-checkout set with- - Network accessline 58
git clone --depth 1 --filter=blob:none --sparse https://github.com/expo/examples.git /tmp/expo-ref/examples \ - Network accessline 84
- **Default branch is `master`,** not `main` (matters for raw URLs and sparse checkout). - **Single-click deploy.** Every example has a launch URL: `https://launch.expo.dev/?github=https://github.com/expo/examples/tree/master/<example>`. - Network accessline 85
- **Single-click deploy.** Every example has a launch URL: `https://launch.expo.dev/?github=https://github.com/expo/examples/tree/master/<example>`.
plugins/expo/skills/expo-examples/references/catalog.md
- Network accessline 3
A categorized view of [expo/examples](https://github.com/expo/examples) for fast triage. Each entry is a **single-concern integration demo** (one library/service, managed project, usually one screen) — not a full app. This snapshot drifts —
plugins/expo/skills/expo-module/references/config-plugin.md
plugins/expo/skills/expo-native-ui/references/icons.md
plugins/expo/skills/expo-native-ui/references/media.md
plugins/expo/skills/expo-overview/SKILL.md
- Network accessline 83
defaults differ by SDK. - **Read the docs for that SDK, not `latest`.** Use the version-pinned URL, e.g. `https://docs.expo.dev/versions/v56.0.0/sdk/ui/` on SDK 56 instead of - Network accessline 84
- **Read the docs for that SDK, not `latest`.** Use the version-pinned URL, e.g. `https://docs.expo.dev/versions/v56.0.0/sdk/ui/` on SDK 56 instead of `https://docs.expo.dev/versions/latest/sdk/ui/` — the `latest` pages track the newest - Network accessline 85
`https://docs.expo.dev/versions/v56.0.0/sdk/ui/` on SDK 56 instead of - Network accessline 86
`https://docs.expo.dev/versions/latest/sdk/ui/` — the `latest` pages track the newest
plugins/expo/skills/expo-project-structure/SKILL.md
- Network accessline 80
Appending `+api` to a file in `app/` makes it a server **API route**. Server code is different from frontend code — it runs in a Node-like server environment (deployed with EAS Hosting or on [third-party services](https://docs.expo.dev/rout - Network accessline 105
Based on [Expo app folder structure best practices](https://expo.dev/blog/expo-app-folder-structure-best-practices) by Kadi Kraman. For `src/` precedence and alias mechanics, see the [Expo docs](https://docs.expo.dev/router/reference/src-di
plugins/expo/skills/expo-router/references/toolbar-and-headers.md
- Network accessline 284
Docs https://docs.expo.dev/versions/unversioned/sdk/router - read to see the full API.
plugins/expo/skills/expo-router/references/zoom-transitions.md
- Network accessline 16
<Pressable> <Image source={{ uri: "https://example.com/thumb.jpg" }} - Network accessline 17
<Image source={{ uri: "https://example.com/thumb.jpg" }} style={{ width: 120, height: 120, borderRadius: 12 }} - Network accessline 18
source={{ uri: "https://example.com/thumb.jpg" }} - Network accessline 34
<Link.AppleZoom> <Image source={{ uri: "https://example.com/thumb.jpg" }} - Network accessline 35
<Image source={{ uri: "https://example.com/thumb.jpg" }} style={{ width: 200, aspectRatio: 4 / 3 }} - Network accessline 36
source={{ uri: "https://example.com/thumb.jpg" }} - Network accessline 59
<Link.AppleZoomTarget> <Image source={{ uri: "https://example.com/full.jpg" }} - Network accessline 60
<Image source={{ uri: "https://example.com/full.jpg" }} style={{ width: "100%", aspectRatio: 4 / 3 }} - Network accessline 61
source={{ uri: "https://example.com/full.jpg" }} - Network accessline 78
<Link.AppleZoom alignmentRect={{ x: 0, y: 0, width: 200, height: 300 }}> <Image source={{ uri: "https://example.com/thumb.jpg" }} /> - Network accessline 79
<Image source={{ uri: "https://example.com/thumb.jpg" }} /> - Network accessline 94
export default function PhotoScreen() { usePreventZoomTransitionDismissal(); return <Image source={{ uri: "https://example.com/full.jpg" }} />; - Network accessline 95
usePreventZoomTransitionDismissal(); return <Image source={{ uri: "https://example.com/full.jpg" }} />; } - Network accessline 96
return <Image source={{ uri: "https://example.com/full.jpg" }} />; - Network accessline 124
<Pressable> <Image source={{ uri: "https://example.com/thumb.jpg" }} - Network accessline 125
<Image source={{ uri: "https://example.com/thumb.jpg" }} style={{ width: 120, height: 120 }} - Network accessline 126
source={{ uri: "https://example.com/thumb.jpg" }} - Network accessline 156
- Expo Router Zoom Transitions: https://docs.expo.dev/router/advanced/zoom-transition/ - Network accessline 157
- Link.AppleZoom API: https://docs.expo.dev/versions/v55.0.0/sdk/router/#linkapplezoom - Network accessline 158
- Apple UIKit Fluid Transitions: https://developer.apple.com/documentation/uikit/enhancing-your-app-with-fluid-transitions
plugins/expo/skills/expo-ui/SKILL.md
- Broad permissionsline 1
Bash(node *expo-ui/scripts/list-components.js *)
plugins/expo/skills/expo-ui/references/drop-in-replacements.md
- Network accessline 24
- Overview — https://docs.expo.dev/versions/latest/sdk/ui/drop-in-replacements/index.md - Network accessline 25
- Per component — https://docs.expo.dev/versions/latest/sdk/ui/drop-in-replacements/{component}/index.md (slug is the component name lowercased, no hyphens, e.g. `bottomsheet`, `datetimepicker`, `segmentedcontrol`)
plugins/expo/skills/expo-ui/references/jetpack-compose.md
- Network accessline 34
- Expo UI's API mirrors Jetpack Compose's API. Use Jetpack Compose and Material Design 3 knowledge to decide which components or modifiers to use. If you need deeper Jetpack Compose or Material 3 guidance (e.g. which component to pick, layo - Network accessline 41
(`<skill-root>` is the directory containing this `references/` folder.) - **Always read the `.d.ts` type files** to confirm prop shapes and signatures — read the relevant `{ComponentName}/index.d.ts` from the installed `@expo/ui/jetpack-com - Network accessline 42
- **Always read the `.d.ts` type files** to confirm prop shapes and signatures — read the relevant `{ComponentName}/index.d.ts` from the installed `@expo/ui/jetpack-compose` package in `node_modules`. This is the most reliable source of tru - Network accessline 43
- When about to use a component, fetch its docs to confirm the API — https://docs.expo.dev/versions/latest/sdk/ui/jetpack-compose/{component-name}/index.md - Network accessline 44
- When unsure about a modifier's API, refer to the docs — https://docs.expo.dev/versions/latest/sdk/ui/jetpack-compose/modifiers/index.md - Network accessline 60
- `RNHostView` embeds React Native components inside a Jetpack Compose tree (the same concept as in `@expo/ui/swift-ui`) — wrap any RN child in `<RNHostView>`. - If a required composable or modifier is missing in Expo UI, it can be extended - Network accessline 61
- If a required composable or modifier is missing in Expo UI, it can be extended via a local Expo module. See: https://docs.expo.dev/guides/expo-ui-jetpack-compose/extending/index.md. Confirm with the user before extending. - Network accessline 65
- **LazyColumn** — Use instead of react-native `ScrollView`/`FlatList` for scrollable lists. Wrap in `<Host style={{ flex: 1 }}>`. Not suitable for large lists — each item is a JSX node processed on the JS thread, which causes noticeable sl - Network accessline 66
- **Icon** — Use `<Icon source={require('./icon.xml')} size={24} />` with Android XML vector drawables. To get icons: go to [Material Symbols](https://fonts.google.com/icons), select an icon, choose the Android platform, and download the XM - Network accessline 72
- `ObservableState.value` is readable/writable from worklets; `onChange` fires a worklet listener on state change. - Docs — https://docs.expo.dev/versions/latest/sdk/ui/jetpack-compose/usenativestate/index.md - Network accessline 73
- Docs — https://docs.expo.dev/versions/latest/sdk/ui/jetpack-compose/usenativestate/index.md
plugins/expo/skills/expo-ui/references/swift-ui.md
- Network accessline 44
(`<skill-root>` is the directory containing this `references/` folder.) - **The installed package's TypeScript types (`.d.ts`) are the most reliable source of truth** for prop shapes and signatures — read the relevant `{Component}/index.d.t - Network accessline 45
- **The installed package's TypeScript types (`.d.ts`) are the most reliable source of truth** for prop shapes and signatures — read the relevant `{Component}/index.d.ts` from the installed `@expo/ui/swift-ui` package in `node_modules`. Use - Network accessline 46
- When about to use a component, fetch its docs to confirm the API — https://docs.expo.dev/versions/latest/sdk/ui/swift-ui/{component-name}/index.md - Network accessline 47
- When unsure about a modifier's API, refer to the docs — https://docs.expo.dev/versions/latest/sdk/ui/swift-ui/modifiers/index.md - Network accessline 66
- If a required modifier or View is missing in Expo UI, it can be extended via a local Expo module. See: https://docs.expo.dev/guides/expo-ui-swift-ui/extending/index.md. Confirm with the user before extending. - Network accessline 72
- `ObservableState.value` is readable/writable from worklets; `onChange` fires a worklet listener on state change. - Docs — https://docs.expo.dev/versions/latest/sdk/ui/swift-ui/usenativestate/index.md - Network accessline 73
- Docs — https://docs.expo.dev/versions/latest/sdk/ui/swift-ui/usenativestate/index.md
plugins/expo/skills/expo-ui/references/universal.md
- Network accessline 62
Docs — https://docs.expo.dev/versions/latest/sdk/ui/universal/textinput/index.md - Network accessline 99
- Overview — https://docs.expo.dev/versions/latest/sdk/ui/universal/index.md - Network accessline 100
- Per component — https://docs.expo.dev/versions/latest/sdk/ui/universal/{component-name}/index.md
plugins/expo/skills/expo-ui/scripts/list-components.js
- Executable scriptline 1
#!/usr/bin/env node
plugins/expo/skills/expo-upgrade/SKILL.md
- Network accessline 21
Check if latest is beta: https://exp.host/--/api/v2/versions (look for `-preview` in `expoVersion`) - Dangerous shell operationline 44
rm -rf node_modules .expo - Network accessline 78
- Review release notes for the target SDK version at https://expo.dev/changelog - Network accessline 79
- Update versioned docs links in agent instruction files (`AGENTS.md`). The default template links to `https://docs.expo.dev/versions/v<version>/`. Search for `docs.expo.dev/versions/` and bump each link to the new SDK version. - Network accessline 129
- `EXPO_USE_FAST_RESOLVER=1` is removed in SDK +54. - cjs and mjs extensions are supported by default in SDK +50. - Expo webpack is deprecated, migrate to [Expo Router and Metro web](https://docs.expo.dev/router/migrate/from-expo-webpack/). - Network accessline 131
- Expo webpack is deprecated, migrate to [Expo Router and Metro web](https://docs.expo.dev/router/migrate/from-expo-webpack/).
plugins/expo/skills/expo-upgrade/references/expo-av-to-audio.md
- Network accessline 132
https://docs.expo.dev/versions/latest/sdk/audio/
plugins/expo/skills/expo-upgrade/references/expo-av-to-video.md
- Network accessline 22
<Video ref={videoRef} source={{ uri: 'https://example.com/video.mp4' }} - Network accessline 23
ref={videoRef} source={{ uri: 'https://example.com/video.mp4' }} style={{ width: 350, height: 200 }} - Network accessline 24
source={{ uri: 'https://example.com/video.mp4' }} - Network accessline 39
const player = useVideoPlayer('https://example.com/video.mp4', player => { - Network accessline 160
https://docs.expo.dev/versions/latest/sdk/video/
plugins/expo/skills/expo-upgrade/references/native-tabs.md
- Network accessline 124
- Read docs for more info https://docs.expo.dev/versions/v55.0.0/sdk/router-native-tabs/
plugins/expo/skills/expo-upgrade/references/new-architecture.md
plugins/expo/skills/expo-upgrade/references/react-navigation-to-expo-router.md
- Network accessline 61
- Official Expo Router SDK 55 → 56 migration guide: https://docs.expo.dev/router/migrate/sdk-55-to-56
plugins/expo/skills/expo-web-to-native/SKILL.md
- Network accessline 9
A web React app does not *convert* to native — there is no transpiler. It **migrates**, screen by screen, the way a strangler fig grows around a tree and slowly replaces it: stand up a native shell, run the whole web UI inside it on day one - Network accessline 80
- [`./references/verify-on-device.md`](./references/verify-on-device.md) — the two-agent parity recipe: drive the web app (browser agent) and the native app (argent), open the same route, compare. - [`./references/run-as-goal.md`](./referen - Network accessline 82
- [Expo — From Web to Native with React](https://expo.dev/blog/from-web-to-native-with-react) — the canonical guide this skill operationalizes.
plugins/expo/skills/expo-web-to-native/references/false-friends.md
- Network accessline 89
| Web | Native | Gotcha | |---|---|---| | `fetch('/api/x')` (relative) | absolute URL | Native has no origin — relative paths fail. Use a configured base URL (`EXPO_PUBLIC_API_URL`). | - Network accessline 90
|---|---|---| | `fetch('/api/x')` (relative) | absolute URL | Native has no origin — relative paths fail. Use a configured base URL (`EXPO_PUBLIC_API_URL`). | | CORS | n/a | No browser CORS, but you still need a reachable absolute host. | - Network accessline 91
| `fetch('/api/x')` (relative) | absolute URL | Native has no origin — relative paths fail. Use a configured base URL (`EXPO_PUBLIC_API_URL`). |
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Signal confidence: 308 facts
- Network access in prose of the SKILL.mdeas-app-stores/SKILL.md:9Low confidence
- Network access in code of documentationeas-app-stores/references/app-store-metadata.md:67Low confidence
- Network access in code of documentationeas-app-stores/references/app-store-metadata.md:68Low confidence
- Network access in code of documentationeas-app-stores/references/app-store-metadata.md:69Low confidence
- Network access in code of documentationeas-app-stores/references/app-store-metadata.md:70Low confidence
- Network access in code of documentationeas-app-stores/references/app-store-metadata.md:71Low confidence
- Network access in code of documentationeas-app-stores/references/app-store-metadata.md:289Low confidence
- Network access in code of documentationeas-app-stores/references/app-store-metadata.md:290Low confidence
- Network access in code of documentationeas-app-stores/references/app-store-metadata.md:291Low confidence
- Network access in prose of documentationeas-app-stores/references/app-store-metadata.md:448Low confidence
- Network access in prose of documentationeas-app-stores/references/ios-app-store.md:24Low confidence
- Network access in prose of documentationeas-app-stores/references/ios-app-store.md:161Low confidence
- Network access in prose of documentationeas-app-stores/references/ios-app-store.md:163Low confidence
- Network access in prose of documentationeas-app-stores/references/ios-app-store.md:164Low confidence
- Network access in prose of documentationeas-app-stores/references/ios-app-store.md:165Low confidence
- Network access in prose of documentationeas-app-stores/references/ios-app-store.md:166Low confidence
- Network access in prose of documentationeas-app-stores/references/ios-app-store.md:167Low confidence
- Network access in prose of documentationeas-app-stores/references/native-ios.md:3Low confidence
- Network access in prose of documentationeas-app-stores/references/native-ios.md:48Low confidence
- Network access in prose of documentationeas-app-stores/references/native-ios.md:57Low confidence
- Network access in prose of documentationeas-app-stores/references/native-ios.md:61Low confidence
- Network access in prose of documentationeas-app-stores/references/native-ios.md:102Low confidence
- Network access in prose of documentationeas-app-stores/references/native-ios.md:139Low confidence
- Network access in prose of documentationeas-app-stores/references/native-ios.md:163Low confidence
- Network access in prose of documentationeas-app-stores/references/play-store.md:5Low confidence
- Network access in prose of documentationeas-app-stores/references/testflight.md:45Low confidence
- Network access in prose of documentationeas-app-stores/references/testflight.md:62Low confidence
- Network access in prose of the SKILL.mdeas-hosting/SKILL.md:9Low confidence
- Network access in code of the SKILL.mdeas-hosting/SKILL.md:144High confidence
- Access to secrets in code of the SKILL.md: a variable, placeholder or call, not a stored valueeas-hosting/SKILL.md:148Low confidence
- Network access in prose of the SKILL.mdeas-hosting/SKILL.md:209Low confidence
- Network access in code of the SKILL.mdeas-hosting/SKILL.md:214High confidence
- Network access in code of the SKILL.mdeas-hosting/SKILL.md:215High confidence
- Access to secrets in code of the SKILL.mdeas-hosting/SKILL.md:248High confidence
- Network access in code of the SKILL.mdeas-hosting/SKILL.md:271High confidence
- Network access in code of the SKILL.mdeas-hosting/SKILL.md:318High confidence
- Network access in code of the SKILL.mdeas-hosting/SKILL.md:319High confidence
- Access to secrets in code of the SKILL.md: a variable, placeholder or call, not a stored valueeas-hosting/SKILL.md:345Low confidence
- Network access in code of the SKILL.mdeas-hosting/SKILL.md:357High confidence
- Network access in code of the SKILL.mdeas-hosting/SKILL.md:358High confidence
- Network access in code of the SKILL.mdeas-hosting/SKILL.md:361High confidence
- Network access in code of the SKILL.mdeas-hosting/SKILL.md:362High confidence
- Network access in code of the SKILL.mdeas-hosting/SKILL.md:406High confidence
- Network access in code of the SKILL.mdeas-hosting/SKILL.md:407High confidence
- Access to secrets in code of the SKILL.md: a variable, placeholder or call, not a stored valueeas-hosting/SKILL.md:407Low confidence
- Network access in prose of the SKILL.mdeas-observe/SKILL.md:9Low confidence
- Network access in prose of the SKILL.mdeas-observe/SKILL.md:13Low confidence
- Network access in prose of the SKILL.mdeas-observe/SKILL.md:27Low confidence
- Network access in prose of the SKILL.mdeas-observe/SKILL.md:28Low confidence
- Network access in prose of the SKILL.mdeas-observe/SKILL.md:29Low confidence
and 258 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest .claude-plugin/marketplace.json | .claude/skills/<skill-name>/ |
| Codex | Native | Manifest AGENTS.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md plugins/expo-experiments/skills/expo-migrate-module/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md plugins/expo-experiments/skills/expo-migrate-module/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md plugins/expo-experiments/skills/expo-migrate-module/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md plugins/expo-experiments/skills/expo-migrate-module/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.
Explore alternatives and comparisons
Add this badge to your README
It updates every night and links to this page.
[](https://hotskills.dev/skill/expo-skills/)