NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #4993 most downloaded on npm
The React Native multithreading library
Last release today
04 Oct 2026
Ships on a steady schedule
a new release about every 8 days
Rarely documented
notes for 8 of 35 stable releases
3 versions withdrawn
withdrawn after publishing
6 years old
552 releases · first in 2020
One column per quarter.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Networking on Worklet Runtimes in Bundle Mode
Worklet Runtimes created in Bundle Mode now ship a standalone networking module: XMLHttpRequest, Blob, FileReader, fetch (whatwg), Headers, Request, Response, FormData, AbortController and AbortSignal. It replaces the earlier networking preview and its FETCH_PREVIEW_ENABLED feature flag. createWorkletRuntime accepts a new enableNetworking option, which defaults to true and is forced off on runtimes without the Event Loop.
The Worklets Babel plugin has a Rust port built on OXC for Bundle Mode. It is available as react-native-worklets/plugin-oxc/babel, with prebuilt binaries for macOS, Linux and Windows on x64 and arm64.
createSynchronizable accepts a new fixedType option. A fixed-type Synchronizable holds a number or a boolean without serialization and exposes setDirty, a non-exclusive write that doesn't wait for other setDirty calls. On the C++ side Synchronizable is now an interface over std::variant values with a SynchronizableDynamic implementation, and several races on exotic architectors and lock leaks in the dynamic implementation are fixed.
The native side of WorkletsModule is created on a background thread as soon as the module is created, so installTurboModule only attaches it to the RN Runtime. In Bundle Mode the bundle is evaluated on the UI Worklet Runtime on a background thread while the RN Runtime evaluates it, instead of on the JS thread in start.
Worklet Runtimes use the built-in Hermes microtask queue instead of a custom JS implementation.
The Serializable handle is gone: SerializableInitializer, createSerializableInitializer and the __init clone path are removed, and makeShareable serializes its value eagerly into a retaining Serializable. RetainingSerializable caches its value per runtime. Serializable::ValueType::HandleType stays in the Compat Stable API enum for ABI compatibility and extractSerializable throws for it.
makeShareable without a handle by @tjzel in #10412Worklet closures are stored as arrays instead of objects, closure-free worklets are exported directly in Bundle Mode without factory wrappers, and implicit worklet context objects are removed. navigator is a known global, so worklets resolve it on their own runtime instead of capturing the main runtime's object by closure.
Worklets can be integrated on iOS through Swift Package Manager via Package.swift and SPM integration metadata in react-native.config.js. The nightly compatibility check builds the app via SPM on React Native >= 0.87.
Destroying a Worklet Runtime now acquires the runtime mutex first, so a synchronous call in flight on another thread finishes, discarded results of synchronous calls are destroyed under the lock, and pending jobs of the async queue and event loop are aborted under the lock instead of destroying their JSI handles on an unrelated thread.
withTiming and withSpring methods by @piaskowyk in #10467RetainingSerializable.h include in umbrella Serializable.h by @tjzel in #10406isWorkletFunction type definitions with source by @tjzel in #10415Full Changelog: worklets-0.12.2...worklets-0.13.0
FETCH_PREVIEW_ENABLED feature flag. (#10250 by @tjzel)SerializableInitializer, createSerializableInitializer and the __init clone path are gone. Serializable::ValueType::HandleType stays in the Compat Stable API enum for ABI compatibility and extractSerializable throws for it. (#10414 by @tjzel)makeShareable now serializes its value eagerly into a retaining Serializable instead of rebuilding it lazily on each runtime through a handle. (#10412 by @tjzel)Synchronizable interface to operate on std::variant values. Getters return a Serializable, a double or a bool, and setBlocking takes either a Serializable or a plain value. (#10294 by @tjzel)setDirty to the C++ Synchronizable interface. SynchronizableDynamic throws from it. (#10295 by @tjzel)Package.swift and SPM integration metadata in react-native.config.js. (#10472 by @kacperzolkiewski)XMLHttpRequest for text and arraybuffer responses. (#10493 by @tjzel)Blob and FileReader to the Worklets networking module, and blob and arraybuffer response types to XMLHttpRequest. (#10494 by @tjzel)fetch, Headers, Request and Response to the Worklets networking module, backed by whatwg-fetch. (#10495 by @tjzel)FormData to the Worklets networking module, with multipart encoding done in JavaScript. (#10496 by @tjzel)AbortController and AbortSignal to the Worklets networking module. (#10497 by @tjzel)enableNetworking option to createWorkletRuntime. It defaults to true and is forced off on runtimes without the Event Loop. (#10498 by @tjzel)RetainingSerializable. (#10264 by @tshmieldev)isOnUIThread to the Worklets Stable API. (#10265 by @bartlomiejbloniarz)fixedType option to createSynchronizable. A fixed-type Synchronizable holds a number or a boolean without serialization and exposes setDirty, a non-exclusive write that doesn't wait for other setDirty calls. (#10296 by @tjzel)navigator as a known global: worklets resolve it on their own runtime instead of capturing the main runtime's object by closure. (#10364 by @wcandillon)getCurrentThreadId as public JavaScript API. (#10441 by @tjzel)withTiming and withSpring. (#10467 by @piaskowyk)react-native-worklets/plugin-oxc/babel, with prebuilt binaries for macOS, Linux and Windows on x64 and arm64. (#10608 by @tshmieldev)undefined again instead of throwing, which broke runOnRuntimeSync and scheduleOnRuntime on guest runtimes in Legacy Eval mode. (#10593 by @bartlomiejbloniarz)<React/Utils.h> when it is available, so cxxreact/ReactNativeVersion.h deprecated on React Native main no longer breaks the build. (#10536 by @tshmieldev)AnimationFrameQueue kept delivering frames after WorkletsModule was invalidated. (#10278 by @shubhamdeol)AnimationFrameQueue from dispatching the rest of a frame batch when WorkletsModule is invalidated from inside a frame callback. (#10464 by @tjzel)getDirty and setBlocking on a Synchronizable - the pointer holding the value is now read and written atomically. (#10292 by @tjzel)setBlocking leaving a Synchronizable locked forever in development builds when the updater function or the serializer throws. (#10331 by @tjzel)std::thread::id instead of comparing pthread_t with ==, which POSIX doesn't define. (#10349 by @tjzel)Serializable.h file for backwards compatibility with Expo. (#10390 by @tjzel)Serializable.h header including a non-existent RetainableSerializable.h instead of RetainingSerializable.h, which made the header fail to compile. (#10406 by @tjzel)ReferenceError when a worklet file assigns to module.exports. (#10408 by @tshmieldev)__proto__ key. (#10451 by @tshmieldev)./gradlew app:build failing on :lintAnalyzeDebug with a K2 UAST crash on .gradle.kts build scripts - all lint tasks are now skipped, not only lintVital*. (#10448 by @tshmieldev)start. bundleModeMetroConfig prepends a polyfill that triggers it. (#10490 by @tjzel)WorkletsModule on a background thread as soon as the module is created, so installTurboModule only attaches it to the RN Runtime. (#10489 by @tjzel)nativeLoggingHook for Worklet Runtimes natively instead of reading React Native's host function from the RN Runtime. (#10488 by @tjzel)RCTEventEmitter base class from WorkletsModule on iOS. The module never emitted events, so it now inherits from NSObject and declares the bridge property itself. (#10485 by @tjzel)__proto__ object reconstruction path as unlikely. (#10465 by @tshmieldev)Serializable subclass into a dedicated file under SharedItems/Serializable/, with its factory function alongside. No behavior change. (#10345 by @tjzel)Synchronizable into an interface and a SynchronizableDynamic implementation. (#10293 by @tjzel)fixedType option and setDirty for Synchronizable. (#10297 by @tjzel)queueMicrotask now enqueues native Hermes jobs, the private __callMicrotasks global is replaced by __drainMicrotasks, and the _microtaskQueueFinalizers array is removed. (#10199 by @tjzel)requestAnimationFrame callback on the UI Runtime, instead of once after the whole batch. (#10237 by @tjzel)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
cherry-pick(worklets-0.12-stable): stop AnimationFrameQueue when WorkletsModule is invalidated ( #10278 ) by @tjzel in #10461
Full Changelog: worklets-0.12.1...worklets-0.12.2
cherry-pick(worklets-0.12-stable): extract UI-thread check into UIScheduler::isOnUIThread ( #10265 ) by @tjzel in #10327
Full Changelog: worklets-0.12.0...worklets-0.12.1
refactor(worklets): remove deprecated WorkletRuntime sync API by @tjzel in #10091
Worklet Runtimes now support WeakRef. This required enabling Hermes' own microtask queue when the runtime is created, and draining it from C++.
Bundle Mode used to load the script through in-memory copies. On iOS the whole bundle stayed resident in a std::string for the app's lifetime, and on Android a dev-server bundle passed through a Java String and two more copies over JNI. Local bundles are now mmapped and Android dev-server downloads stream to a cache file, the same way React Native's own loaders work. Dev-server fetches now also check the HTTP status and surface the error message Metro returns. In development on Android, initialization reuses the bundle React Native has already downloaded.
enableLocking option in createWorkletRuntimecreateWorkletRuntime accepts a new enableLocking option, which creates a Worklet Runtime without mutex guards. It is meant for advanced use cases, where you can guarantee thread-safety of the runtime.
Full Changelog: worklets-0.11.3...worklets-0.12.0
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →