Building iOS Live Activities With React: Inside Voltra

Featuring
Kewin Wereszczyński
Software Engineer
@
Callstack
Łukasz Chludziński
Engineering Manager
@
Callstack
Szymon Chmal
Software Developer
@
Callstack

Live Activities are one of the most visible platform features Apple has shipped in recent years. They sit on the Lock Screen, power the Dynamic Island, and stay alive while your app is in the background or not running at all. For users, they feel instant and native. For developers, they introduce an entirely different execution model than what most React Native apps are built around.

This is exactly the gap Voltra is designed to close.

In recent livestream, we took a closer look at how Voltra approaches iOS Live Activities, what problems it solves, and what it means for React Native teams who want first-class, real-time system integrations without rewriting their app in Swift.

Why Live Activities are fundamentally different

Live Activities are not “just another UI surface”.

They are rendered by the system and run outside your app’s process. Updates are applied imperatively by the app, either through push notifications or background signals, and they are expected to be fast, predictable, and extremely battery-aware.

From Apple’s perspective, this makes perfect sense. A Live Activity showing a delivery or transit update cannot depend on your JavaScript thread being alive, hydrated, and in a good mood.

From a React Native perspective, this is where things get tricky.

React Native apps are optimized around an active JavaScript runtime, component trees, and state updates flowing through React. Live Activities break that assumption entirely. They operate under strict OS-imposed resource limits, which means you cannot run a full-fledged JavaScript environment. Instead, they rely on native SwiftUI layouts, serialized state snapshots, explicit lifecycle management, and a lightweight translation layer that produces a SwiftUI view hierarchy, all while respecting strict system-enforced update limits.

Voltra starts by accepting this reality instead of trying to hide it.

Voltra’s core idea: React Native controls intent, native owns rendering

One of the biggest conceptual wins in Voltra is that it does not try to “re-implement React Native inside a Live Activity”.

Instead, it draws a clear boundary: React Native owns business logic, events, and decision - Native. SwiftUI owns layout, rendering, system integration and Voltra acts as the bridge that keeps both sides in sync

This separation aligns naturally with how Live Activities are meant to work on iOS.

Your React Native app decides when a Live Activity should start, update, or end.

The system decides how it is displayed, when it refreshes, and where it appears.

Trying to blur that line usually leads to brittle abstractions. Voltra avoids that by leaning into platform rules rather than fighting them.

State updates without pretending the JS runtime is alive

A common misconception is that Live Activities require your app to be running in the background. They do not.

Live Activities update via:

  • Push notifications with specific payloads
  • System-scheduled refresh windows
  • Server-driven updates

Voltra models this explicitly. State updates are treated as immutable snapshots rather than live, reactive streams. That makes updates predictable and keeps you aligned with Apple’s rate limits and power constraints.

From a React Native point of view, this means you stop thinking in terms of “re-rendering components” and start thinking in terms of “publishing state”.

It is a mindset shift for sure.

Dynamic Island support without special cases

Dynamic Island is often treated as a special feature, but architecturally it is just another presentation of the same Live Activity.

You define one activity, one state model, and one update flow. iOS decides whether that state appears on the Lock Screen, in the Dynamic Island, expanded, collapsed, or hidden entirely.

Widgets, Live Activities, and one mental model

Widgets and Live Activities share more DNA than most people expect. Both rely on SwiftUI, serialized data, and system-managed refresh behavior. Timeline-driven updates, however, apply only to widgets.

Voltra takes advantage of their similarity.

By aligning its APIs with Apple’s widget and activity architecture, Voltra makes it easier to reason about both surfaces using the same mental model. You define what data exists, how it changes, and when it should be published. The platform handles the rest.

This also makes future expansion easier. Once you are comfortable publishing state instead of rendering views, adding new surfaces becomes less intimidating.

What Voltra deliberately does not do

There are a few things Voltra intentionally avoids, and this is where some of the strongest opinions from the stream came through.

Voltra does not:

  • Run JavaScript inside Live Activities
  • Pretend Live Activities are “mini React Native apps”
  • Hide Apple’s constraints behind leaky abstractions
  • Over-optimize for rare edge cases

This restraint is a feature.

Live Activities are heavily constrained by design. Any solution that promises unlimited updates, full React rendering, or background JavaScript execution is either misleading or headed for rejection.

Voltra stays within the rules, which makes it boring in the best possible way.

When Live Activities actually make sense

One of the more pragmatic takeaways is that Live Activities should be used sparingly.

They are perfect for:

  • Deliveries and ride tracking
  • Live sports or event updates
  • Timers and ongoing sessions
  • Navigation and transit progress

They are a poor fit for:

  • Generic notifications
  • High-frequency data streams
  • Anything that needs complex user interaction

Voltra does not try to convince you otherwise. It gives you the tools to build Live Activities when they are the right UX, not because they are shiny.

Final thoughts

Voltra represents a mature approach to integrating React Native with modern iOS system features.

It respects platform boundaries, avoids magical thinking about background JavaScript, and treats Live Activities as what they are: system-owned, state-driven surfaces.

For React Native teams, this is a big deal. It means you can offer first-class iOS experiences like Live Activities and Dynamic Island without abandoning your existing architecture or rewriting your app in Swift.

Live Activities are not easy. Voltra does not make them trivial. It makes them possible in a way that is realistic, maintainable, and aligned with how iOS actually works.

And that is exactly what most production teams need.

‍

Insights

Learn more about React

cover

Jun 24Article

Writing Custom Renderers for React

Learn how React renderers work, why RNTL needed a new test renderer, and what it takes to connect React Reconciler to a host environment.

cover

Nov 27Podcast

From React Native Web to React Strict DOM

Nicolas Gallagher (Meta) explains how React Strict DOM evolved from React Native Web, providing a shared syntax that compiles to native or web with zero overhead.

cover

Nov 21Podcast

React Foundation: New Governance Model for React and React Native

Seth Webster, Executive Director of the React Foundation, details its new governance model, Meta's role, and how partners like Callstack and Microsoft will ensure stability and scale.

cover

Apr 9Podcast

Exploring TanStack Ecosystem: From React Query to TanStack Start

Tanner Linsley breaks down TanStack’s evolution-from React Query to Start, and why client-first React apps still matter in today’s full-stack landscape.

Event Cover

Feb 20Live Stream

Create React App is Out: Exploring Alternatives & Community Proposals

CRA is now deprecated, so we explore other options for starting web React projects, going through Vite, TanStack Router, Parcel, and Rsbuild to check the developer experience.

Event Cover

Feb 13Live Stream

State of React 2024 Breakdown

Let's take a deep dive into the long-awaited State of React survey from 2024; brace yourselves for a two-hour ride.

cover

Sep 9Article

The Complete Developer Guide to React 19, Part 3: Upgraded Support

Learn how React 19's new features enhance SEO, page performance, and custom elements support for better, faster web applications.

Event Cover

Sep 5Talk

Welcome to the React Universe

This is the Keynote talk presented at React Universe Conf 2024, the largest community conference that unites developers and thought leaders to explore trends, share insights, and push the boundaries of React and React Native.

cover

Sep 3Article

The Complete Developer Guide to React 19, Part 2: New Enhancements

Discover React 19's key updates, including improved `ref` usage, error reporting, and context consumption in part 2 of this practical developer guide.

cover

Sep 2Article

The Complete Developer Guide to React 19, Part 1: Async Handling

Explore the key features of React 19 beta, focusing on new hooks that enhance async handling, state management, and form submissions.

cover

May 2Article

Understanding React Server Components

React Server Components (RSC) are still work in progress, but now it's the best time to explore these core concepts of future React. Find out why and how!

cover

Mar 19Tutorial

The Hard Way vs. The React Native AI SDK Way: Stop Writing Custom Modules for Every Model

Learn how React Native AI uses a unified provider model to switch between cloud and on-device LLMs without rewriting application logic, enabling reliable AI experiences online and offline.

cover

Mar 12Tutorial

Build Smarter Apps: Tool Calling & AI Orchestration Explained

Learn how on-device models in React Native can call tools, interact with external APIs, and return structured outputs you can use directly in application logic.

cover

Mar 5Tutorial

MLC LLM + React Native: On-Device AI Without the Pain

Learn how to run third-party on-device LLMs in React Native using MLC LLM. Choose your models, run them efficiently across platforms, and keep a unified JavaScript API with React Native AI.

cover

Feb 24Tutorial

Intelligent Fallbacks with Apple Intelligence in React Native

Learn how to use Apple’s built-in Foundation Models in React Native apps, reduce memory usage, and enable fast, fully on-device AI with React Native AI Apple.

cover

Feb 10Tutorial

What Is the React Native AI SDK? A Complete Intro & Quickstart

Learn why on-device AI matters for React Native apps, how local LLMs behave offline, and what problems React Native AI is designed to solve from day one.

cover

Jan 29Tutorial

Implementing an Android TurboModule with Kotlin

Learn how to implement a React Native TurboModule on Android, from the TypeScript spec and Codegen to the Kotlin implementation and package registration.

cover

Jan 19Tutorial

Working with Different Threads in Swift TurboModules

Learn how JavaScript, native module, background, and main threads interact in React Native TurboModules, and how to use GCD queues to run async work safely in Swift.

cover

Jan 9Tutorial

How to Add Type-Safe Constants to Swift TurboModules

Learn how to expose typed, immutable constants from a Swift TurboModule using Codegen, and get full end-to-end type safety between native and JavaScript.

cover

Dec 30Tutorial

Adding Event Emitters to Your TurboModule in Swift

Learn how to emit native events from a Swift TurboModule and subscribe to them in JavaScript, including proper memory management and Codegen integration.

cover

Dec 22Tutorial

Writing Your First TurboModule in Swift

Learn how to build a fully working TurboModule in Swift, integrate it with Codegen, and bridge it through Objective‑C inside an Expo app.