Why Web Technologies Still Win
for Cross-Platform GUI Development
Graphical user interfaces are the most obvious link in human-machine interaction. An absolutely fascinating topic, because the same functionality is subjectively perceived as good or bad precisely through them. An enormously important part of the user experience. Probably so important that even poor functionality can hide behind a brilliant interface.
The Importance and My Perspective on GUIs
Graphical user interfaces are so important to me that I continuously follow developments in this field. The topic of cross-platform is particularly exciting for me. In my perception, the Apple ecosystem is actually very spoiled in this regard. While there was a switch from Objective-C to Swift, and the development of capabilities never stops, the environment itself always seemed very homogeneous to me. This definitely doesn’t apply to Windows or Linux. Over the years, a single “standard” way to build applications hasn’t really been established.
The Ideal: Native, But Reality Demands More
At heart, I am convinced that GUIs should ideally be completely native. Whether for desktop or mobile. However, installed applications have long been insufficient, which is why a web application usually joins the ranks. We don’t need to ponder whether this is sustainable if you want to be present on all these platforms. It won’t come as a surprise: for me, the ideal solution for cross-platform GUIs remains web technologies. But let’s see what I’ve been looking into this time.
Cross-Platform Landscape: Flutter & React Native
When talking about cross-platform applications today, you can’t avoid Flutter. Especially for mobile applications. Currently, it has clearly established itself as the leading framework for mobile apps. And the simplicity of building apps for both iOS and Android with it is obvious. In the desktop realm, it’s quieter. Ubuntu has been using it for a while. With RustDesk, you can also find a few other applications that have decided on Flutter. Flutter isn’t standing still for the web either. However, in my opinion, nothing but web-native tools belongs there. Therefore, I don’t even look at such alternatives for this purpose.
But React Native is also still on everyone’s lips and constantly evolving. Microsoft once adopted it to also support native desktop applications. One of the latest improvements for mobile development is the New Architecture, which has largely replaced the cumbersome bridge. Apparently, the JS runtime can now directly address objects from the native world, in the original memory space. And as long as things aren’t quieting down around React, they certainly won’t around React Native either.
The Kotlin Multiplatform (KMP) Contender
KMP from JetBrains is very exciting. Essentially, it’s a variant from the Android world that supports building applications—based on Kotlin—for all platforms. Currently, I’m mainly familiar with the JetBrains Toolbox, which is built on it. But overall a fascinating topic, as both Kotlin and Compose offer powerful capabilities—and adoption continues to grow.
My Conclusion: Web Technologies as the Core
As important as native applications are to me, a web application will always be the most important thing for me. Because in the end, it simply hasn’t been necessary for a long time to have to install an application natively first. Nowadays, you practically need a dedicated app for everything anyway, so the thought of being able to work independently of installed applications in the future is refreshing. Native applications are always a supplement for me, which is why I stick with web technologies for GUIs.
Practical Paths: PWAs and Modern Desktop Frameworks
For mobile, I would fully rely on PWAs, especially because the potential limitations imposed by the various app stores are obvious there. And if it should be an installed application on the desktop, there have long been more possibilities than just Electron.
Now very well-known, with a Rust foundation: Tauri. For everyone from the Go ecosystem, Wails provides the right solution. And what I discovered only recently is Saucer, for when C++ is also an option. All tools to elegantly package web views with various backends for web-based applications and integrate them into the host system.
Further Exploration
- Flutter: The official framework for building natively compiled applications for mobile, web, and desktop from a single codebase.
- React Native: A framework for building native applications using React. Learn about its New Architecture.
- Kotlin Multiplatform (KMP): JetBrains’ technology for sharing code between mobile, web, desktop, and server-side applications.
- Progressive Web Apps (PWAs): Web applications that use modern web capabilities to deliver an app-like experience.
- Tauri: A framework for building lightweight, secure desktop applications with any frontend framework and a Rust core.
- Wails: A framework for building desktop applications using Go and web technologies.
- Saucer: A lightweight framework for embedding web-based user interfaces in C++ applications.