Skip to main content
← All Tools · 🛠️ Documentation & DX Tools

mise

The fast, modern version manager for Node, Python, Ruby, Go, and 500+ tools — successor to asdf with 10x faster performance, written in Rust, with built-in task runner and env management.

Free Open source (MIT)
developer-toolsversion-managerdevexrustopen-sourcenodepython

✅ Pros

  • + Replaces nvm, pyenv, rbenv, goenv, sdkman with one tool
  • + 10x faster than asdf (written in Rust vs shell scripts)
  • + Backward compatible with asdf plugins and `.tool-versions` files
  • + Built-in task runner (replaces Makefile for common dev tasks)
  • + Environment variable management (.mise.toml replaces .envrc for many cases)

⚠️ Cons

  • − Newer than asdf — some edge cases not yet handled
  • − Plugin ecosystem still catching up to asdf's full breadth
  • − Task runner is less powerful than dedicated tools like just
  • − Breaking changes possible as project matures

Overview

mise (formerly rtx) is a fast, unified version manager that replaces the patchwork of nvm, pyenv, rbenv, and asdf. Written in Rust, it’s 10x faster than asdf (which is bash), handles 500+ tools via plugins, and adds env management and a task runner. The .mise.toml file per project pins all tool versions for the entire team.

Installation

# macOS
brew install mise

# Linux / Any
curl https://mise.run | sh

# Add to shell (~/.zshrc)
eval "$(mise activate zsh)"  # or bash, fish

Per-Project Tool Versions

# .mise.toml (commit this!)
[tools]
node = "20.11.0"
python = "3.12.1"
go = "1.22.0"
terraform = "1.7.4"
awscli = "2.15.0"

[env]
NODE_ENV = "development"
DATABASE_URL = "postgresql://localhost/myapp_dev"
# Install all pinned versions
mise install

# Activate — tools are now in PATH
mise use  # or just cd into the directory (auto-activate)

Global Defaults

# Set global defaults (used when no .mise.toml in project)
mise use --global node@20
mise use --global [email protected]

# List all installed versions
mise ls

# List available versions
mise ls-available node

Task Runner

# .mise.toml — define tasks
[tasks.dev]
run = "npm run dev"
description = "Start dev server"

[tasks.test]
run = "npm test -- --coverage"
depends = ["lint"]

[tasks.lint]
run = "biome check ."

[tasks.db.migrate]
run = "npx prisma migrate dev"

[tasks.setup]
run = """
npm install
mise run db.migrate
echo 'Setup complete!'
"""
mise run dev          # Start dev server
mise run test         # Run tests (after lint)
mise run db.migrate   # Run migrations

Plugin System

# Install via asdf-compatible plugins
mise plugin add rust
mise use rust@latest

# Or use short form for popular tools
mise use node@lts
mise use [email protected]
mise use deno@latest

mise vs Alternatives

miseasdfnvmpyenv
SpeedFast (Rust)Slow (bash)SlowMedium
Languages500+500+Node onlyPython only
Task runner✅❌❌❌
Env management✅❌❌❌
asdf compat✅N/A❌❌
Maturity2023+2014+2010+2011+

For new projects, mise is the recommended choice. For existing asdf setups, mise is a drop-in replacement that reads .tool-versions files.

Quick Start

Get from zero to a fully pinned, reproducible dev environment in under 5 minutes:

# 1. Install mise
curl https://mise.run | sh
echo 'eval "$(mise activate bash)"' >> ~/.bashrc
source ~/.bashrc

# 2. In your project directory, pin your tools
mise use [email protected]
mise use [email protected]
# This creates/updates .mise.toml — commit it to Git

# 3. Install all pinned versions
mise install

# 4. Verify
node --version   # v20.11.0
python --version # Python 3.12.2
# .mise.toml — what your teammates will see after git pull
[tools]
node = "20.11.0"
python = "3.12.2"

[env]
NODE_ENV = "development"

[tasks.dev]
run = "npm run dev"
description = "Start the development server"
# After a teammate clones the repo:
mise install   # installs all tools defined in .mise.toml
mise run dev   # start the dev server with the correct Node version

The key workflow benefit: every developer on the team gets the exact same tool versions automatically, without needing a .nvmrc, .python-version, and .tool-versions file all maintained separately. One .mise.toml file replaces all of them.