Here is BookNest at the end of this section, after prebuild and the scaffolding of Scaffolding BookNest:
tree -a -L 1 --dirsfirst -I 'node_modules|.git|.expo' .. ├── android ├── assets ├── src ├── .env ├── .gitignore ├── AGENTS.md ├── App.js ├── LICENSE ├── app.config.js ├── app.json ├── eas.json ├── index.js ├── package-lock.json └── package.json 4 directories, 11 files
Which group a file belongs to tells you what a change to it costs:
| Group | Files | A change needs |
|---|---|---|
| JavaScript | index.js, App.js, src/, JSON data, assets/ | A save (Fast Refresh) |
| Configuration | package.json, app.json, app.config.js, eas.json, .env | A Metro restart or a build |
| Native (generated) | android/, and ios/ on a Mac | A new build |
android/ is output, not source: the template's .gitignore lists /android and /ios, because npx expo prebuild regenerates them from app.json, package.json and config plugins, which Expo 6,418 calls Continuous Native Generation. Its gradle.properties carries the switches newArchEnabled=true, hermesEnabled=true, edgeToEdgeEnabled=true and reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64. Change them through app.json or the expo-build-properties plugin, never by hand, or the next prebuild throws your edit away (Prebuild and CNG). Commit package-lock.json so every machine installs identical versions.