Choosing Your Expo Architecture: Managed Workflow vs. Continuous Native Generation
Deciding between Expo's Managed and Bare workflows? Learn how Continuous Native Generation (CNG) and Config Plugins allow you to use custom native modules without the maintenance burden of manual native folder management.
08 Oct 2025, 18:45 UTC

The Native Code Dilemma
React Native developers often face a critical decision: do you want the simplicity of a JavaScript-only environment, or do you need direct access to the ios/ and android/ directories to implement custom native modules? Historically, this was a binary choice between the Managed Workflow and the Bare Workflow. Today, Expo uses a unified approach centered on Continuous Native Generation (CNG).
The core problem is maintenance. Manually editing native files (the "Bare" approach) creates a technical debt where every SDK upgrade requires tedious manual merges of native configuration files. The takeaway is to stay in a "Managed" state as long as possible by using Config Plugins to automate native changes, treating your native folders as disposable build artifacts rather than source code.
Comparing Architecture Options
| Feature | Managed (Expo Go) | CNG (Prebuild + Dev Client) | Bare Workflow |
|---|---|---|---|
| Native Folder Access | Hidden/Abstracted | Generated on demand | Permanent source files |
| Custom Native Modules | Not supported | Supported via Plugins | Supported manually |
| Build Environment | EAS Build / Cloud | Local or EAS Build | Local (Xcode/Android Studio) |
| Upgrade Path | Automatic/Simple | npx expo prebuild |
Manual native migrations |
Trade-offs and Decision Logic
When to stay Managed
If your app relies solely on the Expo SDK and standard APIs, avoid generating native folders. This allows you to use the Expo Go app for rapid prototyping and eliminates the need for a local macOS environment to build iOS binaries.
When to move to CNG (Prebuild)
You must move beyond Expo Go when you need a library that requires native linking or a custom AndroidManifest.xml/Info.plist modification. Instead of "ejecting" (the legacy Bare Workflow), use npx expo prebuild. This generates the native folders based on your app.json configuration. If you need to change a native setting, you write a Config Plugin—a JavaScript function that modifies the native project files during the prebuild process.
The Risk of the Bare Workflow
Maintaining ios/ and android/ folders in version control (the Bare Workflow) means you are now responsible for native dependency versioning. This significantly increases the risk of build failures during React Native version upgrades, as you can no longer simply regenerate the folders from a clean state.
Implementation: Transitioning to a Development Build
To use custom native code while maintaining a managed-like experience, you must replace Expo Go with a Development Build. This is a custom version of the Expo Go app tailored specifically to your project's native dependencies.
Step 1: Install the Dev Client
Run this command in your project root to add the necessary native runtime:
npx expo install expo-dev-client
Step 2: Configure Native Requirements
Instead of opening Xcode, add the required native configuration to your app.json. For example, to add a specific permission or a third-party plugin:
{
"expo": {
"name": "My App",
"plugins": [
[
"expo-camera",
{
"cameraPermission": "Allow this app to access your camera"
}
]
]
}
}
Step 3: Generate and Build
Run the prebuild command to generate the native directories based on the plugins listed above. Note: Run this with administrative permissions for your local environment.
npx expo prebuild
Expected Result: The creation of /ios and /android folders in your root directory. You should now add these to your .gitignore if you intend to follow the CNG pattern.
Step 4: Create the Binary
Since you now have custom native code, you cannot use the App Store version of Expo Go. You must build your own development binary using EAS (Expo Application Services):
eas build --profile development --platform ios
Risk: Local builds require a full Xcode/Android Studio installation. Using EAS Build offloads this to the cloud, removing the local hardware requirement.
Verification and Rollback
How to verify the setup
- Check Native Folders: Run
ls ios/ android/. If they exist and match yourapp.jsonsettings, prebuild worked. - Test Dev Client: Launch the app on a physical device. If the "Development Menu" appears and recognizes your custom plugins, the build is successful.
Rollback Procedure
Because npx expo prebuild changes the state of your filesystem by adding native directories, the rollback is simple: delete the ios/ and android/ folders. Since your configuration is stored in app.json, you can regenerate them at any time without losing native settings.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.