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 zscalernpm config set cafile "~/.certs/zscaler.crt"npm install -g pnpmNotes:
- Node.js does not use system CA [Issue 58990], so that
set cafileline might be needed pnpmglobal packages need a different PATH thannpm, so we need to runpnpm setupand the appropriate PATH in.zshrc(the setup is typically smart enough to do it for you)