Modern software engineers frequently work across multiple programming ecosystems simultaneously, maintaining Node.js microservices, Python data pipelines, Go networking daemons, and Rust utilities on a single machine. Traditionally, managing conflicting language runtimes required running separate managers—such as nvm, pyenv, gvm, and rustup—or using shell-scripted tools like asdf that introduce noticeable terminal latency during shell startup. mise (formerly rtx), developed in Rust by Jeff Dickey, is a lightning-fast polyglot runtime manager, environment variable manager, and task runner that manages all programming languages in one unified configuration.
Why mise Outperforms Traditional Version Managers
Designed as a drop-in, backwards-compatible replacement for asdf, mise executes in native compiled Rust rather than interpreted Bash scripts:
- Blazing Performance: Executes shell shims and directory hooks 20 to 100 times faster than
asdf, eliminating perceptible shell lag. - Unified Language Support: Installs and switches versions for Node.js, Python, Go, Java, Ruby, Rust, Terraform, and hundreds of CLI tools using standard asdf plugins.
- Per-Directory Configuration: Automatically switches runtime versions when you
cdinto project folders based on.mise.tomlor legacy.tool-versionsfiles. - Integrated Environment Variables: Replaces tools like
direnvby loading project-specific environment variables and secrets automatically. - Built-In Task Runner: Defines and executes cross-platform build tasks similar to Make, npm scripts, or just.
Installing mise Across Linux Distributions
The official mise installation script provisions native binaries and maintains update channels.
Installing via Standalone Script (All Distributions)
curl https://mise.run | sh
This downloads the standalone binary to ~/.local/bin/mise.
Installing on Arch Linux and Manjaro
sudo pacman -S mise
Installing on Ubuntu, Debian, and Mint via APT
sudo apt-get install -y gpg sudo wget curl
sudo install -dm 755 /etc/apt/keyrings
wget -qO - https://mise.jdx.dev/gpg-key.pub | gpg --dearmor | sudo tee /etc/apt/keyrings/mise-archive-keyring.gpg 1> /dev/null
echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.gpg arch=amd64] https://mise.jdx.dev/deb stable main" | sudo tee /etc/apt/sources.list.d/mise.list
sudo apt update
sudo apt install -y mise
Configuring Shell Integration
To enable automatic directory switching and shims, add the activation hook to your shell configuration:
For Bash:
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
source ~/.bashrc
For Zsh:
echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc
source ~/.zshrc
Installing and Managing Runtimes
Managing toolchains with mise requires only intuitive subcommands:
1. Installing Multiple Node.js and Python Versions
# Install latest Node.js LTS and Python 3.12
mise use -g node@lts
mise use -g [email protected]
The -g flag sets these versions as your workstation-wide global defaults.
2. Setting Project-Specific Versions
To lock a specific version for an individual project repository:
cd ~/projects/my-api
mise use [email protected]
Mise automatically generates a .mise.toml file in that directory. Whenever you navigate to this directory, your active Node version instantly changes to 20.10.0.
Feature Comparison: mise vs asdf vs nvm/pyenv
| Feature | mise (rtx) | asdf | nvm / pyenv |
|---|---|---|---|
| Execution Core | Compiled Native Rust | Interpreted Bash scripts | Shell scripts |
| Shell Startup Latency | < 5 ms | 50–200 ms | 30–150 ms |
| Multi-Language Scope | Universal (all runtimes) | Universal | Single language only |
| Env Var Management | Built-in (.env & toml) | Requires plugins | Unsupported |
| Plugin Ecosystem | Direct asdf plugin compatibility | Native | N/A |
Switching to mise simplifies multi-language development on Linux, delivering unmatched execution speed while consolidating disparate runtime managers into a single, cohesive workflow.