Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

I used to maintain Detox for iOS when I was at Wix, from 2017 to 2021. We ended up dropping support for Expo for plenty of reasons, some technical, some "political". The people reporting "issues" (more like asking questions) for their Expo apps, usually had very little technical understanding of any of the increasingly thick environment stack (the Expo layer, RN layer, UI framework layer, OS layer). They were basically web developers who were trying to emulate developing for the browser, with zero interest (and often, capacity) in learning any of the complexities of the aforementioned complex environment.

It was our experience the expo layer added a lot of complexity and many bugs, with very little ability of users to actually fix anything without "ejecting" their project away from that ecosystem. That was on top of the RN layer, which in itself was full of bugs. We would send users to report expo bugs to the expo team, and were first met by "just fix it on your end, you are detox!" type of comments from that silly community, and those that did report the issues, saw no reaction from the expo team, despite detox being one of the most popular testing frameworks in the RN world at the time (no idea about now, but back then, even Facebook was using detox to test RN itself).

At the end of the day, we decided the hassle was not worth the low quality user benefit, so we decided to drop support for Expo. It was one of the best bureaucratic decisions we ever made.



Modern Expo is very different and in 2023, Expo has full support for custom native code and isn't a layer, so to speak. Ejecting is gone. React Native has also become much thinner in several ways. For instance, developers write Kotlin and Swift with the Expo Modules API and uses JSI (RN's "JavaScript Interface") to directly bind the native methods to Hermes JS methods.

Relatedly, the developer demographic has grown and a lot more developers are adding Kotlin and Swift to their skill sets. They write JS and React most of the time while also writing custom native code when they need to. Most of the best Expo apps include custom native code.

Test frameworks have also grown a lot. I suspect the issues with Detox were often from developers looking to use it with the Expo Go starter app that doesn't support custom native code. These days I hear a lot of positive things about Maestro as well and there was a nice talk on it at App.js Conf earlier this year: https://www.youtube.com/watch?v=uoCzBdFCoqc


Hi James, thank you for this comment.

I'm glad to hear the tech and, more importantly, the community have improved.

By "layer", I mean custom controls and animation toolkits that get bundled in an Expo-enabled project. Those are in addition to the RN-provided ones. It all adds to complexity.


Expo Modules Core is the only module that is bundled in. It is a small runtime library that defines the Expo Modules API used by other modules, and adds about 150 KB to a production build of an app downloaded from the stores. A hello world iOS app made with Expo ended up being smaller than the same hello world app that used RN without Expo due to the Xcode settings.

There are also no custom UI controls or animation libraries bundled with Expo. The Expo Go starter app includes a preset SDK, and when developers create a build for the app stores or a development build of their own app, only the libraries they use are included.

IMO it would be a meaningful improvement for the react-native package to provide the minimal runtime needed, namely JSI, Hermes, Turbo Modules, Yoga, Fabric, and perhaps a few primitive view components like View, ScrollView, and Text. The package provides more than a library needs. Animations and gestures today are better served in my experience by modules outside of the react-native package, like Reanimated and Gesture Handler that use truly native gestures. React Navigation uses the system navigator UI and Expo Router adds file-based routing and universal links. Expo Image adds support for modern image formats like AVIF and WebP and uses mature, performant image libraries like Glide and SDWebImage. So there is definitely still work to be done that can improve quality and reduce complexity in RN.


I learned a while ago that is not worth using an abstraction layer over the official tooling (whatever Apple and Google provides you), even for small apps I was building one for each platform (as one dev).

Tried at the time Xamarin and PhoneGap, and bit later RN, each one has his quirks and things that works in one platform but not in other so in the end you end up building one app for each platform more or less, but with more bugs than the official ones.


I’ve come to the same conclusion. I began to build a very simple app about a month ago and as a Web Dev figured React Native would be the best tool. Having completed about 60% of the app, I’m going to trash the whole thing and restart with Swift/Kotlin. I’ve encountered too many “quirks” that end up burning a huge amount of time for what should be an inconsequential component.


Using Swift UI, or UIKit, has its own quirks. And then you need to shift mental gears with entirely different UI component paradigms.

I find most people making this argument haven't worked full time with one or the other.

If you're a larger company who can afford two teams/groups, or if you are working on something lower level like OpenGL or ML, it makes sense.

Having done both for multiple years, I can't understand when people think it would be faster to build separate apps. It's not even remotely close. You're swapping out doing bug fixes, platform specifics like push notifications, the occasional separate UI implementation, and distribution twice with doing _everything_ twice.


You might want to check out CapacitorJS - https://capacitorjs.com/

It’s more web than RN and depending on what you’re doing might not feel as native, but it’s pretty easy to make a solid app with it.


For some bizarre reason I haven't figured out yet, it seems like the "cross platform" choice is always the worst one.

So when people talk about cross-platform on the Mac, for example, it's always some JavaScript abomination, or Java, or Delphi (yes, seriously), or Go.

How about going the other direction and getting Cocoa running somewhere else? GNUstep, Cocotron etc. Gosh, that would actually make sense, can't have that. Literally.

In fact, one company did. Apportable. Google bought them and buried the tech.

Hmm


It’s not perfect by any means, but SwiftUI is the most productive development stack I’ve ever used for GUIs.

There’s definitely a huge learning curve and some rough edges, but the speed with which I can write a polished UI in it is staggering.


On the flip side, Unity is massively successful, and basically every indie game developer who has found any success eventually ends up porting their game to it anyway, precisely because of the cross platform benefits.

The problem isn’t that middlewares are bad. They are great: Unity and Unreal, your browser, Java…

The problem is mobile apps don’t make money. Games and web services do. The OP is talking about low quality users. They’re broke! They’re not incentivized to fix their own problems either! It’s all just a blub for them. So middlewares improve for the audiences where they’re at least viable, and stagnate when they support something that no one should be bothering to do in the first place.


Game dev is a different beast and in most platforms the development/tools are the same or close enough, also when building a game you rely only in low level API (Vulkan, Metal, OpenGL, etc) from the main platform you are targeting. But when you are building an app then you use the hight level API, that means you don't need to deal with font rendering, etc. You could obviously build an app with Unity, but it will not feel native, also IIRC Unity is awful when you need to input text in your game (in iOS at least, not sure how's Android side), it appears a input element above your keyboard while when using the native UI the UX is different.


I've realized that I don't want an abstraction layer. I want a guardrail layer.

Previously, much of my draw to things like Expo has been the reduction in mental load for handling multiple different platforms. In theory, they're built by people who know the different "gotchas" and can help me avoid them.

In practice, something always requires you to dive into the underlying layers. At which point, you're just fighting with bug-filled abstractions.


As a solo dev simple apps are probably the only thing you can maintain two separate versions of? Complex LOB apps at businesses as a solo dev I could never imagine not using a cross platform toolkit of somekind. RN w/ expo is the best I have found out of all the cross platform kits by far.

If you have react experience I really suggest giving modern RN & expo a try.


> the increasingly thick environment stack (the Expo layer, RN layer, UI framework layer, OS layer).

This is at the core of my difficulty with cross-platform frameworks for Android and iOS. Dealing with the first-party stack presents enough problems on its own. Adding more layers to that easily compounds the frustration involved in getting anything done.


Expo was really lackluster when I last worked with react native around 2018/2019. I hear it has gotten much, much better now but I haven't tried lately


It has. I built an app using Expo several years ago and recently had to update it. Upgrading expo was a pain (as it always is) but the changes and additions in the latest version made so many things easier. And with custom clients, you can do a lot more now than you could before without ejecting.


It's the best way to build React Native apps, with very few exceptions, these days. (I have been building RN apps of all types since it came out in 2015.)


The limitation is not true nowadays. Expo works well with Detox and listed in Detox's showcase: https://wix.github.io/Detox/showcase


Activate my iPhone 5s for iOS


Sorry, only simulators supported ;-)




Consider applying for YC's Winter 2026 batch! Applications are open till Nov 10

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: