
Node Version Managers: Volta Is Unmaintained, So I'm Trying mise
When I first wrote this post in 2023, Volta was the new tool I wanted to check out. That has changed. Volta is now unmaintained, and its maintainers recommend moving to mise.
So this is an update. If you are on Volta, it still works for now, but it’s worth planning a move. mise is the one I’m planning to try.
Volta is unmaintained
In November 2025 the Volta maintainers opened an issue titled Volta is unmaintained; we recommend migrating to mise. It says most of them use mise now.
The Volta README says it more bluntly: they won’t be able to fix breakages from new OS releases or other changes in the ecosystem. So an existing install keeps working until something underneath it changes.
That’s a shame, as the idea of one fast Rust binary that pins the node version per project and works across all my computers was what made it sound interesting.
Why mise
mise does what I wanted from Volta, and more. It manages versions for node and a lot of other tools (python, ruby, go and so on), and can also handle environment variables and project tasks. Like Volta, it’s written in Rust.
It’s not only the Volta maintainers recommending it. The Thoughtworks Technology Radar moved mise to Adopt in April 2026 and calls it their recommended default for standardising developer environments. They also describe it as a drop-in replacement for asdf.
I haven’t switched yet, so the steps below are from the mise getting started docs, not from my own setup.
Getting started with mise
Install it and activate it in zsh:
curl -fsSL https://mise.run | sh
echo 'eval "$(~/.local/bin/mise activate zsh)"' >> "${ZDOTDIR:-$HOME}/.zshrc"
Open a new terminal, then set a default node version:
mise use --global node@24
To pin node for a project, run this in the project folder:
mise use node@24
That creates a mise.toml you commit with the project:
[tools]
node = "24"
mise doctor checks the setup if something isn’t working.
Existing .nvmrc files are off by default
One thing that could catch you out. According to the mise node docs, mise doesn’t read .nvmrc, .node-version or package.json until you turn it on:
mise settings add idiomatic_version_file_enable_tools node
If you have a lot of projects with an .nvmrc, that’s the setting you want. Add --local to save it in the project’s mise.toml instead of globally.
If you’re coming from nvm, mise can also pick up the versions you already have installed with mise sync node --nvm. The docs don’t mention a Volta equivalent, so I think you just reinstall the versions you need.
Global npm packages
Global packages belong to whichever node version is active, so a CLI can seem to disappear when you switch versions. The mise docs suggest installing a CLI as its own tool if you want it to stay put across node versions:
mise use -g npm:typescript
The other options
The rest of the original list is still around:
- nvm - the one I’ve used most on Mac and Linux. Shell based, and uses an
.nvmrcfile in the project to pick the version. - nvm for Windows - a separate project, not a port of nvm. It has had a v2 rewrite since I last used it, and lists per-directory version switching as a feature. From memory, the old version didn’t support
.nvmrc. - fnm - fast, works on Windows, macOS and Linux, and reads both
.nvmrcand.node-version. A good pick if you only care about node. - n - small and simple, for Mac and Linux.
- asdf - multi-language with plugins, and now written in Go. mise started out as an asdf alternative, so it covers similar ground.
Which one I’d pick now
If you’re on Volta, I’d move rather than wait for something to break. mise is what its own maintainers point to, and it’s what I’m going to try next.
If you only need node and like keeping your .nvmrc files, fnm still looks like the simpler option.