◉RORK LABJP
●EXPO — EAS Observe now records native crashes (Oct 7). On SDK 57, update to 57.0.21 or later●RORK — GPT-6.1 Sol (Sep 29) and Claude Sonnet 5.5 (Sep 28) are now in the model menu●RN 0.88 — React Native 0.88.x is scheduled for Oct 12, 2 days left●Q&A — People keep asking why AuthSession returns no result in Android standalone builds●WINDOWS — A walkthrough shows how to ship an iPhone app from Windows only, with no Mac●NEW — When only notifications fail in Expo Go: three checks to run first●EXPO — EAS Observe now records native crashes (Oct 7). On SDK 57, update to 57.0.21 or later●RORK — GPT-6.1 Sol (Sep 29) and Claude Sonnet 5.5 (Sep 28) are now in the model menu●RN 0.88 — React Native 0.88.x is scheduled for Oct 12, 2 days left●Q&A — People keep asking why AuthSession returns no result in Android standalone builds●WINDOWS — A walkthrough shows how to ship an iPhone app from Windows only, with no Mac●NEW — When only notifications fail in Expo Go: three checks to run first
Articles/Getting Started
◈ Getting Started/2026-09-14Intermediate

Rork No Longer Creates New Expo Projects: Keep Yours, or Rebuild It in SwiftUI?

You can no longer start an Expo project in Rork, but existing ones keep building and shipping. Here is how to decide whether to stay on Expo or rebuild in SwiftUI, and what quietly goes missing when you rebuild.

Rork577Expo213React Native238SwiftUI66Kotlin4Migration

I opened Rork's Expo documentation page and the yellow warning box reached me before the prose did. You can no longer create Expo (React Native) projects in Rork. New apps are native iPhone in Swift, native Android in Kotlin, or web in React.

The sentence right after it was the one that mattered more. If you already have an Expo project, it keeps working — you can build it, publish it, and export it to GitHub exactly as before.

So this is not a story about something breaking. The door to starting one closed; the ones already running keep running. That makes the decision harder, not easier. You are being asked whether to rebuild something that is not broken.

I run my own apps as an indie developer, and this is the kind of choice where my hands stop moving. So let me lay out what actually changed, what did not, and how to decide on your own terms.

What changed, and what did not

The primary source is Rork's own page, "What happened to Expo?" New iPhone apps are Swift, new Android apps are Kotlin, and new web apps are React. The stated reason is direct: on Rork's internal benchmarks, the agent wrote better Swift apps than React Native apps.

The same page also notes that Expo is still a real native stack and that plenty of production apps ship that way. It is not written as a dismissal of Expo.

ItemCurrent status
Creating a new Expo projectNot available
Building an existing Expo projectWorks as before
Publishing an existing Expo projectWorks as before
Exporting to GitHubWorks as before
New iPhone appSwift (SwiftUI)
New Android appKotlin
New web appReact

One honest caveat. The documentation carries no date for when this switch happened. Rork's docs are published without dates in the body, so I have nothing solid to point at for "since when." I am describing the current state only, not a timeline.

Rebuilding changes the shape of the project itself

The docs recommend moving an existing Expo project to Swift. Next to the preview there is an Add iOS app button. Press it and the agent recreates your screens, navigation, data flows, and design as a native iPhone app in SwiftUI. For Android, you use the + menu above the preview and pick Kotlin.

The part I found reassuring: your Expo app is not deleted. It stays in the same project, so you can hold the two side by side.

After a rebuild, the project looks like this:

  • Two codebases. Swift for iPhone, Kotlin for Android. Not one shared file.
  • One hosted backend. With Rork Cloud or Supabase, both apps talk to the same database.
  • One chat, one context. "Add dark mode to both" reaches each app.
  • One place to publish. App Store, Google Play, and web from the same Publish menu.

Then the docs say something I did not expect them to admit: the two apps can drift. A Swift change is not the same file as a Kotlin change, and the agent is what keeps them in sync. That is genuinely different from one shared React Native codebase.

I appreciated that they wrote it down. It is also, for me, where the decision actually lives.

When I was maintaining iOS and Android side by side on my own wallpaper app, I once fixed a piece of copy on one platform and not the other, and I did not notice for a long while. A missing feature announces itself. A drifted string, a different margin, a reordered list — those only surface when you open both at once. Drift does not crash, so nothing tells you about it.

Four questions that decide it

This is not a question of which stack is better. For me it came down to four things.

QuestionLeans toward stayingLeans toward rebuilding
Do you ship Android too?Yes, or you plan toiPhone only for now
Can you pause shipping?Review or launch dates are stacked upThere is room before the next update
Do you need widgets, Live Activities, or sensors?Not for a whileNow, or soon
Do you read and edit the code yourself?Yes, you export and work in itMostly you leave it to the agent

On the third row: Rork's comparison page describes Swift as the path to home screen widgets, Live Activities, advanced motion and body tracking, AR, better game performance, and finer sensor access. If you have business in that territory, rebuilding is a shortcut rather than a detour.

If instead you ship Android in parallel and work in the code yourself, the cost of carrying two codebases arrives first. I wrote about a related decision — whether you need Rork Max at all — in Whether You Need Rork Max Is Answered by Your Permissions, Not the Price Page. The reasoning here follows the same shape.

Inventory your screens before you rebuild

Even if you decide to rebuild, do one thing before pressing the button: get a list of your current screens into your own hands.

The agent will recreate them. But deciding whether it succeeded is your job, and judging requires something to compare against.

In the exported Expo project:

# Write out the list of screens (routes) in the Expo project.
# Capture this before you press rebuild — it becomes your comparison sheet.
cd path/to/exported-expo-project
 
find app -name '*.tsx' -not -name '_*' \
  | sed 's|^app/||; s|\.tsx$||; s|/index$||' \
  | sort > screens.txt
 
wc -l screens.txt

Expected output is a single line:

14 screens.txt

Screen names alone are not enough, so take one more step.

# Turn each route into a row with the four states worth checking.
# Columns: normal / empty / network failure / permission denied
while read -r r; do
  printf '%s\t-\t-\t-\t-\n' "$r"
done < screens.txt > rebuild_checklist.tsv
 
head -3 rebuild_checklist.tsv

Which gives you:

(tabs)/home	-	-	-	-
(tabs)/settings	-	-	-	-
detail/[id]	-	-	-	-

Here is why the four states matter. What goes missing in a rebuild is rarely a screen. Screens are loud; you notice an absent one immediately. What goes missing lives between the screens.

When I rebuilt my own wallpaper app, the thing I missed longest was the offline state. The list rendered. Detail views opened. But with no connection, the screen simply said nothing at all, and I found that out much later than I would like to admit. A bug you can watch happen is easier to catch than a bug where nothing happens.

With this sheet, you can fill in cells one at a time while the rebuilt app is open. Until all four columns are filled, I treat the move as unfinished.

Either way, get it onto GitHub first

Whichever way you go, there is one step worth doing up front: export the current Expo code to GitHub and mark it.

# Mark the state you can come back to, before any rebuild.
git tag expo-before-swiftui-rebuild
git push origin expo-before-swiftui-rebuild
 
# Confirm the tag landed.
git tag --list 'expo-*'

Output:

expo-before-swiftui-rebuild

The tag is less about rolling back and more about having something to compare with. When you are staring at the SwiftUI version wondering "was it always like this?", one reliable place to open the old code shortens the wondering considerably.

If this is the first time the exported code goes into git, write the .gitignore before you run git init — I collected that order of operations in Write .gitignore Before You Run git init on an Exported Rork Project. For what happens after the move, from SwiftUI build through delivery, Native iOS Apps with Rork Max: SwiftUI to TestFlight covers adjacent ground.

How I would decide

If you have an Expo project, ship Android as well, and your next update is close, I would stay where I am for now. There is not yet enough reason to stop something that works.

If you ship iPhone only, you have business with widgets or Live Activities, and there is room before the next release, I lean toward rebuilding. Knowing the Expo version stays inside the same project turned out to be more reassuring than I expected. It is not a one-way door.

And whichever you choose, one thing gets decided first. Before deciding whether to move, decide what you will compare afterward. That order is the one I try hardest not to break on the days I am in a hurry.

Start by writing out the routes in your app directory and giving each one four columns. Whether to rebuild can wait until you have looked at that sheet.

Thank you for reading this far. I hope it gives you a concrete first move rather than one more thing to weigh.

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 →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

◈ Getting Started2026-09-08
Whether You Need Rork Max Is Answered by Your Permissions, Not the Price Page
When I cannot decide between standard Rork and Rork Max, I stop reading the price page. Instead I pull every OS capability my app actually asks for out of app.json and Info.plist, then sort them into what Expo covers, what a config plugin covers, and what truly needs native Swift.
◈ Getting Started2026-09-01
Starting with the EAS Observe free tier, and why Crashlytics stays installed
EAS Observe reached general availability on August 20. I looked into consolidating down to one monitoring service and found that native crashes are still out of scope. Here are the free-tier limits and the setup details that trip people up.
◈ Getting Started2026-08-29
Nine Expo patches shipped in thirty days. Which one is your app actually running?
A tilde in package.json does not mean you are on the newest patch. The file that decides what actually gets installed is package-lock.json. Here is what npm did when I ran the checks myself.
📚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