// the find
nvm-sh/nvm
Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions.
nvm is the de facto standard version manager for Node.js on POSIX shells — install and switch between Node versions per-shell or per-project via .nvmrc. It's for anyone who touches more than one Node project with different version requirements, which in practice is almost everyone.
Pure POSIX shell with zero native dependencies, so it runs on bash, zsh, dash, ksh across Linux/macOS/WSL without a compiled binary to trust or rebuild. The .nvmrc directory-upward lookup plus LTS codename aliasing (lts/argon, lts/*) covers the real-world case of 'pin this repo to a version' well. Edge-case handling is unusually thorough for a shell project — checksum verification, circular alias detection, offline install mode, mirror support with auth headers, and fallback to unofficial-builds.nodejs.org for platforms nodejs.org doesn't ship binaries for (musl, riscv64, loong64). Test coverage is real: a fast/slow split with actual CI matrices across Alpine, Windows, and multiple Node install paths, not just a README claiming it's tested.
It works by sourcing a shell function into every new shell, which adds measurable startup latency — common enough that half the ecosystem (zsh-nvm, lazy-load snippets) exists just to work around it, and none of that is built in. No Fish support at all, officially punted to third-party tools (bass, nvm.fish) that the nvm team won't support if they break. Windows outside WSL/Git Bash/Cygwin is a hard no — if your team is on native Windows, you're pointed at a different, unrelated project (nvm-windows) with its own bugs and alias format. Per-shell state means every new terminal tab re-sources nvm and re-resolves .nvmrc from scratch; there's no daemon or system-wide cache, which is exactly the thing newer competitors like fnm and volta were built to fix, and they're noticeably faster for it.