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-30Intermediate

Fixing 'TurboModuleRegistry.getEnforcing could not be found' in Rork

A practical walkthrough of the 'TurboModuleRegistry.getEnforcing(...): could not be found' error that became common once the New Architecture went default. Covers Expo Go vs. dev builds, when a native rebuild is required, and how to isolate libraries that aren't New Architecture-ready.

Rork547New Architecture3TurboModuleExpo193Error Handling8

One morning I launched a Rork-generated app exactly the way I always do, and was greeted by an unfamiliar red screen:

TurboModuleRegistry.getEnforcing(...): 'RNSomeModule' could not be found.
Verify that a module by this name is registered in the native binary.

I had not touched a single line of JavaScript. Tracing it back, the trigger was the New Architecture (Fabric / TurboModules) becoming the default in Expo SDK 53 and later. Plenty of people are stuck on this same screen, so here is the isolation routine I settled on while migrating six wallpaper apps to the New Architecture.

What the error is actually saying

getEnforcing means "a native module with this name must exist, so go find it." Its sibling get returns null when nothing turns up, but getEnforcing throws immediately if the module is missing.

So this error is telling you: "JavaScript tried to call the native module RNSomeModule, but the native binary currently running on the device has no module registered under that name." The key insight is that the problem lives in the native binary, not in your JS. Miss that, and you can rewrite JavaScript all day without getting anywhere.

In my experience the cause almost always collapses into one of four buckets.

Cause 1: You're running inside Expo Go

This is the most common one. Expo Go is an app that ships with a fixed, predetermined set of native modules. Any library you added — react-native-mmkv, a billing SDK, your own native module — simply does not exist inside Expo Go.

Checking is easy: look at how you launched.

# Goes through Expo Go -> your custom native modules won't run
npx expo start
 
# What you actually need -> a dev build that includes your modules
npx expo start --dev-client

The fix is to make a development build.

# Add expo-dev-client
npx expo install expo-dev-client
 
# Produce a dev build that runs on the device (cloud build example)
eas build --profile development --platform ios

Think of a development build as "Expo Go rebaked with your exact set of libraries." Once it is installed, your JS changes keep hot-reloading just like before.

Cause 2: You updated JS but never rebuilt the native side

This often hits right after you npm install a library that contains native code. Installing the new library that provides RNSomeModule does nothing to the binary already on your device — it is still the old one, with no record of the new module. Only the JS bundle moved forward; the native side never caught up.

You need a native rebuild.

# Regenerate the native projects first
npx expo prebuild --clean
 
# Reinstall Pods on iOS
cd ios && pod install && cd ..
 
# Build again from native
npx expo run:ios

When "I fixed and saved my JS but it still breaks," you have usually skipped the native rebuild. Whenever you add or update a library, remember to rebuild rather than reload — it saves a surprising amount of wasted time.

Cause 3: The library isn't New Architecture-ready

If the error survives a clean rebuild from prebuild --clean, the library itself may not support TurboModules yet. Older libraries are written against the legacy Bridge, and the New Architecture runs in bridgeless mode where they can't be resolved as TurboModules.

First, pin down which library is responsible. Take the module name from the error (the RNSomeModule part) and cross-reference it against the library's README and React Native Directory to see whether New Architecture support is listed.

If a compatible release exists, update.

npx expo install react-native-some-module@latest

If no compatible version exists yet, temporarily turning the New Architecture off is the pragmatic move. Set this in app.json:

{
  "expo": {
    "newArchEnabled": false
  }
}

After changing it, always rebuild starting from npx expo prebuild --clean. Editing app.json alone changes nothing. Treat this as buying time, not a permanent fix. During my own migration I replaced incompatible libraries one at a time, then flipped newArchEnabled back on once they were all sorted.

Cause 4: Wrong module name or a flawed custom spec

If you write native modules yourself, the spec name fed to Codegen and the name registered in the native implementation can drift apart. If you call getEnforcing('Foo') but the implementation registers itself as Bar, of course it won't be found. Make sure three places agree: the spec file name (e.g. NativeFoo.ts), the registration name in @ReactModule / RCT_EXPORT_MODULE, and the call site.

A quick isolation order

When in doubt, knock these down from the top — it's the fastest path.

  1. Are you on Expo Go? (-> switch to a dev build)
  2. Did you rebuild natively after adding the library? (-> rebake from prebuild --clean)
  3. Is the library New Architecture-ready? (-> check the Directory; if not, temporarily set newArchEnabled: false)
  4. For a custom module, do the registration names match?

Steps 1 and 2 resolve the majority of cases. Only once you reach step 3 should you start suspecting library compatibility.

Avoiding the same rut

Migrating to the New Architecture all at once, across every app, makes isolation hard. Of my six apps, I migrated the one with the fewest dependencies first, nailed down the routine above, then rolled it out to the rest. Surfacing the sticking points on app number one made apps two through six finish remarkably quietly.

When the error appears, the first thing to recall is: this is a native-binary problem, not a JavaScript problem. Hold onto that, and the fix will fit into one of the four drawers we laid out today. I hope it saves someone else from stalling on the same screen.

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 →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

Dev Tools2026-06-02
Fixing 'No bundle URL present' on a Release Build to a Real iOS Device
How to read the 'No bundle URL present' error that shows up when you build a Rork-exported app locally in Xcode. We separate the Metro-connection case from the missing-embedded-bundle case, and walk through generating an offline bundle by hand with working commands.
Dev Tools2026-08-22
Every bulk replace exited zero. The damage was in the lines I did not delete
Run a bulk replace over generated code and the breakage lands on the neighbouring lines, not the matched ones. Here is what broke in a live project, and a dependency-free guard that checks the invariants a replace must preserve.
Dev Tools2026-08-21
The four acceptance checks I still run after the build turns green
A successful build does not mean a shippable build. Here are the four failure classes an AI build loop cannot see, and a dependency-free script that inspects the artifact itself before you submit.
📚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 →