upgrade-react-native
Use when upgrading react-native to a newer version. Handles version bumps, native project changes (Android/iOS), dependency updates, and breaking change migration. Invoke with `/upgrade-react-native <version>`.
What this skill does
# Upgrade React Native
Upgrade a React Native Community CLI project to a target version by fetching
and applying the diff from the
[React Native Upgrade Helper](https://react-native-community.github.io/upgrade-helper/).
<!-- LLM_EXCLUDE: Human-only context below -->
> [!Note]
> **Expo users:** For Expo projects or more complex upgrade scenarios, try:
> - [expo/skills/upgrading-expo](https://skills.sh/expo/skills/upgrading-expo)
> - [callstackincubator/agent-skills/upgrading-react-native](https://skills.sh/callstackincubator/agent-skills/upgrading-react-native)
<!-- /LLM_EXCLUDE -->
## Invocation
```
/upgrade-react-native <targetVersion>
```
- `<targetVersion>` — the React Native version to upgrade to (e.g. `0.79.0`).
## Step-by-step procedure
Follow every step below **in order**. Do not skip steps.
### 1. Detect the current React Native version
Read the project's root `package.json` and extract the `react-native` version
from `dependencies` (or `devDependencies`). Strip any semver range prefix
(`^`, `~`, `>=`, etc.) to get the exact current version string.
If the current version cannot be determined, stop and ask the user.
### 2. Validate the target version
- The target version must be a valid semver string (e.g. `0.79.0`).
- It must be **greater than** the current version.
- Verify the target version exists by checking:
```
https://raw.githubusercontent.com/react-native-community/rn-diff-purge/master/RELEASES
```
Fetch this file and confirm the target version is listed. If not, report the
closest available versions and ask the user to choose.
### 3. Fetch the upgrade diff
Fetch the unified diff between the two versions:
```
https://raw.githubusercontent.com/react-native-community/rn-diff-purge/diffs/diffs/<currentVersion>..<targetVersion>.diff
```
For example, to upgrade from `0.73.0` to `0.74.0`:
```
https://raw.githubusercontent.com/react-native-community/rn-diff-purge/diffs/diffs/0.73.0..0.74.0.diff
```
If the diff cannot be fetched (404), it may be because exact patch versions are
not available. Try the nearest minor versions (e.g. `0.73.0` instead of
`0.73.2`). Report what you tried and ask the user if needed.
### 4. Parse the diff and map file paths
The diff uses the template project name `RnDiffApp`. Map every path in the diff
to the actual project:
| Diff path prefix | Actual project path |
|------------------|---------------------|
| `RnDiffApp/` | Project root (`./`) |
Additionally, replace occurrences of the template identifiers with the project's
actual names:
| Template value | Replace with |
|----------------|--------------|
| `RnDiffApp` | The project's app name (from `app.json` → `name`, or the `name` field in `package.json`) |
| `rndiffapp` | Lowercase version of the project's app name |
| `com.rndiffapp` | The project's Android package name (from `android/app/build.gradle` or `android/app/src/main/AndroidManifest.xml`) |
### 5. Review the diff and plan changes
Before making any edits, review the entire diff and categorize changes:
1. **Direct applies** — files that exist in the project and whose original
content matches the diff's `-` lines. These can be applied as-is.
2. **Conflicts** — files where the project's content has diverged from the
template (custom modifications). These need manual merging.
3. **New files** — files in the diff that don't exist in the project yet. Create
them.
4. **Deleted files** — files the diff removes. Delete them only if the project
hasn't added custom content to them.
Present this plan to the user before proceeding. Group changes by area:
- **Root config files** (`package.json`, `metro.config.js`, `.eslintrc.js`, etc.)
- **iOS native files** (`ios/` directory)
- **Android native files** (`android/` directory)
- **JavaScript/TypeScript source** (if any template source files changed)
- **Third-party native dependencies** (from step 7 — include any version bumps
identified there)
### 6. Apply changes
Apply the changes following the plan from step 5:
- For **direct applies**: edit the file to match the diff's `+` lines.
- For **conflicts**: apply the upgrade changes while preserving the project's
customizations. Use your judgement to merge. If uncertain, show both versions
and ask the user.
- For **new files**: create them at the mapped path.
- For **deleted files**: remove them.
**Important considerations:**
- When updating `package.json`, update the `react-native` version and any
related dependencies mentioned in the diff (e.g. `react`, `@react-native/*`
packages, Gradle versions, CocoaPods versions).
- Do NOT run `npm install` / `yarn install` / `pod install` automatically.
Inform the user these steps are needed after the upgrade.
- Refer to the [references](#references) section for version-specific guidance
on breaking changes and migration notes.
### 7. Update third-party native dependencies
Scan the project's `dependencies` and `devDependencies` in `package.json` for
third-party React Native libraries that contain **native code** (i.e. they have
an `ios/` or `android/` directory, or are known native modules). Common examples
include `react-native-screens`, `react-native-reanimated`,
`react-native-gesture-handler`, `@react-native-async-storage/async-storage`,
`react-native-svg`, `react-native-safe-area-context`, etc.
For each candidate dependency:
1. **Fetch the library's README** from its GitHub repository or npm page.
2. **Look for a React Native version compatibility table or section** — many
native libraries document which versions of their package support which React
Native versions (e.g. a "Compatibility" or "Version Support" table).
3. **If the README contains a compatibility table** that maps the target React
Native version to a specific library version, include that library version
bump in the upgrade plan.
4. **If the README does not mention version compatibility with React Native
versions**, skip the library — do not guess or assume an upgrade is needed.
Present all proposed dependency bumps alongside the diff-based changes in step 5
(grouped under a **Third-party native dependencies** section). For each:
- State the current version, the proposed version, and link to the compatibility
info you found.
- If multiple major versions are compatible, prefer the latest stable version
that supports the target React Native version.
Apply these version bumps to `package.json` as part of step 6.
### 8. Post-upgrade checklist
After applying all changes, present the user with a checklist:
- [ ] Run `npm install` or `yarn install` to update JS dependencies
- [ ] Run `cd ios && bundle exec pod install` (or `npx pod-install`) to update
native iOS dependencies
- [ ] Run a clean build for Android: `cd android && ./gradlew clean`
- [ ] Run a clean build for iOS: `cd ios && xcodebuild clean`
- [ ] Run the app on both platforms to verify it launches
- [ ] Run the project's test suite
- [ ] Review any conflict resolutions for correctness
- [ ] Check the [React Native changelog](https://github.com/facebook/react-native/blob/main/CHANGELOG.md) for additional breaking changes
- [ ] Check the [Upgrade Helper web UI](https://react-native-community.github.io/upgrade-helper/?from=<currentVersion>&to=<targetVersion>) for any supplementary notes
## References
Consult these for version-specific migration guidance:
- [references/upgrade-helper-api.md](./references/upgrade-helper-api.md) — How
to fetch diffs and version lists programmatically
Related in Web Dev
generating-lwc-components
IncludedLightning Web Components with PICKLES methodology and 165-point scoring. Use this skill when the user creates or edits LWC components, builds wire service patterns, or writes Jest tests for LWC. TRIGGER when: user creates/edits LWC components, touches lwc/**/*.js, .html, .css, .js-meta.xml files, or asks about wire service, SLDS, or Jest LWC tests. DO NOT TRIGGER when: Apex classes (use generating-apex), Aura components, or Visualforce.
tanstack-query
IncludedManage server state in React with TanStack Query v5. Set up queries with useQuery, mutations with useMutation, configure QueryClient caching strategies, implement optimistic updates, and handle infinite scroll with useInfiniteQuery. Use when: setting up data fetching in React projects, migrating from v4 to v5, or fixing object syntax required errors, query callbacks removed issues, cacheTime renamed to gcTime, isPending vs isLoading confusion, keepPreviousData removed problems.
document-processor-api
IncludedProcess documents with Nutrient DWS. Use when the user wants to generate PDFs from HTML or URLs, convert Office/images/PDFs, assemble or split packets, OCR scans, extract text/tables/key-value pairs, redact PII, watermark, sign, fill forms, optimize PDFs, or produce compliance outputs like PDF/A or PDF/UA. Triggers include convert to PDF, merge these PDFs, OCR this scan, extract tables, redact PII, sign this PDF, make this PDF/A, or linearize for web delivery.
nutrient-document-processing
IncludedProcess documents with Nutrient DWS. Use when the user wants to generate PDFs from HTML or URLs, convert Office/images/PDFs, assemble or split packets, OCR scans, extract text/tables/key-value pairs, redact PII, watermark, sign, fill forms, optimize PDFs, or produce compliance outputs like PDF/A or PDF/UA. Triggers include convert to PDF, merge these PDFs, OCR this scan, extract tables, redact PII, sign this PDF, make this PDF/A, or linearize for web delivery.
tanstack-query
IncludedManage server state in React with TanStack Query v5. Covers useMutationState, simplified optimistic updates, throwOnError, network mode (offline/PWA), and infiniteQueryOptions. Use when setting up data fetching, fixing v4→v5 migration errors (object syntax, gcTime, isPending, keepPreviousData), or debugging SSR/hydration issues with streaming server components.
accelint-nextjs-best-practices
IncludedNext.js performance optimization and best practices. Use when writing Next.js code (App Router or Pages Router); implementing Server Components, Server Actions, or API routes; optimizing RSC serialization, data fetching, or server-side rendering; reviewing Next.js code for performance issues; fixing authentication in Server Actions; or implementing Suspense boundaries, parallel data fetching, or request deduplication.