Skip to content

Install & Activate

Getting mise on your machine is a one-liner. Understanding the two ways it puts tools on your PATH — and where it reads config from — is what separates “it works on my laptop” from “it works everywhere.” This page covers both.

Terminal window
curl https://mise.run | sh # → ~/.local/bin/mise

The simplest path. Pin a version or relocate the binary with env vars:

Terminal window
MISE_VERSION=v2026.6.4 MISE_INSTALL_PATH=/usr/local/bin/mise \
curl https://mise.run | sh

The installer drops a static binary and does nothing to your shell. That’s the next, crucial step.

Activation is what makes cd-ing into a project swap your tools automatically. Add the right line to your interactive rc file:

~/.bashrc
eval "$(mise activate bash)"

Reload (exec $SHELL) and you’re live. The https://mise.run/bash (or /zsh, /fish) endpoint even appends the activation line for you during install.

mise can expose your tools two different ways, and almost every “why isn’t my tool found?” question comes down to which one you’re using.

PATH activation hooks your shell prompt. Before each prompt — and on every cd — mise runs hook-env, which rewrites PATH (and [env] vars) to match the directory you’re standing in.

hook-env: PATH rewrite on cd / prompt (PATH-activation mode)
Rendering diagram…

Shims are static wrapper scripts in ~/.local/share/mise/shims. You put that one directory on PATH and forget it. Calling node runs the node shim, which asks mise (at exec time) which version this directory wants, then execs it. No prompt hook, no shell integration — which is exactly why they work where there is no shell.

Terminal window
eval "$(mise activate bash --shims)" # or just add the shims dir to PATH
export PATH="$HOME/.local/share/mise/shims:$PATH"
PATH activationShims
Howprompt hook rewrites PATH per directorystatic wrapper scripts on PATH
Sets [env] varsyesno (env vars only via activation)
Needs an interactive shellyesno
Speedfast; resolves once per prompttiny per-call exec overhead
New binary appearspicked up automaticallyrun mise reshim
Best foryour daily terminalIDEs, CI, cron, Dockerfile, scripts

A common gotcha: under PATH activation, which node reports the shim or installed path your shell sees. To find the real resolved binary, use mise’s own resolver:

Terminal window
mise which node # → ~/.local/share/mise/installs/node/22.14.0/bin/node
mise where node # → the install dir
mise reshim # regenerate shims after a tool adds a new binary

Need a tool right now without touching config or your shell? mise exec (alias mise x) resolves, installs if missing, and runs — in a one-off subshell.

Terminal window
mise exec node@22 -- node --version # ad-hoc, nothing written to config
mise x python@3.13 -- python script.py
mise x -- npm test # use the versions this dir already pins

This is the right tool inside scripts, cron, systemd units, and CI steps where you don’t want to depend on shell activation. (Pinning tools into a project with mise use is page 2.)

mise walks up from your current directory to the filesystem root, then layers in your user and system config. Nearer files win, merged key by key — so a project mise.toml overrides your global Node version without throwing away your global env.

Config resolution: walk up from cwd, merge (nearer overrides)
Rendering diagram…

Within a single directory, the precedence is (highest first):

OrderFileCommit it?
1mise.local.tomlno — gitignore
2mise.<env>.local.tomlno — gitignore
3mise.tomlyes
4mise.<env>.tomlyes
5mise/config.toml, .mise/config.tomlyes
6.mise.toml (legacy dotted form)yes
then user ~/.config/mise/config.toml, then system /etc/mise/

There’s also .miserc.toml — a new-in-2026 early-init settings file read before the rest, for things like selecting the active environment.

.tool-versions vs mise.toml — pick mise.toml

Section titled “.tool-versions vs mise.toml — pick mise.toml”

mise still reads asdf’s .tool-versions (lowest precedence) for backwards compat:

.tool-versions
node 22.14.0
python 3.13.2

But it only carries tool versions — no [env], no [tasks], no [settings]. The equivalent mise.toml does all three, in one committed file:

mise.toml
[tools]
node = "22" # fuzzy → latest 22.x
python = "3.13"
[env]
DATABASE_URL = "postgres://localhost/dev"
[tasks.test]
run = "npm test"

You can now install mise, activate it (or drop in shims), run anything ad-hoc with mise exec, and you know exactly which config file wins. Next: actually pinning tools — versions, backends, and the lockfile — in Tools & Backends.