How to Install and Use mise in Linux to Manage Multiple Programming Language Runtimes and Environment Variables

Managing modern software development workstations often means juggling multiple competing language version managers. Developers routinely install nvm for Node.js, pyenv for Python, rbenv for Ruby, gvm for Go, and direnv for directory-specific environment variables. This fragmented toolchain slows shell startup times, complicates configuration files, and introduces path conflicts. mise (formerly known as rtx) is a unified, polyglot development tool manager written in Rust. It replaces half a dozen language managers with a single lightning-fast binary that handles runtime installations, shims, task running, and environment switching seamlessly.

Why Choose mise Over asdf, nvm, or pyenv?

While asdf popularised the unified runtime manager concept, it relies heavily on interpreted bash scripts and extensive shim directory lookups, which noticeably delays terminal launch times. mise provides complete compatibility with the asdf plugin ecosystem while dramatically improving performance:

  • Written in Rust: Executes runtime resolution in microseconds without perceptible shell latency.
  • Direct PATH Injection: Rather than forcing all tool executions through slow shell shims, mise modifies your active shell PATH dynamically upon directory traversal.
  • Native direnv Functionality: Supports .env and mise.toml files to automatically export project environment variables when entering repository folders.
  • Automatic Tool Downloading: Compiles from source or downloads verified precompiled release binaries directly from GitHub releases.
Feature / Capability mise asdf (Bash) Dedicated Managers (nvm/pyenv)
Implementation Language Compiled Rust Bash scripts Shell scripts & C wrappers
Shell Overhead ~1–4 ms ~50–200 ms ~30–100 ms per manager
Environment Variables (.env) Built-in native support Requires external direnv Requires external direnv
Configuration File mise.toml or .tool-versions .tool-versions .nvmrc, .python-version

Installing mise on Linux

You can install mise across Ubuntu, Debian, Fedora, Arch Linux, or generic Linux distributions using the official standalone installation script or your system’s package manager:

Method 1: Standalone Install Script (Recommended)

curl https://mise.run | sh

The binary is placed in ~/.local/bin/mise. Next, activate mise in your shell configuration:

  • For Bash: Add to ~/.bashrc:
    echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
    source ~/.bashrc
  • For Zsh: Add to ~/.zshrc:
    echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc
    source ~/.zshrc

Method 2: Ubuntu / Debian APT Repository

sudo apt-get update && 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-get update && sudo apt-get install -y mise

Step 1: Installing and Managing Global Runtimes

To establish default language runtimes for your user account:

mise use --global node@22
mise use --global [email protected]
mise use --global [email protected]

Verify that your installed versions take precedence immediately:

node --version
python3 --version
go version

Step 2: Configuring Project-Specific Versions with mise.toml

To pin specific runtime versions for a designated repository without affecting other projects on your machine, navigate to your repository folder and run:

cd ~/projects/my-web-app
mise use [email protected]
mise use [email protected]

mise automatically creates or updates a declarative mise.toml file in the repository root:

[tools]
node = "20.18.0"
python = "3.11.9"

[env]
NODE_ENV = "development"
API_ENDPOINT = "http://localhost:8080"

Whenever you cd into ~/projects/my-web-app, your shell automatically updates PATH to use Node 20.18.0 and exports the specified environment variables. When you leave the folder, mise automatically restores your global defaults.

Step 3: Auditing Installed Tools and Upgrading

  • List All Active Runtimes: mise list displays installed language versions, source configuration paths, and active status.
  • Check for Outdated Versions: mise outdated checks upstream registries for newer patch or minor updates.
  • Clean Unused Runtimes: mise prune removes obsolete language versions to reclaim disk storage.

Troubleshooting Common mise Issues

  • Command Not Found After Installation: Ensure ~/.local/bin is present in your shell $PATH before running the activate command.
  • Missing Build Dependencies for Python or Ruby: Compiling Python or Ruby versions from source requires system development headers. On Debian/Ubuntu, run sudo apt install -y build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev before installing Python versions.
  • Disabling Auto-Activation in Specific Directories: To prevent mise from loading in a specific folder, create an empty .miserc file containing [settings] experimental = false or use mise deactivate.

Get the best tech tips delivered straight to your inbox.

Join thousands of readers mastering Apple, Google, Microsoft, and Linux.