RORK LABJP
PLAY — Google Play's target API level 36 requirement took effect yesterday, August 31. From today, new apps and updates must target Android 16VISIBILITY — Apps still on API 35 stay listed but disappear for users on newer Android versions. No error is raised; new installs simply fade, which makes the change easy to missEXTENSION — If you missed the deadline, an extension through November 1, 2026 can be requested in Play Console — best filed alongside a concrete migration planAPPLE — On the Apple side, the event lands September 9 and iOS 27 is reported to ship September 14. Testing generated apps on iOS 27 hardware before release week is time well spentEXPO — Expo released expo-paste-input on August 28, a native module that brings image, GIF, and sticker paste to React Native TextInputEAS — EAS Observe reached general availability on August 20, putting crash and performance monitoring on the same EAS platform as builds and updatesPLAY — Google Play's target API level 36 requirement took effect yesterday, August 31. From today, new apps and updates must target Android 16VISIBILITY — Apps still on API 35 stay listed but disappear for users on newer Android versions. No error is raised; new installs simply fade, which makes the change easy to missEXTENSION — If you missed the deadline, an extension through November 1, 2026 can be requested in Play Console — best filed alongside a concrete migration planAPPLE — On the Apple side, the event lands September 9 and iOS 27 is reported to ship September 14. Testing generated apps on iOS 27 hardware before release week is time well spentEXPO — Expo released expo-paste-input on August 28, a native module that brings image, GIF, and sticker paste to React Native TextInputEAS — EAS Observe reached general availability on August 20, putting crash and performance monitoring on the same EAS platform as builds and updates
Articles/Dev Tools
Dev Tools/2026-05-24Advanced

Staged migration of a Rork-generated RN project to the New Architecture — notes from running six wallpaper apps in parallel

An implementation log for incrementally enabling Fabric and TurboModules on a Rork-generated React Native project, validated in parallel across six wallpaper apps. Covers flag design, compatibility triage, and KPI comparison based on actual production data.

Rork547React Native234New Architecture3Fabric2TurboModules2Hermes8Staged Rollout3

Premium Article

I'm Masaki Hirokawa, an independent app developer who has been shipping iOS and Android apps since 2014. The React Native projects that Rork generates are a wonderful starting point, but every time I take one toward production I run into the same question: when should I enable React Native's New Architecture — Fabric, TurboModules, and Bridgeless mode? In this note I'll walk through how I staged that migration across my own catalog of wallpaper apps. With more than 50 million cumulative downloads spread across six titles, I never had the courage to flip a single flag for all of them at once. What worked instead was breaking the risk into smaller pieces and lining everything up so I could compare numbers honestly.

Why I call this a "staged introduction" rather than a "migration"

React Native's New Architecture is the kind of change that feels like flipping a single switch — bridge gone, Fabric in, TurboModules everywhere. From the operator's side though, that one switch hides a lot of subtlety. My layered stack on top of Rork's scaffolding includes AdMob, Firebase, Skia, Reanimated, MMKV, and AppLovin MAX, replicated across six apps. I learned the hard way that turning newArchEnabled = true in a single push can silently break a non-Fabric native module during launch, and I sometimes didn't notice until TestFlight builds were already going out.

So in my own docs I now use the phrase "staged introduction" instead of "migration." I split it into four phases:

  1. Baseline measurement — keep Old Architecture and measure cold start, JS-thread load, and crash rate for two weeks.
  2. Flag plumbing — make newArchEnabled switchable per build via expo-build-properties.
  3. Canary rollout — pick the lowest-DAU app of the six and let it ride internal + TestFlight builds for a week.
  4. Horizontal expansion — promote apps one by one if KPIs are at least equivalent, roll back if anything regresses.

It sounds like a simple rule — "don't switch every production app at once" — but operationally that's the part that matters most. Rork's generated code is typically clean enough for the New Architecture; almost everything that breaks lives in the native dependencies I added on top later.

Step 1: How to gather baseline numbers

The baseline phase can stay on Old Architecture. Skipping this step is what leads to the vague "feels faster but I can't prove it" kind of decision later. I aim for at least 14 consecutive days of measurement.

I lock the measurement to these five signals:

  • Cold start: Firebase Performance Monitoring's _app_start at p50 and p95
  • JS-thread load: 30 samples of the primary navigation flow with the Hermes profiler
  • Native memory: same scenario three times under Xcode Instruments and Android Profiler
  • Crash rate: Crashlytics' Crash-free users for the trailing 14 days
  • ANR rate (Android): the 7-day median from Play Console's Android Vitals

I paste these five into a Notion table and append the same columns every two weeks afterward. Locking the format up front saves a surprising amount of time when comparing notes — nobody has to argue about what each number means.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
A step-by-step setup for introducing the `newArchEnabled` flag into a freshly generated Rork project using expo-build-properties
A decision flow for wrapping non-Fabric legacy native modules through the Interop Layer while tracking remaining risk
A KPI comparison template covering cold-start, JS-thread load, and crash rate across six wallpaper apps over two-week cycles
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $15 for lifetime access
View Membership →

Related Articles

Dev Tools2026-06-29
When a New Architecture Migration Only Janks in Release Builds — Field Notes on Catching Silent Interop-Layer Fallback
A Rork app on the New Architecture scrolled fine in development but stuttered only in release builds on real devices. The cause: a legacy native module quietly falling back to the interop layer. Field notes on measuring it and rolling out a fix without reverting the whole app.
Dev Tools2026-05-27
Two Months of Rork × Hermes in Production — Cold Start and Memory in Real Numbers
What actually happens to cold start, memory, and crash rates after running Rork-generated apps with Hermes enabled in production for two months. Field notes from an indie developer with 50 million cumulative downloads.
Dev Tools2026-04-30
How to Track Down 'undefined is not an object' Errors in Rork — Fast
Read Hermes' 'undefined is not an object' error correctly in Rork — five typical causes with code, plus debugging steps when stack traces look unhelpful.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →