Written by hand with love and hate. Every keyboard key was pressed and 2 cups of coffee were consumed.

It's been over 10 years since React Native was released, and I've spent all of those years building applications with it. I've worked across MedTech and EdTech, built a CRM for lawyers, and developed an app for children with autism to help them communicate with their parents and loved ones.

I wouldn't say React Native is the best choice, but in 2015-2016 it was the only cross-platform framework that let you write truly native-feeling apps for both iOS and Android. Ionic was decent, but it was still essentially a web view with all the browser's limitations. For example, you had to use Hammer.js to eliminate the 300ms tap delay that exists for detecting double-clicks - a delay that significantly degraded mobile UX.

After 10 long years and countless projects, I dove into SwiftUI - and I'm thrilled. I don't think React Native will come close to this level of interface quality and user experience anytime soon.

Here's why:

UI: Apple Human Interface Guidelines out of the box

You no longer need to write custom libraries, test them endlessly, or devise clever hacks to achieve pixel-perfect layouts across countless devices including iPad. You simply enable support and your app works automatically. A huge number of problems vanish by default. You get 100% native components that users already know how to use - date pickers, selectors, everything. Your users get a familiar experience that doesn't disrupt their journey with unfamiliar patterns.

RN Third-party dependencies: a pain in the ass

This is a massive pain point, especially during architecture migrations. I'm exhausted by an ecosystem where you install a package through npm, it might auto-link (or might not), forcing you to manually patch your Podfile. You can't access platform features out of the box. You need to clear multiple caches just to get things working. And even when it works, you might discover the library maintainer hasn't added support for the new architecture - now you're stuck maintaining both Bridge and Turbo Modules simultaneously. That's when dependency hell begins, with system APIs that may or may not work at the library maintainer's discretion. If they don't need those APIs, you'll have to patch the package yourself, hope your PR gets accepted, or fork and maintain it indefinitely.

Build tools: slow, expensive, bad

After 5 years in production, your node_modules folder balloons past 1GB. Popular CI/CD services automatically disable caching, forcing you to run full installs every time. A build that once took 20 minutes on Bitrise now takes 40. You didn't change anything - you just stayed current with the ecosystem. Most of that time is spent compiling C++ libraries bundled with the framework. You simply upgraded from React Native 0.70 to 0.80+, and now your QA team waits 40 minutes to test a bugfix that took you 15 minutes to write.

Delivery: RN apps start weighing 100+ MB

And that's not the limit. I've seen React Native apps balloon to 500MB. Five hundred megabytes! There's nothing worth 500MB in there - just layers upon layers of abstractions. Your actual code? Maybe 5MB at most. Our team wrote 2MB of application code for iOS and Android, yet the final app weighs 38MB. This is unacceptably large and directly impacts conversion, especially once you cross 200MB. At that point, Apple shows a warning asking users if they want to download via cellular because the size is "very large." That's another friction point in your funnel. You've captured their attention, maybe even paid for ads to get them to your App Store page - but they see that size warning and bounce. You've already paid for that click.