Native mobile app development
Once the decision has been made to build a native app, we historically avoided cross-platform technologies that emphasize code reuse over user experience and web technologies over native frameworks. We quickly adopted Swift for our iOS apps, and on Android we did the same with Kotlin.
However, for several years now we've been working with React Native, a framework that allows us to build apps that follow the patterns of React in a way that bridges to native UI elements, all using JavaScript.
We've found that it makes difficult things easy (like complex UI implementations), but also some things quite difficult (like localization and adaptive layouts that at the time of writing aren't supported so well).
We're excited about the approach it takes to "learning once, writing anywhere" as this has allowed us to share common, custom components (a user profile view, for example) between both iOS and Android. We've also been able to reuse skills we've learned elsewhere (JavaScript and React), which has also enabled more designers and developers at thoughtbot to be involved in mobile development. This enables our teams working on mobile applications to be smaller, faster, and more flexible.
As a result, we find that React Native is the right choice for most companies building the first version of their mobile app today. It strikes the right balance of quality user experience, performance, and total cost of ownership for most companies and applications.
Some teams have existing iOS and Android specific codebases and expertise, or may have product specific needs not suited to React Native. In those cases, Swift and Kotlin are likely a better choice.