Avatar
Holeybit By Jonas Tahardi

Node Version Manager

In the past, I haven’t been paying much attention to the version of Node I’m using. Since I’m on a Mac, I usually just run brew install node, and from time to time I’ll do a brew update and brew upgrade.

Because Homebrew is a rolling-release package manager, versions move fast. As of early February 2026, I ended up on Node v25.6.0 and npm 11.8.0. That’s not a problem for personal use, but when publishing or sharing packages, pushing everyone onto the bleeding edge isn’t ideal. The usual convention is to target the Active LTS release.

nvm is commonly recommended, but when I tried it, my terminal took a couple of seconds longer to start, which was noticeable.

There are many alternatives—fnm, volta, mise. Mise goes beyond Node and can manage tools like Python, Ruby, and Go, and even pnpm. Volta automatically detects versions from package.json, though my understanding is that pnpm support is still experimental.

I ended up choosing fnm. It’s fast, lightweight, and automatically respects .node-version and .nvmrc files.

brew install fnm
# add to .zshrc: eval "$(fnm env --use-on-cd --shell zsh)"
# restart shell
fnm install --lts
# if you happened to be behind zscaler
npm config set cafile "~/.certs/zscaler.crt"
npm install -g pnpm

Notes:

  • Node.js does not use system CA [Issue 58990], so that set cafile line might be needed
  • pnpm global packages need a different PATH than npm, so we need to run pnpm setup and the appropriate PATH in .zshrc (the setup is typically smart enough to do it for you)