Create GUI apps with Wails + Elm!
- setup a golang toolchain
- setup a wails toolchain
- install elm-live globally:
npm install -g elm-live
Run the following command:
wails init -n wails-hello-world -t https://github.com/benjamin-thomas/wails-elm-template
Inside the project folder, run: wails dev
. This setup provides auto-reloading of backend+frontend code.
It's also possible to keep the frontend reloading process separated by:
- deleting the
frontend:dev:watcher
entry in./wails.json
- then run
cd ./frontend && npm run dev:watch
in a separate terminal (this triggers the elm-live toolchain)
It's possible to debug and inspect javascript code at: http://localhost:34115.
This URL also allows the inspection of state change provided by elm's '--debug' compile flag.
To build a production binary, use wails build
.
I feel this stack could be a great combo for GUI programming. Elm's promise to eliminate runtime errors could turn out to be invaluable.
I evaluated other technologies, here's my list pros and cons while trying to build a hello world app on an old computer:
| Technology | Pros | Cons |
| ------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| JavaFX (with modules) | Easy cross platform development | Hard cross platform distribution (tooling is still a little rough) |
| | | Packaged app remains rather large (~30-90MB) |
| ------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| JavaFX (without modules) | Easier distribution if using Bellsoft/Liberica JDK | What are the security implications for the end user? |
| | | The distributed package is even larger (~150MB) |
| ------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| JavaFX | Interesting ecosystem for building business apps (see: ControlsFX,etc.) | Slow app startup (2s) |
| ------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| JavaFX | Potentially tiny binaries if distributes as .jar | The end user needs an SDK, that's a pretty heavy requirement (+ becomes a security concern to manage) |
| ------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| JavaFX | Can achieve a rather native look. | Task manager reports a javaw.exe binary, not my-app.exe. |
| | | I could not find how to circumvent this although I'm pretty sure it's doable |
| ------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| Electron | Easy dev setup, easy distribution with extra packages | Distributed package remains quite large (~70-120MB) |
| ------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| Electron | I saw a small memory footprint in my simple test (has there been improvements here?) | Memory usage is said to be a problem, memory leaks could easy to introduce and hard to find/debug |
| ------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| Electron | Very slow app startup (4s) | Microsoft documented the high memory usage of Microsoft Teams for their users (ouch!). |
| | | Then announced moving off Electron for this reason. |
| ------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| Flutter (Dart) | Cross-device development (mobile+desktop) by Google. Fast startup and dev hot-reload (< 1s). | Apps look pretty tied up to Google's material design. Some community projects like `fluent_ui` try |
| | Binary bundle could downsized if zipped from ~20MB | to address this but are still at an early stage. |
| ------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| .Net MAUI (C#, F#, VB) | Multi-platform App UI by Microsoft: almost cross-platform (cross-device) dev. | No Linux support :( |
| | | Seems to require a Windows dev machine (no dotnet core support) |
| ------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| Avalonia (C#, F#, VB) | Community driven cross-device development | Binary size remains fairly large. Incorporates DLLs that got wrongly tagged as viruses by AV companies, etc. |
| ------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| Tauri (Rust based) | Very similar to Wails. | Rust compile times make hot-reload so slow (30-40s!) |
| ------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| Wails + Elm | Fast startup (1s), very fast auto-reload (instant), small binary (4MB), small memory footprint. | v2 of the project is a little early, but the project has been around for many years. |
| | The architecture and final output feel much simpler than the other solutions. | |
| ------------------------ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
If you feel I got things wrong, or want to add to this list, don't hesitate to open a PR!
Go one level above this project. Then run these two commands and ensure hot-reload works.
rm -r ./wails-elm-test;wails init -n wails-elm-test -t ./wails-elm-template/
cd ./wails-elm-test/ && code . && wails dev