July 17, 2026

nvm vs fnm vs Volta: which Node version manager to use in 2026

Photo of Marco Orta Marco Orta | 9 min read
Compartir
3D illustration of three hexagonal badges and a rotary selector in front of a terminal: switching between Node.js versions
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 .nvmrc or .node-version file.
    • 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

    CriterionnvmfnmVolta
    LanguageShell scriptRustRust
    SpeedSlowVery fastVery fast
    WindowsNo (use nvm-windows)YesYes
    Auto-switch per folderWith pluginYes, nativeYes (pinning)
    Pins version in package.jsonNoNoYes
    Manages package managersNoNoYes
    PopularityHighestHigh and growingMedium

    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:

    Operationnvmfnm
    Load the manager into a new shell405 ms4 ms
    Switch version (use 24)1,003 ms4 ms
    Empty shell, no manager (baseline)2 ms2 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:

    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.

    Compartir

    Search

    Tags

    Tutorial PHP Laravel AI JavaScript Web Development Best Practices Laravel 13 Security Migration Tools Claude SEO Regular Expressions Text Manipulation