Working With the React Native Super App Showcase Repository

Authors
Bartłomiej Krok
Software Engineer
@
Callstack
Szymon Chmal
Software Developer
@
Callstack

Building a super app in React Native raises an important engineering question: how can independent feature teams ship on their own without fragmenting the codebase, increasing binary size, or causing runtime crashes? To explore one answer, this article looks at Callstack’s Super App Showcase, an open-source reference application for React Native super app architecture. We provide an overview of its design and explain each component’s role to help you architect and manage super apps in your own projects.

The showcase organizes its packages in a monorepo and uses Re.Pack with Module Federation V2 to build and load federated bundles at runtime. To the end user, the application functions like a standard mobile app, while each feature domain operates as a microfrontend that is downloaded over the network when needed. For a smaller implementation, you can build from scratch, follow our step-by-step guide to super app development with Re.Pack 5.

Architecture overview

The system has three structural roles and relies on two non-negotiable architectural rules.

The first role belongs to the Host Shell, which is the only package containing native binaries. It owns root navigation, boot logic, authentication gates, and declares where remote mini apps originate. The second role consists of the federated mini apps, which represent isolated feature domains that each expose a single navigator or context provider as a federated remote bundle. The third role is the Shared SDK, a singleton library that defines the dependency contract and provides runtime code that must exist in exactly one instance across the entire process lifetime. This includes real-time streaming connections, shared state contexts, and design system tokens.

Two rules keep this multi-bundle ecosystem stable. First, native code lives in the Host Shell because registering two instances of a native module causes an immediate application crash rather than soft warnings. Second, every shared package reads its version from the same dependency catalog. The showcase registers each dependency as a singleton and uses the pinned value for both version and requiredVersion. Module Federation does not enforce strict equality here, so the catalog and alignment checks keep dependencies consistent across packages. A second React instance can break hooks and internal state.

App lifecycle and cold start

The cold start sequence shows how these boundaries work in practice. When the host binary boots, it configures script management with persistent local storage, so downloaded remote bundles survive application restarts. The host then mounts shared data providers from the SDK above root navigation and opens global data streams before any feature-specific mini app mounts.

Next, the host fetches the authentication bundle over the network behind a suspense boundary, displaying the native splash screen as a fallback. The auth provider remains in its initial loading state while it verifies stored tokens, keeping the native splash screen visible until session state resolves and eliminating any UI flash of a sign-in screen. Once authenticated, primary navigation renders, and JavaScript bundles for individual feature domains download only when the user explicitly navigates to the corresponding tab or feature.

Shell app

Diving deeper into individual components reveals several key implementation strategies for the Shell.

The Host Shell defines a unique container namespace and configures Module Federation V2 to resolve manifest endpoints dynamically for each target platform. Mounting a remote mini app requires no custom framework code, as dynamic imports are rewritten into container lookups at build time. Every remote mount point needs an error boundary, so that, if a remote feature bundle fails to download due to network issues, that specific tab displays a local fallback error while the rest of the application remains fully functional.

Global application services, such as authentication, also connect directly to the Shell. The Host Shell must evaluate sign-in state before rendering navigation tabs, while the authentication UI and logic should remain independently deployable. Exposing an auth provider as a federated render prop allows the host to branch on state provided by a container it does not own.

Federated mini apps

Federated mini apps own their domains by exposing a complete stack navigator rather than individual screens. This allows feature teams to add dozens of internal routes without requiring a single code change in the host repository. To avoid bundling native code, mini apps declare native dependencies purely as peer dependencies.

plugins: [
  ...
   new Repack.plugins.ModuleFederationPluginV2({
      name: 'trading',
      filename: 'trading.container.js.bundle',
      dts: false,
      exposes: {
        './App': './src/navigation/MainNavigator',
      },
      shared: getSharedDependencies({eager: false}),
  }),
  ...
]

The bundler resolves these dependencies by pointing its resolution root directly to the host's module directory, while TypeScript configurations use path mapping entries to locate types. At build time, the mini app compiles against the host's dependencies, but at runtime it carries none of that native code in its bundle, resolving instead to the shared singleton already loaded by the shell.

Monorepo and catalog management

The Shared SDK keeps contracts aligned across all packages through a central dependency contract and automated alignment rules. A single utility function generates shared dependency declarations for every bundler configuration, ensuring that adding or updating a shared singleton takes one line of code, and the change propagates across the workspace.

Adding a new feature module to this monorepo setup follows a predictable five-step workflow:

  1. Initialize the package directory with a configuration that points to Re.Pack commands.
  2. Define the bundler configuration with a unique container name, output filename, exposed navigator path, and shared dependency flags set to consume shared modules.
  3. Point module resolution in the bundler to the host’s node directory and map peer dependencies in the TypeScript configurations.
  4. Register the remote entry in the host’s Module Federation V2 plugin and declare its types.
  5. Wrap the dynamic import with a lazy boundary and skeleton fallback

State management and real-time performance

Decoupling an app into runtime bundles is straight engineering, but making those seams invisible to users requires intentional performance patterns. When multiple feature tabs consume the same background data feed, opening duplicate socket connections wastes resources and risks state drift. The core real-time data service resides entirely within the Shared SDK singleton, ensuring newly mounted components receive cached state synchronously when they subscribe and display accurate values on the first frame.

While a remote is loading, the Host displays a local placeholder with an activity indicator and feature label. High-frequency price subscriptions are isolated in leaf components so that updates do not cause the entire row to re-render.

Only the price text re-renders on each update, while the highlight animation runs on the UI thread using Reanimated shared values. Price updates use React transitions, and React Compiler is enabled in the Host, Trading, and Wallet.

Production considerations

Preparing this architecture for production requires planning for two integration points: dynamic remote resolution and version compatibility.

In production, local manifest URLs must be replaced with stable remote hosting or trusted discovery service. Teams should also define caching, rollback, offline behavior, monitoring & signature-verification policies. The showcase signs the Auth production bundle. However, the Host must explicitly enable signature verification to verify signed remotes when loading them.

Remote feature bundles deploy instantly over the air, while host binaries go through app store review cycles. For version compatibility, backend routing must therefore prevent an older host binary from fetching an incompatible bundle version.

Summary

The Super App Showcase is designed to make a complex architecture easier to explore in context. Rather than presenting Module Federation, Re.Pack, shared dependencies, and runtime bundle loading as isolated concepts, the repository shows how they work together in a real React Native application.

Following the Host Shell, federated mini apps, and Shared SDK through the repository, you can see where each responsibility belongs: how the shell owns the native runtime and application bootstrap, how feature domains remain independently deployable, and how the shared SDK keeps common services and dependencies consistent across every bundle.

Use the Showcase as a reference super app, then adapt its structure, dependency contracts, loading patterns, and release strategy to your own application and team structure. And if you’re considering taking these patterns into production and want to compare notes, our super app development team is happy to talk.

Insights

Learn more about Super Apps

cover

Jul 21Article

A Step-By-Step Guide to Super App Development With Re.Pack 5

Learn how to connect a React Native host and mini app with Re.Pack 5 and Module Federation, then load the remote module at runtime.

cover

Jul 2Article

Mobile Module Federation with Re.Pack: When Runtime Delivery Is Worth the Complexity

Learn how Module Federation works in React Native with Re.Pack, when it makes sense, when simpler options are better, and what teams need to validate before adopting runtime delivery.

cover

May 19Article

Using TurboModule Substitution to Build Safer React Native Plugin Systems

Learn how TurboModule substitution helps React Native plugin systems provide native capabilities while preserving sandbox boundaries.

cover

Aug 27Article

Re.Pack 5.2: Faster Babel Transforms, RN 0.80 & 0.81, Rozenite

This release focuses on parallel, smarter transforms with a new Babel & SWC loader, official support for React Native 0.80 and 0.81, fully typed configs, support for Rozenite and more

cover

Jul 31Article

Running Multiple Instances of React Native in Sandbox

react-native-sandbox lets you run multiple React Native instances in one app. Build secure super apps and plugins with true runtime isolation, crash containment, and configurable permissions for native modules, perfect for integrating third-party code safely.

Event Cover

May 21Talk

Building Universal Super Apps With React & React Native

Discover how to build universal Super Apps using React and React Native. Join Mike Grabowski, CTO at Callstack, as he explores dynamic code delivery, native UI rendering, and how RePack bridges the gap with Module Federation.

Event Cover

May 20Live Stream

What’s New in Re.Pack 5.1: Live Overview

Explore runtime hooks, prefetching MF remotes, and more in Re.Pack 5.1. Join us live or watch the replay.

cover

May 14Article

New in Re.Pack 5.1: Preloading Remotes, Runtime Hooks, and Faster Startups

Re.Pack 5.1 introduces runtime hooks, preloading of remote modules with Module Federation, and experimental persistent cache for faster startups, plus full React Native 0.79 support.

cover

Jan 29Podcast

Mobile Microfrontends With Zephyr Cloud and Re.Pack

Get ready for faster development cycles and reduced risks when rolling out updates for mobile apps with microfrontends enabled by Zephyr Cloud and Re.Pack.

Event Cover

Jul 8Webinar

How to Scale Teams, Product Development, and Release Process With Re.Pack

Join us to learn how Re.Pack helps manage complexity in React Native apps, enables scalable teams, and boosts release processes.

cover

Nov 7Podcast

Module Federation

In the 18th episode of the React Native Show Podcast, Łukasz Chludziński, Paweł Trysła, and Zack Jackson talk about Module Federation in Webpack and Re.Pack. They also discuss some of the buzzwords related to this type of architecture, for example, super apps and micro frontends.

cover

Jul 6Podcast

Re.Pack - Bringing Webpack to React Native

This episode explores Re.Pack, an Open Source, Webpack-based toolkit to build React Native apps with the full support of the Webpack ecosystem.

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.