mrkeyoor.com_
Mon 09 Nov 17:31 UTC
Dev Toolsevaluationupdated 01 Nov 2026

nvm review

Choose nvm for Node.js version switching in Linux, macOS or WSL when you are comfortable configuring your shell and selecting project versions explicitly. nvm installs Node.js versions per user and selects them per shell. Our run on October 10, 2026, at commit 6dc3765 recorded a successful repository dependency install, but the tests timed out and the saved output includes failed checks. It did not verify a deployment or compare version-switching speed.

+32stars / 7d
Verdict

nvm fits developers who want per-user Node.js installations and explicit control in POSIX shells. Our run recorded a successful repository dependency install, but failed checks, a test timeout and conflicting saved installation summaries limit what it proves. Verify shell loading and project version selection in your own workflow before relying on it. Consider fnm for its documented Fish and PowerShell integration, or NVM for Windows for native Windows version management.

We ran it

Lab card: what happened when we ran nvmScreenshot of nvm (github.com/nvm-sh/nvm)
Install✓ · 43s395 packages · 76 MB
Buildn/ano build script
Tests✗ timed out · 900sran, no count parsed
Known vulns00 critical · 0 high · 0 moderate · 0 low (npm audit)
Repo494 files~7,037 lines of source · 1.5 MB · 17 CI workflows · Dockerfile · tests dir

Answers from our run

Does nvm build from source?

Dependencies installed in 43 seconds (395 packages), and the project has no separate build step. We cloned commit 6dc3765 into a clean Debian container with 3 CPUs and no project-specific setup.

Do nvm's tests pass?

We could not finish them: the suite was still running after 15 minutes in our container.

Does nvm have known vulnerabilities in its dependencies?

npm audit found none in the dependency tree at the time of our run.

Who should not use nvm?

Fish users who require direct upstream support.

What are the alternatives to nvm?

fnm, NVM for Windows. nvm fits developers who want per-user Node.

Setup4/5The stored install step succeeded in 43 seconds, but its tail includes an npm ci error; shell loading and npm prefix compatibility require attention.
Docs5/5The README gives specific installation checks, profile troubleshooting, noninteractive Bash instructions, platform limits and global-package migration guidance.
Community5/5Retained historical rating for recorded GitHub attention and maintenance activity; it does not measure adoption, support responsiveness or production reliability.
Maturity4/5Release fixes, 17 recorded CI workflows and a tests directory support the rating; named failed checks and the 900-second timeout limit validation.

Who it’s for

Developers using POSIX shells who need different Node.js versions for different projects.
Teams that can record a version in .nvmrc and make nvm use part of entering a project.
Developers willing to maintain shell loading configuration, including separate loading for noninteractive jobs.

Who it’s NOT for

Fish users who require direct upstream support.
Native Windows teams seeking a manager designed for their environment.
Teams expecting the documented automatic directory-switching recipes to receive maintainer support.
Developers who must retain an incompatible npm prefix setting.

Setup reality

Our run on October 10, 2026, tested commit 6dc3765 in our sandbox with 3 CPUs, 8 GB RAM and image lab-node:22. The harness recorded the install step as successful with exit 0 after 43 seconds. Its stored dependency summary is 395 packages and 76 MB. This measured repository dependency setup, not the everyday installation of nvm followed by a verified Node.js workload.

The saved install output starts with an npm ci lockfile error and later reports a completed package installation. Its package and advisory figures disagree with the stored summary. The stored audit total remains 0; the raw installation output separately reports advisories. These records have not been reconciled, and scan coverage is unknown because scannedPackages is absent. Neither record establishes security.

The harness skipped the build because it found no build script. That does not mean the repository lacks a Makefile: the detector recorded one. The test command timed out after 900 seconds with exit 124. Its saved tail includes failures for nvm_print_implicit_alias success and nvm_stdout_is_terminal, alongside passing checks. The complete suite remains unverified.

Should you choose nvm?

Use nvm if explicit Node.js selection fits your Linux, macOS or WSL workflow. The important setup task is making sure the shell that runs your commands loads nvm. A successful repository dependency install does not establish that a fresh terminal, container entrypoint or unattended job will select the intended Node.js version.

nvm installs Node.js versions per user and selects them per shell. The README describes this operating model and its supported POSIX shells. Separate terminals can therefore use different versions. A project can record its expected version in .nvmrc, but you still need to invoke nvm or configure additional shell integration.

What our sandbox recorded

Our run on October 10, 2026, tested commit 6dc3765. Our sandbox had 3 CPUs, 8 GB RAM and image lab-node:22. This correction uses the existing saved run; we have not executed it again.

Our harness recorded the repository install step as successful after 43 seconds. The saved outcome includes exit 0 and no install timeout. The stored dependency summary records 395 packages and 76 MB on disk. Those are repository setup measurements, not shell startup or switching benchmarks.

The raw install tail complicates that result. It begins with an npm ci error explaining that a suitable lockfile is required, then later reports a completed package installation. The final step status therefore does not show that every command within the step succeeded. The retained output does not establish the intervening command sequence.

The stored package summary and raw installation output disagree. The stored audit total is 0, while the raw install tail reports advisories, including a critical advisory. We retain the stored measurements and disclose the disagreement rather than replacing one record with the other. The raw advisory report is not a reconciled audit result. Scan coverage is unknown because the record has no scannedPackages field, and an advisory count is not a security assessment.

The build step was skipped with reason no script. The detector also recorded a Makefile, so this skip cannot support a claim that no build target existed.

The tests timed out and included failed checks

The harness recorded the test command at 900 seconds with exit 124 and timedOut set to true. Its saved tail contains passing checks, but also two named failures:

The terminal failure exposes a problem encountered in our sandbox. It does not explain the alias failure or establish why the overall command exceeded its time limit. The tail is incomplete, so these named failures are not an exhaustive failure count. No complete passing-test total is available.

Our harness preserves step status, exit codes, elapsed time, timeout flags and output tails. Those fields answer different questions: a timeout describes how execution ended, while the tail can reveal checks that failed before it ended. The MrKeyoor testing methodology explains these distinctions and the limits of sandbox results. That page describes the publisher's current procedure; it does not establish which methodology version governed this October run.

We did not verify a deployment entrypoint, a real application workload, every selectable Node.js release, Fish or native Windows behavior, or comparative switching speed.

Check shell loading before troubleshooting Node.js

nvm is a sourced shell function. The documented installation check is command -v nvm; which nvm does not test the same thing because nvm is not an executable binary. If a new terminal cannot find it, inspect the profile that the installer updated and whether your shell reads that file.

Noninteractive Bash does not source the usual profile files. The README documents BASH_ENV and explicit sourcing of nvm.sh for container and CI use. Put loading and version selection in the job that needs them, then verify that job in its actual execution environment.

Check existing npm configuration too. The README identifies npm prefix settings as incompatible with nvm and excludes Homebrew installations from upstream support. When no suitable Node.js binary exists, installation can require source compilation and a C++ toolchain. Our dependency-install timing does not measure that path.

Use .nvmrc to record the project choice

The README documents .nvmrc lookup in the current directory and its parents. Running nvm use without an explicit version selects the file's version; nvm install can install it when needed. Recording an exact release is useful when the team wants a fixed choice. A moving alias such as lts/* can resolve to a different release later.

Automatic switching requires additional integration. The documented directory-change recipes are user contributions that the nvm maintainers do not support. Treat that integration as part of your team's shell configuration and verify it separately.

When another manager fits better

fnm documents Fish and PowerShell setup with automatic directory switching. Its README also documents .nvmrc support and macOS, Windows and Linux support. Consider it as a replacement when you want those shell integrations across your team's environments. It still requires shell setup; our nvm run provides no comparative performance evidence.

NVM for Windows is a separate project for Windows Node.js version management. Its project page explicitly distinguishes it from nvm and documents Windows integrations. Consider it as a replacement for a native Windows workflow. Do not assume it shares nvm's configuration or behavior. Fish wrappers, by comparison, complement nvm by adding an integration layer rather than replacing it.

How to read the retained ratings

These editorial ratings use a five-point scale: 1 means substantial documented obstacles, 2 means major caveats, 3 means usable with material gaps, 4 means strong evidence with a consequential limitation, and 5 means extensive evidence within the dimension's stated scope. They are judgments, not benchmark results.

Setup ease covers repository setup and documented configuration friction. Documentation covers the specificity of installation, troubleshooting and compatibility guidance. Community covers visible attention and maintenance activity, not adoption or support response time. Maturity covers maintenance history, release fixes and repository test infrastructure, with the unfinished sandbox suite counted as a limitation.

The retained scores are setup ease 4/5, documentation 5/5, community 5/5 and maturity 4/5. The community score reflects the historical attention and activity recorded with the existing review; stars do not establish production use. The maturity score does not mean the tested checkout passed. The v0.40.8 release notes document shell and path fixes, while our checkout had 17 CI workflow files and a tests directory. Those signals cannot override the failed checks and timeout.

Before adopting nvm for a project, open a fresh terminal, confirm that nvm loads, select the version recorded in .nvmrc, and check the Node.js version. Repeat that verification inside any unattended job that will use it.

Alternatives

ProjectWhat it isPick it when
fnmA Node.js version manager with documented Fish and PowerShell setup, automatic directory switching and .nvmrc support.Choose it as a replacement when those integrations matter across macOS, Windows and Linux; comparative speed was not tested here.
NVM for Windows gh↗A separate project for managing Node.js versions on Windows.Choose it as a replacement for a native Windows workflow after checking its own installation and configuration documentation.

Sources

  1. nvm README: usage, shell loading, and compatibility
  2. nvm GitHub repository facts
  3. nvm v0.40.8 release notes
  4. Issue 3951: profile last line corrupted by installer
  5. PR 3952: insert newline before appending to profile
  6. fnm README: supported shells and directory switching
  7. NVM for Windows: native Windows version management

More dev tools reviews

evilginx2 · google-colab-cli · mujoco · SteamTools · git-cliff · blackbird · the whole board →