RORK LABJP
IOS27 — iOS 27 and iPadOS 27 ship on September 14, three days out. The ground always shifts under app builders in the days right after a releaseWAIT — Standard Rork waits on Expo and React Native to catch up. Rork Max can follow as soon as Xcode and the SDK are ready. Different kinds of waitingFOLD — The folding iPhone Duo starts at $1,999. A new screen shape is the first place a generated layout tends to come apartSTACK — Standard Rork emits React Native through Expo; Rork Max emits native Swift. A great many write-ups still conflate the twoPRICE — Standard tiers run Free, Junior at $25, Middle at $50 and Senior at $100. Rork Max spans $200 to $1,800 a month depending on tierSOURCE — Funding figures differ across secondary coverage right now. If you cannot verify a number at the source, leave it outIOS27 — iOS 27 and iPadOS 27 ship on September 14, three days out. The ground always shifts under app builders in the days right after a releaseWAIT — Standard Rork waits on Expo and React Native to catch up. Rork Max can follow as soon as Xcode and the SDK are ready. Different kinds of waitingFOLD — The folding iPhone Duo starts at $1,999. A new screen shape is the first place a generated layout tends to come apartSTACK — Standard Rork emits React Native through Expo; Rork Max emits native Swift. A great many write-ups still conflate the twoPRICE — Standard tiers run Free, Junior at $25, Middle at $50 and Senior at $100. Rork Max spans $200 to $1,800 a month depending on tierSOURCE — Funding figures differ across secondary coverage right now. If you cannot verify a number at the source, leave it out
Articles/Dev Tools
Dev Tools/2026-07-28Advanced

Counting what prebuild --clean will erase before you upgrade to Expo SDK 57

A raw diff between two generated ios/ trees showed 649 changed lines; only 3 were real edits. How to count what prebuild --clean erases, and move it into a config plugin.

Rork559Expo205prebuild2config plugin6Expo SDK 575upgradesnative codeReact Native237

Premium Article

Expo SDK 57 shipped with React Native 0.86, and the release notes describe it as a non-breaking step up from 0.85. Following along should be cheap.

Still, before running expo prebuild --clean on one of the Rork-generated apps I maintain as an indie developer, I wanted an answer to a smaller question.

How many hand edits are actually sitting in ios/?

Rork gives you a project you own. You open the generated ios/ in Xcode, add a linker flag, drop one SDK initialization line into AppDelegate. Those edits feel trivial at the time. Three months later you have forgotten every one of them, and --clean removes them without comment.

So I built something that counts only the edits that would disappear. The numbers it produced were not what I expected.

A big diff tells you nothing about risk

I built a fixture that imitates two consecutive prebuild outputs for the same ios/ tree: 320 source entries, a 331-line project.pbxproj. The baseline is untouched generator output. The current copy carries three edits of the kind you actually make.

LocationEdit
MyApp/AppDelegate.mmOne inserted line: [FIRApp configure];
MyApp/Info.plistAdded NSCameraUsageDescription
MyApp.xcodeproj/project.pbxprojAdded OTHER_LDFLAGS = "-ObjC"

Three meaningful lines. Here is what a plain diff reports:

$ diff -rq ./baseline ./current | wc -l
6

$ diff -r ./baseline ./current | grep -c '^[<>]'
653

$ wc -l < ./baseline/MyApp.xcodeproj/project.pbxproj
331

$ diff ./baseline/.../project.pbxproj ./current/.../project.pbxproj | grep -c '^[<>]'
641

A 331-line file producing 641 changed lines. Practically every line on both sides is reported as different.

The cause is the pbxproj object ID. Xcode identifies every object in a project file with a 24-digit hex token, and those tokens are regenerated wholesale on every prebuild. Nothing about the content changed; every line still reads as new.

Which means diff volume carries no signal at all about risk. Three lines worth protecting are sitting somewhere inside 653 lines of churn — restricted to the files actually worth scanning, 3 meaningful lines out of 649, or 0.46%. If you do not know that ratio before running --clean, you will not notice when those three lines are gone.

What to skip, and what to normalize

Narrowing the scope happens in two stages.

Never look at these — directories where a diff has nothing to say:

  • Pods/ — output of pod install. The information worth keeping lives in Podfile
  • build/, DerivedData/, .gradle/, app/build/ — build intermediates
  • xcuserdata/ — Xcode UI state, different for every person who opens the project

Look, but flatten the churn — expressions that change without meaning anything:

RuleMatchesReplaced with
pbxproj object ID24-digit hex tokens<OBJID>
CocoaPods checksum40-digit hex tokens<SHA1>
Generation timestampISO 8601 datetimes<TIME>
Absolute paths/Users/…, /home/…<PATH>

The absolute path rule earns its place the moment you move machines or share the work. A CI container and a local Mac have different home directories, and that alone marks every generated xcconfig as changed.

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
Of 649 changed lines between two generated ios/ trees, exactly 3 were real hand edits. An ablation run shows which single normalization rule removes 643 of the false positives
A complete script that counts only the edits a regeneration would destroy and exits 1 when any exist. It runs in 0.04s on a 320-source tree, so it drops straight into CI as an upgrade gate
The full config plugin that takes those counted edits and makes them survive prebuild --clean, including verified idempotency and why a missing anchor should abort rather than warn
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 $15 for lifetime access
View Membership →

Related Articles

Dev Tools2026-08-14
Find the native edits expo prebuild will erase before you upgrade to SDK 57
Expo SDK 57 makes expo prebuild clear and regenerate ios and android by default. Here is how to audit your hand edits first, move them into config plugins, and why 57.0.9 matters for Reanimated apps.
Dev Tools2026-07-30
What Renovate may bump in an Expo app, and what it must never touch
Turning on automated dependency updates in a Rork-generated app also hands Renovate the 123 packages Expo SDK 57 pins. Measured on 2026-07-30, six of them sit a full major version behind npm latest. Here is how to generate the ignore list from the SDK instead of maintaining it by hand.
Dev Tools2026-05-30
Managing Native Settings Across Rork-Exported Apps with a Custom Expo Config Plugin
Tired of re-typing your AdMob ID and ATT string every time prebuild wipes your Info.plist? Here is how I made native settings reproducible with a custom Expo config plugin and shared it across six wallpaper apps.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links