Reanimated 4 + react-native-worklets in Production: Migrating Off Reanimated 3 Without Breaking Your Animations
In short
Reanimated 4 is New-Architecture-only and moves worklets into a separate react-native-worklets package. The migration is small: install both packages, swap your Babel plugin to react-native-worklets/plugin, clear caches, and audit old native-driver hacks now that RN 0.85 ships a Shared Animation Backend. Your imperative useAnimatedStyle code carries over unchanged, so do the New Architecture upgrade first and the Reanimated bump second.

On this page
- What actually changed between Reanimated 3 and Reanimated 4?
- Do I have to be on the New Architecture for Reanimated 4?
- How do I install the react-native-worklets split correctly?
- Will my existing useAnimatedStyle and useSharedValue code still work?
- What is the new CSS-style animation API and when should I use it?
- How does React Native 0.85's Shared Animation Backend change what I should hand-roll?
- What is a safe migration order and rollback plan?
- The short version
Reanimated 4 is the first stable release that runs only on the New Architecture, and the biggest practical change is that worklets no longer live inside Reanimated itself. They moved into a separate react-native-worklets package. If you are migrating a gesture-heavy app off Reanimated 3, you will install both packages, update your Babel plugin, decide between the new CSS-style animation API and the imperative useSharedValue / useAnimatedStyle approach you already know, and audit anything you were hand-rolling now that React Native 0.85 ships a Shared Animation Backend. I migrated a swipe-and-drag-heavy app through this and the work was real but bounded, maybe a focused day for a mid-sized app if you did not skip the New Architecture homework first.
What actually changed between Reanimated 3 and Reanimated 4?
The headline: Reanimated 4 is New-Architecture-only, the worklets runtime is now its own package, and there is a new declarative CSS-style animation API sitting next to the imperative one you already use. Nothing about your old useAnimatedStyle code is deleted, but the plumbing underneath it moved.
In Reanimated 3, the worklets machinery (the part that runs your animation functions on the UI thread) shipped inside react-native-reanimated. In 4, that machinery was extracted into react-native-worklets, and Reanimated depends on it. This matters because other libraries can now depend on worklets without pulling in all of Reanimated, and because your Babel config points at a different plugin name.
Here is the shape of the change at a glance.
| Concern | Reanimated 3 | Reanimated 4 |
| Architecture support | Old + New Architecture | New Architecture only |
| Worklets runtime | Bundled in react-native-reanimated | Separate react-native-worklets package |
| Babel plugin | react-native-reanimated/plugin | react-native-worklets/plugin |
| Declarative animations | Imperative API only | CSS-style API plus imperative API |
| Minimum RN | Works on older RN | Aligned with recent RN releases |
Imperative API (useSharedValue, etc.) | Yes | Yes, unchanged surface |
| Step | Action | How I verify |
| 1 | New Architecture on, Reanimated still 3 | Smoke-test every gesture screen |
| 2 | Install Reanimated 4 + react-native-worklets | App builds, no worklet runtime errors |
| 3 | Swap Babel plugin to react-native-worklets/plugin | Worklets transform; reset Metro cache |
| 4 | tsc --noEmit to catch moved imports | Zero type errors |
| 5 | Audit and delete native-driver hacks | Animations still smooth without them |
| 6 | Adopt CSS-style API on new screens only | No churn in existing imperative code |
For rollback, the clean separation pays off. If step 2 or 3 breaks something, you revert two files (package.json and babel.config.js) plus the lockfile and you are back on a known-good state, because you did not touch animation logic. That is the whole reason I refuse to combine the install with an API rewrite.
If your app is genuinely large or the gesture surface is critical revenue path, this is exactly the kind of bounded-but-fiddly upgrade I take on as mobile development work ↗, and I am happy to scope it on a contact page ↗ note. Most of these migrations are predictable once you respect the prerequisite order.
The short version
Reanimated 4 is a small library upgrade wearing a big coat. The actual code changes are: install two packages instead of one, point Babel at react-native-worklets/plugin, and clear your caches. Your imperative animations carry over. The CSS-style API is a tool for new declarative work, not a mandate to rewrite. And RN 0.85's Shared Animation Backend mostly means you get to delete old workarounds. The thing that makes or breaks the migration is the New Architecture prerequisite, so do that first and verify it on its own before you bump a single Reanimated version.
FAQ
Do I have to be on the New Architecture to use Reanimated 4?
Yes, Reanimated 4 runs only on the New Architecture, so enabling and verifying it must happen before you bump Reanimated.
What is react-native-worklets and why is it a separate package now?
It is the worklets runtime that used to ship inside Reanimated, extracted in version 4 so it installs alongside react-native-reanimated and other libraries can depend on it independently.
Will my existing useAnimatedStyle and useSharedValue code break in Reanimated 4?
No, the imperative API surface is unchanged, so existing shared-value and animated-style code keeps working once you fix the install and the Babel plugin.
Should I rewrite my animations into the new CSS-style API?
No, use the CSS-style API for simple state-driven transitions on new screens and keep complex per-frame gesture animations on the imperative API.
What does React Native 0.85's Shared Animation Backend mean for my app?
It gives animation libraries a common native path, so the practical action is deleting old native-driver workarounds and letting Reanimated drive the animations.
Working on something like this?
I build web apps, AI features, and mobile products for clients. If this article matches a problem you have, tell me about it.
Start a conversationMalik Hamza Shabbir · Full-Stack & AI Engineer
I build full-stack and AI products solo: a reputation SaaS in production, RAG pipelines, and React Native apps. I write from what I ship, not from documentation summaries.
Related articles
Google Play 16KB Page Size: Fix Failing React Native Builds
Google Play now blocks all React Native updates without 16KB page-size support. Here's the fix: RN 0.77+, AGP 8.5.1+, NDK r28, plus updated native deps.
Fix 'Your app is affected by Google Play's 16 KB page size requirement' in React Native
Google Play flagged your AAB for the 16 KB page size requirement? Here is how I diagnose which native .so libraries are misaligned with check_elf_alignment.sh, bump the NDK and AGP to fix my own code, and handle the React Native dependencies that are the usual culprits before the 31 May 2026 enforcement.
The Bridge Is Gone: Migrating a Legacy React Native App to 0.85 When New Architecture Is the Only Option
React Native 0.85 fully removed the bridge on 7 April 2026, so the New Architecture is the only option. Here is how I audit dependencies against the Directory, which libraries still crash, and the realistic effort to rescue a 0.7x Paper app.