Expo app integration with React Native Stallion

Expo integration guide - Learn how to migrate your Expo app from EAS Updates or Expo Updates to React Native Stallion (Stallion Software) for faster, affordable OTA updates. Includes npm install -g expo-cli setup instructions.

Note:

Full Expo support requires minimum React Native Stallion SDK version 2.3.0.

Expo Integration with React Native Stallion

Introduction

Thinking about switching from Expo Updates or EAS Updates? Whether you're looking for more control, better pricing, or faster Over-the-Air (OTA) updates, React Native Stallion is a lightweight and developer-friendly alternative.

This guide shows how to migrate your Expo app to React Native Stallion using the prebuild approach. If you're currently using Expo Updates, you'll find the transition smooth and well worth the benefits.

Prerequisites

Before integrating React Native Stallion with your Expo app, ensure you have Expo CLI installed. You can install it globally using:

npm install -g expo-cli

Alternatively, you can use npx expo commands without global installation, which is the recommended approach for most projects.

Step 1: Run Expo Prebuild

First, generate the native iOS and Android folders using Expo's prebuild command:

npx expo prebuild

This will create the ios/ and android/ directories, converting your project into a prebuild-compatible structure—no full eject required.

Step 2: Follow Native Installation Steps

Now that your native folders are generated, follow the native installation guide to install and configure React Native Stallion SDK in both Android and iOS.

Step 3: Add Custom Metro Configuration

Create a metro.config.js file at the root of your project to define aliases and ensure custom resolution works correctly:

const { getDefaultConfig } = require("@expo/metro-config");
const path = require("path");

const projectRoot = __dirname;
const config = getDefaultConfig(projectRoot);

config.resolver.alias = {
  ...config.resolver.alias,
  "@": path.resolve(projectRoot),
};

module.exports = config;

Step 4: Add Babel Configuration

Create or update the babel.config.js file:

module.exports = function (api) {
  api.cache(true);
  return {
    presets: ["babel-preset-expo"],
    plugins: [
      [
        "module-resolver",
        {
          root: ["./"],
          alias: {
            "@": "./",
          },
        },
      ],
    ],
  };
};

Step 5: Install Required Packages

Install the following packages (use latest versions):

npm install --save-dev \
  @react-native-community/cli \
  @react-native/metro-config \
  babel-plugin-module-resolver \
  babel-preset-expo

Or with Yarn:

yarn add -D \
  @react-native-community/cli \
  @react-native/metro-config \
  babel-plugin-module-resolver \
  babel-preset-expo

Step 6: Publish Your Bundle with Custom Entry File

If you're using Expo Router, your entry file will likely be:

node_modules/expo-router/entry.js

Use the following command to publish your bundle with React Native Stallion:

npx stallion publish-bundle \
  --upload-path=nimbus-apps/nimbus-consumer-app/expo \
  --platform=ios \
  --release-note="Migrated from Expo Updates" \
  --entry-file=<your-custom-entry-file>

For example for Expo router apps the entry file should be node_modules/expo-router/entry.js

Step 7: Proceed with Production Setup

Everything else should work as expected from here. You can continue with the production deployment steps outlined in the production usage guide.


Looking for a fast, affordable, and flexible alternative to Expo Updates? Learn why developers are switching to React Native Stallion and how it unlocks better OTA workflows.