How to Build Standalone Desktop Apps: A Complete Guide to Electron, Tauri, Neutralinojs, Flutter and More

Building a website is relatively easy.

Building a standalone desktop application is a different challenge.

A website normally runs inside a browser. A standalone application is installed on the user's computer and can have its own icon, window, menus, file-system access, local storage, system integration, installer, updater and operating-system permissions.

Modern developers have many ways to turn web technologies, native languages or cross-platform frameworks into installable desktop software.

Some frameworks allow a developer to use HTML, CSS and JavaScript. Others use Rust, Go, Dart, C++, C# or XAML.

Popular choices include:

  • Electron

  • Tauri

  • Neutralinojs (neu)

  • NW.js

  • Wails

  • Flutter

  • .NET MAUI

  • Qt

  • Avalonia

There are also other approaches, including JavaFX, NodeGui, native Win32/WPF applications, Swift/AppKit, Windows App SDK and platform-specific technologies.

The important question is not:

"Which framework is the best?"

The better question is:

"Which technology fits the application, team, operating systems and distribution requirements?"

This article explains the major approaches, their requirements, advantages, disadvantages, project configuration files and representative configuration examples.

The examples are intentionally small and educational. Framework configuration formats change between major versions, so developers should verify the exact syntax against the documentation for the version they are actually using before building a production application.


What Is a Standalone Desktop App?

A standalone desktop application is software that users install or execute directly on an operating system rather than accessing exclusively through a web browser.

Examples include:

  • Image editors

  • Accounting software

  • PDF tools

  • Developer utilities

  • School management applications

  • Database tools

  • Media players

  • Productivity software

  • Offline utilities

  • Desktop AI applications

  • Business management systems

  • Data-analysis applications

  • File conversion tools

A desktop application can be:

Online

Connected to cloud services or APIs.

Offline

Working completely without an internet connection.

Hybrid

Using local functionality while communicating with cloud services when necessary.

The framework you choose determines how much of the application is native, how the user interface is rendered and what operating-system facilities are available.


The Three Major Desktop-App Strategies

Most cross-platform desktop development falls into three broad categories.

1. Web technology wrapped in a desktop runtime

Examples:

  • Electron

  • NW.js

  • Neutralinojs

  • Tauri

  • Wails

These are attractive to web developers because HTML, CSS and JavaScript can remain part of the user interface.


2. Cross-platform native-style UI frameworks

Examples:

  • Flutter

  • .NET MAUI

  • Avalonia

  • Qt

These generally provide their own UI frameworks and are better suited to applications that require a more application-oriented architecture.


3. Platform-native development

Examples include:

  • Windows App SDK

  • WinUI

  • Win32

  • WPF

  • Cocoa/AppKit

  • SwiftUI

  • GTK

These can provide excellent platform integration but generally require more platform-specific development.

For a product intended for Windows, macOS and Linux, cross-platform frameworks can significantly reduce duplicated work.


Before Choosing a Framework

Do not start by installing Electron or Flutter.

Start by writing down the application's requirements.

Ask:

  1. Which operating systems must be supported?

  2. Does the application need internet access?

  3. Does it need to read and write files?

  4. Does it need a database?

  5. Does it need system notifications?

  6. Does it need a tray icon?

  7. Does it need hardware access?

  8. Does it need background processes?

  9. Does it need auto-updates?

  10. Does it need Microsoft Store distribution?

  11. Does it need Apple's App Store?

  12. Does it need Linux packages?

  13. Does it need a very small installer?

  14. Does the team already know JavaScript, Rust, Go, Dart or C#?

These answers can change the best technology choice completely.


1. Electron

Electron is one of the most established ways to create cross-platform desktop applications using web technologies.

It combines Chromium and Node.js so developers can build Windows, macOS and Linux applications using JavaScript, HTML and CSS. Electron's official documentation describes this architecture directly.

This makes Electron particularly attractive to web developers.

If you already know:

  • HTML

  • CSS

  • JavaScript

  • React

  • Vue

  • Angular

  • TypeScript

Electron is one of the easiest desktop-development paths to understand.


Electron Architecture

A simplified Electron application normally has:

my-app/
├── package.json
├── main.js
├── preload.js
├── renderer/
│   ├── index.html
│   ├── app.js
│   └── style.css
└── assets/

The important distinction is between:

Main process

Controls application windows and privileged desktop operations.

Renderer process

Displays the user interface.

Preload script

Provides a controlled bridge between the renderer and privileged functionality.

This separation is extremely important for security.


Electron Requirements

A typical Electron development environment requires:

  • Node.js

  • npm or another Node package manager

  • Electron

  • A code editor or IDE

  • Platform-specific build/signing tools when required

Electron's official tutorial installs Electron as a development dependency and uses package.json as part of the project configuration.


Electron package.json Example

A simplified configuration can look like:

{
  "name": "example-desktop-app",
  "version": "1.0.0",
  "description": "A standalone desktop application",
  "main": "main.js",
  "scripts": {
    "start": "electron .",
    "make": "electron-forge make"
  },
  "devDependencies": {
    "electron": "^VERSION",
    "@electron-forge/cli": "^VERSION"
  }
}

The exact version should be replaced with a current compatible release rather than copying a version number from an old article.


Electron Forge

Electron itself provides the runtime, but packaging and distribution require additional tooling.

Electron's official documentation recommends Electron Forge as an integrated packaging and distribution solution. Forge can package an application and generate platform-specific distributables.

A simplified Forge configuration can look like:

module.exports = {
  packagerConfig: {
    name: "ExampleApp",
    icon: "./assets/icon"
  },

  makers: [
    {
      name: "@electron-forge/maker-squirrel"
    }
  ]
};

A real project may contain different makers for Windows, macOS and Linux.


Electron Pros

Excellent web compatibility

Developers can reuse existing HTML, CSS and JavaScript skills.

Huge ecosystem

There are many libraries and examples available.

Mature tooling

Electron has established packaging, debugging and distribution workflows.

Excellent for complex applications

Electron is suitable for sophisticated applications that need extensive Node.js integration.

Strong framework compatibility

React, Vue, Angular and other frontend systems can be used.


Electron Cons

Larger application footprint

Electron bundles a Chromium-based runtime, which can increase application size and memory usage.

Security responsibility

Node.js access and web content must be carefully separated.

Resource consumption

Electron applications can use more RAM and CPU than some lighter alternatives.

Packaging complexity

Professional distribution requires attention to installers, signing, updates and platform-specific behavior.


When Electron Makes Sense

Choose Electron when:

  • Your team is strong in JavaScript.

  • You already have a web application.

  • You need a large ecosystem.

  • You need Node.js integration.

  • Application size is less important than development speed.

Electron remains one of the safest choices when developer productivity and ecosystem maturity are the main priorities.


2. Tauri

Tauri takes a different approach.

Instead of bundling Chromium with every application, Tauri uses the operating system's webview for rendering while the backend is written in Rust.

Tauri 2 also provides a permission and capability system that lets developers control which windows or webviews can access particular native functionality.

The conceptual architecture is:

HTML/CSS/JavaScript
        ↓
System WebView
        ↓
Tauri
        ↓
Rust
        ↓
Operating System

This can result in applications with a smaller footprint than traditional Chromium-bundled desktop frameworks, although actual application size depends on the project and dependencies.


Tauri Requirements

Typical requirements include:

  • Node.js for many frontend workflows

  • Rust toolchain

  • Tauri CLI

  • Operating-system build dependencies

  • WebView support supplied by the target operating system

A Tauri project commonly contains:

my-app/
├── package.json
├── src/
└── src-tauri/
    ├── Cargo.toml
    ├── src/
    ├── capabilities/
    └── tauri.conf.json

Tauri's official documentation identifies tauri.conf.json, Cargo.toml, the Rust source directory and capability files as important parts of the project structure.


Tauri Configuration Example

A simplified src-tauri/tauri.conf.json might look like:

{
  "$schema": "https://schema.tauri.app/config/2",
  "productName": "ExampleApp",
  "version": "1.0.0",
  "identifier": "com.example.exampleapp",

  "build": {
    "frontendDist": "../dist"
  },

  "app": {
    "windows": [
      {
        "title": "Example App",
        "width": 1200,
        "height": 800
      }
    ]
  },

  "bundle": {
    "active": true
  }
}

This is a conceptual example. Actual fields depend on the Tauri version and project structure.


Tauri Capabilities

One of Tauri's important security concepts is its capability system.

A capability file can look like:

{
  "$schema": "../gen/schemas/desktop-schema.json",
  "identifier": "main-window",
  "description": "Permissions for the main application window",
  "windows": [
    "main"
  ],
  "permissions": [
    "core:window:default",
    "core:path:default"
  ]
}

Tauri's documentation describes capability files as JSON or TOML files inside the src-tauri/capabilities directory and uses them to control access to native APIs.

This is a major architectural advantage when security boundaries matter.


Tauri Pros

Smaller architecture

The application does not need to bundle an entire Chromium runtime in the same way Electron does.

Rust backend

Rust provides strong memory-safety properties and excellent performance.

Strong permission model

Tauri allows granular control over native capabilities.

Web frontend

You can continue using HTML, CSS and JavaScript.

Good for modern applications

It is particularly attractive for developers who want web UI with a lightweight native layer.


Tauri Cons

Rust learning curve

Developers who only know JavaScript may find Rust significantly harder.

Native dependencies

Setting up Rust and operating-system dependencies can be more complicated than Electron.

Webview differences

Because the operating system provides the webview, platform differences can matter.

Debugging can span multiple layers

A complicated application may involve JavaScript, Rust, webview behavior and operating-system APIs.


When Tauri Makes Sense

Tauri is attractive when you want:

Modern web UI + native backend + smaller footprint + strong permissions

It is particularly interesting for developers who are willing to learn Rust.


3. Neutralinojs — the neu Approach

Neutralinojs is another lightweight way to build desktop applications using web technologies.

Its CLI is called neu.

The official CLI can create, run and build Neutralinojs applications.

Neutralinojs aims to avoid the large runtime footprint associated with Chromium/Node-based frameworks.

Its official documentation describes it as a lightweight cross-platform framework supporting Windows, macOS, Linux and web environments.


Neutralinojs Requirements

A simple development setup generally requires:

  • Node.js

  • npm

  • @neutralinojs/neu

  • HTML/CSS/JavaScript

  • Optional frontend framework

Install the CLI:

npm install -g @neutralinojs/neu

Then create an application:

neu create myapp

Neutralino's official CLI documentation confirms these commands and the build workflow.


Neutralino Configuration

The main configuration file is:

neutralino.config.json

A simple example:

{
  "applicationId": "com.example.myapp",
  "version": "1.0.0",
  "defaultMode": "window",

  "url": "/",

  "enableServer": true,
  "enableNativeAPI": true,

  "cli": {
    "binaryName": "myapp",
    "resourcesPath": "/resources/"
  }
}

Neutralino's documentation identifies applicationId, version, defaultMode, url, server settings, native API settings and CLI build settings as important configuration areas.


Neutralino Build

The basic workflow is:

neu run

for development and:

neu build

for a production build.

The CLI can produce platform binaries and can also create portable releases or embed resources into the executable.


Neutralino Pros

Very lightweight

It is designed as a lighter alternative to Chromium-heavy frameworks.

Familiar web development

HTML, CSS and JavaScript remain central.

Simple configuration

The project structure is relatively straightforward.

Easy for small utilities

It can be excellent for lightweight desktop tools.


Neutralino Cons

Smaller ecosystem

The ecosystem is not as large as Electron's.

Less suitable for very complex desktop products

Applications requiring extensive native integrations may require more investigation.

Smaller developer community

Finding solutions for unusual problems may be harder.

Advanced native requirements

Complex native functionality may require extensions or additional development.


When Neutralinojs Makes Sense

Neutralinojs is worth considering for:

  • Lightweight utilities

  • Small business tools

  • Simple desktop wrappers

  • Offline applications

  • Web-based productivity tools

  • Small cross-platform applications

For a simple application where Electron feels unnecessarily heavy, Neutralinojs can be an interesting option.


4. Wails

Wails takes the web-frontend approach and combines it with Go.

The architecture is:

HTML/CSS/JavaScript
        ↓
Web frontend
        ↓
Wails
        ↓
Go backend
        ↓
Operating System

Wails describes itself as a framework for building desktop applications with Go and web technologies and supports Windows, macOS and Linux.


Wails Requirements

Wails requires:

  • Go

  • Platform-specific development tools

  • A web frontend toolchain when using frontend frameworks

  • WebView support

Current Wails 3 documentation lists Go 1.24 or later as a requirement and explains platform-specific dependencies such as WebView2 on Windows and WebKit/GTK dependencies on Linux.


Wails Project Configuration

Wails 3 uses:

build/config.yml

for important application metadata.

Example:

info:
  productName: "Example App"
  productIdentifier: "com.example.exampleapp"
  productVersion: "1.0.0"
  companyName: "Example Company"
  productDescription: "A cross-platform desktop application"

The official Wails documentation identifies build/config.yml as the project configuration file for product metadata and packaging information.

A typical project also contains:

build/
go.mod
go.sum
main.go
Taskfile.yml
frontend/

Wails 3's generated project structure includes build configuration, Go modules, application code and task files.


Wails Pros

Go backend

Go is relatively simple compared with Rust.

Web frontend

Existing web-development skills remain useful.

Small runtime approach

Wails uses the operating system's webview rather than shipping a complete browser runtime.

Strong performance

Go provides good performance for many application workloads.

Good for developers who dislike Rust

This is one of Wails' most attractive characteristics.


Wails Cons

Smaller ecosystem than Electron

The community is much smaller.

Requires Go knowledge

Web developers need to learn Go for serious native functionality.

Platform dependencies

Linux, macOS and Windows have different build requirements.

WebView dependency

The application depends on platform webview technology.


5. NW.js

NW.js is another established technology for building desktop applications using web technologies.

Historically known as Node-WebKit, NW.js allows Node.js modules to be used directly from a web-based application environment.

It can be attractive to developers who want deep Node.js integration while using a browser-based interface.


NW.js Configuration

NW.js uses:

package.json

as its application manifest.

A minimal configuration is:

{
  "name": "example-app",
  "main": "index.html"
}

The official NW.js documentation states that these two fields are sufficient for a minimal application.

A more detailed manifest can contain window configuration:

{
  "name": "example-app",
  "main": "index.html",

  "window": {
    "title": "Example App",
    "width": 1200,
    "height": 800,
    "resizable": true
  }
}

NW.js Pros

Direct Node.js access

Node.js functionality can be integrated closely with the application.

Web technologies

HTML, CSS and JavaScript remain the primary UI technologies.

Mature concept

NW.js has been around for many years.

Useful for existing web/Node applications

Projects that already depend heavily on Node.js may find it familiar.


NW.js Cons

Large runtime

Like other browser-runtime approaches, the application can be relatively large.

Less popular today

Electron has become the dominant choice for many JavaScript desktop projects.

Packaging complexity

Distribution requires attention to platform-specific packaging.

Ecosystem perception

New developers may find Electron has more current examples and community resources.


6. Flutter Desktop

Flutter takes a different route.

Instead of using HTML and CSS for the interface, Flutter uses Dart and its own widget-based rendering system.

Flutter supports desktop development for Windows, macOS and Linux, in addition to its mobile and web targets.

A Flutter application is generally written in Dart:

Flutter
   ↓
Dart
   ↓
Flutter widgets
   ↓
Desktop platform

Flutter Requirements

A Flutter desktop development environment generally requires:

  • Flutter SDK

  • Dart, included with Flutter

  • IDE/editor

  • Platform-specific desktop toolchain

  • Appropriate SDKs and compilers

For Windows development, Flutter's documentation covers Visual Studio requirements and Windows-specific build and packaging processes.

For Linux, Flutter requires the relevant system libraries and development environment.


Flutter's Main Configuration File

Flutter applications use:

pubspec.yaml

This file defines project metadata and dependencies.

Example:

name: example_desktop_app
description: A cross-platform desktop application
publish_to: "none"

version: 1.0.0+1

environment:
  sdk: ">=3.0.0 <4.0.0"

dependencies:
  flutter:
    sdk: flutter

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true

Flutter's official documentation confirms that every Dart/Flutter project contains a pubspec.yaml file and that it manages project metadata and dependencies.


Flutter Versioning

A Flutter project can contain:

version: 1.0.0+1

The first part represents the application version, while the number after + can represent the build number.

Flutter's Windows deployment documentation specifically describes how these values are used in Windows application packaging.


Flutter Pros

Excellent UI system

Flutter gives developers a consistent widget-based UI.

Strong cross-platform strategy

The same codebase can target mobile and desktop.

Attractive for application products

Flutter is especially strong when the application has a rich custom interface.

Good developer tooling

Hot reload and a mature development environment make iteration fast.

Excellent if mobile is also required

A product can potentially share much of its architecture between desktop and mobile.


Flutter Cons

Requires Dart

Web developers need to learn another language.

Desktop is not the original reason Flutter became popular

The ecosystem remains heavily associated with mobile development.

Native integration sometimes requires platform-specific code

Desktop APIs can require additional work.

UI is Flutter-rendered

This can be an advantage or disadvantage depending on whether you want highly consistent visuals or deeply native platform controls.


Flutter Desktop Distribution

For Windows, Flutter can produce desktop applications and supports packaging approaches such as MSIX. The official deployment documentation covers Windows packaging and Microsoft Store validation.

Linux builds produce a bundle containing the executable, libraries and data assets.


7. .NET MAUI

.NET MAUI is Microsoft's cross-platform application framework for .NET developers.

It allows developers to build applications using:

  • C#

  • XAML

  • .NET

It targets Android, iOS, Windows and macOS through the appropriate platform technologies.

For developers already comfortable with C#, .NET MAUI can be an excellent choice.


.NET MAUI Requirements

Current Microsoft documentation requires a modern Visual Studio environment on Windows for typical development, with Visual Studio 2022 17.12 or later and the .NET MAUI workload.

Developers can also use Visual Studio Code with the appropriate extension.

For iOS and Mac Catalyst development, Apple tooling and a compatible Mac are required.


.NET MAUI Project Configuration

A simplified .csproj might look like:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>
      net10.0-android;
      net10.0-windows10.0.19041.0
    </TargetFrameworks>

    <OutputType>Exe</OutputType>
    <RootNamespace>ExampleApp</RootNamespace>
    <UseMaui>true</UseMaui>
    <SingleProject>true</SingleProject>

    <ApplicationTitle>Example App</ApplicationTitle>
    <ApplicationId>com.example.exampleapp</ApplicationId>
  </PropertyGroup>

</Project>

The exact target frameworks and properties should be generated by the current .NET MAUI project template rather than copied blindly from an article.


.NET MAUI Pros

Excellent for C# developers

A developer already using .NET can move naturally into MAUI.

Microsoft ecosystem

Strong integration with the .NET ecosystem.

Mobile and desktop

Useful when one application needs both.

Large .NET ecosystem

Access to NuGet libraries and established development tooling.


.NET MAUI Cons

More complicated platform setup

Android, Windows, macOS and iOS have different requirements.

Apple development requires Apple hardware

For Apple's platforms, a Mac is part of the practical development workflow.

Desktop-first applications may have alternatives

For a Windows/macOS/Linux desktop-only application, frameworks such as Avalonia or Qt may sometimes be more natural.


8. Avalonia UI

Avalonia is a cross-platform .NET UI framework.

It is particularly interesting for developers who like the C# and XAML programming model but want broader desktop platform support.

Avalonia describes itself as a cross-platform UI framework for .NET and supports Windows, macOS and Linux, with additional platform targets.


Avalonia Requirements

Current Avalonia documentation requires .NET 8 or later for desktop development.

Projects can be created through standard .NET templates.

For example:

dotnet new install Avalonia.Templates
dotnet new avalonia.mvvm -o ExampleApp
cd ExampleApp
dotnet run

The official documentation recommends the MVVM template for new applications.


Avalonia Project Files

A typical application contains:

ExampleApp/
├── App.axaml
├── Program.cs
├── Views/
│   └── MainWindow.axaml
├── ViewModels/
├── ExampleApp.csproj
└── ...

The Avalonia documentation identifies App.axaml, MainWindow.axaml, Program.cs and view-model files as important pieces of the generated project.


Avalonia Configuration Example

A simplified .csproj could look like:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Avalonia"
                      Version="CURRENT_VERSION" />

    <PackageReference Include="Avalonia.Desktop"
                      Version="CURRENT_VERSION" />

    <PackageReference Include="Avalonia.Themes.Fluent"
                      Version="CURRENT_VERSION" />
  </ItemGroup>

</Project>

The actual package versions should be selected from the current Avalonia release rather than hard-coded from an old tutorial.


Avalonia Pros

Excellent desktop focus

It is particularly suitable for desktop applications.

C# and XAML

Familiar to WPF developers.

Cross-platform rendering

Avalonia uses its own rendering approach rather than simply wrapping the platform's native controls.

Strong Windows developer experience

Developers coming from WPF may find the concepts familiar.


Avalonia Cons

Smaller ecosystem than .NET itself

It is not as ubiquitous as standard .NET UI technologies.

Learning curve for non-.NET developers

JavaScript developers would need to learn C# and XAML.

Some platform-specific functionality requires additional work

No cross-platform UI framework eliminates platform differences completely.


9. Qt

Qt is one of the most established cross-platform application frameworks.

It is particularly important for serious desktop software, industrial software, embedded applications and applications where native-level capabilities and performance matter.

Qt can be used with C++ and also has bindings for other languages.

Modern Qt projects commonly use CMake.


Qt Requirements

A typical Qt development environment may include:

  • Qt SDK

  • C++ compiler

  • CMake

  • Qt Creator or another IDE

  • Platform-specific development tools

Qt's documentation provides official CMake-based project workflows and explains that CMakeLists.txt is the main CMake project file.


Qt CMake Example

A minimal example:

cmake_minimum_required(VERSION 3.16)

project(ExampleApp VERSION 1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Widgets)

qt_add_executable(ExampleApp
    main.cpp
)

target_link_libraries(ExampleApp PRIVATE
    Qt6::Widgets
)

The exact minimum CMake version and Qt components should follow the version of Qt being used.


Qt qmake

Qt also has its traditional qmake project system.

A basic .pro file can look like:

QT += widgets

CONFIG += c++17

SOURCES += \
    main.cpp

Qt's qmake documentation explains that .pro project files describe the sources and configuration used to generate build files.

For new Qt projects, however, CMake is increasingly the preferred modern build approach.


Qt Pros

Mature technology

Qt has decades of development behind it.

Powerful

It is suitable for complex professional applications.

Cross-platform

Windows, macOS, Linux and other environments can be targeted.

Excellent native integration

Qt provides extensive APIs.

Strong graphics capabilities

Useful for sophisticated interfaces and specialized applications.


Qt Cons

C++ complexity

C++ has a significantly steeper learning curve than JavaScript.

Larger development ecosystem to learn

Qt itself is a large framework.

Licensing must be understood

Qt has different licensing arrangements, and commercial developers need to carefully understand which license applies to their project.

More engineering overhead

For a simple CRUD utility, Qt can be more framework than necessary.


Comparing the Major Frameworks

FrameworkMain LanguageUIRuntime ApproachBest For
ElectronJavaScript/TypeScriptHTML/CSSChromium + Node.jsWeb developers
TauriRust + JSWeb UISystem WebView + RustLightweight modern apps
NeutralinojsJavaScriptHTML/CSSLightweight native runtimeSmall utilities
WailsGo + JSWeb UISystem WebView + GoGo developers
NW.jsJavaScriptHTML/CSSChromium + Node.jsNode/web applications
FlutterDartFlutter widgetsFlutter engineRich cross-platform apps
.NET MAUIC# / XAMLNative/platform UI.NET platform stack.NET + mobile/desktop
AvaloniaC# / XAMLAvalonia UICross-platform rendererDesktop .NET apps
QtC++Qt Widgets/QMLNative frameworkProfessional software

Which Framework Produces the Smallest App?

This question is often asked incorrectly.

Application size depends on:

  • Runtime

  • Dependencies

  • Assets

  • Libraries

  • Compression

  • Packaging

  • Debug symbols

  • Architecture

  • Included language runtime

Therefore, saying:

"Framework X always produces the smallest application"

is usually an oversimplification.

Generally, however:

Electron and NW.js carry substantial browser-runtime components.

Tauri, Wails and Neutralinojs aim for lighter runtime architectures.

Flutter carries its own rendering engine.

Qt carries the relevant Qt libraries.

.NET applications depend on their .NET deployment model.

The correct comparison should be made using actual release builds of the application you intend to ship.


Which Framework Is Best for HTML/CSS Developers?

If you already know:

  • HTML

  • CSS

  • JavaScript

  • TypeScript

your most natural choices are:

Electron

Best-known ecosystem.

Tauri

Excellent modern alternative if you are willing to learn Rust.

Neutralinojs

Very attractive for lightweight utilities.

Wails

Interesting if you are willing to learn Go.

NW.js

Useful when deep Node.js integration is important.


Which Framework Is Best for C# Developers?

The strongest candidates are:

Avalonia

Excellent for desktop-focused cross-platform applications.

.NET MAUI

Particularly attractive if Android and iOS are also important.

Windows App SDK / WinUI

Excellent if Windows is the primary target.


Which Framework Is Best for Mobile + Desktop?

Flutter is one of the strongest choices when a product needs:

Android + iOS + Windows + macOS + Linux

from a largely unified codebase.

.NET MAUI is another strong choice for developers already invested in .NET.

The correct choice depends heavily on the UI requirements and platform integrations.


Which Framework Is Best for a Windows-Only App?

If the product is exclusively for Windows, cross-platform development may not even be necessary.

Possible technologies include:

  • WinUI

  • Windows App SDK

  • WPF

  • Win32

  • .NET

  • Electron

  • Tauri

  • Flutter

A Windows-only application that requires deep integration with Windows services may benefit from a Windows-native technology.

A web developer building a Windows utility may still find Electron or Tauri faster.


Which Framework Is Best for a Web-to-Desktop Conversion?

Suppose you already have:

HTML
CSS
JavaScript
React

Then the easiest migration paths are generally:

Electron

or

Tauri

or

Neutralinojs

or

Wails

depending on how much native backend functionality you need.

If the application is mostly a web interface with a few desktop functions, a lightweight webview framework can be especially attractive.


A Standalone App Is More Than an EXE

One of the biggest mistakes beginners make is thinking:

"I generated an EXE. My application is finished."

It is not.

A professional standalone application may require:

  • Application icon

  • Product name

  • Version number

  • Installer

  • Uninstaller

  • Code signing

  • Update mechanism

  • Crash reporting

  • Logging

  • File associations

  • Protocol handlers

  • Desktop shortcuts

  • Start-menu entry

  • Windows registry integration where appropriate

  • macOS application bundle configuration

  • Linux package configuration

  • Privacy policy

  • License

  • Store metadata

The application executable is only one part of the product.


Configuration Files Matter

Every framework has its own concept of configuration.

Some important examples are:

Electron

package.json
forge.config.js

Tauri

src-tauri/tauri.conf.json
src-tauri/Cargo.toml
src-tauri/capabilities/*.json

Neutralinojs

neutralino.config.json

Wails

build/config.yml
go.mod
Taskfile.yml

Flutter

pubspec.yaml

plus platform-specific project files.

.NET MAUI

*.csproj

plus platform-specific directories.

Avalonia

*.csproj
App.axaml

Qt

CMakeLists.txt

or, in older/traditional projects:

*.pro

NW.js

package.json

These files control important parts of the build.


Versioning Your Desktop App

Always establish a versioning strategy early.

For example:

1.0.0

can represent:

MAJOR.MINOR.PATCH

A common interpretation is:

MAJOR

Breaking changes.

MINOR

New features without major compatibility changes.

PATCH

Bug fixes and small improvements.

Build systems may also use a separate build number.

For example:

1.0.0+25

The exact versioning requirements differ between operating systems and app stores.


Architecture Matters More Than the Framework

A poor architecture will remain poor regardless of the framework.

For a serious desktop application, separate:

UI
│
├── State
│
├── Services
│
├── Business Logic
│
├── Data Access
│
├── Local Storage
│
└── Native Integration

Do not put the entire application into one JavaScript file or one gigantic UI class.


Example Application Architecture

Suppose you are creating a desktop invoice application.

A good structure might be:

src/
├── ui/
├── components/
├── services/
│   ├── invoice-service
│   └── customer-service
├── database/
├── models/
├── utilities/
└── main/

The UI should not directly contain all database logic.

Instead:

UI
 ↓
Service
 ↓
Repository
 ↓
Database

This makes the application easier to test and maintain.


Local Databases

Desktop applications frequently need local data.

Popular choices include:

  • SQLite

  • IndexedDB

  • JSON files

  • Local key-value storage

  • Embedded databases

SQLite is particularly useful for applications that need structured local data without requiring a separate database server.

For example:

customers
invoices
invoice_items
products
settings

can all live inside one local database.

But sensitive data should not simply be stored unencrypted because the application happens to be offline.

Security requirements should be considered from the beginning.


Security Is Critical

Desktop applications often have more privileges than websites.

A vulnerability can potentially expose:

  • Local files

  • API credentials

  • User documents

  • System commands

  • Database files

  • Tokens

Electron developers should carefully separate renderer content from privileged Node functionality.

Tauri's capability system exists partly to provide granular control over which application windows can access native functionality.

Neutralinojs also provides native APIs and security settings that should be configured carefully. Its documentation specifically warns about weakening token security when native APIs can access system internals.


Never Put Secret API Keys in the Frontend

This is a common mistake.

Bad:

const API_KEY = "MY_SECRET_KEY";

If that code ships inside the application, the key should be considered potentially recoverable by the user.

A better architecture is:

Desktop App
     ↓
Your Backend
     ↓
Third-Party API

The server controls the secret.

If direct client-side API access is unavoidable, use authentication mechanisms designed for that architecture and assume anything shipped to the client can eventually be inspected.


Code Signing

Professional desktop software should normally be digitally signed.

Code signing helps operating systems and users establish that the software came from the claimed publisher and has not been altered after signing.

Electron's documentation explicitly recommends code signing for distributed applications.

Store distribution can introduce additional packaging and certification requirements.

For example, Flutter's Windows documentation discusses validating packages with Microsoft's Windows App Certification Kit before store publication.


Installer vs Portable Application

There are two common distribution approaches.

Installer

Examples:

Setup.exe
MSI
MSIX
DMG
DEB
RPM

The installer places files where appropriate and can create shortcuts and registration entries.

Portable

The user extracts or launches the application without a conventional installation process.

Portable software can be convenient for utilities, but it may not provide all the integration expected from a professional desktop product.

The right approach depends on the application.


Auto-Updates

A serious commercial application may eventually need automatic updates.

A typical update system looks like:

Application
     ↓
Check update server
     ↓
New version available?
     ↓
Download
     ↓
Verify signature
     ↓
Install
     ↓
Restart

Never design an update mechanism that blindly downloads and executes arbitrary files.

Update security deserves the same attention as application security.


Cross-Platform Does Not Mean Identical

A major misconception is:

"I wrote the application once, so everything will behave exactly the same."

Real operating systems differ.

Windows has:

  • Registry

  • Win32

  • Windows Runtime

  • MSIX

  • Windows notifications

macOS has:

  • App bundles

  • Entitlements

  • Keychain

  • notarization

  • Apple signing

Linux has:

  • Multiple distributions

  • Different desktop environments

  • Different package systems

  • Different system libraries

Cross-platform frameworks reduce duplicated UI and business logic.

They do not eliminate operating-system differences.


Build on the Platforms You Target

Do not assume that a Windows build proves the macOS build works.

For example:

Windows → test Windows build
macOS   → test macOS build
Linux   → test Linux build

This becomes especially important when your application uses:

  • Native libraries

  • File paths

  • Hardware

  • Printing

  • System notifications

  • USB

  • Bluetooth

  • System tray

  • File associations

  • Native menus


Cross-Compilation Has Limits

Some frameworks can cross-compile more easily than others.

But cross-compilation does not always mean:

"Build every operating system from my Windows PC."

For example, Apple platform builds have signing and SDK requirements that generally involve Apple's development environment.

Wails documentation similarly distinguishes platform-specific build requirements and explains cross-platform build options.

Always design the CI/CD pipeline around the actual target platforms.


A Practical Decision Matrix

Choose Electron if:

You are primarily a JavaScript developer and need a mature ecosystem.

Choose Tauri if:

You want web technologies but prefer a lightweight Rust/native architecture.

Choose Neutralinojs if:

You need a lightweight desktop utility and do not require an enormous ecosystem.

Choose Wails if:

You like web development but want Go as the native backend.

Choose NW.js if:

Your existing application depends heavily on Node.js and browser technology.

Choose Flutter if:

You want one UI technology across mobile and desktop and are comfortable with Dart.

Choose .NET MAUI if:

You are already invested in C# and .NET and want mobile plus desktop applications.

Choose Avalonia if:

You want a desktop-focused cross-platform .NET solution with C# and XAML.

Choose Qt if:

You need a mature, powerful C++ framework for serious desktop or specialized applications.


What I Would Choose for Different Projects

Simple web-based utility

Neutralinojs or Tauri

Large JavaScript business application

Electron

Lightweight JavaScript desktop application

Tauri or Neutralinojs

Go-powered desktop software

Wails

Mobile + desktop product

Flutter

C# desktop application

Avalonia

C# mobile + desktop application

.NET MAUI

Industrial or high-performance professional application

Qt

Existing Node.js desktop application

Electron or NW.js

These are starting recommendations, not universal rules.


A Professional Development Workflow

A good standalone application project can follow this sequence:

Phase 1 — Requirements

Write down:

  • Target platforms

  • Required features

  • Offline requirements

  • Database requirements

  • API requirements

  • Security requirements

  • Distribution method

Phase 2 — Framework Selection

Compare:

  • Runtime size

  • Performance

  • Language

  • Native APIs

  • Community

  • Licensing

  • Packaging

  • Store support

  • Developer skills

Phase 3 — Prototype

Build only:

Window
+
Navigation
+
One major feature
+
Local storage

Do not build the entire product immediately.

Phase 4 — Architecture

Separate:

UI
Business Logic
Services
Database
Native APIs
Configuration

Phase 5 — Security

Review:

  • Secrets

  • Permissions

  • File access

  • Network access

  • Updates

  • User input

  • Authentication

Phase 6 — Packaging

Create:

  • Installer

  • Portable build if required

  • Application icon

  • Version metadata

  • Signing configuration

Phase 7 — Testing

Test:

  • Fresh installation

  • Upgrade

  • Uninstall

  • Offline operation

  • Different screen sizes

  • Different Windows versions where relevant

  • Different macOS versions where relevant

  • Different Linux distributions where relevant

Phase 8 — Distribution

Choose:

  • Direct download

  • Microsoft Store

  • Mac App Store

  • Snap

  • Flatpak

  • DEB/RPM

  • Enterprise deployment

  • Your own update server


The Most Important Lesson

Do not choose a framework because someone says:

"Tauri is faster."

Or:

"Electron is easier."

Or:

"Flutter is the future."

Or:

"Rust makes everything better."

These statements are incomplete.

The best framework is determined by the application's requirements.

A small desktop calculator and a professional video editor do not have the same engineering requirements.

A school management system and a hardware monitoring utility do not have the same requirements.

A Windows-only business application and a mobile-plus-desktop consumer application should not necessarily use the same technology.


Final Comparison

The desktop development landscape is now unusually flexible.

A web developer can transform an existing web application into a desktop product through technologies such as Electron, Tauri, Neutralinojs, Wails or NW.js.

A developer who wants a dedicated application UI can use Flutter, Avalonia, .NET MAUI or Qt.

The choice should be driven by:

Language

Performance

Application size

Native integration

Security

Platform requirements

Developer experience

Distribution

Long-term maintenance

The most important decision is not which framework is currently trending.

It is whether the framework can support the application five years from now.

A desktop application is a product, not simply an executable file.

Good software architecture, secure native integration, reliable packaging, code signing, updates, testing and maintainability matter just as much as the framework selected at the beginning.


Author's Research and Development Note

This article is based on the author's research, technical analysis and review of current official documentation from the relevant framework projects.

The configuration examples are illustrative templates, not universal copy-and-paste production configurations. Frameworks frequently change their CLI commands, configuration schemas, package versions, operating-system requirements and build systems.

Before starting a real project, developers should:

  • Check the current official documentation.

  • Verify the framework version.

  • Confirm supported operating systems.

  • Test the required native APIs.

  • Check current licensing terms.

  • Verify store and signing requirements.

  • Build a small proof of concept.

  • Test the application on every target operating system.

  • Review security requirements before deployment.

Never select a framework solely because an online article, video or AI assistant calls it "the best."

Do your own technical research before building a commercial application, investing in development tools or committing a product to a particular framework.

The best framework is the one that solves your actual engineering problem reliably, securely and economically.