◉RORK LABJP
●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Expo SDK 58 is out of beta as of 10/15 (beta since 09/15). Check your dependencies before upgrading●WIDGET — A write-up traces an iOS widget that renders black only in production builds●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Expo SDK 58 is out of beta as of 10/15 (beta since 09/15). Check your dependencies before upgrading●WIDGET — A write-up traces an iOS widget that renders black only in production builds●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…
Articles/Dev Tools
⬡ Dev Tools/2026-10-19Advanced

One Missing Tutorial Image Was Enough to Stop the Whole App from Launching. Moving Nice-to-Have Features Off the Required Startup Path

On some devices the app never launched at all. The cause was a design where a missing tutorial image failed the whole screen build. A small wrapper that takes optional features off the startup path, and a pre-release check.

Expo222Startup4Error Handling9Design7Onboarding9

✦ Premium Article

Reports came in that the app never launched on some devices. On my own device it started normally, every time.

When that happens, the instinct is to hunt on the device side: the model, the OS version, the memory. This time the cause was in my own design. I had written the tutorial images directly into the screen definition. On a device where one of those images was missing, the tutorial did not simply fail to appear. The code that builds the screen itself failed.

Never put something that is nice to have on the same road as something the app cannot live without. That is the one line I took away from this incident in a wallpaper app. This note redraws that line for an Expo project, with code I actually ran.

The symptom was "never starts", not "crashes"

What made it hard was how little there was to follow. The app did not crash after launch; the first screen was never assembled. A bug that appears mid-use can be traced through what the person was doing. Here, all that reached me was a single phrase: "it won't open".

The reason it never reproduced on my device is obvious in hindsight: my device had the image. It did not reproduce because my device met the condition, not because the code was correct. Had I drawn that distinction first, I would have saved a good deal of time spent on models and OS versions.

Stating the cause in one sentence

A required step, building the screen, depended on something that was not required, a tutorial image.

At launch an app does many things. Some of them are things the app cannot exist without; others can fail while the app itself keeps working. At the time I had lined them all up on one road without telling them apart.

What happens during launchIf it is missingHow to treat it
Build the skeleton of the first screenNothing can be shownRequired. A failure is a failure
Read settings and saved stateThe app can run on defaultsFall back to defaults
Tutorial (text and images)The app is usable without itOptional. Never take the app down with it
Prepare adsThe app is usable without themOptional. Never make the app wait
Initialize analyticsOnly recording is lostOptional. Do not discard the failure silently

Writing this table made me a little embarrassed. Filling in the right-hand column is enough to show where the fix belongs. Before writing it, I had thought of the tutorial as part of the app, not as something separate from the conditions the app needs in order to run.

✦

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
✦You can now list everything on your app's startup path that should be optional, and find, before shipping, the places where one missing piece stops the whole app
✦You can now drop a small function into your Expo project that runs an optional feature so that neither its failure nor its slowness drags the app down with it
✦You can now reproduce a launch failure that never happens on your own device by deliberately removing the condition, and stop it from coming back with a single audit script
Secure payment via Stripe · Cancel anytime
✦

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

Related Articles

⬡ Dev Tools2026-10-15
When EXPO_PUBLIC_ Values Read Fine in Dev but Come Back undefined in Production: Telling the Spellings Apart
The API URL reads fine while developing and turns undefined once the app is built. The cause was how process.env was written. I lined up babel-preset-expo's output for dev and production and tabulated which spellings get replaced and which are left behind.
⬡ Dev Tools2026-10-14
My App Open Ad Only Showed When the App Came Back From Background. The 'Returned to Foreground' Signal Fired Before the Ad Had Loaded
On a cold start, the app open ad in my Android app never showed. The foreground signal came before the load began. Here is how I split the signal from the load and rebuilt it as logic you can test ordering by ordering.
⬡ Dev Tools2026-10-13
Before You Ship: Go Looking for Your Own Keys Inside the Exported Expo Bundle
A key can be missing from your source and still be sitting inside the finished app. I ran expo export on Expo SDK 57, searched the bundle with grep and a short Node script, and recorded which secrets show up and which don't.