Skip to content

An objective comparison of multiple frameworks that allow us to "transform" our web apps to desktop applications.

License

Notifications You must be signed in to change notification settings

Elanis/web-to-desktop-framework-comparison

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

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.

Table Of Content

Major characteristics

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.

Features

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

Front-end frameworks/technologies

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

Operating systems support

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

Benchmarks

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.

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) β‰ˆ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

Build time

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

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) β‰ˆ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

Start duration

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)

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) β‰ˆ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

Build time

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

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) β‰ˆ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

Start duration

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

Future content

See Issues and Pull requests. You can participate by proposing new issues, or by filling them!

Contributors

List of contributors to this repository