Cross-platform frameworks are dead. AI killed them.
Johannes Treitz ·
I shipped an iOS app written in Swift but I can't read Swift. Its Android sibling is in Kotlin, which I can't read either. How did I end up here?
Two years ago, before LLMs took over coding, I started to build Werkbook, an app for blue-collar workers to document their work on site. Nobody carries a laptop onto a roof, so it needed to run on phones and tablets but I have no knowledge of Swift or Kotlin. I experimented with various cross-platform frameworks and settled on Hotwire Native, a natural fit for a Ruby on Rails app.
Initial progress was great. Then the seams started to show. On some phones the app crashed when someone took too many photos and ran out of memory. In a basement, without a signal, the app was dead. Polishing meant working around its limitations. Despite the shared code, I still had platform-specific problems, like the app not opening from a link in an email, so I tested on each device anyway. It worked, but it was never going to be great, and no fun to work on.
I don't need a framework
At the end of August I tried something else. I gave the Rails app an API and asked Claude to build a native iOS app, using the web app as a blueprint. To my surprise it didn't just write Swift. It navigated the labyrinth of certificates, provisioning profiles, entitlements and permissions, and the app landed on my iPhone without me opening Xcode once. After four weeks the native app had replaced the wrapper: snappy, robust, polished, and for the first time fun to work on.
The Android app followed even quicker with the iOS app as a blueprint. I spent most of the time deciding where to keep the app's identity and where to follow Android's conventions.



But what about the code?
I can't read the generated code. I can follow the structure, but I couldn't tell you whether a Swift closure holds on to something it shouldn't. After 20 years of reading every line I ship, I was skeptical at first, like everybody else.
But my own code had bugs too, very likely more. The time I don't spend reading code goes into testing every change on real devices and tweaking the UX. And the agent writes far more tests than I would. Slowly, it earned my trust.
What I don't know yet is how this ages: whether the agents keep the code tidy, and how often a fix in one place breaks something elsewhere. When something crashes in Swift, I can't read the stack trace either. So I hand it to the agent and confirm the fix on the device, not in the diff.
How is this safe?
The apps don't decide anything that matters. The API is the security perimeter. Who sees which data, what a user may do, what counts as valid input: all of that lives in the Rails app, which I wrote. The mobile apps are untrusted clients by design.
A bug in the Swift code can draw a screen wrong. It can't show someone else's data, because the server never sends it.
Rest in peace, frameworks
PhoneGap/Cordova, Ionic, React Native: cross-platform frameworks have existed since 2008, when Android joined the iPhone and developers had to build every app twice. They all promise one thing: write your code once, run it everywhere. The price was always the same: an abstraction layer between you and the platform. That trade made sense when writing a native app twice cost twice as much. Now an agent writes most of it, and the lines of code these frameworks save no longer justify their limitations. Neither do over-the-air updates: many of my fixes, like configuration changes, needed a store release anyway, and app review recently became much faster.
Shopify, React Native's most prominent champion since 2020, came to the same conclusion: in September it announced that "native is now the future of mobile at Shopify", citing AI agents, and rebuilt the Shop app in Swift and Kotlin in twelve weeks. Coinbase seems to be next: a job posting describes a rewrite of its mobile app from React Native to native, "using AI-assisted code generation".
Why stop at phones?
Out of curiosity, I asked the agent for a native Mac app. Half a day later I had a rough but working app. I'm not shipping it yet. But if a native client is that cheap, web apps and the many desktop apps built on Electron start to look like the next abstraction layer to go. Ironically, Claude's own Mac app is one of them.