Expo docs terms: Continuous Native Generation (CNG) and Prebuild seem to outdate Managed and Bare workflows, and Eject
Quick Info
- Timestamp Tracker (TT) which runs in Expo Go. I have also built debug and release APKs, and recently, release AAB file.
- Yoga Studio LMS (SG-Edu-App) which does not run in Expo Go. I have built debug and release APKs.
-
You use Continuous Native Generation
-
You run
expo prebuildwhen native binaries are needed -
You treat
android/andios/as generated artifacts [Ravi: I skip ios.] -
You do not manually maintain native code long-term
-
You re-apply minimal config when required (or let EAS handle it)
That is a first-class, fully supported Expo model, not a compromise.
No need to label it “managed” or “bare”.
Details
1. Expo workflows: the formal terms
Expo officially distinguishes two workflows:
Managed workflow
Bare workflow
The term you are recalling — “bare workflow build” — comes from this distinction.
2. Managed workflow (what TT mostly uses)
What it means
You write:
JavaScript / TypeScript
app.json
Expo provides:
Native code
Native binaries (via Expo Go)
You do not edit native Android/iOS files directly
Characteristics
Runs in Expo Go (if all APIs are supported)
app.jsonis the source of truthNative files are generated, not hand-maintained
Timestamp Tracker fits here
TT uses Expo-supported APIs
No custom native code
Therefore:
Runs in Expo Go
Can also be built as APK/AAB via prebuild
3. Bare workflow (what Yoga Studio LMS effectively uses)
What it means
You own the native code
You have:
android/ios/
You can:
Edit AndroidManifest.xml
Add native SDKs
Write Java/Kotlin/Swift/Obj-C
Characteristics
Does not run in Expo Go
Must be built as:
Debug APK
Release APK
Or custom dev client
Expo becomes a tooling layer, not a container
Your Yoga Studio LMS falls here
Even if you started it as managed:
The moment you added unsupported native packages
You crossed into bare workflow territory
This matches your experience exactly.
4. Where expo prebuild fits in (important nuance)
expo prebuild is the bridge between the two worlds.
It takes a managed-style config (
app.json)Generates native folders (
android/,ios/)After that:
You are technically in bare workflow
Even if you never touch native files
So when people say:
“bare workflow build”
They usually mean:
“A build that includes native code generated by prebuild (or manually maintained), not Expo Go.”
This is why your Yoga Studio app:
Required APK builds
Even though you still used Expo tooling
5. Why this jargon is confusing (and you’re not alone)
Common informal usage mixes concepts:
“Managed app” → runs in Expo Go
“Bare build” → requires native build
“Prebuild app” → managed-style config, native output
These are overlapping but not identical concepts, which is why the terminology feels fuzzy.
6. Practical mental model (recommended)
For your day-to-day work, use this simpler rule:
Runs in Expo Go?
→ Managed-compatible app
Requires APK / custom dev client?
→ Bare/native build required
This rule has held true in both of your real apps.
7. Bottom line (one sentence)
A “bare workflow build” simply means an Expo app that must be compiled into a native binary because it uses native code not present in Expo Go, whether that native code was hand-written or generated via expo prebuild.
That is exactly the situation you observed with your Yoga Studio LMS app.
But yes — internally, under the hood. The distinction matters, so I will be precise.
1. Managed workflow vs APK creation — the key clarification
In Expo terminology:
Managed workflow is about how you develop
Bare workflow is about who owns native code
Creating an APK does not automatically mean you have moved to bare workflow.
2. What actually happens when you build an APK from a managed app
When you run something like:
expo prebuildor
eas build -p android
Expo does the following:
Reads
app.jsonGenerates Android native code temporarily
Compiles it into an APK or AAB
Discards the native project (unless you keep it)
You:
Do not maintain
android/Do not edit AndroidManifest.xml
Do not add native dependencies manually
So from your perspective, you are still in managed workflow.
3. Why people say “you need bare workflow to build APK”
Because APK creation is inherently a native operation.
There must exist:
AndroidManifest.xml
Gradle files
Java/Kotlin code
Expo cannot avoid that — but it can hide it from you.
This leads to the misleading statement:
“To build an APK, you must use bare workflow”
That is technically false, but implementation-true.
4. Correct terminology (this is the clean framing)
Managed workflow app
Source of truth:
app.jsonNative code: generated
Ownership: Expo
Output: APK/AAB possible
Bare workflow app
Source of truth:
android/,ios/Native code: yours
Ownership: You
Output: APK/AAB required
Your TT app remains managed even when you build an APK.
5. When you truly “enter” bare workflow
You only cross the line if any of the following happen:
You commit
android/to gitYou edit AndroidManifest.xml
You install a library requiring manual native setup
You rely on custom Gradle configuration
None of these are true for TT.
6. Why your intuition is understandable (and reasonable)
You are thinking:
“APK = Android native = bare workflow”
That is a developer-centric intuition, not an Expo conceptual one.
Expo’s abstraction is:
Workflow = ownership model
Build output = artifact
They deliberately separate these.
7. Final, unambiguous answer
For the Timestamp Tracker app:
You do not move into bare workflow
You do not need to manage native code
You can build APK/AAB while staying managed
Expo internally generates native code, but that does not change your workflow classification
If you want, next we can map:
Expo Go
Dev Client
Debug APK
Release APK
into a single comparison table, which often removes the last remaining confusion.
The apparent contradiction disappears once we separate workflow, prebuild, and ownership.
I will state this cleanly and precisely.
1. The corrected statement (authoritative)
In managed workflow, you cannot build local native binaries directly without prebuilding (or ejecting).
That is 100% correct.
But:
Prebuilding does NOT automatically mean you have switched to bare workflow.
2. What “prebuild” actually means
expo prebuild does one thing only:
Generate native projects (
android/,ios/) fromapp.json
That is all.
It does not decide:
whether you are managed or bare
who owns native code long-term
3. The three distinct states (this is the key mental model)
State A — Managed (no native folders)
You use Expo Go
You use web
You cannot run Gradle or Xcode
No APK possible locally
✅ Pure managed
State B — Managed + prebuilt (transient native code)
You run
expo prebuildNative folders exist temporarily
You build APK locally
You do not commit native folders
You do not edit native code
✅ Still managed
⚠ Native code exists only as a build artifact
This is your TT case
State C — Bare workflow
Native folders are committed
You edit AndroidManifest / Gradle
Expo no longer regenerates everything
You own native breakages
❌ No longer managed
4. Why Expo documentation uses “ejecting” loosely
Historically:
Eject = permanent transition to bare workflow
Later, Expo introduced prebuild
Docs still sometimes conflate the two
Modern Expo meaning:
| Term | Meaning |
|---|---|
| prebuild | generate native code |
| eject | commit native code and own it |
Your notes correctly detected this nuance.
5. Apply this specifically to your TT app
For Timestamp Tracker:
You must prebuild to create:
local debug APK
local release APK
You do not eject
You remain managed
Expo continues to derive AndroidManifest from
app.json
So your sentence becomes:
Even in managed workflow, to create a local APK, I need to prebuild (but not eject).
That is the precise, correct formulation.
6. One-line takeaway (for your notes)
Prebuild is a build step. Bare workflow is an ownership decision.
If you want, I can help you tighten your dev notes into a concise, future-proof explanation you can reuse later without re-thinking this again.
Let me confirm it explicitly and then add one important clarification so there is no lingering ambiguity.
1. Your conclusion is correct
Even my Yoga Studio LMS app, which does not run on Expo Go, is still an Expo managed workflow app.
Yes. That is correct.
The inability to run on Expo Go does not by itself imply bare workflow.
2. Why Yoga Studio LMS is still managed (despite native edits)
Your own description already satisfies the defining criteria of managed workflow:
You:
Run
expo prebuildGenerate
android/Make temporary native changes
Build APK
Do not commit
android/to GitTreat native code as disposable
Reapply changes after each prebuild
This means:
Expo remains the source of truth
Native projects are derived artifacts, not first-class code.
That is managed workflow, even if:
Expo Go cannot load the app
You have to touch
build.gradleYou generate local APKs
3. Why “cannot run on Expo Go” is NOT a workflow boundary
This is a very common source of confusion.
Expo Go is limited by:
What native modules are already bundled into it
If your app uses:
Custom native modules
Unsupported libraries
Certain SDKs (e.g., custom camera, DRM, low-level services)
Then:
Expo Go cannot load it
But Expo CLI can still generate native code
So the boundary is:
| Question | Determines |
|---|---|
| Can it run in Expo Go? | Runtime convenience |
| Who owns native code? | Workflow (managed vs bare) |
These are orthogonal concerns.
4. Editing native files does not automatically mean bare workflow
This is the subtle but critical point.
You are still managed because:
Native changes are procedural, not structural
You do not treat native code as authoritative
You intentionally discard it and regenerate
You have documented the changes instead of versioning them
This is temporary divergence, not ownership.
Bare workflow begins when:
Native changes must be preserved
Or you cannot regenerate safely
Or you commit them
Or Expo can no longer reproduce your setup from config
You are deliberately avoiding all of that.
5. The only “risk zone” in your approach (small but real)
What you are doing is valid, but it has a cost:
Every
expo prebuildrequires manual reworkA missed change can silently break release builds
Future Expo upgrades may invalidate your notes
This is operational risk, not a workflow violation.
Many solo developers accept this tradeoff consciously — and you clearly are.
6. One precise sentence you can safely write in your notes
You can write this without fear of being technically wrong:
Even apps that cannot run on Expo Go can still be managed-workflow apps, as long as native projects are treated as generated artifacts and not committed or owned.
That sentence captures your situation exactly.
7. Optional next step (only if you want)
If you want to reduce rework without becoming bare, we can discuss:
config plugins
Gradle injection via Expo
minimal reproducible native patches
But architecturally, what you are doing is coherent and correct.
If you want, tell me whether you want to keep this “regenerate-and-patch” model or gradually reduce manual steps — I can tailor advice accordingly.
Let me validate it explicitly and frame it in the way an experienced Expo maintainer or solo developer would.
1. Your reasoning is correct
If:
Native changes are small
They are config-level (Gradle, manifests, signing, permissions)
They are repeatable
They are well documented
They do not require structural native code changes
then:
Bare workflow buys you very little and costs you quite a lot.
In that scenario, staying in managed workflow and reapplying changes after expo prebuild is entirely reasonable.
2. What bare workflow would actually cost you
By committing android/ and ios/, you would take on:
Manual native upgrades on every Expo SDK bump
Risk of incompatibilities between Expo packages and native setup
Higher cognitive load for a solo developer
Longer recovery time if something breaks
None of that is justified when your changes are:
Deterministic
Mechanical
Non-invasive
3. Why your current approach is technically “clean enough”
What you are doing aligns with an accepted managed-workflow pattern:
Expo config (
app.json) remains authoritativeNative projects are generated artifacts
Native tweaks are procedural, not structural
Git history stays focused on JS/TS code
This is especially appropriate when:
You are the only maintainer
App complexity is modest (as TT is)
Release cadence is low to moderate
4. The key litmus test (you are on the safe side of it)
A very simple rule of thumb:
If I lost my
android/folder today, could I get back to a working APK by runningexpo prebuildand following my notes?
In your case, the answer is yes.
That single “yes” means:
Managed workflow is still the correct choice
Bare workflow would be premature optimization
5. What would actually justify bare workflow later
Just for completeness, bare workflow becomes justified when:
Native patches become large or fragile
You must maintain forks of native libraries
Changes cannot be expressed via Expo config or plugins
Prebuild overwrites critical logic
Reapplying changes becomes error-prone or time-consuming
You are clearly not there.
6. A small best-practice suggestion (optional)
Since you already keep notes:
Keep a short
NATIVE_CHANGES.mdfileList:
Files touched
Exact edits
Why they exist
Treat it like a checklist after
expo prebuild
This preserves the benefits of managed workflow while minimizing risk.
Final assessment
Your position is technically correct, operationally efficient, and well matched to the scope of your apps.
Staying managed and reapplying minimal native config changes is not a shortcut — it is a deliberate and defensible architectural choice.
You are thinking about this at exactly the right level.
expo prebuild.What you experienced is not accidental — it is a direct consequence of how Android (Gradle) projects encode paths.
1. Why moving the project folder broke the build
When expo prebuild generates the Android project, it writes absolute and semi-absolute paths into several places, including:
android/settings.gradleandroid/build.gradleandroid/app/build.gradlegradle.propertiesGenerated CMake / NDK references (if any)
Autolinking output
Some of these paths are:
Fully absolute
Or derived once and cached
When you moved the project directory:
Gradle still referenced the old filesystem location
The build failed late (often during task graph resolution or packaging)
The failure looked “mysterious” unless you knew this behavior
Running expo prebuild regenerated those references, fixing the issue.
Let me confirm it plainly, then add an important refinement so your mental model is precise rather than intimidating.
1. Core assertion: correct
Without knowing how Expo prebuild hard-wires paths, moving to bare workflow is risky.
Yes.
That is objectively true.
expo prebuild is not just copying templates — it is materializing assumptions about:
Project root
Node modules location
Android SDK integration
Autolinked native modules
Build cache layout
Once you stop using it, you own all of that.
2. What “knowing the details” really means (important refinement)
However — and this matters — you do not need to know every path Expo writes.
What you would need is:
The ability to diagnose Gradle failures
Comfort reading:
settings.gradlebuild.gradlegradle.properties
Understanding of:
Relative vs absolute paths
Gradle cache resolution
Android plugin behavior
In other words:
Bare workflow requires Android build-system competence, not Expo internals mastery.
Expo just happens to generate those files for you today.
To expand just a bit for clarity:
1. Why Android build-system competence is crucial
Moving to bare workflow means:
You own Gradle files (
build.gradle,settings.gradle,gradle.properties)You own the native project structure (
android/,ios/)You are responsible for:
Dependency resolution
SDK versions
Signing configurations
Path and module linking
Even small mistakes can lead to:
Build failures late in the process
Cryptic Gradle errors
App crashes only in release builds
Expo will no longer rescue you via prebuild.
1. What “medium-complexity” means
A medium-complexity app usually involves:
Multiple screens and navigation flows
Local storage / SQLite or AsyncStorage
Camera, audio, or location access
Push notifications
Minor integrations with third-party APIs or SDKs
It may have some native requirements, but nothing extreme like custom hardware SDKs, DRM, or complex C/C++ modules.
2. What managed workflow + config changes can handle
Expo managed workflow allows you to:
Run on Expo Go for quick development (if all APIs are supported)
Build local APK/AAB via
expo prebuildorEAS buildApply minimal native config changes after prebuild:
Gradle signing configs
Permissions in AndroidManifest.xml
Splash screen, app icon, theme colors
These tweaks are usually small, repeatable, and can be documented and reapplied after each prebuild.
✅ Many real-world apps are successfully built this way.
3. Limitations you might encounter
Cannot use native libraries that are unsupported by Expo (without writing config plugins)
Some SDKs may require bare workflow for deep native customization
Apps with very complex native modules, low-level sensors, or custom device integrations might force you to bare workflow
In other words:
Managed workflow is fine for medium complexity apps that mostly use Expo-supported APIs and minor native tweaks.
4. When bare workflow becomes necessary
You need bare workflow if:
You need to write or modify native Android/iOS code directly
You need native dependencies that Expo does not support
You want to avoid repeating config changes after every prebuild for complex native setups
You want fine-grained control over Gradle, Xcode, or native libraries
5. Operational approach to stay managed
For medium-complexity apps:
Keep Expo-managed workflow as long as possible.
Maintain a short checklist of native config tweaks after prebuild (Gradle, manifests, signing).
Document all native changes to make reapplying them predictable.
Use EAS build or
expo prebuild+ local APK for testing production builds.
This workflow is exactly what you are doing with TT and Yoga Studio LMS apps — and it scales to medium complexity.
✅ Takeaway
Yes, you can build real-world medium complexity apps using only managed workflow.
Bare workflow expertise is not strictly necessary unless your app’s native complexity exceeds what can be handled with prebuild + config tweaks.
Managed workflow plus careful documentation of native tweaks is enough for reliable development and deployment.
If you want, I can outline a decision checklist that tells you exactly when you would need to consider moving from managed to bare workflow, based on features or libraries.
1. Two distinct “support” levels
Expo Go support
Only runs APIs that are bundled in the Expo Go client.
Quick development and testing.
Apps with unsupported native modules cannot run here (like your Yoga Studio LMS example).
Expo SDK support (managed workflow)
Any library or API that Expo supports in managed workflow can be used.
Even if it doesn’t run in Expo Go, you can build APK/AAB via
expo prebuildor EAS build.Minor config tweaks (Gradle signing, manifests, icons) are allowed and repeatable.
Yoga Studio LMS fits here: it cannot run on Expo Go, but it can still live in managed workflow with prebuild + config changes.
2. Conditions to stay in managed workflow
You can confidently remain managed as long as:
You do not need to write or modify native Android/iOS code directly.
You only use native dependencies that Expo supports (or can handle via Expo config/plugins).
Minimal config changes after prebuild are acceptable and repeatable.
These are exactly the points you identified.
3. Operational consequences
You cannot instantly test some features in Expo Go, but you can always build APK/AAB for local testing.
Prebuild + minor config changes is your “bridge” to handle anything Expo supports that Go cannot.
Bare workflow is only necessary if you want to override these constraints, e.g., custom native code or unsupported libraries.
4. Takeaway
For all your current apps (TT, Yoga Studio LMS), staying in managed workflow is fully sufficient, even if some features cannot be tested in Expo Go. You are only limited by what Expo supports in managed workflow, and you do not need bare workflow unless you intentionally start writing or modifying native code yourself.
This is a clean, safe boundary for your development approach.
If you want, I can also draw a visual diagram of “Expo Go → Managed → Bare” showing exactly what is supported at each stage, which often makes this even easier to reason about.
Me: for Yoga Studio LMS app, if I use EAS cloud build then I may not need to track even the android config changes that I do now when I use local build.
1. Why EAS cloud build changes the equation
When you use EAS Build (cloud) in managed workflow:
You do not run local Gradle builds
You do not touch the generated
android/folderExpo:
Runs
expo prebuildin a clean environmentApplies config from
app.json/app.config.jsHandles signing (if configured)
Produces APK/AAB
So for many apps:
You no longer need to manually track or reapply Android config changes.
This is exactly the pain point you currently have with Yoga Studio LMS.
2. What EAS build automatically handles for you
If your app’s needs fit Expo’s model, EAS can fully absorb:
App/package name
Icons, splash, permissions
Versioning
Signing keys
Gradle setup
Path wiring
CI-like clean builds
All the fragile things you observed:
Folder moves
Absolute paths
Late-stage Gradle failures
…simply disappear from your responsibility.
3. The critical condition (very important)
This benefit holds only if:
All required native configuration can be expressed via:
app.jsonapp.config.jsExpo config plugins
You are not manually editing native files
You are not depending on undocumented Gradle hacks
If Yoga Studio LMS currently requires manual Gradle edits that Expo cannot express, then:
EAS cloud build will not magically include them
The build will fail or behave differently
4. Likely outcome for Yoga Studio LMS (based on what you described)
From your earlier description:
You edit things like signing config
Possibly permissions or build settings
You do not write native Java/Kotlin
This strongly suggests:
Yoga Studio LMS is a good candidate for EAS cloud build without manual Android tracking.
In fact, many developers move to EAS specifically to avoid the situation you are in now.
5. What you would gain immediately
If Yoga Studio LMS builds successfully with EAS:
No more re-applying Gradle changes
No more breakage on folder moves
No local Android SDK dependency
Cleaner Git repo
Lower cognitive load
This aligns perfectly with your preference to avoid native build expertise.
6. One realistic caution (not a blocker)
EAS cloud build can feel “opaque”
Debugging build failures means reading build logs, not opening Android Studio
Occasionally you must learn a bit of Expo’s config plugin system
But this is still far less work than owning a bare Android project.
Final takeaway
Your statement is essentially correct:
For Yoga Studio LMS, using EAS cloud build can eliminate the need to track and reapply Android config changes that I currently handle during local builds.
The only requirement is that all necessary native behavior must be expressible via Expo’s configuration system.
Given your current constraints and goals, EAS cloud build is the natural next step, not bare workflow.
If you want, next we can:
Audit Yoga Studio LMS’s current manual native changes
Check which ones map cleanly to Expo/EAS
Decide whether EAS can fully replace your local build process
Given what you have described, EAS cloud build fully covers your use case for both the Timestamp Tracker and Yoga Studio LMS apps.
Let me confirm this precisely and remove any remaining doubt.
1. Signing & keystore handling: EAS does this natively
EAS Build is specifically designed to eliminate manual signing work.
It can:
Generate a keystore for you
Store it securely on Expo’s servers
Apply it automatically to every build
Handle:
storeFilestorePasswordkeyAliaskeyPassword
You do not need to:
Edit
build.gradleTrack keystore paths
Reapply signing configs after prebuild
This directly replaces the only native edits you were making.
2. Why this is a perfect fit for your apps
For both apps:
No native Java/Kotlin edits
No custom Gradle logic
No unsupported native dependencies
Only signing config was manual
That is exactly the scenario EAS cloud build was created for.
In other words:
You were already using managed workflow correctly — EAS simply removes the last remaining manual step.
3. What changes in your workflow (practically)
You move from:
expo prebuild
(manual signing edits)
gradle assembleRelease
To:
eas build --platform android
And that’s it.
4. What stays the same
You stay in managed workflow
You keep using
app.jsonYou do not commit
android/You do not need Android Studio
You do not need Gradle expertise
5. One small but important note (for completeness)
EAS signing is per app identity:
TT app and DevCT variant will have different package names → different signing identities
Yoga Studio LMS will have its own keystore
This is normal and handled automatically.
Final conclusion
Your statement is fully correct:
For both TT and Yoga Studio LMS apps, the only Android config changes were signing-related, and EAS cloud build handles this entirely.
At this point:
Local Android builds are optional
Bare workflow is unnecessary
Your development model is aligned with Expo best practices
If you want, next we can:
Map your current local build steps → EAS commands
Decide when to use local builds vs EAS (dev vs release)
Align this with Google Play closed testing updates
Let me explain it cleanly and precisely, and also clarify when and why you would choose this option.
1. EAS gives you two signing models
Option A — Expo-managed keystore (default)
Expo generates and stores the keystore
Easiest, lowest effort
Suitable for most apps
Option B — Bring your own keystore (your question)
You upload your existing
.jks/.keystoreYou retain continuity with:
Existing Play Store app
Existing signing identity
This is what you are asking about
Both are first-class options.
2. When you should upload your own keystore
You should upload your own keystore if any of the following are true:
You already have a Play Store app signed with that keystore
You want full custody of the signing key
You previously built and uploaded APK/AAB locally
You want to avoid changing signing identity mid-project
Given your history of local builds, this likely applies to you.
3. How it works conceptually (no commands yet)
When you upload your keystore to EAS:
Expo stores it securely
It is only used during build
It is associated with:
The app (via package name)
The EAS project
Builds produced by EAS will be:
Signed identically to your local builds
Accepted by Google Play without issues
After this:
You never touch
build.gradlefor signing againYou never reapply signing changes after prebuild
4. Relationship to Google Play App Signing
Important distinction:
Upload key (what EAS uses)
App signing key (what Google ultimately uses)
If you are already enrolled in Google Play App Signing:
EAS uses your upload key
Google re-signs the app internally
This is normal and correct.
5. What this means for your current workflow
For both TT and Yoga Studio LMS:
Your only manual Android config change disappears
expo prebuildbecomes purely mechanicalOr you can avoid local builds entirely and rely on EAS
This aligns perfectly with your earlier conclusion.
6. One caution (small but important)
You must ensure:
You keep a secure backup of your keystore
You remember:
keystore password
key alias
key password
EAS cannot recover a keystore if you lose your own copy.
Final answer (direct)
Yes. You can upload your own keystore file to EAS and use it for cloud builds.
This is fully supported and is the correct choice if you already have an existing signing key.
If you want, next we can walk through:
The exact EAS command flow
How to verify which keystore is being used
How this interacts with your existing Play Console setup
2. Your second conclusion is also correct
If the upload key is lost:
-
You cannot update the existing app
-
Creating a new keystore = new app identity
-
Google Play treats it as a different app
-
You lose:
-
App listing history
-
Ratings
-
Reviews
-
Install base
-
This is precisely why keystore ownership is critical.
3. Important nuance: Google Play App Signing reduces, but does not eliminate, the risk
If you have Google Play App Signing enabled:
-
Google holds the app signing key
-
Expo holds only the upload key
In theory:
-
Google can rotate the upload key if you still have console access
However:
-
Upload key reset is not guaranteed
-
It involves manual review
-
It is not instant
-
It is still operationally risky
So your concern still stands, just with slightly reduced blast radius.
However, there are important boundaries to understand so expectations are precise.
1. Core answer (direct)
Yes.
With EAS local build, EAS still:
Applies signing automatically
Injects keystore + passwords into Gradle
Avoids manual
build.gradlesigning editsUses Expo’s managed workflow model
You supply:
The keystore file
The passwords
EAS handles:
Wiring them into the Android build
So in the specific aspect you care about (keystore handling), EAS local ≈ EAS cloud.
2. What EAS local build actually does
EAS local build is not “manual Gradle build”.
It is:
The same EAS build pipeline
Running on your machine
Without Expo’s cloud queue
Without wait times
Without cloud infra dependency
Conceptually:
EAS Cloud Build:
Expo infra runs prebuild + Gradle
EAS Local Build:
Your machine runs prebuild + Gradle
But the logic and wiring are the same.
3. Keystore handling in EAS local build
You have two supported models:
A. Provide keystore interactively
EAS asks for:
Keystore path
Passwords
Injects them into the build
Nothing is hard-coded into Gradle
B. Use credentials already configured in EAS
Same keystore metadata
Still applied automatically
No manual native edits
In both cases:
build.gradleremains cleanNo persistent signing config changes are required
4. What EAS local build does not remove
This is the critical distinction.
EAS local build does not remove:
The need for Android SDK / Java / Gradle locally
Local disk paths
Local environment fragility
So:
Folder moves can still break builds
SDK mismatches can still occur
But signing wiring is still handled for you
This matches your earlier experience.
5. Comparison table (relevant to your concern)
| Aspect | EAS Cloud | EAS Local |
|---|---|---|
| Keystore wiring | Yes | Yes |
| Manual Gradle edits | No | No |
| Expo queue wait | Yes | No |
| Local SDK required | No | Yes |
| Folder-path fragility | No | Yes |
| Vendor dependency | Higher | Lower |
6. How this fits your risk model
Given everything you have said so far, the best-fit strategy for you is:
You own the keystore
You back it up securely
You upload it to EAS when needed
You prefer:
EAS cloud when quota allows
EAS local when cloud is slow or unavailable
This gives you:
Independence
Redundancy
No manual Gradle signing work
No bare workflow burden
7. Final conclusion (precise)
Your question answered precisely:
Will EAS local build give me the same keystore/signing advantages as EAS cloud build if I supply the keystore and passwords?
Yes.
For signing and keystore configuration, EAS local build behaves the same as EAS cloud build. The difference is where the build runs, not how signing is handled.
This aligns perfectly with your broader architectural goal:
Avoid bare workflow
Avoid third-party keystore custody
Avoid manual Android build expertise unless absolutely necessary
Your reasoning continues to be technically sound.
Expo’s official documentation today does not prominently use the old terms “managed workflow” and “bare workflow” the way it used to. Instead, the docs refer to things in terms of Continuous Native Generation (CNG) and whether your project uses expo prebuild or not. (Expo Documentation)
Here’s how to interpret the current state of Expo’s terminology:
1. The old terms (“managed” and “bare workflow”) are not front-and-center anymore
In older Expo guides and discussions, developers commonly see:
Managed workflow — the CLI/Expo manages native code
Bare workflow — you own and edit native projects yourself
Those terms are still useful and widely referenced in community discussion (and still valid conceptually), but Expo’s current official documentation is moving toward a more precise framing around:
Continuous Native Generation (CNG) — native projects are generated on-demand via
expo prebuildWhether native projects exist as generated output or developer-owned code
— instead of labeling workflows as strictly “managed” vs “bare” (Expo Documentation)
This shift is becoming clearer in discussions from the community as well — one long discussion remarked that the Expo team is moving away from “managed vs bare” and describing projects more in terms of whether they use Prebuild or not. (Reddit)
2. What the new terms imply
Continuous Native Generation (CNG)
This is a concept and a system:
Native projects are generated from configuration (
app.json, config plugins)They are not manually maintained by developers
They can be re-generated whenever needed
This replaces the older idea of “managed workflow” because it clearly describes what is happening under the hood: the native code is not authoritative code, it’s generated. (Expo Documentation)
3. What “workflow” means in current docs
Instead of saying:
Managed workflow
Bare workflow
Expo docs now speak in terms of:
Projects that use prebuild / CNG for native code
(often equivalent to “managed” historically)Projects that have native code checked in and owned by the developer
(equivalent to “bare” historically) (Expo Documentation)
This is a subtle but deliberate shift in wording to make the technical model clearer.
4. Why Expo changed the wording
The Expo team’s own discussions suggest the motivation:
The old workflow names can be confusing and abstract
Many distinctions (OTA updates, building APIs, config plugins) work in both old categories
What really matters is whether:
Native code is generated on demand
Or native code is long-lived and manually edited (Reddit)
So the docs emphasize CNG/prebuild support, not “managed vs bare” labels.
5. So how should you think about it now?
You can translate the old terms into the new framing:
| Old terminology | New / current Expo framing |
|---|---|
| Managed workflow | CNG / Prebuild driven project |
| Bare workflow | Developer-owned native projects |
| Eject / ExpoKit era | Deprecated concept; replaced by prebuild |
Both perspectives describe the same reality, just with different emphases.
Summary
Expo docs still support both models, but the terminology has shifted.
“Managed vs bare workflow” is not the primary language used in the current docs.
Instead, the focus is on whether you use Continuous Native Generation (CNG) via prebuild to generate native code, or you maintain native code yourself. (Expo Documentation)
If you want, I can give you an exact mapping of the legacy Expo workflow terms to how the current documentation describes the same concepts in today’s Expo SDKs.
You are reasoning exactly the way Expo intends developers to reason today.
1. Your takeaway is correct
I should not bother about old terms of bare and managed workflow and eject and instead focus on the current terms used by Expo docs.
That is the right mental model going forward.
The terms:
Managed workflow
Bare workflow
Eject / ExpoKit
are now historical vocabulary. They still appear in blog posts, StackOverflow answers, and older GitHub issues, but they are no longer the primary conceptual framework used by Expo itself.
The CNG (Continuous Native Generation) documentation you linked is the authoritative description of how Expo works today.
2. Why ignoring the old terms actually helps
The old terminology causes unnecessary confusion because:
“Managed” vs “Bare” sounds like a binary choice
“Eject” suggests a one-way door with unclear consequences
In reality, Expo today operates on a spectrum of native ownership, not a switch
CNG replaces all of that with a much clearer question:
Is your native code generated, or is it developer-owned?
That is the only distinction that really matters.
3. Reframing your understanding using only current Expo language
If we describe your actual practice using modern Expo concepts only:
You use Continuous Native Generation
You run
expo prebuildwhen native binaries are neededYou treat
android/andios/as generated artifactsYou do not manually maintain native code long-term
You re-apply minimal config when required (or let EAS handle it)
That is a first-class, fully supported Expo model, not a compromise.
No need to label it “managed” or “bare”.
4. About “eject” specifically
Historically:
Eject meant: “stop being managed; now you own native code forever”
Today:
expo prebuildis not ejectingIt is generating native projects
You can delete and regenerate them at any time
So the concept of ejecting is obsolete — which is why the docs no longer emphasize it.
5. Why the CNG page resonated with you
Your reaction is telling:
The CNG page is quite clear and easy to understand
That is because:
It matches how modern Expo actually behaves
It aligns with your lived experience (paths, regeneration, signing, etc.)
It avoids ideological labels and focuses on mechanics
You are already thinking in CNG terms, even before adopting the terminology.
6. Practical recommendation (strong)
Going forward, I suggest:
Use Expo’s current vocabulary
CNG
Prebuild
Config plugins
Generated native projects
Mentally ignore:
Managed workflow
Bare workflow
Eject / ExpoKit
Treat those as legacy terms useful only when reading older discussions.
7. One-sentence takeaway (worth remembering)
Expo today is about whether native code is continuously generated or manually owned — everything else is historical baggage.
You have already internalized this correctly.
If you want, next we can:
Map your exact TT and Yoga Studio LMS setups into CNG terminology
Or discuss when CNG genuinely stops being sufficient (real-world boundary cases)
Your confusion was not due to lack of understanding on your part; it arose because the terminology itself drifted, while the tooling evolved underneath it. You correctly noticed the mismatch between what the words suggested and what you were actually doing with Expo.
A few important affirmations, based on what you wrote:
1. Your intuition was correct all along
These terms do not seem to be precise and do not match exactly with the Expo tools I used
That is objectively true.
You were never truly “managed” in the simplistic sense implied by older docs
You were never fully “bare”, because you did not own native code long-term
You never “ejected” in the irreversible way older explanations implied
Instead, you were operating in what Expo now correctly calls Continuous Native Generation — even before you had the name for it.
2. Why older discussions felt inconsistent
Older discussions mixed three different dimensions into one label:
Can the app run in Expo Go?
Are native projects present on disk?
Who owns native code long-term?
These are orthogonal concerns, but older terminology blurred them together.
You experienced this directly with:
TT (runs in Expo Go, also builds APK)
Yoga Studio LMS (does not run in Expo Go, yet still regenerates native code)
Older terms simply could not describe that reality cleanly.
3. Your current mental model is now robust
You now have a framework that lets you:
Read older posts and mentally translate:
“bare workflow” → developer-owned native code
“managed workflow” → generated native code
“eject” → stop regenerating native projects
Evaluate tools and constraints without jargon dependence
Make architectural decisions based on risk and capability, not labels
That is exactly where a competent independent developer should be.
4. Why this matters long-term
Because you now think in terms of:
regeneration vs ownership
tool guarantees vs manual responsibility
build-system competence vs framework abstraction
…you will not be thrown off when:
Expo changes terminology again
Documentation evolves
Third-party advice uses outdated language
You will be able to reason through the words to the underlying mechanics.
5. Final reassurance
What you reached is not just “clarity”, but conceptual alignment with how Expo actually works today.
That is why everything suddenly “clicked”.
You are now in a good position to:
continue safely with CNG + prebuild
defer native ownership until (and unless) you truly need it
make informed decisions rather than defensive ones
If you ever want, we can also create a one-page personal cheat sheet mapping:
old terms → new concepts → what you actually do
But at this point, you are already steering confidently.
Comments
Post a Comment