This repository has been made to create an objective comparison of multiple frameworks that allow us to "transform" our web apps to desktop applications.
Electron | NW.JS | Tauri | NodeGui | Neutralino | Wails | Flutter | .Net MAUI | |
---|---|---|---|---|---|---|---|---|
Github stars | 112.3k | 40.2k | 78.5k | 8.8k | 7.3k | 22.8k | 162.5k | 21.7k |
Forks | 15k | 3.9k | 2.3k | 0.3k | 0.4k | 1.1k | 26.7k | 1.6k |
Creation date | 2013 | 2011 | 2019 | 2019 | 2018 | 2019 | 2018 | 2020 |
Last Update | 6/2024 | 5/2024 | 6/2024 | 5/2024 | 6/2024 | 6/2024 | 6/2024 | 6/2024 |
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+ | WebKit2gtk on Linux, Webview2 on Windows and WkWebview on Mac | Flutter engine | .NET MAUI |
See GRAPHS.md for stars/forks visualization.
Electron | NW.JS | Tauri | NodeGui | Neutralino | Wails | Flutter | .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 |
WebGL Support | Yes | Yes | Yes | ? | Yes | Yes | Yes | Yes, but not on all flavors |
Electron | NW.JS | Tauri | NodeGui | Neutralino | Wails | Flutter | .Net MAUI | |
---|---|---|---|---|---|---|---|---|
Angular | Yes | Yes | Yes, official via Vite | Yes, community | Yes | Yes | No | No |
NextJS | ? | ? | Yes, official | ? | ? | Yes | No | No |
Preact | Yes | Yes | Yes, official via Vite | ? | Yes | Yes | No | No |
Qwik | Yes | Yes | Yes, official | ? | Yes | Yes | No | No |
React | Yes | Yes | Yes, official via Vite | Yes, official but EOL | Yes | Yes | No | No |
Svelte | Yes | Yes | Yes, official via sveltekit or Vite | Yes, official | Yes | Yes | No | No |
Vue | Yes | Yes | Yes, official via Vite | Yes, official | Yes | Yes | No | No |
Vite | Yes | Yes | Yes, official | ? | Yes | Yes | No | No |
Electron | NW.JS | Tauri | NodeGui | Neutralino | Wails | Flutter | .Net MAUI | ||
---|---|---|---|---|---|---|---|---|---|
Development 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
See benchmarks.json to get more information about the following data.
Note: These benchmarks are done on GitHub CI. There are ways to make measurements more accurate (e.g., multiple runs), but they will never be perfectly accurate, as they totally depend on system load and resources. You should read these tables as a comparison between frameworks for the same OS, architecture, and app, with a margin of error.
See source in benchmark/01-empty-app folder.
Electron | NW.JS | Tauri | NodeGui | Neutralino | Wails | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β266MB | β404MB | β1MB | β171MB | ? | β8MB | ? | N/A1 | N/A2 |
Windows (x86) | β238MB | β371MB | ? | ? | ? | ? | ? | N/A1 | N/A2 |
Windows (ARM64) | β273MB | Requested | ? | ? | ? | ? | ? | N/A1 | N/A2 |
MacOS (x64) | β420MB | β564MB | ? | ? | β1MB | ? | ? | N/A1 | N/A2 |
MacOS (arm64) | β396MB | β518MB | ? | ? | ? | ? | ? | N/A1 | N/A2 |
Linux (x64) | β268MB | β494MB | β2MB | β75MB | β1MB | β7MB | ? | N/A1 | N/A2 |
Linux (x86) | ? | β501MB | ? | ? | ? | ? | ? | N/A1 | N/A2 |
Linux (ARMv7l) | β203MB | Requested | ? | ? | ? | ? | ? | N/A1 | N/A2 |
Linux (ARM64) | β274MB | Requested | ? | ? | β1MB | ? | ? | N/A1 | N/A2 |
Electron | NW.JS | Tauri | NodeGui | Neutralino | Wails | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β3478ms | β19396ms | β181255ms | β9985ms | ? | β6439ms | ? | N/A1 | N/A2 |
Windows (x86) | β3478ms | β19396ms | ? | ? | ? | ? | ? | N/A1 | N/A2 |
Windows (ARM64) | β3478ms | Requested | ? | ? | ? | ? | ? | N/A1 | N/A2 |
MacOS (x64) | β2311ms | β6262ms | ? | ? | β490ms | ? | ? | N/A1 | N/A2 |
MacOS (arm64) | β2311ms | β6262ms | ? | ? | ? | ? | ? | N/A1 | N/A2 |
Linux (x64) | β1664ms | β25207ms | β185112ms | β6750ms | β490ms | β28439ms | ? | N/A1 | N/A2 |
Linux (x86) | ? | β25207ms | ? | ? | ? | ? | ? | N/A1 | N/A2 |
Linux (ARMv7l) | β1664ms | Requested | ? | ? | ? | ? | ? | N/A1 | N/A2 |
Linux (ARM64) | β1664ms | Requested | ? | ? | β490ms | ? | ? | N/A1 | N/A2 |
Electron | NW.JS | Tauri | NodeGui | Neutralino | Wails | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β352MB (Debug) => β238MB (Release) | β120MB (Debug) => β268MB (Release) | β357MB (Debug) => β254MB (Release) | β178MB (Debug) | β97MB (Debug) | β414MB (Debug) => β260MB (Release) | β793MB (Debug) | N/A1 | N/A2 |
MacOS (arm64) | β424MB (Debug) => β307MB (Release) | β630MB (Debug) | β200MB (Debug) | β174MB (Debug) | β42MB (Debug) | β269MB (Debug) | β197MB (Debug) | N/A1 | N/A2 |
Linux (x64) | β699MB (Debug) => β579MB (Release) | β95MB (Debug) => β834MB (Release) | β311MB (Debug) => β92MB (Release) | β235MB (Debug) | β1GB (Debug) => β925MB (Release) | β650MB (Debug) => β436MB (Release) | β711MB (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) | β145MB (Debug) => β83MB (Release) | β82MB (Debug) => β124MB (Release) | β235MB (Debug) => β153MB (Release) | β137MB (Debug) | β79MB (Debug) | β276MB (Debug) => β162MB (Release) | β680MB (Debug) | N/A1 | N/A2 |
MacOS (arm64) | β209MB (Debug) => β114MB (Release) | β271MB (Debug) | β165MB (Debug) | β104MB (Debug) | β36MB (Debug) | β264MB (Debug) | β250MB (Debug) | N/A1 | N/A2 |
Linux (x64) | β148MB (Debug) => β93MB (Release) | β48MB (Debug) => β194MB (Release) | β104MB (Debug) => β14MB (Release) | β143MB (Debug) | β530MB (Debug) => β473MB (Release) | β275MB (Debug) => β170MB (Release) | β585MB (Debug) | N/A1 | N/A2 |
Electron | NW.JS | Tauri | NodeGui | Neutralino | Wails | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β1196ms (Debug) => β258ms (Release) | β583ms (Release) | β2892ms (Debug) => β419ms (Release) | β11010ms (Debug) | ? | β8347ms (Debug) => β411ms (Release) | ? | N/A1 | N/A2 |
MacOS (arm64) | β583ms (Debug) => β239ms (Release) | ? | β4091ms (Debug) | ? | ? | β6083ms (Debug) | ? | N/A1 | N/A2 |
Linux (x64) | β482ms (Debug) => β306ms (Release) | β425ms (Release) | β34307ms (Debug) | ? | β1203ms (Debug) => β326ms (Release) | β2947ms (Debug) => β240ms (Release) | ? | N/A1 | N/A2 |
1: Benchmark WIP (See #319)
2: Benchmark WIP (See #319)
See source in benchmark/02-empty-app-frameless folder.
Electron | NW.JS | Tauri | NodeGui | Neutralino | Wails | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β266MB | β404MB | β1MB | β171MB | ? | β8MB | N/A1 | N/A2 | N/A3 |
Windows (x86) | β238MB | β371MB | ? | ? | ? | ? | N/A1 | N/A2 | N/A3 |
Windows (ARM64) | β273MB | Requested | ? | ? | ? | ? | N/A1 | N/A2 | N/A3 |
MacOS (x64) | β420MB | β564MB | ? | ? | β1MB | ? | N/A1 | N/A2 | N/A3 |
MacOS (arm64) | β396MB | β518MB | ? | ? | ? | ? | N/A1 | N/A2 | N/A3 |
Linux (x64) | β268MB | β494MB | β2MB | β75MB | β1MB | β7MB | N/A1 | N/A2 | N/A3 |
Linux (x86) | ? | β501MB | ? | ? | ? | ? | N/A1 | N/A2 | N/A3 |
Linux (ARMv7l) | β203MB | Requested | ? | ? | ? | ? | N/A1 | N/A2 | N/A3 |
Linux (ARM64) | β274MB | Requested | ? | ? | β1MB | ? | N/A1 | N/A2 | N/A3 |
Electron | NW.JS | Tauri | NodeGui | Neutralino | Wails | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β3252ms | β14250ms | β181510ms | β9978ms | ? | β6441ms | N/A1 | N/A2 | N/A3 |
Windows (x86) | β3252ms | β14250ms | ? | ? | ? | ? | N/A1 | N/A2 | N/A3 |
Windows (ARM64) | β3252ms | Requested | ? | ? | ? | ? | N/A1 | N/A2 | N/A3 |
MacOS (x64) | β1981ms | β5712ms | ? | ? | β517ms | ? | N/A1 | N/A2 | N/A3 |
MacOS (arm64) | β1981ms | β5712ms | ? | ? | ? | ? | N/A1 | N/A2 | N/A3 |
Linux (x64) | β1871ms | β6069ms | β204505ms | β6757ms | β517ms | β28985ms | N/A1 | N/A2 | N/A3 |
Linux (x86) | ? | β6069ms | ? | ? | ? | ? | N/A1 | N/A2 | N/A3 |
Linux (ARMv7l) | β1871ms | Requested | ? | ? | ? | ? | N/A1 | N/A2 | N/A3 |
Linux (ARM64) | β1871ms | Requested | ? | ? | β517ms | ? | N/A1 | N/A2 | N/A3 |
Electron | NW.JS | Tauri | NodeGui | Neutralino | Wails | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β349MB (Debug) => β235MB (Release) | β120MB (Debug) => β429MB (Release) | β357MB (Debug) => β254MB (Release) | β179MB (Debug) | β80MB (Debug) | β414MB (Debug) => β260MB (Release) | N/A1 | N/A2 | N/A3 |
MacOS (arm64) | β425MB (Debug) => β308MB (Release) | β621MB (Debug) | β198MB (Debug) | β173MB (Debug) | β24MB (Debug) | β268MB (Debug) | N/A1 | N/A2 | N/A3 |
Linux (x64) | β694MB (Debug) => β575MB (Release) | β1GB (Debug) => β832MB (Release) | β311MB (Debug) => β93MB (Release) | β244MB (Debug) | β1GB (Debug) => β923MB (Release) | β649MB (Debug) => β434MB (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) | β140MB (Debug) => β85MB (Release) | β84MB (Debug) => β115MB (Release) | β235MB (Debug) => β151MB (Release) | β128MB (Debug) | β66MB (Debug) | β276MB (Debug) => β162MB (Release) | N/A1 | N/A2 | N/A3 |
MacOS (arm64) | β176MB (Debug) => β118MB (Release) | β260MB (Debug) | β172MB (Debug) | β111MB (Debug) | β13MB (Debug) | β267MB (Debug) | N/A1 | N/A2 | N/A3 |
Linux (x64) | β144MB (Debug) => β100MB (Release) | β425MB (Debug) => β196MB (Release) | β113MB (Debug) => β18MB (Release) | β143MB (Debug) | β576MB (Debug) => β477MB (Release) | β256MB (Debug) => β166MB (Release) | N/A1 | N/A2 | N/A3 |
Electron | NW.JS | Tauri | NodeGui | Neutralino | Wails | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β1177ms (Debug) => β253ms (Release) | β576ms (Release) | β2888ms (Debug) => β414ms (Release) | β5138ms (Debug) | ? | β8327ms (Debug) => β409ms (Release) | N/A1 | N/A2 | N/A3 |
MacOS (arm64) | β486ms (Debug) => β277ms (Release) | ? | β4563ms (Debug) | ? | ? | β5074ms (Debug) | N/A1 | N/A2 | N/A3 |
Linux (x64) | β481ms (Debug) => β307ms (Release) | β441ms (Release) | β34764ms (Debug) | ? | β1256ms (Debug) => β339ms (Release) | β2972ms (Debug) => β244ms (Release) | N/A1 | N/A2 | N/A3 |
1: Frameless mode not supported yet
2: Frameless mode not working
3: Frameless mode not working
See Issues and Pull requests. You can participate by proposing new issues, or by filling them!