Web to Desktop framework comparison
This repository was made to create an objective comparison of multiple framework that grant us to "transform" our web app to desktop application formats.
Electron
NW.JS
Tauri
NodeGui
Neutralino
Flutter
.Net MAUI
Github stars
104k
39.2k
52k
8k
6.1k
145.6k
17.2k
Forks
13.9k
4k
1.3k
0.2k
0.3k
23.4k
1.1k
Creation date
2013
2011
2019
2019
2018
2018
2020
Last Update
2021
2021
2021
2021
2021
2021
2021
Framework Language
C++, JS, Objective-C, Python
C++
Rust
C++
C++
C, C++, Dart
C#
Usage Language - Back
JS, C++
JS, C++
Rust
JS, C++
JS, C++
Dart
C#
Usage Language - Front
HTML, CSS, JS
HTML, CSS, JS
HTML, CSS, JS
HTML, CSS, JS
HTML, CSS, JS
Dart
C#
License
MIT
MIT
MIT
MIT
MIT
BSD 3-Clause
MIT
Developer Dependencies
Node.js, Electron NPM Package
Node.js, NW.JS SDK
C++ Compiler, Node.js, Rustc, Cargo
Cmake, make, Node.js, NodeGUI NPM Package
Node.js, Neu NPM Package
Flutter SDK, Visual Studio 2019 / Clang
.Net SDK, Visual Studio (optional), WebView2 (optional), Xcode (optional)
User Dependencies
None
None
None
None
None
None
None
Dependencies / modules support
npm & node.js native addons
npm & node.js native addons
cargo
npm & node.js native addons
❌
pub.dev
NuGet
Engine
Chromium
Webkit, Chromium
WRY (WebKitGTK for Linux, WebKit for MacOS, Webview2 for Windows)
Qt
WebkitGTK+
Flutter engine
.NET MAUI
Operating systems support
Electron
NW.JS
Tauri
NodeGui
Neutralino
Flutter
.Net MAUI
Developement Environment
Windows
✔️
✔️
✔️
✔️
✔️
✔️
✔️
MacOS
✔️
✔️
✔️
✔️
✔️
✔️
✔️
Linux
✔️1
✔️
✔️
✔️
✔️
✔️
✔️
Target Environment
Windows
✔️
✔️
✔️
✔️
✔️
✔️
✔️
MacOS
✔️
✔️
✔️
✔️
✔️
✔️
✔️
Linux
✔️
✔️
✔️
✔️
✔️
✔️
Soon
Android
❌
Requested
Soon2
❌
❌
✔️
✔️
iOS
❌
❌
In progress2
❌
❌
✔️
✔️
tvOS
❌
❌
❌
❌
❌
❌
✔️
Web
❌
❌
❌
❌
✔️3
✔️
❌
1 : Linux 32 Bit support dropped
2 : https://github.com/tauri-apps/tauri#platforms
3 : Uses modes to generate web apps
See benchmarks.json to get more informations about following data.
Note: These benchmarks are done on Github CI, there are measures to have measurements more accurates (e.g. multiple runs), but it will never exactly be accurate, as it totally depends on system load and resources. You should read these tables as comparision between frameworks on a same OS/Arch/App with a margin of error.
See source in benchmark/01-empty-app folder.
Electron
NW.JS
Tauri
NodeGui
Neutralino
Flutter
.Net MAUI
Windows (x64)
≈226MB
≈317MB
≈3MB
≈171MB
≈2MB
?
?
Windows (x86)
≈202MB
≈288MB
?
?
?
?
?
Windows (ARM64)
≈226MB
Requested
?
?
?
?
?
MacOS (x64)
≈358MB
≈488MB
≈6MB
?
≈1MB
?
?
MacOS (arm64)
≈343MB
?
?
?
?
?
?
Linux (x64)
≈231MB
≈423MB
≈6MB
≈236MB
≈1MB
?
?
Linux (x86)
?
≈421MB
?
?
?
?
?
Linux (ARMv7l)
≈168MB
Requested
?
?
?
?
?
Linux (ARM64)
≈236MB
Requested
?
?
≈1MB
?
?
Electron
NW.JS
Tauri
NodeGui
Neutralino
Flutter
.Net MAUI
Windows (x64)
≈3929ms
≈19063ms
≈378894ms
≈13103ms
≈1000ms
?
?
Windows (x86)
≈3929ms
≈19063ms
?
?
?
?
?
Windows (ARM64)
≈3929ms
Requested
?
?
?
?
?
MacOS (x64)
≈22203ms
≈19063ms
≈616264ms
?
≈1000ms
?
?
MacOS (arm64)
≈22203ms
?
?
?
?
?
?
Linux (x64)
≈2516ms
≈19063ms
≈435624ms
≈45638ms
≈1000ms
?
?
Linux (x86)
?
≈19063ms
?
?
?
?
?
Linux (ARMv7l)
≈2516ms
Requested
?
?
?
?
?
Linux (ARM64)
≈2516ms
Requested
?
?
≈1000ms
?
?
Electron
NW.JS
Tauri
NodeGui
Neutralino
Flutter
.Net MAUI
Windows (x64)
≈68MB (Debug) => ≈84MB (Release)
≈63MB (Debug) => ≈52MB (Release)
≈43MB (Debug) => ≈23MB (Release)
≈133MB (Debug)
≈49MB (Debug)
≈256MB (Debug)
≈5MB (Debug)
MacOS (x64)
≈63MB (Debug) => ≈63MB (Release)
≈45MB (Debug) => ≈75MB (Release)
≈48MB (Debug) => ≈29MB (Release)
≈125MB (Debug)
≈73MB (Debug) => ≈27MB (Release)
≈142MB (Debug)
≈25MB (Debug)
Linux (x64)
≈117MB (Debug) => ≈111MB (Release)
≈84MB (Debug) => ≈53MB (Release)
≈160MB (Debug) => ≈156MB (Release)
≈154MB (Debug)
≈168MB (Debug) => ≈177MB (Release)
≈407MB (Debug)
≈11MB (Debug)
Electron
NW.JS
Tauri
NodeGui
Neutralino
Flutter
.Net MAUI
Windows (x64)
≈146ms (Debug) => ≈108ms (Release)
?
≈123ms (Debug) => ≈82ms (Release)
?
?
?
?
MacOS (x64)
≈524ms (Debug) => ≈266ms (Release)
?
≈622ms (Debug) => ≈686ms (Release)
?
?
?
?
Linux (x64)
≈99ms (Debug) => ≈94ms (Release)
?
≈226ms (Debug) => ≈184ms (Release)
?
?
?
?
See source in benchmark/02-empty-app-frameless folder.
Electron
NW.JS
Tauri
NodeGui
Neutralino
Flutter
.Net MAUI
Windows (x64)
≈226MB
≈317MB
≈3MB
≈171MB
≈2MB
N/A1
N/A2
Windows (x86)
≈202MB
≈288MB
?
?
?
N/A1
N/A2
Windows (ARM64)
≈226MB
Requested
?
?
?
N/A1
N/A2
MacOS (x64)
≈358MB
≈488MB
≈6MB
?
≈1MB
N/A1
N/A2
MacOS (arm64)
≈343MB
?
?
?
?
N/A1
N/A2
Linux (x64)
≈231MB
≈423MB
≈6MB
≈236MB
≈1MB
N/A1
N/A2
Linux (x86)
?
≈421MB
?
?
?
N/A1
N/A2
Linux (ARMv7l)
≈168MB
Requested
?
?
?
N/A1
N/A2
Linux (ARM64)
≈236MB
Requested
?
?
≈1MB
N/A1
N/A2
Electron
NW.JS
Tauri
NodeGui
Neutralino
Flutter
.Net MAUI
Windows (x64)
≈3851ms
≈11222ms
≈402777ms
≈13647ms
≈642ms
N/A1
N/A2
Windows (x86)
≈3851ms
≈11222ms
?
?
?
N/A1
N/A2
Windows (ARM64)
≈3851ms
Requested
?
?
?
N/A1
N/A2
MacOS (x64)
≈16618ms
≈11222ms
≈589110ms
?
≈642ms
N/A1
N/A2
MacOS (arm64)
≈16618ms
?
?
?
?
N/A1
N/A2
Linux (x64)
≈2900ms
≈11222ms
≈545417ms
≈53247ms
≈642ms
N/A1
N/A2
Linux (x86)
?
≈11222ms
?
?
?
N/A1
N/A2
Linux (ARMv7l)
≈2900ms
Requested
?
?
?
N/A1
N/A2
Linux (ARM64)
≈2900ms
Requested
?
?
≈642ms
N/A1
N/A2
Electron
NW.JS
Tauri
NodeGui
Neutralino
Flutter
.Net MAUI
Windows (x64)
≈65MB (Debug) => ≈81MB (Release)
≈77MB (Debug) => ≈48MB (Release)
≈42MB (Debug) => ≈21MB (Release)
≈104MB (Debug)
≈49MB (Debug)
N/A1
N/A2
MacOS (x64)
≈65MB (Debug) => ≈64MB (Release)
≈45MB (Debug) => ≈75MB (Release)
≈47MB (Debug) => ≈27MB (Release)
≈132MB (Debug)
≈72MB (Debug) => ≈27MB (Release)
N/A1
N/A2
Linux (x64)
≈114MB (Debug) => ≈109MB (Release)
≈77MB (Debug) => ≈53MB (Release)
≈154MB (Debug) => ≈154MB (Release)
≈118MB (Debug)
≈166MB (Debug) => ≈175MB (Release)
N/A1
N/A2
Electron
NW.JS
Tauri
NodeGui
Neutralino
Flutter
.Net MAUI
Windows (x64)
≈174ms (Debug) => ≈91ms (Release)
?
≈120ms (Debug) => ≈99ms (Release)
?
?
N/A1
N/A2
MacOS (x64)
≈473ms (Debug) => ≈302ms (Release)
?
≈444ms (Debug) => ≈300ms (Release)
?
?
N/A1
N/A2
Linux (x64)
≈105ms (Debug) => ≈101ms (Release)
?
≈286ms (Debug) => ≈235ms (Release)
?
?
N/A1
N/A2
1 : Frameless mode not supported yet
2 : Frameless mode not working
TODO:
WebGL Support
Build constraints
Source code protection
Modules support (npm, native, etc.)
Benchmarks ideas:
BabylonJS scene
spreadsheet
IDE