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.
Table Of Content
Major characteristics
Electron
NW.JS
Tauri
NodeGui
Neutralino
Wails
Flutter
.Net MAUI
Github stars
109k
39.8k
68.1k
8.5k
6.9k
17.3k
156.4k
19.6k
Forks
15k
4k
2k
0.3k
0.3k
0.8k
25.9k
1.4k
Creation date
2013
2011
2019
2019
2018
2019
2018
2020
Last Update
9/2023
8/2023
9/2023
8/2023
9/2023
9/2023
9/2023
9/2023
Framework Language
C++, JS, Objective-C, Python
C++
Rust
C++
C++
Go
C, C++, Dart
C#
Usage Language - Back
JS, C++
JS, C++
Rust
JS, C++
JS, C++
Go
Dart
C#
Usage Language - Front
HTML, CSS, JS
HTML, CSS, JS
HTML, CSS, JS
HTML, CSS, JS
HTML, CSS, JS
HTML, CSS, JS
Dart
C#
License
MIT
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
Go 1.18+, Node 15+, Wails
Flutter SDK, Visual Studio 2019 / Clang
.Net SDK, Visual Studio (optional), WebView2 (optional), Xcode (optional)
User Dependencies
None
None
None
None
None
None
None
None
Dependencies / modules support
npm & node.js native addons
npm & node.js native addons
cargo (back), npm (front)
npm & node.js native addons
β
Gomod (back), npm (front)
pub.dev
NuGet
Engine
Chromium
Webkit, Chromium
WRY (WebKitGTK for Linux, WebKit for MacOS, Webview2 for Windows)
Qt
WebkitGTK+
Webkit
Flutter engine
.NET MAUI
Integrated updater ?
Official
Community
Official
No
Official
Planned
No, but there are community solutions
No
Automated Tests
Standard node.js tests (back-end) or Webdriver/Playwright (UI)
Standard node.js tests (back-end) or Webdriver(UI)
Cargo (back-end) or Webdriver (UI)
?
?
?
Integrated
Standard C# tests (back-end), no official solution for UI
Operating systems support
Electron
NW.JS
Tauri
NodeGui
Neutralino
Wails
Flutter
.Net MAUI
Developement Environment
Windows
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
MacOS
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
Linux
βοΈ1
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
Target Environment
Windows
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
MacOS
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
Linux
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
βοΈ
Soon
Android
β
Requested
Soon2
β
β
Requested
βοΈ
βοΈ
iOS
β
β
In progress2
β
β
Requested
βοΈ
βοΈ
tvOS
β
β
β
β
β
β
β
βοΈ
Web
β
β
β
β
βοΈ3
β
βοΈ
β
1 : Linux 32 Bit support dropped
2 : https://github.com/tauri-apps/tauri#platforms
3 : Uses modes to generate web apps
Benchmarks
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.
01-empty-app
See source in benchmark/01-empty-app folder.
Build size
Electron
NW.JS
Tauri
NodeGui
Neutralino
Wails
Flutter
.Net MAUI
.Net MAUI w/ Vue
Windows (x64)
β248MB
β354MB
β1MB
β171MB
β2MB
β8MB
?
N/A1
N/A2
Windows (x86)
β220MB
β318MB
?
?
?
?
?
N/A1
N/A2
Windows (ARM64)
β257MB
Requested
?
?
?
?
?
N/A1
N/A2
MacOS (x64)
β386MB
β531MB
β3MB
?
β1MB
β7MB
?
N/A1
N/A2
MacOS (arm64)
β369MB
?
?
?
?
?
?
N/A1
N/A2
Linux (x64)
β251MB
β474MB
β4MB
β75MB
β1MB
β6MB
?
N/A1
N/A2
Linux (x86)
?
β473MB
?
?
?
?
?
N/A1
N/A2
Linux (ARMv7l)
β188MB
Requested
?
?
?
?
?
N/A1
N/A2
Linux (ARM64)
β258MB
Requested
?
?
β1MB
?
?
N/A1
N/A2
Build time
Electron
NW.JS
Tauri
NodeGui
Neutralino
Wails
Flutter
.Net MAUI
.Net MAUI w/ Vue
Windows (x64)
β4139ms
β29100ms
β274447ms
β11509ms
β866ms
β9403ms
?
N/A1
N/A2
Windows (x86)
β4139ms
β29100ms
?
?
?
?
?
N/A1
N/A2
Windows (ARM64)
β4139ms
Requested
?
?
?
?
?
N/A1
N/A2
MacOS (x64)
β5983ms
β29100ms
β207511ms
?
β875ms
β70980ms
?
N/A1
N/A2
MacOS (arm64)
β5983ms
?
?
?
?
?
?
N/A1
N/A2
Linux (x64)
β2218ms
β29100ms
β305380ms
β9474ms
β875ms
β40059ms
?
N/A1
N/A2
Linux (x86)
?
β29100ms
?
?
?
?
?
N/A1
N/A2
Linux (ARMv7l)
β2218ms
Requested
?
?
?
?
?
N/A1
N/A2
Linux (ARM64)
β2218ms
Requested
?
?
β875ms
?
?
N/A1
N/A2
Memory Usage - (Average of runs) Median of used memory for main process and children ones)
Electron
NW.JS
Tauri
NodeGui
Neutralino
Wails
Flutter
.Net MAUI
.Net MAUI w/ Vue
Windows (x64)
β382MB (Debug) => β242MB (Release)
β403MB (Debug) => β286MB (Release)
β144MB (Debug) => β29MB (Release)
β221MB (Debug)
β84MB (Debug)
β196MB (Debug) => β33MB (Release)
β840MB (Debug)
N/A1
N/A2
MacOS (x64)
β298MB (Debug) => β201MB (Release)
β390MB (Debug) => β280MB (Release)
β150MB (Debug) => β31MB (Release)
β152MB (Debug)
β187MB (Debug) => β30MB (Release)
β208MB (Debug) => β34MB (Release)
β193MB (Debug)
N/A1
N/A2
Linux (x64)
β666MB (Debug) => β544MB (Release)
β205MB (Debug)
β302MB (Debug) => β92MB (Release)
β295MB (Debug)
β854MB (Debug) => β742MB (Release)
β663MB (Debug) => β431MB (Release)
β21MB (Debug)
N/A1
N/A2
Memory Usage - (Average of runs) Median of difference between system measured free memory before execution and during execution)
Electron
NW.JS
Tauri
NodeGui
Neutralino
Wails
Flutter
.Net MAUI
.Net MAUI w/ Vue
Windows (x64)
β182MB (Debug) => β84MB (Release)
β275MB (Debug) => β140MB (Release)
β211MB (Debug) => β134MB (Release)
β189MB (Debug)
β64MB (Debug)
β266MB (Debug) => β143MB (Release)
β787MB (Debug)
N/A1
N/A2
MacOS (x64)
β153MB (Debug) => β92MB (Release)
β237MB (Debug) => β159MB (Release)
β154MB (Debug) => β33MB (Release)
β93MB (Debug)
β131MB (Debug) => β31MB (Release)
β204MB (Debug) => β36MB (Release)
β150MB (Debug)
N/A1
N/A2
Linux (x64)
β107MB (Debug) => β51MB (Release)
β70MB (Debug)
β80MB (Debug) => β11MB (Release)
β67MB (Debug)
β416MB (Debug) => β345MB (Release)
β277MB (Debug) => β135MB (Release)
β12MB (Debug)
N/A1
N/A2
Start duration
Electron
NW.JS
Tauri
NodeGui
Neutralino
Wails
Flutter
.Net MAUI
.Net MAUI w/ Vue
Windows (x64)
β1290ms (Debug) => β306ms (Release)
β741ms (Release)
β3348ms (Debug) => β563ms (Release)
?
?
β11283ms (Debug) => β604ms (Release)
?
N/A1
N/A2
MacOS (x64)
β1923ms (Debug) => β704ms (Release)
β1730ms (Release)
β4977ms (Debug) => β743ms (Release)
?
β2305ms (Debug) => β720ms (Release)
β8980ms (Debug) => β802ms (Release)
?
N/A1
N/A2
Linux (x64)
β693ms (Debug) => β362ms (Release)
?
β210536ms (Debug)
?
β1779ms (Debug) => β449ms (Release)
β4490ms (Debug) => β345ms (Release)
?
N/A1
N/A2
1 : Benchmark WIP
2 : Benchmark WIP
02-empty-app-frameless
See source in benchmark/02-empty-app-frameless folder.
Build size
Electron
NW.JS
Tauri
NodeGui
Neutralino
Wails
Flutter
.Net MAUI
.Net MAUI w/ Vue
Windows (x64)
β248MB
β366MB
β1MB
β171MB
β2MB
β8MB
N/A1
N/A2
N/A3
Windows (x86)
β220MB
β330MB
?
?
?
?
N/A1
N/A2
N/A3
Windows (ARM64)
β257MB
Requested
?
?
?
?
N/A1
N/A2
N/A3
MacOS (x64)
β378MB
β329MB
β3MB
?
β1MB
β7MB
N/A1
N/A2
N/A3
MacOS (arm64)
β359MB
?
?
?
?
?
N/A1
N/A2
N/A3
Linux (x64)
β251MB
β474MB
β4MB
β75MB
β1MB
β6MB
N/A1
N/A2
N/A3
Linux (x86)
?
β473MB
?
?
?
?
N/A1
N/A2
N/A3
Linux (ARMv7l)
β188MB
Requested
?
?
?
?
N/A1
N/A2
N/A3
Linux (ARM64)
β258MB
Requested
?
?
β1MB
?
N/A1
N/A2
N/A3
Build time
Electron
NW.JS
Tauri
NodeGui
Neutralino
Wails
Flutter
.Net MAUI
.Net MAUI w/ Vue
Windows (x64)
β5760ms
β35368ms
β389844ms
β16621ms
β643ms
β16151ms
N/A1
N/A2
N/A3
Windows (x86)
β5760ms
β35368ms
?
?
?
?
N/A1
N/A2
N/A3
Windows (ARM64)
β5760ms
Requested
?
?
?
?
N/A1
N/A2
N/A3
MacOS (x64)
β7106ms
β35368ms
β219046ms
?
β1139ms
β72115ms
N/A1
N/A2
N/A3
MacOS (arm64)
β7106ms
?
?
?
?
?
N/A1
N/A2
N/A3
Linux (x64)
β2904ms
β35368ms
β380472ms
β12681ms
β1139ms
β53279ms
N/A1
N/A2
N/A3
Linux (x86)
?
β35368ms
?
?
?
?
N/A1
N/A2
N/A3
Linux (ARMv7l)
β2904ms
Requested
?
?
?
?
N/A1
N/A2
N/A3
Linux (ARM64)
β2904ms
Requested
?
?
β1139ms
?
N/A1
N/A2
N/A3
Memory Usage - (Average of runs) Median of used memory for main process and children ones)
Electron
NW.JS
Tauri
NodeGui
Neutralino
Wails
Flutter
.Net MAUI
.Net MAUI w/ Vue
Windows (x64)
β374MB (Debug) => β241MB (Release)
β84MB (Debug) => β280MB (Release)
β130MB (Debug) => β27MB (Release)
β168MB (Debug)
β86MB (Debug)
β210MB (Debug) => β33MB (Release)
N/A1
N/A2
N/A3
MacOS (x64)
β296MB (Debug) => β194MB (Release)
β114MB (Debug) => β271MB (Release)
β149MB (Debug) => β29MB (Release)
β159MB (Debug)
β190MB (Debug) => β29MB (Release)
β208MB (Debug) => β32MB (Release)
N/A1
N/A2
N/A3
Linux (x64)
β661MB (Debug) => β541MB (Release)
β167MB (Debug)
β301MB (Debug) => β92MB (Release)
β294MB (Debug)
β925MB (Debug) => β741MB (Release)
β653MB (Debug) => β429MB (Release)
N/A1
N/A2
N/A3
Memory Usage - (Average of runs) Median of difference between system measured free memory before execution and during execution)
Electron
NW.JS
Tauri
NodeGui
Neutralino
Wails
Flutter
.Net MAUI
.Net MAUI w/ Vue
Windows (x64)
β179MB (Debug) => β89MB (Release)
β58MB (Debug) => β147MB (Release)
β199MB (Debug) => β134MB (Release)
β122MB (Debug)
β70MB (Debug)
β268MB (Debug) => β145MB (Release)
N/A1
N/A2
N/A3
MacOS (x64)
β195MB (Debug) => β96MB (Release)
β73MB (Debug) => β132MB (Release)
β133MB (Debug) => β32MB (Release)
β101MB (Debug)
β133MB (Debug) => β29MB (Release)
β198MB (Debug) => β38MB (Release)
N/A1
N/A2
N/A3
Linux (x64)
β102MB (Debug) => β57MB (Release)
β32MB (Debug)
β76MB (Debug) => β10MB (Release)
β61MB (Debug)
β437MB (Debug) => β337MB (Release)
β249MB (Debug) => β128MB (Release)
N/A1
N/A2
N/A3
Start duration
Electron
NW.JS
Tauri
NodeGui
Neutralino
Wails
Flutter
.Net MAUI
.Net MAUI w/ Vue
Windows (x64)
β1795ms (Debug) => β402ms (Release)
β941ms (Release)
β4230ms (Debug) => β767ms (Release)
β8798ms (Debug)
?
β19748ms (Debug) => β955ms (Release)
N/A1
N/A2
N/A3
MacOS (x64)
β2287ms (Debug) => β746ms (Release)
β1785ms (Release)
β5479ms (Debug) => β721ms (Release)
?
β2449ms (Debug) => β742ms (Release)
β9391ms (Debug) => β782ms (Release)
N/A1
N/A2
N/A3
Linux (x64)
β867ms (Debug) => β419ms (Release)
?
β42036ms (Debug)
?
β2152ms (Debug) => β590ms (Release)
β6096ms (Debug) => β450ms (Release)
N/A1
N/A2
N/A3
1 : Frameless mode not supported yet
2 : Frameless mode not working
3 : Frameless mode not working
Future content
See Issues and Pull requests . You can participate by proposing new issues, of filling them !
Contributors
List of contributors to this repository