Run React Native across many named JS runtimes.
React Native Runtimes lets you mount components, schedule functions, and share state across multiple JavaScript runtimes — so your main UI thread is never blocked by lists, chat, sync, or crypto.
What you get
Two libraries that work together: @react-native-runtimes/core for runtime composition and @react-native-runtimes/state for native-backed shared state.
Threaded rendering
Mount React components or whole screens on a named secondary runtime so the main JS stays free for navigation and input.
Native-backed shared state
A small Zustand-like API on top of a C++ singleton — every runtime sees the same value and the same revision.
Prewarming and headless tasks
Spin up runtimes ahead of time, hydrate them in the background, and open them with zero perceived delay.
Background business logic
Pin functions to a "background" runtime with a one-line directive, then keep call sites ordinary.
Big lists, smooth UI
Run FlashList or LegendList on a worker runtime so scrolling never competes with the rest of your app.
Incremental adoption
Opt in one component or one screen at a time. The rest of your app keeps working exactly as it did.
A second runtime, in a few lines
Wrap any top-level component in OnRuntime. Metro auto-registers it; native mounts it on the named runtime.
- 1Install the packages and wrap your Metro config.
- 2Prewarm a runtime from the app delegate or
MainApplication. - 3Drop
OnRuntimearound the slow part of your UI.
import { OnRuntime } from '@react-native-runtimes/core';
function MessageList({ conversationId }) {
// runs on 'messages-runtime', not the main runtime
return <ActualMessageList conversationId={conversationId} />;
}
export function ConversationPreview() {
return (
<OnRuntime name="messages-runtime">
<MessageList conversationId="release-room" />
</OnRuntime>
);
}Built for production React Native apps
Use it for chat screens, infinite lists, sync engines, headless hydration, or any work that should never compete with the main UI runtime.