Project Structure

Project Structure and Configuration Files

Here is BookNest at the end of this section, after prebuild and the scaffolding of Scaffolding BookNest:

Listing the project one level deepJSX
tree -a -L 1 --dirsfirst -I 'node_modules|.git|.expo' .
Output
.
├── 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:

Where each part of the project lives
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.