◉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)●SONNET 4.5 — Retires on the Claude API on 11/30, 27 days left. If your app calls it, check the migration target●SDK 58 — Moves to React Native 0.88. R8 is now on by default in Android release builds, and iOS prebuild generates a SceneDelegate●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)●SONNET 4.5 — Retires on the Claude API on 11/30, 27 days left. If your app calls it, check the migration target●SDK 58 — Moves to React Native 0.88. R8 is now on by default in Android release builds, and iOS prebuild generates a SceneDelegate●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…
⬡ Dev Tools

Dev Tools

React Native and Expo techniques, build-error and crash troubleshooting, and API integrations that help you take Rork-generated code to production quality.

2026-10-30Intermediate

It runs in development but the iOS Release build dies on launch — checking whether a missing scheme is the cause

In an expo-router app, an app.json with no scheme can crash only the iOS Release build at launch. Why Debug and Android survive, the two ways to fix it, how to think about leaving the scheme out on purpose, and a pre-submission check.

2026-10-29Intermediate

When DevTools Stays Silent in Expo Go on Android, Suspect the Runtime Before Your Code

In Expo Go on Android, React Native DevTools can open but never evaluate anything in the Console, and the Sources tab stays empty. Three quick checks to tell it apart from a bug in your own code, how to switch to a development build, and what to do if you can't.

2026-10-28Advanced

Users Told Me They Could Not Close a Fullscreen Ad. The Entry Points Were Scattered, So I Put the Show-or-Not Check and a Safety Net in One Place

An unclosable fullscreen ad came from calls that ignored foreground state, a clash with a permission dialog, and no safety net. A single entry-point component, tested in Node.

2026-10-27Beginner

Claude Sonnet 4.5 Leaves the API on November 30. Find the Model IDs Hard-Coded in Your App First

Claude Sonnet 4.5 is scheduled to retire from the API on November 30, 2026. A small script finds the model IDs written into your app's code and config, so you can replace them and check again.

2026-10-27Intermediate

Your EAS Update Opens in Expo Go on iPhone but Stops on Android with "Failed to download remote update". The 403 You Get Even When Signed In

An EAS Update that opens in Expo Go on iOS but stops on Android (SDK 57) with Failed to download remote update. The cause is a sign-in token saved in one place and read from another, and the fix sits on the SDK 58 side. The order to check things in, and what to run yourself.

2026-10-25Intermediate

Fullscreen Ads Stopped Showing After Going Back and Forth Between Screens — The Ad Holder Was Still Holding a Closed Screen

Fullscreen ads vanished after reopening a screen because a reused ad holder kept notifying a closed screen. A holder that swaps only its listener target, tested in Node.

2026-10-25Intermediate

Sound Effects Stop at Play #40 — With expo-audio's createAudioPlayer, remove() Alone Isn't Cleanup

Creating a createAudioPlayer instance per play in expo-audio can leave Android silent after about 40 plays, with didJustFinish never arriving. What remove() and release() each do, three ways to restructure, and how to notice when it happens.

2026-10-24Intermediate

The ANR Was Coming From Cleanup When a Screen Closed: Classifying the Blocking Line From Traces

A Python script that reads Android ANR traces and classifies the line that blocked the main thread, such as billing client teardown or synchronous image decoding. Two causes I found in my wallpaper apps, and the thinking behind the fixes.

2026-10-23Beginner

Failed to resolve plugin for module: Check the Spelling, the Install, the File, Then the Contents

You add one line to plugins in app.json and Expo stops with PluginError: Failed to resolve plugin for module. I reproduced the causes behind that one message in a blank Expo SDK 58 project and put them in the order I now check them, using a single command.

2026-10-22Intermediate

A Video Fails to Save with "Not Enough Space" — Check Whether the File Is Over 2GB Before Blaming Storage

On Android, a 2.2GB video won't save to the gallery and the error says "Not enough space", even with plenty of free storage. I read the public Expo issue and reproduced the same boundary on Linux. Here is a size check to add before saving, and the idea of copying in pieces.

2026-10-21Intermediate

A Widget That Updates on Time in iOS Stays on "Initial" in Android

In expo-widgets, updateTimeline does nothing on Android and the generated XML hardcodes updatePeriodMillis to 0. How to recognize it, what updateSnapshot can cover, and a script to check your project.

2026-10-20Advanced

Why Redeploying Doesn't Fix the Application Error You See Right After a Deploy

Right after I swapped a secret, every page showed Application error. Stale HTML was calling a JS file that no longer existed. Here are a detection script, a build-version check for the edge cache, and a once-only auto-reload, all run and verified.

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.

2026-10-18Beginner

Before asking Rork for Apple and Google sign-in, I went looking for steps that weren't mine to take

When you ask Rork for Google and Apple sign-in, is there anything left for you in Apple Developer or Google Cloud? What the official docs say about the split, plus a small check for accidentally mixing two auth models.

2026-10-15Beginner

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.

2026-10-14Advanced

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.

2026-10-13Intermediate

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.

2026-10-07Intermediate

Japanese Headings Won't Turn Bold on Android: How to Trace and Fix a fontWeight That Does Nothing

A troubleshooting note for Rork apps where headings look bold on iPhone but stay thin on Android. How to tell the symptoms apart, pick weights through fontFamily, and verify the fix.

2026-09-22Intermediate

Four Numbers to Record Before R8 Becomes the Default — Android Measurements While We Wait for Expo SDK 58

Expo SDK 58 turns on R8 by default for Android release builds. Here is how I capture four numbers — download size, DEX total, cold start, and build time — so the before and after can be compared with the same ruler.

2026-09-21Intermediate

A build that stops with exit code 0 — the flag that silenced the log, and the check that let an empty file through

Two reports landed in the same week: eas build --local stopping with exit code 0 but produced no further output, and a zero-byte stub that never got embedded. Both came down to settings that reduce output. Here is how to audit your own scripts.

2026-09-19Beginner

Reading only what Rork changed: the diff routine I run after every re-export

How to read a fresh Rork export as a diff against the last one: clear tracked files before you copy, strip the noise before you count, and stop once before the merge commit lands.

2026-09-10Intermediate

I Added a Dim Screen Button, and iPhones Stayed Dark After the App Was Closed

In expo-brightness, setBrightnessAsync applies only to the current activity on Android, but changes the device brightness itself on iOS. Here is why the cleanup burden falls on one platform only, and a hook that restores brightness through AppState.

2026-09-07Intermediate

Adding .easignore stops EAS from reading .gitignore — count what actually ships to the build

EAS Build decides what to upload from .gitignore, and the moment you add .easignore the two swap places. Here is how I count the bundled files before sending, plus a measured result: once a parent directory is excluded, an exclamation mark cannot bring a file back.

2026-09-06Intermediate

There is no --json on eas env:list, so I rebuilt my environment variable inventory

eas env:list does not accept a --json flag. Here is how I turn --format short output into safe JSON, and how I spot a missing variable across three environments in one line.

2026-09-05Advanced

Your Widget Extension Can Submit a BGTaskScheduler Request. It Just Cannot Register the Handler

Calling BGTaskScheduler from a widget extension compiles, submits, and returns true — and then nothing runs. Here is why registration belongs to the host app only, and how I moved refresh ownership back where it belongs across my wallpaper apps.

2026-09-04Advanced

EAS secret visibility does not keep a value out of your app — deciding prefix and visibility separately

The EXPO_PUBLIC_ prefix decides what ships inside your app; EAS visibility decides who can read it. Why stacking them blanks a value on OTA updates, and how to check your build.

2026-09-03Beginner

When a link opens the browser instead of your app, look at the signing key before assetlinks.json

Android App Links fail silently when the certificate fingerprint does not match. Here is the real keytool output, the upload key versus app signing key trap, and a small checker you can run before you deploy.

2026-09-02Intermediate

I counted how many versions expo install starts recommending after one patch bump

What expo install recommends is tied to the patch version of expo itself. I measured the ledger diff against the npm registry, how far npm install drifts, and the one check worth adding to a generated project.

2026-09-01Intermediate

Adding image paste with expo-paste-input, and moving the disappearing file:// URIs out of cache

How to let users paste images and GIFs into a chat input with expo-paste-input. The URIs that onPaste hands you are temporary files that can vanish before the user hits send. Here is the relocation code and the order I verify it on real devices.

2026-08-31Intermediate

Three Minutes After the Screen Locked, My expo-audio Ambient Sound Went Silent

Why expo-audio stops playing when the screen locks, diagnosed as three separate layers: build config, audio session, and lock screen integration. The three-minute stop on Android is documented behavior.

2026-08-29Advanced

The Remote Config keys you add after your release path closes are invisible to the build already on devices

A record of recounting what I can still change remotely before my release path closes. A key you add in the console does nothing unless a build that reads it is already on devices. Which switches to ship in the last build, and a shared-defaults bug I measured.

2026-08-27Intermediate

Count your worklets before you start deleting your own code

Hermes V1 attaches 512KB of debug metadata to every worklet, so simply importing Reanimated can add tens of megabytes. Here are the three numbers to count before blaming your own code, and how to choose between the four available fixes.

2026-08-24Intermediate

I Moved My Dark Mode Checks Into DevTools, and Only Four Places Still Need a Real Device

Expo SDK 57 added light and dark emulation to React Native DevTools, which ended my trips to the Settings app. What it swaps is the value JavaScript reports, so a few places still need a real toggle. Here is how to find that boundary in your own project.

2026-08-23Advanced

Predictive back on Android 16: what to fix before August 31, and what can wait

Targeting API 36 turns predictive back on by default and stops onBackPressed from firing. Here is how I split the work that the deadline actually requires from the work that does not, and how I kept the opt-out from disappearing on the next prebuild.

2026-08-22Advanced

Every bulk replace exited zero. The damage was in the lines I did not delete

Run a bulk replace over generated code and the breakage lands on the neighbouring lines, not the matched ones. Here is what broke in a live project, and a dependency-free guard that checks the invariants a replace must preserve.

2026-08-21Intermediate

The four acceptance checks I still run after the build turns green

A successful build does not mean a shippable build. Here are the four failure classes an AI build loop cannot see, and a dependency-free script that inspects the artifact itself before you submit.

2026-08-20Intermediate

A beta-SDK build can reach TestFlight, but it can't reach review

Builds made with a beta Xcode can be distributed through TestFlight, but they cannot be submitted for App Store review. Here is how to check which SDK produced your build, and how to protect your release profile in eas.json.

2026-08-19Intermediate

Three conditions that make Play Policy Insights report nothing on an Expo project

Google Play now ships an open-source policy auditing skill. Running it against an Expo-shaped project, one directory argument moved the result from five detected data categories to zero. Here is when the scan actually reaches your code, and where its output should not be trusted.

2026-08-18Intermediate

Version code 1 has already been used — who owns that number, app.json or EAS?

When a Play upload stops on versionCode, check where the number actually lives before bumping it. A one-command way to tell whether app.json, EAS, or build.gradle wins.

2026-08-17Advanced

When an Expo UI drop-in swap actually removes a dependency

Expo UI went stable in SDK 56 with drop-in replacements for eight community packages. Swapping one import does not always shrink your dependency list. Here is how to decide which swaps actually pay off, straight from the dependency graph.

← All Articles