Web to Desktop framework comparison 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 118.3k 96.5k 41.2k 30.1k 9.1k 8k 172.4k 23k Forks 16.4k 3.1k 3.9k 1.5k 0.3k 0.4k 29.2k 1.9k Creation date 2013 2019 2011 2019 2019 2018 2018 2020 Last Update 9/2025 9/2025 9/2025 9/2025 6/2025 9/2025 9/2025 9/2025 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.
Front-end frameworks/technologies 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
Operating systems support 1 : Linux 32-bit support dropped 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 w/ Vue Windows (x64) ≈313MB ≈3MB ≈500MB ≈10MB ≈171MB ≈2MB ≈24MB N/A1 Windows (x86) ≈280MB ? ≈442MB ? ? ? ? N/A1 Windows (ARM64) ≈316MB ? Requested ? ? ? ? N/A1 MacOS (x64) ≈480MB ? ≈646MB ? ? ≈1MB ? N/A1 MacOS (arm64) ≈457MB ≈4MB ≈584MB ≈7MB ? ≈2MB ? N/A1 Linux (x64) ≈298MB ≈4MB ≈599MB ≈8MB ≈75MB ≈1MB ? N/A1 Linux (x86) ? ? ≈603MB ? ? ? ? N/A1 Linux (ARMv7l) ≈230MB ? Requested ? ? ? ? N/A1 Linux (ARM64) ≈303MB ? Requested ? ? ≈1MB ? N/A1
Electron Tauri NW.JS Wails NodeGui Neutralino Flutter .Net MAUI w/ Vue Windows (x64) ≈4027ms ≈225952ms ≈8991ms ≈5140ms ≈8748ms ≈173ms ≈37300ms N/A1 Windows (x86) ≈4027ms ? ≈8991ms ? ? ? ? N/A1 Windows (ARM64) ≈4027ms ? Requested ? ? ? ? N/A1 MacOS (x64) ≈2361ms ? ≈6635ms ? ? ≈329ms ? N/A1 MacOS (arm64) ≈2361ms ≈141843ms ≈6635ms ≈24224ms ? ≈173ms ? N/A1 Linux (x64) ≈1996ms ≈279110ms ≈9325ms ≈27519ms ≈6711ms ≈173ms ? N/A1 Linux (x86) ? ? ≈9325ms ? ? ? ? N/A1 Linux (ARMv7l) ≈1996ms ? Requested ? ? ? ? N/A1 Linux (ARM64) ≈1996ms ? Requested ? ? ≈173ms ? N/A1
Memory Usage - (Average of runs) Median of used memory for main process and children ones) Electron Tauri NW.JS Wails NodeGui Neutralino Flutter .Net MAUI w/ Vue Windows (x64) ≈351MB (Debug) => ≈260MB (Release) ≈423MB (Debug) => ≈270MB (Release) ≈233MB (Debug) => ≈314MB (Release) ≈630MB (Debug) => ≈271MB (Release) ≈186MB (Debug) ≈648MB (Debug) => ≈432MB (Release) ≈772MB (Debug) => ≈57MB (Release) N/A1 MacOS (arm64) ≈408MB (Debug) => ≈305MB (Release) ≈224MB (Debug) => ≈71MB (Release) ≈925MB (Debug) => ≈533MB (Release) ≈282MB (Debug) => ≈86MB (Release) ≈158MB (Debug) ≈135MB (Debug) ≈839MB (Debug) N/A1 Linux (x64) ≈725MB (Debug) => ≈607MB (Release) ≈629MB (Debug) => ≈94MB (Release) ≈360MB (Debug) => ≈878MB (Release) ≈624MB (Debug) => ≈404MB (Release) ≈286MB (Debug) ≈964MB (Debug) => ≈893MB (Release) ≈555MB (Debug) N/A1
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 w/ Vue Windows (x64) ≈124MB (Debug) => ≈77MB (Release) ≈323MB (Debug) => ≈157MB (Release) ≈447MB (Debug) => ≈158MB (Release) ≈307MB (Debug) => ≈161MB (Release) ≈150MB (Debug) ≈309MB (Debug) => ≈282MB (Release) ≈771MB (Debug) => ≈31MB (Release) N/A1 MacOS (arm64) ≈171MB (Debug) => ≈78MB (Release) ≈3MB (Debug) => ≈74MB (Release) ≈568MB (Debug) => ≈185MB (Release) ≈183MB (Debug) => ≈70MB (Release) ≈91MB (Debug) ≈94MB (Debug) ≈670MB (Debug) N/A1 Linux (x64) ≈122MB (Debug) => ≈86MB (Release) ≈299MB (Debug) => ≈15MB (Release) ≈369MB (Debug) => ≈178MB (Release) ≈255MB (Debug) => ≈89MB (Release) ≈102MB (Debug) ≈442MB (Debug) => ≈414MB (Release) ≈528MB (Debug) N/A1
Electron Tauri NW.JS Wails NodeGui Neutralino Flutter .Net MAUI w/ Vue Windows (x64) ≈613ms (Debug) => ≈219ms (Release) ≈4329ms (Debug) => ≈488ms (Release) ≈9164ms (Debug) => ≈542ms (Release) ≈5533ms (Debug) => ≈483ms (Release) ? ? ≈34399ms (Debug) => ≈68ms (Release) N/A1 MacOS (arm64) ≈637ms (Debug) => ≈384ms (Release) ≈3431ms (Debug) => ≈1228ms (Release) ≈4385ms (Debug) => ≈529ms (Release) ≈4009ms (Debug) => ≈1131ms (Release) ? ≈1217ms (Debug) ≈13175ms (Debug) N/A1 Linux (x64) ≈407ms (Debug) => ≈273ms (Release) ≈31658ms (Debug) => ≈25289ms (Release) ≈6119ms (Debug) => ≈449ms (Release) ≈3090ms (Debug) => ≈219ms (Release) ? ≈420ms (Debug) => ≈281ms (Release) ≈28908ms (Debug) N/A1
1 : Benchmark WIP (See #319 )
See source in benchmark/02-empty-app-frameless folder.
Electron Tauri NW.JS Wails NodeGui Neutralino Flutter .Net MAUI w/ Vue Windows (x64) ≈313MB ≈3MB ≈500MB ≈10MB ≈171MB ≈2MB N/A1 N/A2 Windows (x86) ≈280MB ? ≈442MB ? ? ? N/A1 N/A2 Windows (ARM64) ≈316MB ? Requested ? ? ? N/A1 N/A2 MacOS (x64) ≈480MB ? ≈646MB ? ? ≈1MB N/A1 N/A2 MacOS (arm64) ≈457MB ≈4MB ≈584MB ≈7MB ? ≈2MB N/A1 N/A2 Linux (x64) ≈298MB ≈4MB ≈599MB ≈8MB ≈75MB ≈1MB N/A1 N/A2 Linux (x86) ? ? ≈603MB ? ? ? N/A1 N/A2 Linux (ARMv7l) ≈230MB ? Requested ? ? ? N/A1 N/A2 Linux (ARM64) ≈303MB ? Requested ? ? ≈1MB N/A1 N/A2
Electron Tauri NW.JS Wails NodeGui Neutralino Flutter .Net MAUI w/ Vue Windows (x64) ≈23163ms ≈234960ms ≈9844ms ≈5986ms ≈9703ms ≈323ms N/A1 N/A2 Windows (x86) ≈23163ms ? ≈9844ms ? ? ? N/A1 N/A2 Windows (ARM64) ≈23163ms ? Requested ? ? ? N/A1 N/A2 MacOS (x64) ≈1832ms ? ≈4847ms ? ? ≈345ms N/A1 N/A2 MacOS (arm64) ≈1832ms ≈133027ms ≈4847ms ≈38105ms ? ≈323ms N/A1 N/A2 Linux (x64) ≈1856ms ≈277606ms ≈9858ms ≈26347ms ≈6375ms ≈323ms N/A1 N/A2 Linux (x86) ? ? ≈9858ms ? ? ? N/A1 N/A2 Linux (ARMv7l) ≈1856ms ? Requested ? ? ? N/A1 N/A2 Linux (ARM64) ≈1856ms ? Requested ? ? ≈323ms N/A1 N/A2
Memory Usage - (Average of runs) Median of used memory for main process and children ones) Electron Tauri NW.JS Wails NodeGui Neutralino Flutter .Net MAUI w/ Vue Windows (x64) ≈6MB (Debug) => ≈4MB (Release) ≈6MB (Debug) => ≈4MB (Release) ≈6MB (Debug) => ≈4MB (Release) ≈4MB (Debug) => ≈4MB (Release) ≈6MB (Debug) ≈6MB (Debug) => ≈4MB (Release) N/A1 N/A2 MacOS (arm64) ≈409MB (Debug) => ≈306MB (Release) ≈221MB (Debug) => ≈68MB (Release) ≈926MB (Debug) => ≈534MB (Release) ≈276MB (Debug) => ≈83MB (Release) ≈158MB (Debug) ≈132MB (Debug) N/A1 N/A2 Linux (x64) ≈722MB (Debug) => ≈603MB (Release) ≈628MB (Debug) => ≈94MB (Release) ≈357MB (Debug) => ≈879MB (Release) ≈625MB (Debug) => ≈404MB (Release) ≈286MB (Debug) ≈962MB (Debug) => ≈891MB (Release) 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 w/ Vue Windows (x64) ≈158MB (Debug) => ≈98MB (Release) ≈256MB (Debug) => ≈173MB (Release) ≈288MB (Debug) => ≈135MB (Release) ≈301MB (Debug) => ≈178MB (Release) ≈116MB (Debug) ≈345MB (Debug) => ≈302MB (Release) N/A1 N/A2 MacOS (arm64) ≈170MB (Debug) => ≈39MB (Release) ≈44MB (Debug) => ≈73MB (Release) ≈561MB (Debug) => ≈185MB (Release) ≈185MB (Debug) => ≈72MB (Release) ≈90MB (Debug) ≈94MB (Debug) N/A1 N/A2 Linux (x64) ≈139MB (Debug) => ≈69MB (Release) ≈336MB (Debug) => ≈15MB (Release) ≈366MB (Debug) => ≈171MB (Release) ≈282MB (Debug) => ≈91MB (Release) ≈103MB (Debug) ≈436MB (Debug) => ≈399MB (Release) N/A1 N/A2
Electron Tauri NW.JS Wails NodeGui Neutralino Flutter .Net MAUI w/ Vue Windows (x64) ≈819ms (Debug) => ≈299ms (Release) ≈4371ms (Debug) => ≈565ms (Release) ≈9283ms (Debug) => ≈594ms (Release) ≈5928ms (Debug) => ≈565ms (Release) ≈4888ms (Debug) ? N/A1 N/A2 MacOS (arm64) ≈466ms (Debug) => ≈295ms (Release) ≈2740ms (Debug) => ≈1195ms (Release) ≈3811ms (Debug) => ≈533ms (Release) ≈6993ms (Debug) => ≈1414ms (Release) ? ≈1553ms (Debug) N/A1 N/A2 Linux (x64) ≈393ms (Debug) => ≈267ms (Release) ≈31137ms (Debug) => ≈25251ms (Release) ≈5990ms (Debug) => ≈434ms (Release) ≈2956ms (Debug) => ≈209ms (Release) ? ≈407ms (Debug) => ≈274ms (Release) N/A1 N/A2
1 : Frameless mode not supported yet 2 : Frameless mode not working
See Issues and Pull requests . You can participate by proposing new issues, or by filling them!
List of contributors to this repository