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 | Tauri | NW.JS | Wails | NodeGui | Neutralino | Flutter | .Net MAUI | |
---|---|---|---|---|---|---|---|---|
Github stars | 114.3k | 84.3k | 40.4k | 25.2k | 8.9k | 7.5k | 166.1k | 22.2k |
Forks | 15.4k | 2.5k | 3.9k | 1.2k | 0.3k | 0.4k | 27.4k | 1.7k |
Creation date | 2013 | 2019 | 2011 | 2019 | 2019 | 2018 | 2018 | 2020 |
Last Update | 11/2024 | 11/2024 | 10/2024 | 11/2024 | 10/2024 | 11/2024 | 11/2024 | 11/2024 |
Framework Language | C++, JS, Objective-C, Python | Rust | C++ | Go | C++ | C++ | C, C++, Dart | C# |
Usage Language - Back | JS, C++ | Rust | JS, C++ | Go | JS, C++ | JS, C++ | 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 | C++ Compiler, Node.js, Rustc, Cargo | Node.js, NW.JS SDK | Go 1.18+, Node 15+, Wails | 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 | None |
Dependencies / modules support | npm & node.js native addons | cargo (back), npm (front) | npm & node.js native addons | Gomod (back), npm (front) | npm & node.js native addons | β | pub.dev | NuGet |
Engine | Chromium | WRY (WebKitGTK for Linux, WebKit for MacOS, Webview2 for Windows) | Webkit, Chromium | WebKit2gtk on Linux, Webview2 on Windows and WkWebview on Mac | Qt | WebkitGTK+ | Flutter engine | .NET MAUI |
See GRAPHS.md for stars/forks visualization.
Electron | Tauri | NW.JS | Wails | NodeGui | Neutralino | Flutter | .Net MAUI | |
---|---|---|---|---|---|---|---|---|
Integrated updater? | Official | Official | Community | Planned | No | Official | No, but there are community solutions | No |
Automated Tests | Standard node.js tests (back-end) or Webdriver/Playwright (UI) | Cargo (back-end) or Webdriver (UI) | Standard node.js tests (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 | Tauri | NW.JS | NodeGui | Neutralino | Wails | Flutter | .Net MAUI | |
---|---|---|---|---|---|---|---|---|
Angular | Yes | Yes, official via Vite | Yes | Yes, community | Yes | Yes | No | No |
NextJS | ? | Yes, official | ? | ? | ? | Yes | No | No |
Preact | Yes | Yes, official via Vite | Yes | ? | Yes | Yes | No | No |
Qwik | Yes | Yes, official | Yes | ? | Yes | Yes | No | No |
React | Yes | Yes, official via Vite | Yes | Yes, official but EOL | Yes | Yes | No | No |
Svelte | Yes | Yes, official via sveltekit or Vite | Yes | Yes, official | Yes | Yes | No | No |
Vue | Yes | Yes, official via Vite | Yes | Yes, official | Yes | Yes | No | No |
Vite | Yes | Yes, official | Yes | ? | Yes | Yes | No | No |
Electron | Tauri | NW.JS | Wails | NodeGui | Neutralino | Flutter | .Net MAUI | ||
---|---|---|---|---|---|---|---|---|---|
Development Environment | Windows | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ |
MacOS | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | |
Linux | βοΈ1 | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | |
Target Environment | Windows | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ |
MacOS | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | |
Linux | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | βοΈ | Soon | |
Android | β | Soon2 | Requested | 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 | Tauri | NW.JS | Wails | NodeGui | Neutralino | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β280MB | β1MB | β427MB | β9MB | β171MB | β2MB | β24MB | N/A1 | N/A2 |
Windows (x86) | β248MB | ? | β384MB | ? | ? | ? | ? | N/A1 | N/A2 |
Windows (ARM64) | β295MB | ? | Requested | ? | ? | ? | ? | N/A1 | N/A2 |
MacOS (x64) | β433MB | ? | β595MB | ? | ? | β1MB | ? | N/A1 | N/A2 |
MacOS (arm64) | β410MB | β3MB | β543MB | β7MB | ? | β2MB | ? | N/A1 | N/A2 |
Linux (x64) | β1GB | β2MB | β520MB | β7MB | β75MB | β1MB | ? | N/A1 | N/A2 |
Linux (x86) | ? | ? | β523MB | ? | ? | ? | ? | N/A1 | N/A2 |
Linux (ARMv7l) | β221MB | ? | Requested | ? | ? | ? | ? | N/A1 | N/A2 |
Linux (ARM64) | β289MB | ? | Requested | ? | ? | β1MB | ? | N/A1 | N/A2 |
Electron | Tauri | NW.JS | Wails | NodeGui | Neutralino | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β3128ms | β170440ms | β7033ms | β5922ms | β8268ms | β170ms | β33589ms | N/A1 | N/A2 |
Windows (x86) | β3128ms | ? | β7033ms | ? | ? | ? | ? | N/A1 | N/A2 |
Windows (ARM64) | β3128ms | ? | Requested | ? | ? | ? | ? | N/A1 | N/A2 |
MacOS (x64) | β4264ms | ? | β7100ms | ? | ? | β329ms | ? | N/A1 | N/A2 |
MacOS (arm64) | β4264ms | β67454ms | β7100ms | β23988ms | ? | β170ms | ? | N/A1 | N/A2 |
Linux (x64) | β2996ms | β208151ms | β8013ms | β29913ms | β6516ms | β170ms | ? | N/A1 | N/A2 |
Linux (x86) | ? | ? | β8013ms | ? | ? | ? | ? | N/A1 | N/A2 |
Linux (ARMv7l) | β2996ms | ? | Requested | ? | ? | ? | ? | N/A1 | N/A2 |
Linux (ARM64) | β2996ms | ? | Requested | ? | ? | β170ms | ? | N/A1 | N/A2 |
Electron | Tauri | NW.JS | Wails | NodeGui | Neutralino | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β351MB (Debug) => β252MB (Release) | β509MB (Debug) => β423MB (Release) | β271MB (Debug) => β289MB (Release) | β408MB (Debug) => β261MB (Release) | β191MB (Debug) | β455MB (Debug) => β415MB (Release) | β784MB (Debug) => β57MB (Release) | N/A1 | N/A2 |
MacOS (arm64) | β416MB (Debug) => β319MB (Release) | β189MB (Debug) => β66MB (Release) | β734MB (Debug) => β509MB (Release) | β254MB (Debug) => β77MB (Release) | β146MB (Debug) | β122MB (Debug) | β396MB (Debug) | N/A1 | N/A2 |
Linux (x64) | β710MB (Debug) => β594MB (Release) | β310MB (Debug) => β94MB (Release) | β791MB (Debug) => β877MB (Release) | β646MB (Debug) => β431MB (Release) | β296MB (Debug) | β1GB (Debug) => β969MB (Release) | β514MB (Debug) | N/A1 | N/A2 |
Memory Usage - (Average of runs) Median of difference between system measured free memory before execution and during execution)
Electron | Tauri | NW.JS | Wails | NodeGui | Neutralino | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β169MB (Debug) => β85MB (Release) | β196MB (Debug) => β155MB (Release) | β343MB (Debug) => β126MB (Release) | β274MB (Debug) => β163MB (Release) | β156MB (Debug) | β292MB (Debug) => β253MB (Release) | β749MB (Debug) => β41MB (Release) | N/A1 | N/A2 |
MacOS (arm64) | β155MB (Debug) => β112MB (Release) | β129MB (Debug) => β84MB (Release) | β376MB (Debug) => β174MB (Release) | β216MB (Debug) => β85MB (Release) | β78MB (Debug) | β108MB (Debug) | β1GB (Debug) | N/A1 | N/A2 |
Linux (x64) | β140MB (Debug) => β99MB (Release) | β97MB (Debug) => β24MB (Release) | β397MB (Debug) => β200MB (Release) | β251MB (Debug) => β161MB (Release) | β106MB (Debug) | β516MB (Debug) => β495MB (Release) | β403MB (Debug) | N/A1 | N/A2 |
Electron | Tauri | NW.JS | Wails | NodeGui | Neutralino | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β564ms (Debug) => β209ms (Release) | β2344ms (Debug) => β416ms (Release) | β6640ms (Debug) => β562ms (Release) | β7610ms (Debug) => β406ms (Release) | β9172ms (Debug) | ? | β8710ms (Debug) => β68ms (Release) | N/A1 | N/A2 |
MacOS (arm64) | β374ms (Debug) => β228ms (Release) | β3922ms (Debug) => β1771ms (Release) | β4321ms (Debug) => β722ms (Release) | β4922ms (Debug) => β1770ms (Release) | ? | β1849ms (Debug) | β24879ms (Debug) | N/A1 | N/A2 |
Linux (x64) | β421ms (Debug) => β274ms (Release) | β26826ms (Debug) => β25294ms (Release) | β5261ms (Debug) => β438ms (Release) | β3024ms (Debug) => β251ms (Release) | ? | β488ms (Debug) => β342ms (Release) | β28999ms (Debug) | N/A1 | N/A2 |
1: Benchmark WIP (See #319)
2: Benchmark WIP (See #319)
See source in benchmark/02-empty-app-frameless folder.
Electron | Tauri | NW.JS | Wails | NodeGui | Neutralino | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β280MB | β1MB | β427MB | β9MB | β171MB | β2MB | N/A1 | N/A2 | N/A3 |
Windows (x86) | β248MB | ? | β384MB | ? | ? | ? | N/A1 | N/A2 | N/A3 |
Windows (ARM64) | β295MB | ? | Requested | ? | ? | ? | N/A1 | N/A2 | N/A3 |
MacOS (x64) | β433MB | ? | β595MB | ? | ? | β1MB | N/A1 | N/A2 | N/A3 |
MacOS (arm64) | β410MB | β3MB | β543MB | β7MB | ? | β2MB | N/A1 | N/A2 | N/A3 |
Linux (x64) | β1GB | β2MB | β520MB | β7MB | β75MB | β1MB | N/A1 | N/A2 | N/A3 |
Linux (x86) | ? | ? | β523MB | ? | ? | ? | N/A1 | N/A2 | N/A3 |
Linux (ARMv7l) | β221MB | ? | Requested | ? | ? | ? | N/A1 | N/A2 | N/A3 |
Linux (ARM64) | β289MB | ? | Requested | ? | ? | β1MB | N/A1 | N/A2 | N/A3 |
Electron | Tauri | NW.JS | Wails | NodeGui | Neutralino | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β3102ms | β187051ms | β22946ms | β6303ms | β8810ms | β177ms | N/A1 | N/A2 | N/A3 |
Windows (x86) | β3102ms | ? | β22946ms | ? | ? | ? | N/A1 | N/A2 | N/A3 |
Windows (ARM64) | β3102ms | ? | Requested | ? | ? | ? | N/A1 | N/A2 | N/A3 |
MacOS (x64) | β1868ms | ? | β6177ms | ? | ? | β345ms | N/A1 | N/A2 | N/A3 |
MacOS (arm64) | β1868ms | β66604ms | β6177ms | β23308ms | ? | β177ms | N/A1 | N/A2 | N/A3 |
Linux (x64) | β2932ms | β214049ms | β38340ms | β30160ms | β6625ms | β177ms | N/A1 | N/A2 | N/A3 |
Linux (x86) | ? | ? | β38340ms | ? | ? | ? | N/A1 | N/A2 | N/A3 |
Linux (ARMv7l) | β2932ms | ? | Requested | ? | ? | ? | N/A1 | N/A2 | N/A3 |
Linux (ARM64) | β2932ms | ? | Requested | ? | ? | β177ms | N/A1 | N/A2 | N/A3 |
Electron | Tauri | NW.JS | Wails | NodeGui | Neutralino | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β348MB (Debug) => β250MB (Release) | β336MB (Debug) => β255MB (Release) | β158MB (Debug) => β287MB (Release) | β737MB (Debug) => β261MB (Release) | β165MB (Debug) | β630MB (Debug) => β416MB (Release) | N/A1 | N/A2 | N/A3 |
MacOS (arm64) | β416MB (Debug) => β320MB (Release) | β186MB (Debug) => β63MB (Release) | β749MB (Debug) => β505MB (Release) | β247MB (Debug) => β70MB (Release) | β146MB (Debug) | β120MB (Debug) | N/A1 | N/A2 | N/A3 |
Linux (x64) | β709MB (Debug) => β590MB (Release) | β310MB (Debug) => β94MB (Release) | β397MB (Debug) => β877MB (Release) | β642MB (Debug) => β433MB (Release) | β295MB (Debug) | β1GB (Debug) => β976MB (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 | Tauri | NW.JS | Wails | NodeGui | Neutralino | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β167MB (Debug) => β101MB (Release) | β230MB (Debug) => β153MB (Release) | β297MB (Debug) => β130MB (Release) | β239MB (Debug) => β164MB (Release) | β114MB (Debug) | β294MB (Debug) => β275MB (Release) | N/A1 | N/A2 | N/A3 |
MacOS (arm64) | β166MB (Debug) => β118MB (Release) | β140MB (Debug) => β85MB (Release) | β388MB (Debug) => β174MB (Release) | β218MB (Debug) => β87MB (Release) | β84MB (Debug) | β111MB (Debug) | N/A1 | N/A2 | N/A3 |
Linux (x64) | β138MB (Debug) => β102MB (Release) | β104MB (Debug) => β24MB (Release) | β286MB (Debug) => β202MB (Release) | β248MB (Debug) => β160MB (Release) | β101MB (Debug) | β516MB (Debug) => β508MB (Release) | N/A1 | N/A2 | N/A3 |
Electron | Tauri | NW.JS | Wails | NodeGui | Neutralino | Flutter | .Net MAUI | .Net MAUI w/ Vue | |
---|---|---|---|---|---|---|---|---|---|
Windows (x64) | β592ms (Debug) => β214ms (Release) | β2420ms (Debug) => β438ms (Release) | β7143ms (Debug) => β575ms (Release) | β8024ms (Debug) => β430ms (Release) | β4610ms (Debug) | ? | N/A1 | N/A2 | N/A3 |
MacOS (arm64) | β365ms (Debug) => β228ms (Release) | β3870ms (Debug) => β1747ms (Release) | β3671ms (Debug) => β664ms (Release) | β4594ms (Debug) => β1756ms (Release) | ? | β1850ms (Debug) | N/A1 | N/A2 | N/A3 |
Linux (x64) | β416ms (Debug) => β270ms (Release) | β26836ms (Debug) => β25298ms (Release) | β5644ms (Debug) => β436ms (Release) | β3171ms (Debug) => β256ms (Release) | ? | β497ms (Debug) => β349ms (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!