After three apps, we hit the wall. Here’s what broke, what we tried, and where we landed.
React Native was the right call for the first app. It was the wrong call for the third.
What broke
The bridge. Specifically: every time we tried to do something the framework didn’t expect us to do — a custom camera pipeline, a watchOS extension, hardware-keyboard support — we ended up writing native code anyway, and then duct-taping it to a JS layer.
Where we landed
Native, on both platforms. Swift on iOS, Kotlin on Android. We share less code now and ship faster. The shared-code argument turned out to be a shared-bug argument.