mise (pronounced "meez", as in mise-en-place) is a command-line tool that prepares your development environment before every command runs. It combines three things developers usually juggle with separate tools: installing and switching dev tool versions, loading per-project environment variables, and running build/test/deploy tasks. It's aimed at developers and teams who want one config file (mise.toml) instead of a .nvmrc, a .env file, a Makefile, and a version manager per language, all doing overlapping jobs differently.
It works as a replacement for tools like asdf, nvm, pyenv, rbenv, and direnv, and it also functions as a lightweight task runner similar to make or just. Because it hooks into your shell, activating a directory automatically switches tool versions and loads environment variables, without shims pointing to wrapper scripts.
mise activate puts real tool paths on your PATH, so which node resolves to the actual binary instead of a shim script.mise.toml or load them from .env files, scoped to a project directory and applied automatically when you cd in.run commands, descriptions, and depends chains directly in mise.toml, then execute them with mise run <task>.mise exec <tool>@<version> -- <command>.mise activate hook line.mise.toml that developers use locally can be installed with mise install in CI, keeping local and CI environments consistent.depends on each other.mise install reads the same mise.toml used on developer machines.It's less of a fit if you only ever work with a single language and already have a stable, minimal setup with a dedicated version manager you're happy with, since introducing another tool adds a small migration cost for little gain. It's also not a general-purpose build system like Make or Bazel; task dependency graphs are simple (depends), not a full DAG-based build engine.
Install with the official install script:
$ curl https://mise.run | sh
$ ~/.local/bin/mise --version
Hook mise into your shell so it activates per directory (pick the line for your shell):
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc
echo '~/.local/bin/mise activate fish | source' >> ~/.config/fish/config.fish
echo '~/.local/bin/mise activate pwsh | Out-String | Invoke-Expression' >> ~/.config/powershell/Microsoft.PowerShell_profile.ps1
Install tools globally or per project:
$ mise use --global node@26 go@1
Run a command against a specific version without installing globally:
$ mise exec node@26 -- node -v
Define env vars and tasks in mise.toml, then apply and run them:
[env]
SOME_VAR = "foo"
[tasks.build]
description = "build the project"
run = "echo building..."
$ mise install
$ mise run build
Also installable via crates.io (cargo install mise) since it's published as a Rust crate. See the getting-started guide on the docs site for platform-specific package manager options.