TL;DR
mise is the default pick for 2026: fastest activation, single-binary install, native .tool-versions and .nvmrc parsing, and a real config file with environment variables and tasks. proto is the right call if you live inside the moonrepo ecosystem or want a slightly stricter, declarative-first model. asdf is still rock-solid if you've already standardized on it across a polyglot team — but its shell-based plugins are noticeably slower than the Rust-based newcomers. All three replace the older nvm / pyenv / rbenv zoo with a single tool that handles Node, Bun, Deno, Python, Go, Rust, and more. If you are still on nvm and your shell prompt visibly stutters when you cd into projects, this is the upgrade.
Quick Verdict
| mise | proto | asdf | |
|---|---|---|---|
| Implementation | Rust | Rust | Bash + plugin scripts |
| Activation speed | Sub-millisecond shim | Sub-millisecond shim | Slower (shell-based) |
.tool-versions | Native | Native | Native |
.nvmrc / .python-version | Auto-detected | Auto-detected | Plugin-dependent |
| Plugin model | Built-in core + asdf plugins | Curated set + WASM plugins | Community Bash plugins |
| Tasks / scripts | mise tasks (built-in) | moon integration | None native |
| Env-var management | [env] block, dotenv-compatible | .prototools env section | Plugin-dependent |
| Best for | Most teams in 2026 | Strict, declarative, moonrepo | Existing asdf shops |
Key Takeaways
- Speed is no longer a tie. Both Rust-based managers (mise, proto) measurably beat asdf on
cdactivation; on a large monorepo this is the difference between an instantaneous prompt and a 200-300ms hitch. - Plugin reach favors mise. mise reads asdf's plugin registry as a fallback, so any tool asdf supports, mise can install. proto curates a smaller official catalog plus a WASM plugin API.
- Config style matters. mise uses TOML (
mise.toml) with first-class env vars,[tasks], and[tools]. proto uses.prototools(also TOML). asdf uses plain text.tool-versionsand a separate.envrcif you want env support (usually via direnv). - Migration is cheap. All three read
.tool-versions. You can flip between them in a single repo without rewriting config.
What Each One Actually Is
mise (formerly rtx)
A Rust binary that activates per-shell, manages tool installs into ~/.local/share/mise, and reads a hierarchy of config files (global, user, project). The "task runner" surface (mise run build) competes with npm scripts and just — small but increasingly used as a project entrypoint. mise is openly opinionated about being a replacement for direnv, just, and nvm in one binary.
proto
Built by the moonrepo team and naturally pairs with moon for task orchestration. Tools are installed under ~/.proto. The pitch is determinism: every tool, version, and plugin is captured in .prototools, and proto refuses to silently fall back to system tools. If you've been burned by "works on my machine" because someone's local Node was 22 instead of 24, proto's strictness pays off.
asdf
The original. Bash core, Bash plugins, lots of community tooling. The cost is per-cd shim resolution that has to spawn a shell. asdf 0.16+ has improved this, but it still loses to native binaries.
Speed Reality Check
On a developer laptop with 8 tools managed (node, bun, deno, python, go, rust, java, terraform):
| Operation | mise | proto | asdf |
|---|---|---|---|
cd into project (cold) | ~5ms | ~5ms | ~80-200ms |
node --version (shim) | ~3ms | ~3ms | ~30-60ms |
| Install Node 24 | ~6s | ~6s | ~12s (network + Bash) |
Numbers are illustrative — your shell config dominates more than the manager itself. The directional point is that switching off asdf to mise/proto is the single biggest perceived performance win you'll get from your shell setup in 2026.
Config File Examples
mise.toml:
[tools]
node = "24.5.0"
bun = "1.2"
pnpm = "10"
[env]
NODE_ENV = "development"
DATABASE_URL = "postgres://localhost:5432/dev"
[tasks.dev]
run = "pnpm dev"
description = "Run the dev server"
.prototools:
node = "24.5.0"
bun = "1.2"
pnpm = "10"
[env]
NODE_ENV = "development"
.tool-versions (asdf, mise, and proto all read this):
nodejs 24.5.0
bun 1.2.0
pnpm 10.0.0
Decision Map
| If you... | Pick |
|---|---|
| Want the fastest, most batteries-included option | mise |
| Already use moon for tasks and want a tight pair | proto |
| Have a polyglot team already standardized on asdf plugins | asdf (or migrate to mise) |
| Need a CI-stable, deterministic single-tool answer | proto or mise |
| Are converting from nvm / fnm / volta and want zero friction | mise |
Who Should Pick What
- Solo developer / small team: mise. The single-binary install (
brew install miseorcurl | sh) plus.tool-versionsautodetection means it disappears into the background. - Monorepo team using moon: proto. The integration with
moontask pipelines makes the tool-version definition the single source of truth across CI and local. - Polyglot org with existing asdf plugins for niche tools: stay on asdf, or run mise (which speaks asdf plugins) so you keep the catalog while gaining the speed.
- Node-only team: any of these is overkill compared to fnm vs nvm vs Volta — but if you'll add a second runtime ever, just install mise now.
Real Switching Costs
The actual pain points when migrating:
- CI: GitHub Actions has official actions for all three (
jdx/mise-action,moonrepo/setup-toolchain,asdf-vm/actions/install). All work; mise's is the most batteries-included. - Shell hooks: each manager wants to inject into
~/.zshrcor~/.bashrc. Conflict if you have two installed simultaneously — pick one. - Direnv overlap: if you currently use direnv for env vars, mise's
[env]block replaces it. proto's env support is intentionally narrower; you may keep direnv alongside. - Old
.nvmrcfiles: all three read them. No need to rewrite.
Verdict
For a fresh 2026 setup, install mise. It's the closest thing the polyglot version-manager space has to an obvious default — fast, batteries-included, asdf-plugin-compatible, and pleasant to configure. Choose proto when moon is already your task runner and you want strict determinism. Stay on asdf only if a migration would cost you a full afternoon — otherwise the speed delta on every cd repays itself in a week.
If you're still on plain nvm, the relevant comparison is in fnm vs nvm vs Volta; mise replaces all of those for Node alone and covers everything else.