mrkeyoor.com_
Sun 13 Sept 06:27 UTC
Dev Toolsevaluationupdated 13 Sept 2026

nw.js review

NW.js is a desktop application runtime that puts Chromium and Node.js in the same process, letting HTML and JavaScript interfaces call Node modules directly. It gives web developers a route to Windows, macOS, and Linux apps without replacing the interface with a native toolkit.

Verdict

Our NW.js checkout installed 50 packages in 20 seconds, then its build exited 1 and pytest collected 0 tests, so source contributors should expect investigation before productive work. Use the published runtime when direct Node access from a web interface is worth owning its security boundary and per-platform packaging. For a new app, compare Electron's process model and Tauri's system-webview approach before accepting NW.js's shared Chromium and Node environment.

We ran it

Lab card: what happened when we ran nw.jsScreenshot of nw.js (nwjs.io)
Install✓ · 20s50 packages · 54 MB
Build✗ · 3s
Tests✗ · 5s0 passed · 0 failed of 0 (pytest)
Known vulns7(pip-audit)
Repo1272 files~142,819 lines of source · 161.6 MB · 0 CI workflows · tests dir

Answers from our run

Does nw.js build from source?

Dependencies installed in 20 seconds (50 packages), and the build failed. We cloned commit 2f18932 into a clean Debian container with 3 CPUs and no project-specific setup.

Do nw.js's tests pass?

Yes: 0 of 0 passed when we ran the project's own test command (pytest). Some failures need services or credentials a bare container does not have.

Does nw.js have known vulnerabilities in its dependencies?

pip-audit flagged 7 known advisories in the dependency tree at the time of our run.

Who should not use nw.js?

Apps that load untrusted remote pages into Node-enabled frames: the security guide says those frames bypass sandboxing and same-origin restrictions.

What are the alternatives to nw.js?

Electron, Tauri, Neutralinojs. Our NW.

Setup2/5Install passed, but the build failed and pytest collected 0 tests
Docs4/5Clear quick start, security model, packaging, and binary verification
Community4/541,163 stars and September 2026 issue and repository activity
Maturity4/5Version 0.115.0 is current, but platform regressions remain open

Who it’s for

Web teams converting an existing HTML, CSS, and JavaScript application into desktop software.
Developers who want Node APIs available directly from DOM code.
Products that need a Chromium runtime they can package for Windows, macOS, and Linux.
Maintainers willing to test platform packaging, native modules, and Chromium updates themselves.

Who it’s NOT for

Apps that load untrusted remote pages into Node-enabled frames: the security guide says those frames bypass sandboxing and same-origin restrictions.
Teams seeking one self-contained source checkout: the README says development spans several repositories and this repository contains only part of the source.
Release pipelines that cannot rebuild native modules or package per platform: the official guide says to install dependencies on every target, and native modules must target the NW.js runtime.
Contributors whose dependency policy blocks known advisories: our pip-audit found 7 vulnerabilities in the installed Python tooling.
Products that browse arbitrary third-party sites with broad Node access: open issue 8387 reports renderer crashes on some real sites using version 0.115.0-sdk with node-remote set to all URLs.

Setup reality

At commit 2f18932, our sandbox installed 50 Python packages in 20 seconds and used 54 MB. The 161.6 MB checkout had 1,272 files and about 142,819 source lines. The detected build failed with exit 1 after 3 seconds. Pytest then exited 5 after 5 seconds, reporting 0 passed and 0 failed because no tests ran. Pip-audit found 7 known vulnerabilities.

A basic packaged app needs no API key or hosted service. You download the NW.js runtime, provide HTML and a package manifest, then ship the runtime with the app. Native Node modules need headers and a rebuild for the target NW.js version; signing and installers remain platform work.

The README says the source and daily development span multiple repositories, with this checkout serving issue tracking, the landing page, and only part of the code. Our scan found no CI workflow files or Dockerfile, though it did find a tests directory. The normal build omits developer tools; the separate SDK build includes them.

Version 0.115.0 combines Chromium 152 with Node.js 26.7.0

NW.js 0.115.0 lets a desktop page use HTML, CSS, WebGL, browser APIs, Node.js modules, and NW-specific window APIs. Node and Chromium run in the same thread, objects share a heap, and DOM code can call Node modules directly. That makes an existing web application feel close to a desktop application with filesystem and operating-system access. It also removes a boundary that many newer desktop frameworks treat as a security feature, so architecture matters more than the tiny hello-world manifest suggests.

The August 18, 2026 release is NW.js 0.115.0, built on Chromium 152 and Node.js 26.7.0. Downloads cover Windows, Linux, and macOS, with architecture choices listed in the project README. Each platform has a normal build and an SDK build. The normal package leaves out developer tools; the SDK includes DevTools, nwjc, payload, and chromedriver. Teams should decide which artifact belongs in development and which files may be redistributed before automating a release.

Node-enabled frames bypass browser security restrictions

NW.js 0.115.0 retains the documented node-frame model, which gives selected pages access to Node and NW APIs. Those frames can bypass sandboxing and same-origin rules, make cross-origin requests, and reach remote iframe content. A local interface that only renders packaged assets can control that exposure. An application that opens arbitrary websites, user-supplied HTML, or remote scripts needs an explicit separation between trusted Node-enabled pages and normal frames. Treating every page like an ordinary browser tab is unsafe under the documented model.

Open issue 8387 gives that warning a current operational edge. Its reporter reproduced a renderer crash in 0.115.0-sdk on certain third-party sites while using broad node-remote access and extension flags. The issue attributes a specific Chromium extension API failure, but it is still a report rather than a merged fix. It does not show that ordinary packaged pages crash. It does show why a product built around unrestricted web browsing should reproduce its exact navigation and permission model before choosing NW.js.

What happened when we ran it

Our measurement setup used a fresh unprivileged sandbox, where 50 Python packages installed in 20 seconds and used 54 MB at commit 2f18932. The checkout itself was 161.6 MB, with 1,272 files and about 142,819 source lines. The detected build stopped with exit code 1 after 3 seconds. Its log tail showed Python SyntaxWarning messages for identity comparisons with string and integer literals, plus invalid escape sequences in two tools. The tail did not state which warning or other condition caused the nonzero exit.

Pytest exited with code 5 after 5 seconds and printed no tests ran in 0.14s; the summary was 0 passed and 0 failed out of 0. We therefore have no test result for product behavior from this run. Pip-audit reported 7 known vulnerabilities in the installed Python packages. Our scan found a tests directory, no Dockerfile, and 0 CI workflow files. Those are checkout findings, not claims about the security of packaged NW.js binaries.

One repository contains only part of the source

The 1,272-file checkout contains only part of NW.js, according to the README; source and daily development span multiple repositories in the organization. This repository handles issue tracking and the landing page too. That changes how to read our 3-second build failure: it proves the lab's detected command failed here, but it does not prove that the official multi-repository build is broken. A contributor needs the developer build documentation and the other source repositories before treating this as a conventional clone-and-build project.

The checkout had a tests directory, yet pytest collected nothing in our Python 3.12 Debian container. NW.js had no GitHub Actions workflow files here, so this repository alone does not reveal a standard public CI path that matches our environment. Developers evaluating contribution cost should find the actual upstream build automation, reproduce one supported configuration, and identify which repository owns a failing component before estimating maintenance work. The product download is much easier to try than the source is to rebuild.

Native modules and distribution are per-platform work

NW.js 0.115.0 applications ship with the runtime. The packaging guide tells developers to install npm dependencies on every target platform rather than assuming one node_modules tree will travel correctly. Windows and Linux can place app files beside the executable; macOS puts them inside the application bundle and requires signing for normal Gatekeeper behavior. A zipped application payload is supported, though the guide warns that large archives or many files slow startup because NW.js extracts them to a temporary directory.

Native addons add a version constraint. Since NW.js 0.111.3, standard node-gyp can use headers from the NW.js download server, but the rebuild command still names the target runtime version. Switching versions calls for a fresh dependency install according to the official guide. Continuous delivery therefore needs one build lane per supported operating system and architecture, plus binary signing, checksums, installers, and update testing. The README documents SHA-256 files and GPG signatures for verifying stable runtime downloads.

A September 13 push accompanies 914 open issues and pull requests

The repository was pushed on September 13, 2026, two days after the newest open bug report in our query. GitHub listed 41,163 stars and 914 combined open issues and pull requests. Those figures show an old, visible project with current activity and a large support queue. The latest release in the README and official blog is 0.115.0 from August 18, so buyers should follow the project's own download and blog channels.

Current issue activity includes Windows 11 transparent-window regressions reported against 0.115.0 and an open Node ESM import report covering versions 0.102.1 through 0.108.0. Neither issue means every application encounters the behavior, but both involve desktop details that a browser prototype will miss. NW.js remains a practical shortcut when a team values direct DOM-to-Node calls and knows its target platforms. The failed build, empty pytest collection, 7 audit findings, and documented security model make source adoption a deliberate engineering commitment.

Alternatives

ProjectWhat it isPick it when
Electron gh↗A Chromium and Node.js desktop runtime with separate main and renderer process APIs.pick this instead when its larger package ecosystem and process separation fit your team's desktop architecture.
Tauri gh↗A Rust-backed desktop framework that renders web interfaces in the operating system webview.pick this instead when smaller application bundles and a narrower command boundary matter more than shipping one Chromium version.
NeutralinojsA lightweight desktop runtime that connects web interfaces to native functions.pick this instead when the app needs a small native wrapper and only a limited set of system APIs.

What people are saying

  1. [velocity-scout] nwjs/nw.js

Sources

  1. NW.js README
  2. NW.js repository
  3. NW.js 0.115.0 release notes
  4. NW.js security guide
  5. NW.js packaging guide
  6. Issue 8387: renderer crash with broad remote access
  7. Issue 8333: Node ESM imports in browser context

More dev tools reviews

gson · WxJava · niri · marked · pandoc · shields · the whole board →