Skip to content

Tools & Backends

Install & Activate got mise onto your PATH. Now let’s pin some tools. This page is about the [tools] table: how to put versions in it, where the binaries actually come from (the backend registry), and how to lock it all down so your teammates and CI get byte-identical installs.

Three commands, three jobs:

Terminal window
mise use node@22 # install + write it into the nearest mise.toml
mise install # install everything the config already declares (no edit)
mise exec -- node -v # run a one-off in a tool's env (mise x for short)
CommandEdits config?Installs?When
mise use <tool>@<v>yes (nearest mise.toml)yesadopt a tool into a project
mise install [tool]noyeshydrate a cloned repo / CI
mise exec -- <cmd>noyes (if missing)ad-hoc, scripts, cron
Terminal window
mise exec node@22 -- node build.js # pin the version just for this command
mise x python@3.13 -- python -V # x is the alias

mise use writes to the nearest mise.toml, walking up from your cwd. Two flags steer where it lands:

Terminal window
mise use node@22 # → ./mise.toml (project-local)
mise use -g node@22 # → ~/.config/mise/config.toml (global default)
mise use --env local node@22 # → ./mise.local.toml (gitignored, your machine only)
Terminal window
mise use --pin node@22 # write the resolved EXACT version, not "22"
mise use --remove node # drop a tool from the config

The right-hand side of a tool entry is more expressive than a plain version string:

SpecifierExampleMeaning
exact"20.11.0"that version, nothing else
fuzzy"20", "3.12"latest matching that prefix
latest"latest"newest stable release
lts"lts"newest long-term-support release
prefix:"prefix:1.20"latest within the prefix (explicit form)
ref:"ref:main"build from a git ref / tag / commit
path:"path:/opt/node"use a binary already on disk
sub-N:"sub-2:lts"N releases behind the resolved target
mise.toml
[tools]
node = "22" # fuzzy: newest 22.x
python = "3.13.1" # exact
go = "latest" # newest stable
ruby = "lts"

The simple forms cover most of life:

mise.toml
[tools]
node = "22" # single version
python = ["3.13", "3.12"] # array — first entry is the default on PATH
"npm:prettier" = "latest" # backend-prefixed key — quote it

For tools that need extra setup, use the table form:

mise.toml
[tools]
node = { version = "22", postinstall = "corepack enable" }
ripgrep = { version = "latest", os = ["linux", "macos"] }
my-cli = { version = "1.2", depends = ["node"] }
KeyWhat it does
versionthe version specifier
postinstallshell command run after install (gets MISE_TOOL_NAME / MISE_TOOL_VERSION)
osrestrict install to these OSes, e.g. ["linux", "macos"]
dependsinstall these tools first
install_envenv vars set during the install

Here’s a realistic mise.toml pinning a full backend stack — Node, Python, Go, and a CLI tool from a language backend:

mise.toml
[tools]
node = { version = "22", postinstall = "corepack enable" } # gives you pnpm/yarn
python = "3.13"
go = "1.23"
"npm:typescript" = "5.6" # tsc, from the npm backend
ripgrep = "latest" # from the registry (aqua)
Terminal window
mise install # one command, the whole toolchain

When you write node = "22", mise looks up the short name node in its registry, which maps it to a backend — the actual installation mechanism. You can see every mapping with mise registry.

How a short name resolves to a backend
Rendering diagram…

You can also skip the registry and address a backend directly:

mise.toml
[tools]
"aqua:BurntSushi/ripgrep" = "latest"
"github:cli/cli" = "2.55"
"cargo:tokei" = "latest"
"npm:prettier" = "3.3"
"pipx:ruff" = "latest"
"go:github.com/air-verse/air" = "latest"

mise picks backends in this order, and it’s a supply-chain decision, not just ergonomics:

  1. aqua — the default in 2026. Downloads pre-built release binaries with checksum + signature verification, needs no plugins, and works on Windows. This is the one you want.
  2. github / gitlab — pull release assets straight from a repo when there’s no aqua entry.
  3. language backendscargo npm pipx go gem dotnet. Great coverage, but they require the relevant toolchain to be installed first and build/fetch from package registries.

Legacy / avoid:

  • ubideprecated, folded into github.
  • asdflegacy; no longer accepted for new registry entries.
  • vfox — not accepted for new entries (but it’s the default backend on Windows).
Terminal window
mise settings add disable_backends asdf # opt out of a backend entirely

Versions like "22" are fuzzymise install today and next month can resolve to different patch releases. The lockfile pins the resolved version, the checksum, and the per-platform download URL so installs are reproducible.

It’s stable in 2026 — no experimental flag. Enable it once:

mise.toml
[settings]
lockfile = true # or set MISE_LOCKFILE=1

The lockfile is not created automatically. Generate or refresh it with any install/use operation, or explicitly:

Terminal window
mise lock # resolve current config → mise.lock
mise install # also updates mise.lock when lockfile = true

The file mirrors its config’s basename: mise.tomlmise.lock, mise.local.tomlmise.local.lock.

In CI and Docker, fail loudly if the lockfile can’t satisfy the current platform:

Terminal window
mise install --locked # error if no resolved URL for this platform
mise.toml
[settings]
locked = true # make --locked the default

If your team is on macOS but CI is Linux (and maybe arm64), record entries for every platform up front so nobody hits an “unresolved URL” wall:

Terminal window
mise lock --platform linux-x64,macos-arm64
Terminal window
mise ls # installed tools (versions, source config)
mise ls --current # just what's active here (-c)
mise ls --outdated # installed vs latest available
mise ls-remote node # every installable version of a tool
Terminal window
mise outdated # report tools with newer versions
mise outdated --bump # report newest, ignoring your current spec

This distinction trips people up:

Terminal window
mise upgrade # upgrade WITHIN your spec — "22" → newest 22.x; no config edit
mise upgrade --bump # jump to the newest major/minor AND rewrite mise.toml
mise upgrade node --dry-run
CommandCrosses your version spec?Edits mise.toml?
mise upgradeno (stays within "22")no
mise upgrade --bumpyes (e.g. "22""24")yes

Brand-new releases are where supply-chain attacks land first. Tell mise to ignore releases younger than a cooling-off window:

Terminal window
mise use node@22 --minimum-release-age "7d"
mise install --minimum-release-age "30d"

It’s accepted on use, install, ls-remote, and upgrade, so a freshly published (and possibly compromised) version won’t get pulled into your stack until it’s had time to be scrutinised.


Next: your tools are pinned and locked. Now give the project its environment — vars, dotenv files, and secrets — in Environments & Secrets.