Migrate from a0.dev: extract the Expo app into a standard owned deploy
Expo screens already work in web preview and on device via the a0 app or Expo Go. Extraction means the tree, store consoles, and Convex or Supabase land under org accounts — IPA/APK paths you can rebuild, OTA within a runtime you pin, secrets outside the chat panel. We help you leave a0 Deployment as the only ship path.
Leaving a0.dev means this: the Expo tree lives in storage you control, native builds run from a clean checkout, store credentials sit under org Apple/Play admins, and someone else can ship without opening the a0 chat. You are done when the next binary ships from that path — not from Generate & Submit on the original project.
Where people get stuck
A green a0 web preview is not a portable store build
You do not need every chat experiment. You do need the Expo tree, runtime version, deep-link schemes, backend maps, and secrets that are not stuck in the a0 panel.
Thinking “it worked in web preview” is enough
Camera, push, payments, and biometrics need IPA/APK proof. Web preview never covered them.
Skipping the Expo runtime / Build Settings note
OTA only works within the shipped runtime. Capture Expo SDK version explicitly.
Passwords still live in a0 project settings
Anything only in the panel is not a safe home. Fresh values on destination Convex/Supabase; rotate what touched a0.
Only testing on react-native-web
Also try native builds, deep links, payments fail-closed, and a submit that does not need an open a0 chat.
The calm order
Extract Expo, remap backends and stores, prove native build, then lean on owned EAS/CI
We do not ban prompts mid-sprint. We make owned Expo the place real releases come from — after a practiced native submit and a written way back.
01
Label what stays, what remaps, what is preview-only junk
Proven screens stay. a0 preview caches stay out. Native modules that only worked in IPA/APK need an include-or-drop pass.
02
Stand org-controlled Expo storage with sealed secrets
Bundle ID and Team ID aligned. Someone else can clone and build.
03
Practice native build → TestFlight/Play on a clean runner
No leftover a0 preview assumptions. Deep links list production schemes.
04
Sign a short “it still works” note, then shrink a0 Deployment
Name sample accounts and the primary journey. Time-box how long Generate & Submit-only ship is still allowed.
How to
How to extract the Expo app without guessing
Move Expo source, secrets, and store accounts onto an owned path. Success is a practiced native submit plus a written way back.
Step 01
List what a0 still owns
Web preview, Deployment dashboard, OTA pushes, Convex/Supabase panel secrets.
Step 02
Put the owned Expo tree in place before you change habits
Runtime pinned. Secret names sealed. Build command written down.
Step 03
Build test accounts the preview demo never used
Odd roles, empty screens, native-only features.
Step 04
Replay real journeys on a native build
Compare what people see. Freeze the working tree at switch time.
Step 05
Retire a0 Deployment-only ship only after the note is signed
Support knows panel-era gaps. Time-box going back so two release paths do not invent accounts at once.
Read next
Proof, the essay, and sibling intents
These pages are already on the site. Use them to pressure-test the bet before a call.
“What impressed us most about CodeCross was their ability to deeply understand our vision and translate it into a complete digital solution. Unlike many agencies that just focus on technical delivery, CodeCross approached our project like true partners.”
Which Expo screens, Build Settings, and Convex maps leave a0.dev vs stay chat-only?
Take the Expo/RN application tree, app icon/permissions Build Settings you still need, deep-link schemes, payment product IDs, and a written map of Convex or Supabase collections. Leave preview caches, unpublished chat experiments, and collaborator personal keys out. Capture runtime version (Expo SDK) so OTA planning does not invent compatibility.
How do a0 Deployment and OTA steps become owned EAS or CI without the chat panel?
List version, Bundle ID, Team ID, and Generate & Submit steps a0 assumed. Pin Expo SDK/runtime in config. Replace “available because a0 Deployment” with eas build / submit from a clean checkout. Encode OTA so it stays within the shipped runtime — upgrades still need a new store binary. Fail the pipeline if install only succeeds inside a0’s preview shell.
How should Convex/Supabase and payment secrets cut over off a0.dev?
Mint new backend and payment secrets on destination projects; never commit a0 panel dumps. Point the Expo app at production Convex/Supabase and verify Auth, push, and purchases on a native build — not only web preview. Update deep links and App Store Connect metadata before you freeze the live version. Rotate old a0-visible values after cutover.
Why does “it worked in a0 web preview” fail outside a0 until you normalize?
Web preview lacks native device features, push, and some native modules; payments and biometrics need IPA/APK paths. CI images lack a0-injected preview assumptions; runtime may drift from what TestFlight has; secrets arrive empty. Normalize Expo install, runtime, and env first. A green react-native-web panel is not a portable store build.
Keep the prompt-built Expo app. Move it onto a deploy you control.
Bring the Expo tree, runtime version, and a few TestFlight accounts. We put owned ship last — and we name the a0 Deployment path you can roll back to.