Modern software engineering requires juggling multiple programming languages, runtimes, and command-line tools across different projects. One repository might require Node.js 18 with Python 3.10, while another demands Node.js 22, Python 3.12, and specific versions of Terraform and Go. Historically, developers installed separate managers like nvm, pyenv, rbenv, and gvm, which bloat shell startup times and create complex configuration chains. The mise tool (formerly known as rtx) consolidates this into a single, high-performance polyglot environment manager.
Written in Rust, mise is a blazing-fast drop-in replacement for asdf, providing instantaneous version switching, automated environment variable loading (similar to direnv), and task running capabilities with zero shell latency.
What Is mise and Why Is It Replacing Legacy Version Managers?
Unlike Bash-based managers that inject sluggish shim wrappers into your system $PATH, mise modifies environment variables dynamically using fast binary lookups:
- Instantaneous Execution: Because it is compiled in Rust,
miseexecutes commands directly without the 100ms–300ms latency overhead common to traditional shim scripts. - Universal Tool Management: Installs and manages hundreds of languages and developer CLIs—including Node.js, Python, Go, Rust, Java, Ruby, Terraform, Kubernetes tools, and Zig.
- Cross-Compatibility: Automatically reads legacy configuration files like
.nvmrc,.node-version,.python-version, and.tool-versionswithout requiring migrations. - Built-In Environment and Task Runner: Replaces separate tools by managing project-level environment variables (like
.envfiles) and executing development tasks defined in configuration tables.
How to Install mise on Linux
Installing mise is straightforward using the official standalone binary installer or distribution package archives.
Recommended: Standalone Binary Installer
The simplest and fastest method to install mise is via its automated curl script:
curl https://mise.run | sh
This command downloads the compiled binary and installs it safely into ~/.local/bin/mise.
Ubuntu, Debian, and Linux Mint (via APT Repository)
To receive automatic system updates via APT, add the official repository:
sudo apt update && sudo apt 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
Arch Linux and Manjaro
Install directly from the official Arch community repositories:
sudo pacman -S mise
Configuring Shell Activation
For mise to dynamically activate runtimes when changing directories, hook it into your interactive shell profile:
For Bash Users
Append the hook to ~/.bashrc:
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
source ~/.bashrc
For Zsh Users
Append the hook to ~/.zshrc:
echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc
source ~/.zshrc
For Fish Users
Add to your Fish configuration:
echo '~/.local/bin/mise activate fish | source' >> ~/.config/fish/config.fish
Installing and Managing Runtimes with mise
Once activated, installing specific tool versions is lightning fast:
1. Installing Languages Globally
To establish default global runtime versions across your entire user account, execute:
mise use --global node@22
mise use --global [email protected]
mise use --global [email protected]
Verify that the versions are active:
node -v
python --version
go version
2. Setting Project-Specific Versions
To bind specific runtime versions exclusively to a single development repository:
cd ~/projects/legacy-backend
mise use [email protected] [email protected]
This command creates or updates a mise.toml configuration file inside the project directory. Whenever you navigate into this folder, mise switches your active Node and Python binaries instantly. When you navigate away, your shell reverts to global defaults.
Essential mise Commands Reference
| Command | Function | Practical Use Case |
|---|---|---|
mise ls |
List installed runtimes | Inspect which versions of tools are currently downloaded locally. |
mise ls-remote <tool> |
List available versions | Browse all downloadable releases (e.g. mise ls-remote python). |
mise current |
Show active tool versions | Audit currently active binaries and their originating config paths. |
mise install |
Install missing tools | Installs all versions declared in a cloned repository’s mise.toml. |
mise upgrade |
Update installed runtimes | Bumps tools to their latest minor or patch versions. |
mise prune |
Delete unused versions | Removes orphaned runtime versions to recover disk space. |
Managing Environment Variables with mise.toml
Beyond language runtimes, mise.toml functions as an environment variable manager. Open your project’s mise.toml and configure an [env] block:
[tools]
node = "20"
python = "3.11"
[env]
NODE_ENV = "development"
API_ENDPOINT = "https://api.dev.local"
DATABASE_PORT = 5432
As soon as you enter the folder, mise exports these variables into your shell session. When you exit, it cleans them up automatically, eliminating the need to install separate tools like direnv.