React Native Roadmap 2026-W20
Week of May 11–May 17, 2026
Items This Week
| # | Title | Label | Link |
|---|---|---|---|
| 1 | Redraw — WebGPU 2D graphics primitives for RN & Web | 🟦 RN | Read |
| 2 | React Native SWC — SWC-powered transformer & minifier for Metro | 🟦 RN | Read |
| 3 | The Hidden Cost of <Activity> | 🟦 RN | Read |
| 4 | Expo SDK 56 Beta — Stable Expo UI, faster builds, RN 0.85 | 🟧 EXPO | Read |
| 5 | RN Screens 4.25 — Drops Legacy Architecture, Tabs API RC | 🟦 RN | Read |
| 6 | whisper.rn 0.6 — on-device speech transcription | 🟦 RN | Read |
| 7 | Build fast: Expo speed optimizations & fingerprint EAS workflows | 🟧 EXPO | Read |
| 8 | From React web to Native in one week (Expo + Claude Code + Skills) | 🟧 EXPO | Read |
5-Day Action Plan
Â
🟦 Chunk 1 — Migrate Metro Bundler to React Native SWC
Goal: Replace Babel with SWC in the Metro transpilation pipeline to achieve ~3x faster full bundling and ~8x faster transform workers, reducing developer feedback loops and CI times.
Scope:
- Install
react-native-swcand its peer dependencies - Replace the Babel transformer in
metro.config.jswith the SWC transformer - Replace Babel minifier with the SWC minifier
- Verify all existing transforms work correctly (Flow types, JSX, decorators)
- Measure and document before/after bundle times in the project README
Out of scope:
- Changing Babel configuration for non-Metro tooling (tests, web)
- Migrating custom Babel plugins to SWC plugins (keep as a follow-up)
- Updating CI infrastructure (timing metrics only)
Dependencies: React Native project using Metro ≥ 0.80; no prior chunks needed.
Acceptance criteria:
npx expo startlaunches without Babel errors- Hot reload works as expected on iOS and Android simulators
metro bundlemeasured at ≥ 2x faster than before- No regressions on existing screens verified by a QA smoke test
Estimated effort: M
Â
**Copy/paste this prompt:**
Implement the following React Native chunk for your mobile app: Migrate the Metro bundler from Babel to React Native SWC for faster transpilation.
Goal: Replace Babel with SWC as the Metro transformer and minifier to achieve ~3x faster full bundling and ~8x faster transform workers.
Files to create or modify:
metro.config.js— swap transformer and minifier to SWCpackage.json— addreact-native-swcdependencyREADME.md— document before/after bundle times
Step-by-step instructions:
- Install:
npm install react-native-swc - In
metro.config.js, settransformer.babelTransformerPathtorequire.resolve('react-native-swc/src/index.js') - Set
serializer.minifierPathtorequire.resolve('react-native-swc/src/minifier.js') - Clear Metro cache:
npx expo start --clear - Run
npx expo exportand record build duration - Compare with a Babel baseline (git stash → measure → git stash pop)
Acceptance criteria checklist:
- App launches on iOS simulator without errors
- App launches on Android emulator without errors
- Hot reload works after a JS change
- Bundle time is measurably faster than the Babel baseline
- No TypeScript/Flow type-stripping errors in the output
🟦 Chunk 2 — Audit and Fix Hidden <Activity> Performance Costs
Goal: Prevent frame drops and jank when screens become visible again by auditing all <Activity>-wrapped screens for heavy useEffect usage, and replacing problematic patterns with deferred or lazy alternatives.
Scope:
- Identify all screens or components wrapped in
<Activity>(or using the React 19.2 Activity API) - Profile each identified screen with React Native DevTools when it transitions from hidden to visible
- Refactor expensive
useEffecthooks (data fetching, subscriptions, heavy computations) to run lazily or be cancelled while hidden - Replace synchronous layout effects with
useEffectwhere possible - Add a short performance comment above each refactored hook explaining the rationale
Out of scope:
- Refactoring screens not wrapped in
<Activity> - Introducing a new state management library
- Optimising non-Effect logic (rendering, memoisation — separate chunk)
Dependencies: React Native ≥ 0.83 (Activity API stable); no prior chunks needed.
Acceptance criteria:
- React Native DevTools shows no dropped frames (< 2 dropped per transition) when switching to an Activity-wrapped screen
- All previously identified expensive
useEffecthooks are either deferred, cancelled, or guarded - A non-technical stakeholder can open and close each audited screen 5 times without visible jank
Estimated effort: M
Â
**Copy/paste this prompt:**
Implement the following React Native chunk for your mobile app: Audit and fix hidden performance costs introduced by the <Activity> API.
Goal: Prevent frame drops when screens wrapped in <Activity> become visible by refactoring expensive useEffect hooks.
Files to create or modify:
- Every screen component that is a direct child of an
<Activity>wrapper - Each file containing a
useEffecthook inside those screens
Step-by-step instructions:
- Search the codebase for
<Activityusage:grep -r "<Activity" src/ - Open React Native DevTools (Profiler tab) and record a transition for each found screen
- For each
useEffectthat runs on mount AND is expensive (fetch, subscription, heavy computation): a. Add aisVisiblestate or useuseIsFocused()from React Navigation b. Gate the effect:if (!isVisible) return;c. Return a cleanup function that cancels in-flight requests (AbortController) - For layout effects (
useLayoutEffect) that are not needed synchronously, downgrade touseEffect - Re-profile each screen and confirm frame drop count is below 2 per transition
Acceptance criteria checklist:
- DevTools Profiler shows < 2 dropped frames per Activity screen transition
- All identified expensive effects are guarded by a visibility condition
- Cleanup functions cancel in-flight work (no memory leaks in DevTools)
- Manual smoke test: 5 open/close cycles on each screen with no visible jank
🟧 Chunk 3 — Upgrade to Expo SDK 56 Beta
Goal: Adopt Expo SDK 56 Beta to gain access to stable Expo UI (Jetpack Compose + SwiftUI APIs), React Native 0.85, faster Android startup times, and faster iOS builds via prebuilt XCFrameworks.
Scope:
- Run
npx expo install expo@nextand upgrade allexpo-*packages to SDK 56 Beta versions - Resolve any breaking changes listed in the SDK 56 Beta changelog
- Test the app on both iOS simulator and Android emulator
- Verify Expo UI components (if used) compile without errors
- Confirm EAS Build completes successfully with the new SDK
Out of scope:
- Adopting new SDK 56 features not already in use (follow-up chunks)
- Upgrading non-Expo third-party native libraries (unless required by the SDK upgrade)
- App Store / Play Store submission
Dependencies: Active Expo project on SDK 55; EAS account for build verification.
Acceptance criteria:
npx expo doctorreports no critical issues- The app builds and runs on iOS simulator and Android emulator
- EAS Build succeeds for both platforms
- Android cold-start time is equal to or faster than SDK 55 baseline
Estimated effort: M
Â
**Copy/paste this prompt:**
Implement the following React Native chunk for your mobile app: Upgrade the project from Expo SDK 55 to SDK 56 Beta.
Goal: Gain stable Expo UI APIs, React Native 0.85, improved Android startup, and faster iOS builds.
Files to create or modify:
package.json— bumpexpoand allexpo-*packagesapp.json/app.config.js— updatesdkVersionif hardcodedeas.json— no changes needed unless a new build profile is required
Step-by-step instructions:
- Run
npx expo install expo@nextto install the latest SDK 56 Beta - Run
npx expo install --fixto align all expo-* packages to SDK 56-compatible versions - Check the SDK 56 Beta changelog at https://expo.dev/changelog/sdk-56-beta for breaking changes
- Run
npx expo doctorand resolve any reported issues - Run
npx expo run:iosandnpx expo run:androidlocally to verify - Trigger an EAS Build:
eas build --platform all --profile preview - Measure Android cold-start time and compare to SDK 55 baseline
Acceptance criteria checklist:
-
npx expo doctorexits with no critical errors - App runs on iOS simulator without crashes
- App runs on Android emulator without crashes
- EAS Build succeeds for both platforms
- Android cold-start time ≤ SDK 55 baseline
🟧 Chunk 4 — Configure Fingerprint-Based EAS Update Workflows
Goal: Reduce CI build times by setting up a GitHub-connected EAS Workflow that automatically determines whether a commit requires a full native rebuild or only a JavaScript OTA update, using Expo's fingerprint hashing.
Scope:
- Enable EAS Update in the project (
eas update:configure) - Create an EAS Workflow file at
.eas/workflows/ci.ymlusing the fingerprint-based template - Connect the Expo project to GitHub via the Expo dashboard
- Configure a
previewchannel for OTA-only updates - Test the workflow by pushing a JS-only change (should trigger OTA) and a native change (should trigger a full build)
Out of scope:
- Setting up production OTA updates or staged rollouts
- Configuring multiple app variants or environments
- EAS Submit / App Store automation
Dependencies: Expo SDK 55+ project; EAS account; GitHub repository connected to Expo; Chunk 3 (SDK 56 Beta) recommended but not required.
Acceptance criteria:
- A commit that changes only JS files triggers an EAS Update (no full build)
- A commit that changes
package.jsonnative dependencies orapp.config.jstriggers a full EAS Build - The GitHub commit status shows the correct workflow result (build or update)
- A non-technical stakeholder can install the OTA update on their preview device without reinstalling the app
Estimated effort: S
Â
**Copy/paste this prompt:**
Implement the following React Native chunk for your mobile app: Configure fingerprint-based EAS Update workflows to skip full builds when only JS changes.
Goal: Automatically run OTA updates for JS-only commits and full builds for native changes, cutting average CI time significantly.
Files to create or modify:
.eas/workflows/ci.yml— new workflow fileeas.json— addpreviewchannel / update configurationapp.config.js(orapp.json) — enable EAS Update
Step-by-step instructions:
- Run
eas update:configureand follow the prompts to enable EAS Update - In
app.config.js, setupdates.urlto the EAS Update endpoint andupdates.enabled: true - Create
.eas/workflows/ci.ymlwith the fingerprint-based workflow:- On push to
main, compute the native fingerprint - If fingerprint unchanged → run
eas update --channel preview --auto - If fingerprint changed → run
eas build --channel preview --platform all --non-interactive
- On push to
- Connect the project to GitHub in the Expo dashboard (Settings → GitHub)
- Push a JS-only change and verify only an OTA update runs
- Push a change that adds a new native package and verify a full build runs
Acceptance criteria checklist:
- JS-only commit triggers OTA update (no full build in EAS dashboard)
- Native-change commit triggers full EAS Build
- GitHub commit status reflects the correct workflow outcome
- Preview device receives OTA update without app reinstall
🟦 Chunk 5 — Integrate whisper.rn 0.6 for On-Device Speech Transcription
Goal: Add offline, on-device speech-to-text capability to the app using whisper.rn 0.6 (React Native bindings for whisper.cpp), enabling features like voice search, voice notes, or accessibility dictation without any API cost or network dependency.
Scope:
- Install
whisper.rn@0.6and its native dependencies - Download a small Whisper model (e.g.
ggml-tiny.en.bin, ~75 MB) and bundle it with the app or download on first launch - Create a
useWhispercustom hook that exposesstartRecording,stopRecording, andtranscriptstate - Build a minimal demo screen with a record button and a transcription text area
- Test on a physical device (iOS or Android) to verify transcription accuracy and latency
Out of scope:
- Integration with backend APIs or cloud transcription services
- Speaker diarisation or multi-language support
- Production UI polish (buttons, animations)
Dependencies: React Native ≥ 0.71; microphone permission handling (expo-av or @react-native-voice/voice); no prior chunks required.
Acceptance criteria:
- The demo screen launches and the record button is tappable on a physical device
- After speaking a short sentence (5–10 words), the transcript appears within 3 seconds
- Transcription works fully offline (airplane mode enabled)
- Microphone permission prompt is shown on first use and gracefully handled if denied
Estimated effort: M
Â
**Copy/paste this prompt:**
Implement the following React Native chunk for your mobile app: Integrate whisper.rn 0.6 for on-device, offline speech transcription.
Goal: Enable voice-to-text without any network dependency using whisper.cpp bindings for React Native.
Files to create or modify:
package.json— addwhisper.rnapp.json/app.config.js— add microphone permission (iOSNSMicrophoneUsageDescription, AndroidRECORD_AUDIO)src/hooks/useWhisper.ts— new custom hooksrc/screens/VoiceDemo.tsx— new demo screensrc/navigation/index.tsx— register the demo route
Step-by-step instructions:
- Install:
npx expo install whisper.rn - Add microphone permissions in
app.config.js:- iOS:
NSMicrophoneUsageDescription: "Used for voice transcription" - Android:
permissions: ["RECORD_AUDIO"]
- iOS:
- On app first launch, download
ggml-tiny.en.binfrom Hugging Face to the device's document directory usingexpo-file-system - Create
useWhisper.ts:- Load the model once with
initWhisper({ filePath }) - Expose
transcribe(audioPath)returning{ segments, text } - Handle loading / error states
- Load the model once with
- Create
VoiceDemo.tsx:- Use
expo-avto record audio to a temp file - Call
transcribeon stop and display the result
- Use
- Build a development build (
eas build --profile development) and test on a physical device
Acceptance criteria checklist:
-
whisper.rninitialises without native build errors - Microphone permission prompt appears on first use
- Recording starts and stops correctly
- Transcript appears within 3 seconds of stopping on a physical device
- Transcription works with airplane mode enabled (fully offline)
- Permission denial is handled gracefully (UI shows an explanation message)