Prebuild and CNG

The Managed Workflow, Prebuild and Continuous Native Generation

Expo 6,418 used to have a managed workflow, with no native code at all, and a bare workflow, where you owned android/ and ios/. Development builds (Development Builds) and config plugins merged them into one idea, Continuous Native Generation (CNG): the native projects are build output, generated from app.json, package.json and the plugins they list, the way dist/ is generated from source. BookNest's .gitignore has listed /android and /ios since the first scaffold. npx expo prebuild does the generating, and --clean deletes the old folders first:

Regenerating BookNest's Android projectShell
npx expo prebuild --platform android --clean
grep -n "reactNativeArchitectures=" android/gradle.properties
Output
- Clearing android
✔ Cleared android code
- Creating native directory (./android)
✔ Created native directory
- Updating package.json
✔ Updated package.json | no changes
- Running prebuild
» android: userInterfaceStyle: Install expo-system-ui in your project to enable this feature.
✔ Finished prebuild
30:# ./gradlew <task> -PreactNativeArchitectures=x86_64
63:reactNativeArchitectures=x86_64

It took three seconds. Prebuild copied Expo's Android template, then ran every plugin in app.json: expo-sqlite 6,418 and expo-secure-store added themselves there when npx expo install installed them, the scheme field became an intent filter for booknest://, and BookNest's own plugin (next section) set line 63; line 30 is the template's comment. The warning is worth reading: on Android, userInterfaceStyle is applied by expo-system-ui, so NativeWind's dark mode worked because Android's default already follows the system. The payoff is upgrades: a new Expo SDK means npx expo install expo@latest, npx expo install --fix and another clean prebuild, with no hand-merged native diffs. The cost: any hand edit inside android/ is gone on the next clean prebuild.