mise is a universal version manager for development tools. It replaces separate version managers (nvm, pyenv, rbenv, etc.) with a single tool.
Why mise? #
- One tool - Manage all languages and tools in one place
- Fast - Written in Rust, activates in milliseconds
- Compatible - Works with asdf plugins
- Project-specific - Per-directory tool versions via
.tool-versions
Installation #
curl https://mise.run | sh
Activate in your shell:
echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc
Configuration #
The main config is at mise/.config/mise/config.toml:
[settings]
idiomatic_version_file_enable_tools = ["ruby"]
[tools]
age = "latest"
argocd = "latest"
atuin = "latest"
bitwarden = "latest"
# ... more tools
Key Commands #
# Install all tools from config
mise install
# Install a specific tool
mise install node@20
# List installed tools
mise list
# Use a specific version in current directory
mise use node@20
# Run a command with a specific tool version
mise exec node@18 -- npm test
Tools Managed #
My setup includes:
Development #
neovim- Text editornode- JavaScript runtimepnpm- Package manageruv- Python package manager
Kubernetes #
kubectl- Kubernetes CLIhelm- Package manager for K8sk9s- Terminal UI for K8sargocd- GitOps tool
Utilities #
fzf- Fuzzy finderripgrep- Fast grep alternativefd- Fast find alternativebat- Enhanced cateza- Modern ls replacementdelta- Syntax-highlighting pager for gitdifftastic- Structural diff tooldirenv- Environment variable manager
Terminal #
starship- Shell promptzellij- Terminal multiplexertmux- Terminal multiplexerlf- File manageryazi- Alternative file manager
Git #
gitui- Terminal UI for git (primary)lazygit- Alternative git TUIgithub-cli- GitHub CLIripsecrets- Secret scanner
Media #
vhs- Terminal recording tool
Project-Specific Versions #
Create a .tool-versions file in project directories:
echo "nodejs 20.11.0" > .tool-versions
echo "python 3.11" >> .tool-versions
mise will automatically switch to these versions when you enter the directory.