RORK LABJP
SWIFTUI — New Rork projects are no longer Expo. iPhone is Swift and SwiftUI, Android is Kotlin and Jetpack Compose, Web is React. Existing Expo projects still build and shipEXPO GO — On iOS, Expo Go now needs the same account signed in on both the terminal and the app before a QR code will launch anything. Android and development builds are unaffectedNOV 1 — Forty-eight days until the extension deadline for Google Play's target API 36 requirement. After November 2, non-compliant apps stop reaching new devicesSIGSEGV — Expo Go dies silently on some Samsung devices while expo-doctor reports a clean 20 out of 20. When every check is green, the adb log is where to look nextNEW — Is that API key sitting inside your app? When to use Rork environment variables and when to reach for a Supabase Edge FunctionCREDITS — How far does it go, the promise that AI-side errors do not cost credits? Log what a day of asking for the same fix three times actually consumes, and the line starts to showSWIFTUI — New Rork projects are no longer Expo. iPhone is Swift and SwiftUI, Android is Kotlin and Jetpack Compose, Web is React. Existing Expo projects still build and shipEXPO GO — On iOS, Expo Go now needs the same account signed in on both the terminal and the app before a QR code will launch anything. Android and development builds are unaffectedNOV 1 — Forty-eight days until the extension deadline for Google Play's target API 36 requirement. After November 2, non-compliant apps stop reaching new devicesSIGSEGV — Expo Go dies silently on some Samsung devices while expo-doctor reports a clean 20 out of 20. When every check is green, the adb log is where to look nextNEW — Is that API key sitting inside your app? When to use Rork environment variables and when to reach for a Supabase Edge FunctionCREDITS — How far does it go, the promise that AI-side errors do not cost credits? Log what a day of asking for the same fix three times actually consumes, and the line starts to show
Articles/Dev Tools
Dev Tools/2026-06-13Advanced

Keeping a Rork-Built Expo App Ready for Kotlin Migration — Design Notes After Android Studio's Migration Agent Announcement

Android Studio's new agent can migrate React Native apps to native Kotlin. Here is how I restructured a Rork-built Expo app to stay migration-ready: a native dependency audit script, a portable core layer pattern, and a readiness checklist.

Rork563Expo207React Native238Kotlin3Android StudioMigration Strategy

Premium Article

Among the announcements at Google I/O 2026, the one that made me stop and reread was Android Studio's migration agent: a preview feature that analyzes React Native, iOS, or web codebases and rebuilds them as native Kotlin Android apps. My first thought wasn't "should I migrate now?" It was a quieter question — is the Expo app I'm running even structured in a way that could be migrated?

This matters directly to Rork users, because Rork generates Expo (React Native) apps. The announcement effectively adds a new long-term option to every Rork project: automated migration to native Kotlin. But whether automated migration works in practice depends less on how clever the agent is and more on how "movable" your source code happens to be. As an indie developer running both an Expo-based app and native Android apps side by side, I used this announcement as a prompt to re-examine my own code structure. These are my notes.

What the migration agent actually does

First, the facts as announced. According to Google's developer blog, the Android Studio migration agent (in preview) works like this:

  • It analyzes an existing React Native, iOS, or web codebase
  • It maps out the screens, business logic, and data flow
  • It rebuilds the app as a native Kotlin + Jetpack Compose Android project

The important word is agent, not converter. This is not line-by-line transpilation. An AI reads the intent of your code and rewrites it. Which means output quality depends on how legible the intent of your input code is. Code whose intent is smeared across UI handlers and effects is hard to read for humans — and just as hard for an agent.

It's also worth stressing that this is a preview feature whose behavior may change. So this article is not about how to operate the agent. It's about how to write code that won't embarrass you whenever the agent arrives in stable form.

Why I decided not to migrate yet

My conclusion up front: I'm not migrating my production Expo app for now. Three reasons.

First, giving up OTA updates is expensive. With Expo's EAS Update, JavaScript-layer fixes ship without store review. Being able to push a copy fix or a logic patch the same day matters more in solo development than it sounds. The moment you go native Kotlin, every fix waits in the review queue.

Second, your codebase splits in two. The migration agent only takes care of Android. If you keep an iOS version, you now maintain a React Native app (for iOS) and a Kotlin app (for Android) in parallel. Migrate casually and every future feature costs you twice.

Third, migration just moved to the "available whenever" column. With an agent in the picture, the cost of migrating will keep falling. Unless there's a pressing reason to move, waiting improves your terms.

The cases where migration does make sense are apps whose revenue depends on deep Android-specific integration — widgets, unusual background work, day-one support for new OS features. Notice that this is structurally the same decision as moving up to Rork Max on the Apple side. The rule I described in When Should a Rork App Move Up to Rork Max? Deciding With Store Data, Not Aspiration — only move when real store data justifies the migration cost — applies to Kotlin migration unchanged.

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 run a ready-to-use Node.js script that audits the native dependencies of your Rork-built Expo app in minutes
You'll learn a core-layer separation pattern, shown in working TypeScript, that survives a move to Kotlin or to Rork Max equally well
You'll be able to decide whether to migrate now or wait based on your own app's numbers, using a concrete readiness checklist
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-09-04
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.
Dev Tools2026-08-22
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.
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.
📚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