One tool, every runtime version
You used to install nvm for Node, pyenv for Python, rbenv for Ruby, jenv for Java. mise (formerly rtx) and asdf replace all of them with one CLI that pins per-project versions via a single config file.
Install mise
brew install mise
echo 'eval "$(mise activate zsh)"' >> ~/.zshrcPin versions per project
# In any project root
mise use python@3.12 node@20 ruby@3.3
# Writes .mise.toml with the pins
cat .mise.toml
# Anyone cd-ing in gets the right versions automatically.mise.toml is the project's source of truth. New machines run mise install to download the pinned versions; after that the right runtime is always active inside the project dir.
Global tool defaults
mise use -g python@3.12 node@22
mise list # see what's installed
mise upgrade # bump pinned versions to latest patchWhy mise over asdf
- Faster (Rust binary; asdf is shell scripts).
- Compatible with asdf plugins out of the box.
- Built-in env var management (
[env]in mise.toml). - direnv-style hooks without needing a second tool.
If you're starting fresh, mise. If you have an asdf setup that works, no rush — both are healthy projects.
Pippa note
cwkPippa uses conda + direnv for Python because the conda ecosystem matters for ML packages. mise excels for non-ML stacks (web, scripting, Java). Pick per project — they coexist fine.