opensourceprojects.dev

A broadsheet for software that doesn't ask for your email

fnm: a fast Node.js version manager that reads `.node-version` and `.nvmrc`
GitHub RepoImpressions1

Project Description

View on GitHub

Stop Manually Switching Node Versions: Meet fnm, a Node Version Manager That Actually Feels Fast

If you've ever worked on multiple JavaScript projects, you know the pain: one repo needs Node 18, another needs Node 20, and your global install is stuck on something ancient. You're either manually switching versions, juggling nvm commands, or praying that nvmrc file actually gets respected. It's tedious, it's error-prone, and honestly, it's just boring. That's where fnm comes in—a Node.js version manager built in Rust that's designed to get out of your way and let you get back to coding.

What It Does

fnm is a cross-platform Node.js version manager that works on macOS, Windows, and Linux. At its core, it does what you'd expect: it installs, manages, and switches between different Node.js versions. But the key difference is in the implementation—it's written in Rust, which means it's compiled to a single binary, starts up nearly instantly, and doesn't carry the overhead of a scripting language runtime.

The name stands for "Fast Node Manager," and it lives up to that in a couple of practical ways. First, it's a single file, which makes installation and distribution straightforward. Second, it's built with speed as a primary goal—not just in terms of runtime performance, but also in terms of how quickly you can get it set up and forget about it.

One of the more useful features is its support for .node-version and .nvmrc files. These are the standard files that projects use to declare which Node version they need. fnm reads them automatically, so when you cd into a project, you can have it switch to the right version without manually checking what the file says and running a separate command.

Why It's Cool

The "another Node version manager" skepticism is fair, but fnm has a few things going for it that make it worth a look.

It's genuinely fast. The Rust foundation isn't just a marketing bullet point. The binary starts up almost instantly, which means no perceptible delay when you run a command. If you're the type who gets annoyed by even a half-second lag in your terminal, you'll notice the difference.

Cross-platform without compromise. A lot of version managers treat Windows as an afterthought. fnm supports macOS, Windows, and Linux equally, and it gives you multiple installation paths for each. On Windows alone, you can use Winget, Scoop, or Chocolatey—whatever your preferred package manager happens to be.

It respects your project's wishes. The .node-version and .nvmrc support is the killer feature here. You've probably seen these files in repos and either ignored them or manually checked them. fnm reads them and acts accordingly, which means one less thing to think about when you're hopping between projects.

Shell completions built in. You don't need to hunt down a separate completion script or write your own. Just run fnm completions --shell <SHELL> and you're set for bash, zsh, fish, or PowerShell. It's a small thing, but it's the kind of polish that makes a tool feel well-designed.

Installation is flexible. Whether you want a one-liner script, a Homebrew formula, a Cargo install, or a raw binary from GitHub releases, fnm has you covered. The install script even has flags for custom directories and skipping shell config edits, which is nice if you're particular about your dotfiles.

How to Try It

The easiest way to get started on macOS or Linux is with the automatic install script. Make sure you have curl and unzip installed, then run:

curl -fsSL https://fnm.vercel.app/install | bash

If you're on macOS, you can also use Homebrew:

brew install fnm

On Windows, pick your poison:

winget install Schniz.fnm
scoop install fnm
choco install fnm

If you're already a Rust developer, you can grab it via Cargo:

cargo install fnm

Or download a release binary directly from the GitHub releases page and add it to your PATH.

Once installed, you'll need to set up your shell by evaluating the output of fnm env. The README suggests passing your shell explicitly, like fnm env --shell bash, to avoid runtime shell detection overhead. You'll also want to check out the configuration docs for features like automatic version switching—that's where the .node-version and .nvmrc magic really shines.

Want completions? Just run:

fnm completions --shell <SHELL>

And if you ever want to remove it, just delete the .fnm folder in your home directory and clean up your shell config. No trace left behind.

Final Thoughts

fnm isn't trying to reinvent the wheel—it's trying to make the wheel spin faster and with less friction. If you're a JavaScript developer who's tired of manually managing Node versions or dealing with a version manager that feels sluggish, this is worth trying. It's particularly great if you work across multiple projects with different Node requirements, since the .node-version and .nvmrc support handles the switching for you.

The fact that it's written in Rust means it's fast, but the real value is in the thoughtful design: single-file install, cross-platform support, built-in completions, and a straightforward setup. It's not the flashiest tool out there, but it's the kind of utility that quietly makes your day better. Give it a shot—you might find yourself wondering why you didn't switch sooner.

Follow @githubprojects for more developer tools and open source projects.

Back to Projects
Project ID: d63541ab-d490-405d-a6b8-9df01f096f9bLast updated: August 26, 2026 at 07:58 AM