upgrading-expo — Codex skill: upgrade Expo SDK safely
Walks the agent through an Expo SDK upgrade: install commands, diagnostics, cache cleanup and broken dependency fixes.
npx skills add openai/plugins --skill upgrading-expo -a codexWhat upgrading-expo does
The skill gives the agent an ordered routine for moving to a new Expo SDK. It runs npx expo install expo@latest, then npx expo install --fix, follows up with npx expo-doctor, and clears caches via npx expo export -p ios --clear plus removing node_modules and .expo. From there the agent works a breaking-changes checklist: removed APIs, moved modules, native changes.
Bundled references cover version-specific work: New Architecture migration, React 19 changes, React Compiler setup, native tabs, and moving audio and video off expo-av onto expo-audio and expo-video. A table maps deprecated packages to replacements. Beta releases get their own section — .preview suffix, @next tag.
Before npx expo prebuild --clean the skill tells you to check whether ios/ and android/ exist. If neither does, the project uses Continuous Native Generation and that step, along with the bare-workflow cache cleanup, gets skipped. On SDK 54 and later react-native-worklets is required for react-native-reanimated to work. Worth checking package.json before you start, not after.
What it helps with
- upgrade the Expo SDK without drowning in broken dependencies
- find removed APIs and moved import paths after an upgrade
- migrate audio and video from expo-av to expo-audio and expo-video
- clear CocoaPods, Xcode and Gradle caches after a version bump
- drop stale patches and redundant Metro and PostCSS config
Example prompts for the agent
- Upgrade this project to the latest Expo SDK and fix the dependencies
- Run expo-doctor and tell me what it complains about
- Check which packages are deprecated and suggest replacements
How to install upgrading-expo
1Skills CLI (Vercel)
npx skills add openai/plugins --skill upgrading-expo -a codex2Manually: put the files in place
.agents/skills/upgrading-expo/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add openai/plugins --skill upgrading-expo -a claude-code2Manually: put the files in place
~/.claude/skills/upgrading-expo/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/upgrading-expo/
Manually: put the files in place
.cursor/skills/upgrading-expo/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install openai/plugins upgrading-expo2Manually: put the files in place
.github/skills/upgrading-expo/SKILL.mdPlatform CLI
gemini skills install https://github.com/openai/plugins --path plugins/expo/skills/upgrading-expoManually: put the files in place
.devin/skills/upgrading-expo/SKILL.mdThe legacy .windsurf/skills/ path still works
Claude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: Codex skills: how to install, where they live, how to call them
Questions about upgrading-expo
How do I install upgrading-expo in Claude?
Run npx skills add openai/plugins --skill upgrading-expo, then npx skills add openai/plugins --skill upgrading-expo -a codex. The skill then lives at .agents/skills/upgrading-expo/SKILL.md.
What does upgrading-expo do?
It walks the agent through an Expo SDK upgrade: installing packages, running diagnostics, clearing caches, working the breaking-changes checklist and migrating deprecated packages.
What do I need before using it?
An Expo project. On SDK 54 and later you need react-native-worklets installed, otherwise react-native-reanimated won't work. Before npx expo prebuild --clean, confirm the project isn't using Continuous Native Generation.
Source text
SKILL.md · MIT
---
name: upgrading-expo
description: Guidelines for upgrading Expo SDK versions and fixing dependency issues
version: 1.0.0
license: MIT
---
## References
- ./references/new-architecture.md -- SDK +53: New Architecture migration guide
- ./references/react-19.md -- SDK +54: React 19 changes (useContext → use, Context.Provider → Context, forwardRef removal)
- ./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 -- Migrate audio playback and recording from expo-av to expo-audio
- ./references/expo-av-to-video.md -- Migrate video playback from expo-av to expo-video
## Beta/Preview Releases
Beta versions use `.preview` suffix (e.g., `55.0.0-preview.2`), published under `@next` tag.
Check if latest is beta: https://exp.host/--/api/v2/versions (look for `-preview` in `expoVersion`)
```bash
npx expo install expo@next --fix # install beta
```
## Step-by-Step Upgrade Process
1. Upgrade Expo and dependencies
```bash
npx expo install expo@latest
npx expo install --fix
```
2. Run diagnostics: `npx expo-doctor`
3. Clear caches and reinstall
```bash
npx expo export -p ios --clear
rm -rf node_modules .expo
watchman watch-del-all
```
## Breaking Changes Checklist
- Check for removed APIs in release notes
- Update import paths for moved modules
- Review native module changes requiring prebuild
- Test all camera, audio, and video features
- Verify navigation still works correctly
## Prebuild for Native Changes
**First check if `ios/` and `android/` directories exist in the project.** If neither directory exists, the project uses Continuous Native Generation (CNG) and native projects are regenerated at build time — skip this section and "Clear caches for bare workflow" entirely.
If upgrading requires native changes:
```bash
npx expo prebuild --clean
```
This regenerates the `ios` and `android` directories. Ensure the project is not a bare workflow app before running this command.
## Clear caches for bare workflow
These steps only apply when `ios/` and/or `android/` directories exist in the project:
- Clear the cocoapods cache for iOS: `cd ios && pod install --repo-update`
- Clear derived data for Xcode: `npx expo run:ios --no-build-cache`
- Clear the Gradle cache for Android: `cd android && ./gradlew clean`
## Housekeeping
- Review release notes for the target SDK version at https://expo.dev/changelog
- If using Expo SDK 54 or later, ensure react-native-worklets is installed — this is required for react-native-reanimated to work.
- Enable React Compiler in SDK 54+ by adding `"experiments": { "reactCompiler": true }` to app.json — it's stable and recommended
- Delete sdkVersion from `app.json` to let Expo manage it automatically
- Remove implicit packages from `package.json`: `@babel/core`, `babel-preset-expo`, `expo-constants`.
- If the babel.config.js only contains 'babel-preset-expo', delete the file
- If the metro.config.js only contains expo defaults, delete the file
## Deprecated Packages
| Old Package | Replacement |
| -------------------- | ---------------------------------------------------- |
| `expo-av` | `expo-audio` and `expo-video` |
| `expo-permissions` | Individual package permission APIs |
| `@expo/vector-icons` | `expo-symbols` (for SF Symbols) |
| `AsyncStorage` | `expo-sqlite/localStorage/install` |
| `expo-app-loading` | `expo-splash-screen` |
| expo-linear-gradient | experimental_backgroundImage + CSS gradients in View |
When migrating deprecated packages, update all code usage before removing the old package. For expo-av, consult the migration references to convert Audio.Sound to useAudioPlayer, Audio.Recording to useAudioRecorder, and Video components to VideoView with useVideoPlayer.
## expo.install.exclude
Check if package.json has excluded packages:
```json
{
"expo": { "install": { "exclude": ["react-native-reanimated"] } }
}
```
Exclusions are often workarounds that may no longer be needed after upgrading. Review each one.
## Removing patches
Check if there are any outdated patches in the `patches/` directory. Remove them if they are no longer needed.
## Postcss
- `autoprefixer` isn't needed in SDK +53. Remove it from dependencies and check `postcss.config.js` or `postcss.config.mjs` to remove it from the plugins list.
- Use `postcss.config.mjs` in SDK +53.
## Metro
Remove redundant metro config options:
- resolver.unstable_enablePackageExports is enabled by default in SDK +53.
- `experimentalImportSupport` is enabled by default in SDK +54.
- `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/).
## Hermes engine v1
Since SDK 55, users can opt-in to use Hermes engine v1 for improved runtime performance. This requires setting `useHermesV1: true` in the `expo-build-properties` config plugin, and may require a specific version of the `hermes-compiler` npm package. Hermes v1 will become a default in some future SDK release.
## New Architecture
The new architecture is enabled by default, the app.json field `"newArchEnabled": true` is no longer needed as it's the default. Expo Go only supports the new architecture as of SDK +53.
© Expo Team · MIT · openai/plugins