The night before a submission, looking at a long list of available updates, I have thought more than once: "I might as well bring everything up to date before I ship."
One release made that way was followed by crash reports from older Android devices only. Nothing went wrong on my own phone. An upgraded library had dropped an assumption that old OS versions relied on (I wrote up the details in a separate article). Looking back, the upgrade itself was not the real mistake. The mistake was that I had no order for what to check before upgrading.
Let me give you the conclusion first. Check what the stores and the SDK dictate before you look at what is merely new. This article lays out the order I use as an indie developer shipping wallpaper apps under Dolice, with the screens and commands. The same view works for projects generated by Rork.
Step 1: Put the store version next to your local version
Start with the versions, not the libraries. Open App Store Connect and Google Play Console and note the version currently live. Then open package.json and app.json (or app.config.ts) and read the version field. If the numbers match, the submission cannot go through.
While you are there, recall what you touched since the last release. If you use git, git log --oneline from the last tag is enough. Anything you did not touch can be left out of today's checks.
Step 2: Let a command show you where you drifted from the SDK
Each Expo SDK expects specific versions of many packages. A command is more reliable than your eyes here.
npx expo install --check
npx expo-doctorThe first lists packages whose versions differ from what the SDK expects. The second checks configuration and native-side consistency. Neither rewrites your files, so they are safe to run the night before.
You do not have to fix every finding. But I keep one rule: if a line is flagged, I do not submit without reading it. Also note that expo-doctor does not cover everything; I opened it up and looked at what it actually checks in a separate article.
Step 3: Read the dependencies that carry deadlines first
Next come the things that can block submission if you do not upgrade.
| Item | Decided by | Where to look |
|---|---|---|
| Android target API level | Google Play requirements | Play Console notices and the official help page |
| Xcode / SDK used to build for iOS | Apple's submission requirements | Announcements in App Store Connect |
These are not "upgrade because I want to" items but "cannot ship without it" items. Once the deadlines are settled, everything else can honestly stay where it is. For how to inspect the Android side, see this audit of the effective targetSdkVersion.
Step 4: With npm outdated, pick up only the major-version jumps
Now you can face the pile of update notices.
npm outdatedThe output shows Current (installed), Wanted (the newest version your package.json range allows), and Latest. Reading everything stalls you, so I pick only the rows where the first number of Latest differs from Current. A changed major number is the convention for "behavior may have changed."
For those rows, read only the breaking-changes part of the changelog. If your app does not use the affected feature, skip the upgrade this time.
I took the same posture when moving Firebase from CocoaPods to Swift Package Manager: try it small first, then bring it onto the main line. The record is here.
Step 5: Write one line for everything you chose not to upgrade
The last step is the one that pays off most. Keep a note with each skipped library and the reason.
expo-image: Latest is one major ahead. Current screens rely on the old behavior. Revisit when adding the next feature.
With this in place, you do not repeat the same hesitation at the next submission. And if something breaks later, you can tell the upgraded side from the untouched side. Record why you did not upgrade with the same weight as why you did. That is my line.
One next action
Before your next submission, run npx expo install --check once. If it comes back empty, move straight on to Step 3.
And if a report arrives that the app runs on your phone but never launches on some devices, something optional may have ended up on the startup path. I wrote about how to spot that in a piece on fixing a launch design.
Since I fixed the order, the night before a submission has become much calmer for me. I hope it does the same for you.
Related: Why a Rork Max Android app crashes only on older OS versions