August 1, 2026
This argument is usually fought by people who last touched Expo in 2019, when "ejecting" was a one-way door and half the native modules you needed were unavailable. That version of Expo is gone. The advice built on it should go too.
Expo's config plugins and prebuild mean you no longer choose between "managed" and "bare" as a permanent identity. You write native configuration as code, expo prebuild generates the ios/ and android/ directories, and you can regenerate or commit them. The one-way door became a revolving one.
That single change invalidates most of the arguments still being repeated in comment threads.
Use Expo unless you have a specific, named reason not to.
That is not enthusiasm, it is arithmetic. On a recent build the Expo toolchain removed roughly a week of setup I would otherwise have paid for by hand:
A week is a real number on a fixed-price project, and none of it is work a client can see.
There are genuine ones. If any of these describe your project, reach for the CLI:
Notice what is not on that list: "it is a serious app". Seriousness is not a build tool.
Every new project starts as Expo with prebuild and committed native directories. That gives the ergonomics of managed and an escape hatch that is already open — if I need to touch native code, it is already there, and I have not had to migrate anything.
The migration I did in the other direction, CLI to Expo, took two days and mostly consisted of deleting things.
The build tool is not what will make your app late. Design churn, a backend that changes shape halfway through, and App Store review are what make apps late. I have never once missed a date because of the choice discussed in this post.
If you are picking a stack for something real and want a second opinion on it, tell me what you are building — I would rather talk you out of a bad fit than take the work.