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 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.

Features

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

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

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

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 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

Build time

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

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 .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

Start duration

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)

02-empty-app-frameless

See source in benchmark/02-empty-app-frameless folder.

Build size

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

Build time

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

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 .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

Start duration

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

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