Skip to content

mise as a daily version manager

Mise, pronounced “MEEZ ahn plahs”, is a version manager of version managers. It became a structural part of my daily workflow as a software engineer.

Sanji from One Piece cooking, a nod to mise in daily use

Mise manages versions across platforms, languages, and projects without shell hooks or shims.

Compare mise with nvm (Node Version Manager):

Terminal window
autoload -U add-zsh-hook
load-nvmrc() {
local nvmrc_path
nvmrc_path="$(nvm_find_nvmrc)"
if [ -n "$nvmrc_path" ]; then
local nvmrc_node_version
nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")
if [ "$nvmrc_node_version" = "N/A" ]; then
nvm install
elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then
nvm use
fi
elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then
echo "Reverting to nvm default version"
nvm use default
fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

That snippet comes straight from the nvm docs: https://github.com/nvm-sh/nvm/blob/e4e34ec7f9500709f938e7d0188107741ace70e2/README.md?plain=1#L741C7-L761C5

You put it in ~/.zshrc, so every time you cd into a Node.js project, it installs the right version and switches your shell to it.

With mise, after activation, the same task is one line:

Terminal window
mise use node@latest

To decide which tool version to use, mise looks for a mise.toml file in the current directory and its parents. Global config lives at ~/.config/mise/config.toml and can look like this:

[tools]
bun = "latest"
node = "22"
usage = "latest"
[settings]
idiomatic_version_file_enable_tools = ["node"]

As described in the docs, mise supports nested config that cascades from broad to specific:

~/.config/mise/config.toml # Global defaults
~/work/mise.toml # Work-specific tools
~/work/project/mise.toml # Project-specific overrides
~/work/project/.tool-versions # Legacy asdf compatibility

Each level can override or extend the previous one, which gives you fine control over tool versions across contexts.

Mise works as a drop-in replacement for asdf. It reads the same .tool-versions files and can use asdf plugins through the asdf backend.

People coming from asdf usually find mise to be a faster and simpler asdf.

mise ships with some plugins built into the CLI, written in Rust.

You can list the core plugins with mise registry -b core.

ToolInstall command
Bunmise use -g bun@latest
Elixirmise use -g erlang elixir
Javamise use -g java@temurin
Swiftmise use -g swift
Nodemise use -g node@20
Zigmise use -g zig@latest

Tools like mise make development more approachable. It fits any modern setup and speeds up onboarding.

Connect with me on LinkedIn