A blue Windows desktop displays a glowing software workflow diagram with terminals, connected nodes, and security controls.
NVM for Windows v2 is a ground-up rewrite of the popular Node.js version manager. The creator, Corey Butler, has now explained the reasoning in a long post. It reads like an engineering diary crossed with an IT governance pitch. The interesting part is the specific trade-off behind it: how do you get smart, policy-aware Node launching on Windows without making every node command feel sluggish?

A blue Windows desktop displays a glowing software workflow diagram with terminals, connected nodes, and security controls. The core problem: launching Node is not the same as installing Node​

Butler says he wrote the original in 2014, partly to learn Go. For v2 he kept Go for the main nvm.exe but questioned whether it suited the commands developers run constantly.

His argument separates two kinds of work:

  • Version management tasks such as downloading and extracting Node.js. These take seconds and are limited by network and CPU, so a few extra milliseconds of startup don't matter.
  • Launching node.exe (for example node myfile.js). This happens constantly, so startup latency adds up.

Version 1 sidestepped the issue by using symlinks. A link is only a pointer, so it launches no extra process and adds no latency. But a pointer can't read .nvmrc, check that node.exe is genuine, or apply safeguards at launch. Butler says v2 needed runtime logic, not just a reference.

The latency numbers (the author's measurements)​

Butler frames startup cost in three layers: the OS, the language runtime and the application logic. These figures are his own measurements, not independent benchmarks:

  • Windows process creation: He says every new executable pays a "universal latency tax" through CreateProcessW, usually 12–30 ms and sometimes 100 ms or more under load. This covers creating the process, mapping the image and security/AV scanning.
  • Go runtime: He says Go's runtime, garbage collector and standard library added 12–200 ms in his experiments.
  • Prototype shims: He prototyped the shim in Go, Rust and Zig. He reports Zig at under 1–3 ms and the smallest binary, Rust at 10–15 ms, and Go with the fewest lines of code.

The result is a split design. Go stays in nvm.exe, and Zig handles the shim and other small helpers. The project's shim repository is written in Zig, and project documentation describes Zig-built shims for Node and related tooling commands (npm, npx, etc).

Shim mode versus link mode​

The rewrite gives users a real choice. The mode documentation says you can switch with nvm use shim or nvm use link, or through nvm cfg set mode=shim or mode=link. The trade-offs, per the project docs:

Link modeShim mode (default)
Latency0 msroughly 25–35 ms total (documented)
Automatic version detectionNoYes
Special permissionsSeCreateSymbolicLinkPrivilege only for UNC-path symlinksNone
Runtime features (pinning, permission lockdown, publisher checks)NoYes

Link mode uses NTFS junctions, which need no special privileges but don't support UNC paths. For UNC storage, NVM creates a symlink, which requires SeCreateSymbolicLinkPrivilege. Administrators have it by default, and Windows Developer Mode grants it. It can also be granted through the "Create symbolic links" user right in Group Policy.

The shim figure adds up in a way that supports Butler's thesis. The documentation's own arithmetic is 15 ms for the shim's process creation, about 3 ms of shim logic, then another 15 ms to launch the real node.exe, which gives roughly 33 ms. Most of that is Windows, not the shim. Whether ~30 ms matters is a judgment call. For interactive use it's likely invisible. For a build script that launches Node thousands of times, link mode may be the better choice. That is an inference from the numbers, not something the project tested.

There is a caveat about early adoption. A GitHub issue opened on September 22, 2026 reports that in shim mode, .cmd or .bat entry points for global npm packages failed when given an argument containing a space. The reporter, on v2.0.1-hotfix.2, said switching to link mode worked around it. That is one user report, not a confirmed fix status, but it shows that shim mode has more moving parts than a pointer.

Native Windows integrations​

Butler's second theme is that Node tooling should work with IT infrastructure, not around it. The project lists four native integrations: Windows Apps, Event Viewer logging, the Windows Registry and the Desktop Notification Center.

  • Windows Apps: Butler says each managed Node version is registered, so Windows can treat it as an intentional installation rather than an arbitrary node.exe dropped on disk. He says scanners such as CrowdStrike and Qualys recognize registered apps. He also says he believes this is a first among runtime version managers. Those are his claims, and I could not independently confirm them. Registration doesn't guarantee that every scanner will behave the same way.
  • Event source: He says v2 registers as a Windows Event source for SIEM auditing. The project docs add a nuance: both editions have native Windows Application logging, but it uses plaintext entries with generic event codes meant for developer reference. Structured, SIEM-oriented logging is part of the paid Advanced Logging add-on.
  • Notification Center: Notifications go through Windows, so they respect settings like quiet hours. Butler also says admins can tell NVM's notices apart from generic notifier tools.
  • Registry: Settings move from v1's settings.txt into the registry. Butler calls this the highest-impact integration. He says it enables policy such as forcing the mode, setting storage directories, restricting versions, locking down Node permissions and enforcing package-manager cooldown periods.

The edition documentation shows how the policy side is packaged. Central policy management (ADMX/ADML files plus Group Policy and Entra scripts), a version firewall, an Author-run Node.js mirror, and unified cooldowns belong to the Governance add-on for Certified builds. That means the registry foundation is in the free product, but turnkey enterprise controls are not.

Community versus Certified builds​

Butler says the rewrite stays open source but ships in two forms, and he is open about why. In recent years he says most of his time went to auditors, regulators, CrowdStrike report checks and false-positive antivirus reports after each release, instead of design or code. The costs of that compliance work, he argues, should fall on those who benefit most.

  • Community: MIT licensed and aimed at individuals. It has the full application but no centralized-management capabilities.
  • Certified: Aimed at organizations under an EULA. It adds EV code-signed binaries and deployment-ready installers (Intune, MSI and PowerShell scripts). Advanced Logging, Trust Artifacts (SBOM, provenance, VEX) and Governance are add-ons. The project describes subscriptions as annual and sitewide.

The documentation also says project stewardship moved to Author Software Inc. in January 2025. Butler is a co-founder of that company, so this is not an arm's-length relationship.

Is the split fair? Reasonable people will differ. Supporters will say a tool sitting in the path of every Node launch deserves funded maintenance. Skeptics will note that the security and governance features organizations care about now sit behind a commercial wall, and that a post explaining an architecture also serves as a sales pitch for the paid tier. Both can be true. The author's perspective is clearly stated, and the technical choices can be judged on their own.

One discrepancy worth knowing: code signing​

The sources disagree on signing, so read carefully. The edition guide still says Community builds are not code-signed and may trigger SmartScreen. The GitHub repository says Community installers are code-signed as of v2.0.0-hotfix.2. The release notes for v2.0.1 describe an Authenticode-signed community build. The repository and releases look newer, so the guide's wording may be outdated, but I can't confirm that. Check the signature on the installer you actually download.

Current release status and what to check​

The latest stable release on the releases page is v2.0.1, dated October 2, 2026, with amd64 and arm64 builds. A 2.0.2 beta is also listed, and it isn't a stable release. Release notes say the Community build uses a per-user LocalAppData program root. Organizations needing Program Files, MSI or Intune deployment are directed to Certified Builds.

If you manage Windows developer machines, a sensible checklist is:

  1. Decide per use case: shim for pinning and policy features, link for maximum launch speed or legacy script compatibility.
  2. If you use UNC storage with link mode, confirm that SeCreateSymbolicLinkPrivilege is granted.
  3. Test global npm packages with .cmd or .bat entry points, including arguments with spaces, before rolling out shim mode widely.
  4. Verify the installer's digital signature rather than relying on any one document.
  5. If you need central policy, Event Viewer-grade SIEM logging or an approved-version mirror, evaluate the Certified add-ons instead of assuming Community has them.

Bottom line​

The rewrite is an interesting case study in Windows engineering. The OS's process-creation cost is a floor no language can avoid, and the shim only adds a few milliseconds on top of it. The Windows integrations are real, and project materials confirm them. But the stronger security and audit claims come from the author, and the most enterprise-grade controls are in the commercial tier. For individual developers, it's a free, modernized tool with two modes to choose between. For organizations, it's a tool worth piloting, with clear eyes about what is free and what costs money.

 

References

  1. NVM for Windows v2: Why We Rebuilt It From the Ground Up HackerNoon 2026-10-08T00:00:00+00:00
  2. GitHub - nvm-windows/shim: The nvm-windows shim app. · GitHub github.com
  3. Operating Modes | nvm-windows Documentation docs.nvm-windows.com