nvm vs fnm vs Volta: which Node version manager to use in 2026
Table of Contents
Installing Node.js by downloading the binary from the website works… until you have two projects that need different versions: one stuck on Node 20 and another on Node 24. That’s where a version manager comes in: it lets you install several Node versions and switch between them with a single command, or even automatically when you change folders.
In 2026 there are three serious options: nvm (the classic), fnm (the fast one) and Volta (the one that pins the version per project). In this guide we compare them so you can pick the one that fits your workflow. And if you also want the step-by-step of installing Node from scratch, you’ll find it in how to install Node.js and npm.
Why do you need a version manager?
Without a manager, changing the Node version means uninstalling and reinstalling the binary every time. With one you get:
- Several versions installed at once, isolated from each other.
- Instant switching with a single command (
use 24). - Automatic switching when you enter a project that declares its version in a
.nvmrcor.node-versionfile. - Team reproducibility: everyone uses the same Node version without relying on anyone’s memory.
nvm — the classic
nvm (Node Version Manager) is the best known and the one you’ll see in most tutorials. It’s a shell script for macOS and Linux.
Pros: ubiquitous, documented to infinity, stable. If you search Google about Node versions, the answer almost always mentions nvm.
Cons: it’s relatively slow (it runs as a shell function and slows down terminal startup), and it doesn’t work on Windows. On Windows there’s a separate, unofficially related project, nvm-windows (by coreybutler), with similar commands but an independent codebase.
nvm install 24 # install Node 24
nvm use 24 # activate it in the current session
nvm alias default 24
fnm — the fast one (my recommendation)
fnm (Fast Node Manager) is written in Rust, is cross-platform (Windows, macOS, Linux) and much faster than nvm. It reads .nvmrc and .node-version, and switches versions automatically when you enter a directory.
Pros: speed, works on all three systems with the same syntax, automatic per-directory switching, terminal startup with almost no penalty.
Cons: less “famous” than nvm, so some old tutorial won’t mention it.
fnm install 24 # install Node 24 LTS
fnm use 24 # activate it here
fnm default 24 # default version
node --version # v24.x.x
For most developers in 2026, fnm is the best option: the nvm experience but without the slowness and with real Windows support.
Volta — the one that pins the version per project
Volta is also written in Rust and is cross-platform, but it has a different philosophy: instead of you switching versions, it pins the tool to the project. When you run volta pin node@24, it writes the version into package.json and, from then on, anyone who opens the project uses that version automatically, with no commands.
Pros: total team reproducibility (the version travels in package.json), it also manages npm/pnpm/Yarn and global binaries, 100% transparent switching.
Cons: the “pinning” approach can feel less flexible if you prefer to control the switch manually.
volta install node@24 # install Node 24
volta pin node@24 # pin it in this project's package.json
Quick comparison
| Criterion | nvm | fnm | Volta |
|---|---|---|---|
| Language | Shell script | Rust | Rust |
| Speed | Slow | Very fast | Very fast |
| Windows | No (use nvm-windows) | Yes | Yes |
| Auto-switch per folder | With plugin | Yes, native | Yes (pinning) |
| Pins version in package.json | No | No | Yes |
| Manages package managers | No | No | Yes |
| Popularity | Highest | High and growing | Medium |
How much slower is nvm, in actual numbers
“nvm is slow” gets repeated a lot without figures, so I measured it on my own machine. Setup: WSL2 (Ubuntu) on Linux 6.18, bash, six Node versions installed under nvm, fnm 1.39. Each figure is the median of 20 runs of a brand-new shell:
| Operation | nvm | fnm |
|---|---|---|
| Load the manager into a new shell | 405 ms | 4 ms |
Switch version (use 24) | 1,003 ms | 4 ms |
| Empty shell, no manager (baseline) | 2 ms | 2 ms |
Two caveats so you can read this honestly: the version-switch figure includes loading the manager, and nvm’s cost grows with how many versions you have installed — with six it has to walk all of them, so someone with one or two versions will see a smaller number. Even so, the order of magnitude holds: nvm adds roughly four tenths of a second to every terminal you open, and about a second each time you switch. If you open a lot of terminals a day, that is the difference you actually feel.
Which one do I choose?
- fnm — for most people. Fast, cross-platform and with automatic switching. If you’re coming from nvm, the migration is direct (same idea, same
.nvmrc). - Volta — if you work in a team and want the Node version (and the package manager) to be identical for everyone without anyone having to think about it.
- nvm — if you’re on macOS/Linux, already have it working and don’t mind the small startup cost. There’s no urgent reason to switch, but no reason to start with it in 2026 either.
Migrating from one manager to another
Switching is simple because they all read the same version file. Uninstall the previous one (check no lines of it remain in your .bashrc/.zshrc), install the new one and reinstall your Node versions:
# Example: moving to fnm
fnm install 20
fnm install 24
fnm default 24
Your projects with .nvmrc will keep working the same, because fnm and nvm share that format.
Things that break when you migrate (and how to fix them)
Almost every problem after switching managers comes from the same place: two managers still loaded at once, or a global package that did not travel with you.
node --version doesn’t match the one you just activated. You have leftovers from the old manager in your .bashrc/.zshrc, and whichever loads last wins. Check what is really being used and clean the file:
which node # tells you which manager it comes from
grep -nE "nvm|fnm|volta" ~/.bashrc ~/.zshrc ~/.profile
Your global packages disappeared. Each manager keeps its own global prefix, and they are not shared — nor are they shared between Node versions of the same manager. List them before migrating and reinstall them afterwards:
npm list -g --depth=0 # run this BEFORE switching
The IDE terminal uses a different Node than your terminal. Editors often start a non-login shell that never reads your config. In VS Code, "terminal.integrated.defaultProfile.linux": "bash" with a login shell (-l) fixes it; in PhpStorm, check Settings → Tools → Terminal → Shell path.
On Windows you’re following the wrong instructions. nvm and nvm-windows are different projects with different commands (nvm-windows has no .nvmrc support, for instance). If you’re on Windows, fnm or Volta save you the whole issue.
Volta ignores your use. That is the intended behaviour: if package.json has a pinned version, it wins over anything you do manually. Change it with volta pin node@<version> instead of trying to override it from the shell.
Conclusion
A version manager stops being optional as soon as you have more than one Node project. In 2026 my default recommendation is fnm for its speed and cross-platform support; Volta if you prioritize team reproducibility; and nvm if you already live comfortably with it on Mac or Linux.
For the rest of your Node setup:
- How to install Node.js and npm on Windows, macOS and Linux — the full guide, with the official installer and choosing the LTS version.
- Best JavaScript frameworks in 2026 — once Node is ready, pick your stack.
Frequently asked questions
What is the difference between nvm, fnm and Volta? nvm is the classic (shell script, macOS/Linux only, stable but slow); fnm is written in Rust, cross-platform and much faster, with automatic per-directory switching; Volta is also Rust and cross-platform, but it pins the version in package.json for the whole team.
What is the best manager in 2026? For most people, fnm: fast, cross-platform (including Windows) and it reads .nvmrc. Volta if you prioritize team reproducibility; nvm if you already use it comfortably on Mac or Linux.
Does nvm work on Windows? The original nvm does not; it is a shell script for Mac and Linux. On Windows there is a separate project, nvm-windows (by coreybutler). If you want a single tool for all three systems, choose fnm or Volta.
Can I switch from nvm to fnm without breaking my projects? Yes: they share the .nvmrc format, so your projects keep declaring their version the same way. Uninstall nvm, install fnm and reinstall the Node versions you use.
What does Volta per-project pinning do? volta pin node@24 writes the version into package.json; from then on anyone who opens the project uses that version automatically, without running anything.