weshipit.today — React Native Newsletter — 2026-W15
Week of April 6–April 12, 2026
Items This Week
| # | Title | Label | Link |
|---|---|---|---|
| 1 | React Native 0.85 — New Animation Backend, Jest Preset, Metro TLS | 🟦 RN | Read |
| 2 | react-native-haptic-feedback 3.0 | 🟦 RN | Read |
| 3 | React Native Skia 2.6 | 🟦 RN | Read |
| 4 | The Uphill Climb of Making Diff Lines Performant on GitHub | ⚛️ REACT | Read |
| 5 | Moving Railway's Frontend Off Next.js (Vite + TanStack Router) | ⚛️ REACT | Read |
| 6 | React Status #469 — April 10, 2026 | ⚛️ REACT | Read |
Sources: React Status #469 (Apr 10, 2026) · React Native Blog (Apr 7, 2026) · This Week In React (Apr 8, 2026) — newsletters tracked in the "Newsletters React Native" Notion database.
5-Day Action Plan
🟦 Chunk 1 — Upgrade to React Native 0.85
Goal: Bring the app to the latest stable React Native release, unblocking the new animation backend, eliminating deprecated APIs, and aligning with Node.js LTS versions — a prerequisite for every other chunk this week.
Scope:
- Bump
react-nativeto0.85.xinpackage.json - Install
@react-native/jest-presetand updatejest.config.js(preset: '@react-native/jest-preset') - Search & replace all
StyleSheet.absoluteFillObject→StyleSheet.absoluteFill - Migrate
AccessibilityInfo.setAccessibilityFocus→AccessibilityInfo.sendAccessibilityEvent - Verify CI runs on Node.js ≥ 20.19.4 (drop EOL v21/v23)
- Smoke-test app boot on iOS simulator and Android emulator
Out of scope: Opting into the experimental New Animation Backend channel (0.85.1+), Expo SDK 56 upgrade, third-party library updates.
Dependencies: None — first chunk of the week.
Acceptance criteria:
npx react-native --versionreturns0.85.x- All Jest tests pass with
@react-native/jest-preset - Zero occurrences of
absoluteFillObjectin the codebase - App boots without crash on both iOS and Android
- CI pipeline is green on a supported Node.js version
Estimated effort: M
<details> <summary>**Copy/paste this prompt:**</summary>Implement the following React Native chunk for your mobile app:
Goal: Upgrade the project to React Native 0.85.x.
Files to create or modify:
package.json— bumpreact-nativeto^0.85.0jest.config.js— replacepreset: 'react-native'withpreset: '@react-native/jest-preset'; add@react-native/jest-presetto devDependencies- Any file using
StyleSheet.absoluteFillObject— replace withStyleSheet.absoluteFill - Any file calling
AccessibilityInfo.setAccessibilityFocus— replace withAccessibilityInfo.sendAccessibilityEvent
Step-by-step instructions:
- Set
"react-native": "0.85.0"inpackage.jsonand runnpm install. - In
jest.config.js, install and reference@react-native/jest-preset. - Search the codebase for
absoluteFillObject— replace all occurrences. - Search for
setAccessibilityFocus— migrate tosendAccessibilityEvent. - Run
npx jest— fix any broken snapshots. - Boot on iOS:
npx react-native run-ios. - Boot on Android:
npx react-native run-android.
Acceptance criteria checklist:
-
react-nativeversion is0.85.xinnode_modules - Jest runs with
@react-native/jest-presetwithout errors - Zero
absoluteFillObjectoccurrences remain - App launches on both platforms without crashes
- No TypeScript errors on
tsc --noEmit
🟦 Chunk 2 — Enable Native Driver on Layout Animations (New Animation Backend)
Goal: Deliver visibly smoother layout animations (Flexbox & position props) by opting into RN 0.85's Shared Animation Backend, eliminating JS-thread jank on expanding/collapsing UI elements.
Scope:
- Opt in to the experimental channel (requires 0.85.1, available immediately after Chunk 1)
- Identify 2–3
Animated.Viewcomponents that animate layout props without native driver - Refactor those animations to use
useNativeDriver: trueonwidth,height, orflex - Verify 60 fps via the React Native Perf Monitor on a real or simulated device
Out of scope: Migrating to Reanimated 4, <ViewTransition> (not yet stable), or any new animation screens from scratch.
Dependencies: Chunk 1 (RN 0.85 must be installed; requires 0.85.1 patch for the experimental flag).
Acceptance criteria:
- Layout animations run with
useNativeDriver: trueand no yellow warning - Perf Monitor shows UI thread at 60 fps during target animations
- No JS thread drops visible in Systrace / Perf Monitor
- Works correctly on both iOS and Android
Estimated effort: S
<details> <summary>**Copy/paste this prompt:**</summary>Implement the following React Native chunk for your mobile app:
Goal: Refactor existing layout animations to use useNativeDriver: true with the new Shared Animation Backend in React Native 0.85.
Files to create or modify:
- Any component using
Animated.timing/Animated.springonwidth,height,top,left, orflex— adduseNativeDriver: true src/screens/AnimationDemo.tsx(create if absent) — demo expanding card
Step-by-step instructions:
- Follow https://reactnative.dev/docs/releases/release-levels to opt in to the experimental channel.
- Search the codebase for
Animated.timingandAnimated.springcalls. - For any that animate layout props, add
useNativeDriver: true. - Create a demo screen:
const width = useAnimatedValue(100);
Animated.timing(width, { toValue: 300, duration: 500, useNativeDriver: true }).start();
<Animated.View style={{ width, height: 100, backgroundColor: 'blue' }} />
- Open Perf Monitor (shake → Perf Monitor) and confirm JS FPS stays at 60 during animation.
Acceptance criteria checklist:
-
useNativeDriver: trueon all layout animations — no warnings - Perf Monitor UI thread at 60 fps during animation
- Works on iOS and Android
- No regressions in existing Reanimated-powered animations
🟦 Chunk 3 — Add Haptic Feedback to Key User Interactions
Goal: Improve perceived quality with contextual haptic feedback on primary actions (button presses, success confirmations, error states) — a zero-effort UX win that passes the "wow" test on physical devices.
Scope:
- Install/upgrade
react-native-haptic-feedbackto v3.0 - Create a
useHapticscustom hook with typed trigger names - Wire haptics to: primary CTA buttons (
impactMedium), success toasts (notificationSuccess), error banners (notificationError), pull-to-refresh release - Test on a physical iOS and Android device
Out of scope: Custom vibration patterns, audio feedback, haptics on web/Expo Go.
Dependencies: None — standalone library addition.
Acceptance criteria:
- Library installs and links without breaking iOS or Android builds
- Primary button press produces a tactile response on a physical device
- Success and error haptics are contextually distinct
- No crash on simulator (no haptic engine)
Estimated effort: S
<details> <summary>**Copy/paste this prompt:**</summary>Implement the following React Native chunk for your mobile app:
Goal: Add haptic feedback to key user interactions using react-native-haptic-feedback v3.0.
Files to create or modify:
package.json— addreact-native-haptic-feedback@^3.0.0src/hooks/useHaptics.ts— typed custom hooksrc/components/PrimaryButton.tsx— triggerimpactMediumon presssrc/components/SuccessModal.tsx— triggernotificationSuccesson mountsrc/components/ErrorBanner.tsx— triggernotificationErroron mount
Step-by-step instructions:
npm install react-native-haptic-feedback@^3.0.0thencd ios && pod install.- Create
src/hooks/useHaptics.ts:
import ReactNativeHapticFeedback, { HapticFeedbackTypes } from 'react-native-haptic-feedback';
const options = { enableVibrateFallback: true, ignoreAndroidSystemSettings: false };
export function useHaptics() {
return { trigger: (type: HapticFeedbackTypes) => ReactNativeHapticFeedback.trigger(type, options) };
}
- In
PrimaryButton.tsx, calltrigger('impactMedium')in theonPresshandler. - In success/error components, call the appropriate notification haptic on mount.
Acceptance criteria checklist:
- Library links correctly on iOS and Android
-
useHapticshook is typed and reusable - Primary button produces a tactile response on a physical device
- Success and error haptics are distinct
- No crash on simulator
⚛️ Chunk 4 — Audit & Fix useEffect Overuse in Performance-Critical Screens
Goal: Cut unnecessary re-renders and reduce interaction latency on the app's highest-traffic screens — directly applying lessons from GitHub's real-world React performance optimization case study.
Scope:
- Profile 2–3 high-traffic screens with React DevTools Profiler (record a before baseline)
- Identify
useEffectcalls replaceable by:useMemo, derived state, or direct event handlers - Refactor the identified anti-patterns one component at a time
- Re-run the Profiler for an after baseline and document render count delta in the PR description
Out of scope: Full app performance audit, navigation layer changes, data-fetching architecture changes.
Dependencies: None — purely a refactor task.
Acceptance criteria:
- Profiler shows measurably fewer renders on targeted screens (document the numbers)
- No functional regressions — all existing tests pass
- No
useEffectwith empty dependency arrays that compute a value (replaced withuseMemo) - PR description includes before/after render counts per component
Estimated effort: M
<details> <summary>**Copy/paste this prompt:**</summary>Implement the following React Native chunk for your mobile app:
Goal: Audit and refactor useEffect overuse in performance-critical screens to reduce re-renders and improve interaction latency.
Files to create or modify:
- The 2–3 most-visited screens in
src/screens/(e.g.HomeScreen.tsx,FeedScreen.tsx,ProfileScreen.tsx) - Any shared hooks these screens depend on
Step-by-step instructions:
- Open React DevTools Profiler. Record a typical user interaction on each target screen. Note render counts.
- Look for components that re-render more than twice per interaction.
- For each screen, find
useEffectcalls that:- Compute a derived value → replace with
useMemo - Set state from props → replace with inline derived state
- Could be a direct event handler → remove the effect
- Have missing/wrong dependency arrays → fix the array
- Compute a derived value → replace with
- Apply fixes one component at a time, re-running tests between each change.
- Re-record the Profiler. Document render counts in a PR comment.
Acceptance criteria checklist:
- Profiler shows reduced render counts on targeted screens
- No
useEffectthat only computes derived state remains - All Jest/RTL tests pass
- No TypeScript errors
- Before/after render counts documented in PR description
🟦 Chunk 5 — Configure Metro TLS for Secure Local Development
Goal: Enable HTTPS + WSS (Fast Refresh) on the Metro dev server so developers can test against APIs that require secure origins (OAuth, camera, geolocation, payment SDKs) without staging environment deployment.
Scope:
- Install
mkcertand generate a locally-trusted development certificate - Configure
metro.config.jswith theserver.tlsblock - Verify Fast Refresh still works over WSS after the change
- Document the full setup in
README.mdordocs/dev-setup.md - Add certificate files to
.gitignore
Out of scope: Production TLS, CI/CD certificate automation, multi-developer certificate sharing.
Dependencies: Chunk 1 (Metro TLS requires RN 0.85).
Acceptance criteria:
- Metro starts on
https://localhost:8081with no certificate warnings - Fast Refresh triggers correctly over WSS on file save
- Other developers can reproduce the setup following the README
.gitignoreexcludes all generated certificate files
Estimated effort: S
<details> <summary>**Copy/paste this prompt:**</summary>Implement the following React Native chunk for your mobile app:
Goal: Configure Metro dev server with TLS so the app runs over HTTPS locally.
Files to create or modify:
metro.config.js— addconfig.server.tlsblockREADME.mdordocs/dev-setup.md— TLS setup instructions.gitignore— exclude*.pemand*.keyfiles
Step-by-step instructions:
- Install mkcert:
brew install mkcert && mkcert -install. - In the project root:
mkcert localhost 127.0.0.1 ::1→ generateslocalhost+2.pemandlocalhost+2-key.pem. - Add both files to
.gitignore. - Update
metro.config.js:
const fs = require('fs');
config.server = {
...config.server,
tls: {
cert: fs.readFileSync('./localhost+2.pem'),
key: fs.readFileSync('./localhost+2-key.pem'),
},
};
- Run
npx react-native start— confirm the URL starts withhttps://. - Edit a file and confirm Fast Refresh triggers over
wss://. - Document steps 1–6 in README under "Local HTTPS Dev Server".
Acceptance criteria checklist:
- Metro starts with
https://URL - No certificate warning in browser/DevTools
- Fast Refresh works over WSS
-
.gitignoreexcludes certificate files - README documents the full setup
Last update on April 13, 2026