For a long time, cross-platform app development felt like choosing the least painful compromise.

You could maintain separate native apps for every platform and duplicate a lot of logic. Or you could use a cross-platform framework and accept its trade-offs: runtime overhead, abstraction leaks, slower access to new platform APIs, and an app that...