Welcome back

Opening shared build

Preparing your Mach workspace…

Preparing your secure download…

Mach
Dashboard
All guides
Expo guide
July 31, 2026 · 6 min read

How to Add Mach to an Expo React Native Project

Connect an existing Expo app to Mach, declare the Expo build pipeline, and run your first cloud build.
What you will finish with
A linked Mach project, a framework-specific mach.config.json, and an exact command sequence for your first release workflow.

Before you start

This guide is for an existing Expo project that is configured through app.json, app.config.js, or app.config.ts. Mach uses Expo prebuild during its cloud build pipeline, then takes care of signing, native versioning, artifact upload, and optional store submission.
You need Node.js, a Mach account, and the app identifiers you intend to ship: an iOS bundle identifier and an Android package name. You can connect signing credentials after the project is linked.
Use framework: expo when Expo prebuild owns or refreshes native configuration.
Use framework: react-native instead if your Expo project commits native folders and you deliberately do not want prebuild to regenerate them.

1. Install Mach and sign in

Install the Mach CLI once, then authenticate it with your Mach account.
bash
npm install -g @radhya/mach mach login

2. Link the Expo project

From the root of the Expo project, run mach link. Select the Mach project you want to connect. The command writes the project identity into mach.config.json without changing your application source files.
bash
cd my-expo-app mach link
One config file, one source of truth
Keep mach.config.json at the repository root. For a workspace app, point appDirectory at the mobile app folder instead of duplicating configuration.

3. Declare the Expo pipeline

Mach never guesses the framework from package.json. Set framework to expo explicitly, then confirm the identifiers and version counters for the app you are building.
mach.config.json
{ "framework": "expo", "appDirectory": ".", "ios": { "bundleIdentifier": "com.example.app", "buildNumber": "auto" }, "android": { "package": "com.example.app", "versionCode": "auto" }, "build": { "development": { "developmentClient": true, "distribution": "development", "environment": "development" }, "production": { "distribution": "store" } } }
Version counters stay in Mach
With buildNumber and versionCode set to "auto", Mach allocates the next scoped Dashboard value during a build. Your Expo version remains the public marketing version.

4. Review the resolved configuration

Before spending a build minute, inspect the production profile. This is a useful habit whenever a profile inherits or overrides values.
bash
mach config --profile production

5. Run your first build

Run the platform you are ready to test. For Expo projects, Mach runs Expo prebuild as part of the cloud build, so Expo config plugins and generated native configuration are included before compilation.
bash
mach build --platform ios --profile production mach build --platform android --profile production

What happens next

Your build appears in the Mach dashboard with logs, artifacts, resolved runtime details, and signing status. Add credentials before a signed release build if they are not already stored for the selected profile.
Use mach credentials to configure signing certificates, profiles, or Android keystores.
Use mach ota setup when you are ready for Mach-hosted over-the-air updates.
Use mach deeplink setup when the app needs Universal Links, App Links, or HTTPS OAuth callbacks.
Keep going
Configure credentials
mach credentials
Set up the certificates, profiles, and keystores required for signed builds.
Set up OTA delivery
mach ota setup
Prepare the app for Mach-hosted OTA updates without EAS Update hosting.
Build and release with less ceremony.
Guides for Flutter, React Native, and Expo teams that want a clear path from project setup to shipment.
All guides
Start free