#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.

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

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

Compare on GitHub

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.

Compare on GitHub

View on GitHubAdd to my skills

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>/
4.1kGitHub stars
89stars in 7 days
24skills in this repository
10commits in 30 days

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

Aug 2, 2026Nov 6, 20264,073

Individual skills in this repository

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 tokens

Always available to the agent

SKILL.md

2,935 tokens

When the skill is activated

Reference documents

13,115 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Prerequisite
  2. References
  3. Workflow
  4. Handoff
  5. Submitting Feedback

Files

  • ../../../../.claude-plugin/marketplace.jsonasset585 bytes
  • ../../.claude-plugin/plugin.jsonasset292 bytes
  • SKILL.mdcore12,920 bytes
  • SKILL.mdcore12,920 bytes
  • SKILL.mdcore12,920 bytes
  • agents/openai.yamlasset306 bytes
  • references/compatibility.mddoc20,410 bytes
  • references/example.mddoc7,948 bytes
  • references/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 GitHub

Skills 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

  1. #307 on Oct 31
  2. #308 on Nov 1
  3. #307 on Nov 2
  4. #311 from Nov 3 to Nov 4
  5. #309 on Nov 5
  6. #310 since Nov 6
76 earlier periods
  1. #325 on Aug 2
  2. #329 from Aug 7 to Aug 8
  3. #328 on Aug 9
  4. #338 on Aug 10
  5. #339 on Aug 11
  6. #332 on Aug 12
  7. #336 on Aug 13
  8. #337 on Aug 14
  9. #335 on Aug 15
  10. #338 on Aug 16
  11. #337 on Aug 17
  12. #344 on Aug 18
  13. #343 on Aug 19
  14. #342 on Aug 20
  15. #346 on Aug 21
  16. #341 on Aug 22
  17. #346 on Aug 23
  18. #350 from Aug 24 to Aug 28
  19. #348 on Aug 29
  20. #344 on Aug 30
  21. #353 on Aug 31
  22. #360 on Sep 1
  23. #357 on Sep 2
  24. #363 on Sep 3
  25. #356 on Sep 4
  26. #358 on Sep 5
  27. #357 on Sep 6
  28. #366 on Sep 7
  29. #363 on Sep 8
  30. #365 on Sep 9
  31. #367 on Sep 10
  32. #361 on Sep 11
  33. #365 on Sep 12
  34. #364 on Sep 13
  35. #369 on Sep 14
  36. #372 on Sep 15
  37. #374 on Sep 16
  38. #371 on Sep 17
  39. #370 on Sep 18
  40. #362 on Sep 19
  41. #373 on Sep 20
  42. #371 on Sep 21
  43. #375 on Sep 22
  44. #369 on Sep 23
  45. #368 on Sep 24
  46. #367 on Sep 25
  47. #363 on Sep 26
  48. #366 on Sep 27
  49. #370 on Sep 28
  50. #379 on Sep 29
  51. #377 from Sep 30 to Oct 1
  52. #378 on Oct 2
  53. #371 on Oct 3
  54. #372 from Oct 5 to Oct 6
  55. #374 on Oct 7
  56. #375 on Oct 8
  57. #383 on Oct 9
  58. #374 on Oct 10
  59. #370 on Oct 11
  60. #374 on Oct 12
  61. #372 on Oct 13
  62. #375 on Oct 14
  63. #371 on Oct 15
  64. #375 on Oct 16
  65. #367 on Oct 17
  66. #373 on Oct 18
  67. #374 on Oct 19
  68. #375 on Oct 20
  69. #372 on Oct 21
  70. #374 on Oct 22
  71. #373 on Oct 23
  72. #367 on Oct 24
  73. #382 on Oct 25
  74. #332 on Oct 28
  75. #320 on Oct 29
  76. #312 on Oct 30

Before you install

Network or broad shell

Automated 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:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo-experiments/skills/expo-migrate-module/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-app-stores/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-app-stores/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-app-stores/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-app-stores/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-app-stores/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-app-stores/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-app-stores/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-app-stores/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-hosting/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-hosting/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-hosting/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-hosting/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-hosting/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-hosting/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-observe/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-observe/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-simulator/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • plugins/expo/skills/eas-simulator/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
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

  • Network accessline 29
    Docs: https://docs.expo.dev/eas/observe/integrations/expo-image/
  • Network accessline 66
    Docs: https://docs.expo.dev/eas/observe/integrations/react-native-reanimated/

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

  • Network accessline 5
    > Source: https://docs.expo.dev/eas/observe/eas-cli/ — the canonical CLI page. This reference adds table layouts, JSON output shapes, and pagination details that the docs page does not cover.
  • Network accessline 40
    > Source: https://docs.expo.dev/eas/observe/mcp/

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

  • Executable scriptline 1
    #!/usr/bin/env node
  • Network accessline 22
    const response = await fetch(url, {

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

  • Network accessline 42
    // Display overlay to advertise full app.     // https://developer.apple.com/documentation/app_clips/recommending_your_app_to_app_clip_users
  • Network accessline 43
    // https://developer.apple.com/documentation/app_clips/recommending_your_app_to_app_clip_users

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

  • Network accessline 145
    "type": "remotePublic",                 "name": "company",                 "url": "https://maven.example.com/releases"
  • Network accessline 146
    "name": "company",                 "url": "https://maven.example.com/releases"               },
  • Network accessline 147
    "url": "https://maven.example.com/releases"

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

  • Access to secretsline 31
    [Credential-related source omitted]
  • Access to secretsline 41
    [Credential-related source omitted]
  • Access to secretsline 69
    [Credential-related source omitted]
  • Access to secretsline 81
    [Credential-related source omitted]

plugins/expo/skills/expo-native-ui/references/icons.md

  • Network accessline 222
    1. Use the SF Symbols app on macOS (free from Apple) 2. Search at https://developer.apple.com/sf-symbols/
  • Network accessline 223
    2. Search at https://developer.apple.com/sf-symbols/

plugins/expo/skills/expo-native-ui/references/media.md

  • Network accessline 86
    const player = useAudioPlayer({ uri: 'https://stream.nightride.fm/rektory.mp3' });
  • Network accessline 138
    const videoSource = 'https://example.com/video.mp4';
  • Possible obfuscationline 183
    const binaryString = atob(base64);

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

  • Network accessline 7
    Full guide: https://docs.expo.dev/guides/new-architecture/
  • Dangerous shell operationline 72
    Verify from the command line if the currently running app uses the New Architecture: `bunx xcobra expo eval "_IS_FABRIC"` -> `true`

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

and 258 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativeManifest .claude-plugin/marketplace.json.claude/skills/<skill-name>/
CodexNativeManifest AGENTS.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md plugins/expo-experiments/skills/expo-migrate-module/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md plugins/expo-experiments/skills/expo-migrate-module/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md plugins/expo-experiments/skills/expo-migrate-module/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.

expo/skills: #310 on hotskills, 4.1k stars

[![expo/skills on hotskills](https://hotskills.dev/badge/expo-skills.svg)](https://hotskills.dev/skill/expo-skills/)