Skip to content
C.W.K.
Stream
Lesson 08 of 08 · published

mise / asdf: Multi-Tool Version Manager

~10 min · mise, asdf, version-manager

Level 0Window Tourist
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

One tool, every runtime version

Tools such as mise and asdf can manage several runtime versions through one interface. They do not automatically replace environment managers, package ecosystems, or deployment images that a project already owns.

Install mise

brew install mise
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc

Pin 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 can be the version declaration when the repository chooses mise as its owner. Activation still depends on shell integration or explicit execution, and teams must reconcile existing Conda, system, container, or CI ownership before adding another layer.

Global tool defaults

mise use -g python@3.12 node@22
mise list                 # see what's installed
mise upgrade              # bump pinned versions to latest patch

Why mise over asdf

  • A compiled implementation can make common operations responsive; measure the commands and plugin path that matter to this project.
  • 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.

One runtime owner per project

Preserve the repository's declared manager unless there is an explicit migration plan. Coexistence on one machine is possible; stacking multiple activators inside one project makes PATH and interpreter selection harder to explain.

A version pin is only one layer of reproducibility

Dependency locks, native libraries, environment values, and the operating system can differ even with the same Python or Node version. Know the boundary the runtime manager actually solves.

Automatic activation changes command resolution

Entering a directory can rewrite PATH. Review trust prompts and configuration before approving an unfamiliar repository, then inspect the selected executable and version.

Code

Bootstrap mise·bash
brew install mise
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
exec zsh
cd ~/myproject
mise use python@3.12 node@20
cat .mise.toml

External links

Exercise

Install mise. cd into any project. Run mise use python@3.12 and watch .mise.toml appear. cd out of the project, run python --version, see your global. cd back in, see the pinned version.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.