We’re Building a New React Native Framework

Last week, we announced something we’ve been working on for the last couple of months: a React Native framework designed specifically for mature Enterprise apps. It’s the result of years of experience building tools and contributing to large-scale projects of our clients.

Introducing a new React Native Framework for Enterprise apps. ✨

Built around native build reuse, incremental adoption and self-hosting at your own infra.

Because the best build is no build.

Hop on the wait list ⬇️ pic.twitter.com/SJqy4p7dXu

— Michał Pierzchała (@thymikee) March 4, 2025

Why a new framework

Or rather—why not? As many of us, React Native developers, have a background in the web or are exposed to the web libraries, frameworks, and ideas that are cross-pollinating to the React Native Community, we’re familiar with hundreds of JavaScript frameworks coming out every day. And somewhat fewer that are specific to React.

In the realm of building cross-platform native apps—mobile, desktop, TV— there’s no such diversity. We have Expo, excellent for new and growing projects, with great DX and loads of services to build and deploy apps quickly as part of their EAS cloud, focusing on mobile and web platforms. Recently, we’ve also been using One, which brings Vite bundler and Zero sync engine to React Native, focusing on web and mobile, still in its early days and beta phase. And that’s pretty much it.

At the same time, on a daily basis at Callstack, we’re serving clients that usually have large teams, building complex apps for years, accumulating tech debt, becoming slower and slower to iterate, where time is wasted on waiting for builds and onboarding web engineers into intricacies of mobile platforms. According to the React Native Framework RFC, almost all of these companies are building their own frameworks based on the Community CLI—they just don’t open source them to make them available for everyone, and for good reasons.

As a maintainer of the Community CLI, I have quite the exposure to how this tool is used (and misused) in various projects. When we evaluated how our clients use it and what our developers are challenged with, we noticed that these companies encounter similar challenges that they address uniquely:

  • High build times with no reuse across CI jobs and dev team.
  • Months just to integrate a third-party cloud vendor.
  • A mixed tech stack that makes adding React Native feel like pulling teeth.

We also have clients who ship their products to 10+ platforms or have brownfield setups, embedding React Native in their native apps, so using anything other than the Community CLI is not an option for them.

The early experiments with UX

So, in the spirit of Open Source, we ran some experiments with a small team of Maciej Jastrzębski and Szymon Rybczak. First, we refreshed the UI of the CLI to focus on local building experience, picking devices or simulators to run an app in a smarter and more interactive manner.

Thinking about new UI for running React Native commands. Starting with Android. pic.twitter.com/8gwu5Z2yZJ

— Michał Pierzchała (@thymikee) November 19, 2024

We felt that was cute, but it required a massive rewrite of the Community CLI, which wasn’t really possible to backport without breaking changes. Since this package is used by hundreds of thousands of developers, we wanted to be super cautious—we wouldn’t need to be with a new tool, though, so the experiments continued.

Knowing that enterprises we work with have little to no build reuse across CI jobs and the dev team, we toyed with the idea of dragging and dropping builds to our simulators and emulators, which works pretty well both for iOS and Android.

If developers had easy access to native build artifacts, they wouldn’t really need to build their projects locally. Not to mention installing CocoaPods (and all the hurdles it takes for web developers), running Xcode build and Gradle. Crossing it all off the list would give you some nice time savings over the course of the week and even more over a month. With teams of 20-80 developers, that time adds up ridiculously fast.

You can just drag and drop .apk file to your emulator to install an Android app pic.twitter.com/cKI8p2tE7B

— Michał Pierzchała (@thymikee) November 20, 2024

Reusing builds across CI jobs

At the same time, Maciej was investigating the other part: the build reuse. We’ve seen our clients approach speeding up builds by caching various parts of the pipeline, with varying success. But usually the cache was flaky, invalidating more often than necessary, and thus unreliable. We’ve even seen teams that deliberately disabled all kinds of caching because fixing problems related to it caused them more engineering capacity than it was worth.

So, we picked the most popular CI option we surveyed across our clients and decided to build some prototypes for reliable build reuse on GitHub Actions. With GitHub Artifacts storage, we had a “backend” to store builds across various jobs. Now, we needed a more robust caching solution.

We initially started to build one, and then it struck us that months earlier, Expo released a great piece of software: @expo/fingerprint, which allows them to match JS bundles to particular native versions associated with that bundle by calculating a unique hash. This is super helpful for over-the-air updates with Expo Updates. But… It would also suit nicely for reliable build caching. Knowing the hash of our project, we can reduce the build times by completely avoiding them.

Because the best build is no build.

The best build is no build. pic.twitter.com/igNORxl397

— Michał Pierzchała (@thymikee) December 20, 2024

That allowed us to put the hashing mechanism on a GitHub action. Instead of dragging and dropping the binary to a simulator, we figured integrating it with a single command, such as run:ios or run:android, run side-by-side with a Metro or Re.Pack dev server, would be an even nicer experience for developers.

So the ultimate experience goes like this:

  1. Install npm dependencies.
  2. Run the dev server.
  3. Run the iOS or Android command, which will fetch the build from the remote cache stored on GitHub Artifacts.

And that’s it. In a few seconds and three commands, you’re ready to ship without installing native dependencies or running a local build. And it’s all hosted on an infrastructure you 100% control.

Testing it in our clients’ codebases

Now that we had a fully fledged CLI and GitHub Actions that it could connect to, it was time to integrate it with some of our clients. We found a few early adopters, one of which we estimated lose over 1000 hours (yes, you read correctly, 125 days) of engineering and testing capacity every month due to excessive build times across the organization.

Once the native artifact is cached, all subsequent builds are dramatically faster. In the case of one of our clients, from 34 minutes to 3 minutes, which is roughly the time it takes to spin up the CI machine and install npm dependencies for that project. A 10x decrease.

Faster builds, from 34 minutes to 3 minutes

But these are unsigned APP and APK builds for developers, who can download them through our CLI and run latest JavaScript local dev server with Metro or Re.Pack. Let’s say that’s the easy part.

For our apps to be usable by internal or external testers, we need to build our apps in a way that they’re runnable on devices. That’s where we need app signing, as well as re-signing—we need that fresh JavaScript bundle available for our test builds, or else an old cached one will be picked.

We’ve solved that as well, and for one of our clients, it resulted in a workflow that allowed them to run e2e tests on a device farm on every commit of every pull request—something that was not achievable on their own infrastructure before using our framework.

Testing automation that reuses builds with up-to-date JavaScript bundle
Testing automation that reuses builds with up-to-date JavaScript bundle

Our Principles

We build the new framework with a clear focus: to serve large teams and complex apps. These projects require flexibility, the ability to host everything on their own, deploy to as many platforms as possible, and decrease onboarding time. That’s why our engineering design choices focus on:

  • Modular design—add your supported platforms and plugins, and integrate existing tools; you can build around our framework
  • Self-hosting—use your own infrastructure without relying on third-party cloud vendors; whether you’re using GitHub Actions or soon Amazon S3 and BitBucket, we got you covered.
  • Incremental adoption—easily migrate from Community CLI or an existing native app.

We’re not focusing on new projects or smaller teams yet (but we have a CLI to spin up new projects if you need to). At least not yet. We’re laying the foundation for more integrated features to come: OTA, React Server Components, mobile microfrontends with Re.Pack, more platforms, bring-your-own-remote-cache-provider, just to name a few.

How you can try it

Our framework is currently in an early development phase and not yet publicly available. To get first-hand news on the project development, join our waiting list. For selected apps, we may consider giving you access to an early preview once we finalize the documentation, which we are working on right now. Let us know by answering the waiting list email or by using the contact form.

Our plan is to open-source this framework as soon as possible—hopefully in the upcoming weeks. We want to ensure some base level of polish, DX, and docs, so you can have an easy time giving it a try without a hotline to our team. Building such tools privately is certainly not within our comfort zone, so expect it sooner than later!

Insights

Learn more about Enterprise

cover

Jun 17Article

Why Banking App Modernization Stalls Before It Ships

Learn why banking app modernization stalls when product ambition outpaces testing, release management, observability, and team coordination, and what banks need to fix first.

cover

Sep 13Talk

Native Apps Without a Build Step

Discover Rock by Callstack: the open, modular, self-hosted framework for React Native. Built to help teams scale, migrate, and deliver faster in the evolving React Native ecosystem.

cover

Aug 18Article

React Native Enterprise Framework is now Rock

Rock is the new name for the React Native Enterprise Framework (RNEF). A solid foundation for enterprise-grade, cross-platform apps. Faster CI, build caching, iOS ad-hoc installs, and more.

Event Cover

Jun 24Talk

Brownfield Incremental React Native Adoption x Rock

Learn how to smoothly adopt React Native in your existing apps using Callstack’s Rock for easier setup, faster deployment, and seamless integration.

Podcast Cover

Jun 10Podcast

Build Faster and Scale Smarter With Rock

Discover how Rock cuts build times, streamlines CI, and simplifies large-scale app development for growing teams.

cover

May 12Webinar

From Hours to Minutes: Making Your React Native CI Builds 20x Faster

Discover how to skip 90% of native builds in React Native CI using Rock. Includes a live demo and cost-saving insights from Expensify’s setup.

cover

Jan 16Podcast

React Native at Scale With Rafael Mendiola

Scaling React Native across business growth stages: insights from Rafael Mendiola & Jakub Stadniczuk in a podcast episode.

cover

Nov 30Podcast

React Native at Scale With Mike Duminy (Klarna)

Tune in to find out how the use of React Native and Re.Pack can impact organizational structure and how these tools help Klarna scale product development.

cover

Aug 27Article

How Can React Native Paper Help Startups and Enterprises?

How React Native Paper can help you create great-looking, fully accessible and inclusive apps (and prototypes) perfectly tailored to your needs.

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.