Reference

mise(1)

Dev tools, env vars, and tasks in one CLI

NAME

mise - Dev tools, env vars, and tasks in one CLI

SYNOPSIS

mise [OPTIONS] [<TASK>] [<TASK_ARGS>] ... [<TASK_ARGS_LAST>] ... [COMMAND]

DESCRIPTION

mise installs the development tools your projects need, sets their environment variables, and runs their tasks.

You declare tools, environment variables, and tasks in mise.toml. `mise use <TOOL>` installs a tool and adds it to the project's mise.toml, `mise install` installs everything the config requests, and `mise run <TASK>` runs a task. Docs: https://mise.jdx.dev

OPTIONS

-c, --continue-on-error

Continue running tasks even if one fails

-C, --cd <DIR>

Run as if mise were started in DIR

-E, --env <ENV>

Load the `mise.<ENV>.toml` config files (same as MISE_ENV)

Repeat the flag or separate names with commas to load several environments.

-f, --force

Force the operation

-j, --jobs <JOBS>

How many jobs to run in parallel; defaults to the `jobs` setting

Values below 1 are treated as 1.

Environment: MISE_JOBS

-n, --dry-run

Dry run, don't actually do anything

-P, --profile <PROFILE>

Set the profile (environment)

-q, --quiet

Suppress non-error messages

Environment: MISE_QUIET

-s, --shell <SHELL>
-t, --tool <TOOL@VERSION>

Tools to load in addition to those in mise.toml, such as `node@24 [email protected]`

-v, --verbose

Show extra output (use -vv for even more)

-V, --version
-y, --yes

Answer yes to all confirmation prompts

--debug

Set the log level to debug

--log-level <LEVEL>
--no-config

Do not load any config files

Same as `MISE_NO_CONFIG=1`.

--no-env

Do not load environment variables from config files

Same as `MISE_NO_ENV=1`.

--no-hooks

Do not run hooks from config files

Same as `MISE_NO_HOOKS=1`.

--no-timings

Hide the elapsed time printed after each task completes

Set `MISE_TASK_TIMINGS=0` to hide it by default

--output <OUTPUT>

How task output is displayed when running a task (same as `mise run --output`)

--raw

Connect tasks and install commands directly to the terminal

Commands then run one at a time. Same as `MISE_RAW=1` or the `raw` setting.

--locked

Require download URLs from the lockfile when installing

Installing fails when the lockfile has no pre-resolved URL for a tool on the current platform, so mise does not call the GitHub or aqua registry APIs to find one. Same as `MISE_LOCKED=1` or the `locked` setting.

--silent

Suppress all task output and mise non-error messages

--timings

Show the elapsed time after each task completes

Set `MISE_TASK_TIMINGS=1` to show it by default

--trace

Set the log level to trace

-h, --help

Print help

ARGUMENTS

<TASK>

Task to run

Shorthand for `mise run <TASK>`.

<TASK_ARGS>

Task arguments

COMMANDS

activate

Print the script to activate mise in an interactive shell

tool-alias

Manage tool backend and version aliases

Aliases: alias, aliases

tool-alias get

Show the version a tool's version alias stands for

tool-alias ls

List tool version aliases

Aliases: list

tool-alias set

Set a backend alias or a version alias in the global config

Aliases: add, create

tool-alias unset

Remove a backend alias or a version alias from the global config

Aliases: rm, remove, delete, del

backends

Manage backends

Aliases: b, backend, backend-list

backends ls

List built-in backends

Aliases: list

backends switch

Switch tools to the backend the registry now installs them from

bin-paths

List the bin directories of the active tools

bootstrap

Set up this machine from your mise config

Aliases: bs

bootstrap accounts

Manage Linux users and groups

bootstrap accounts apply

Create, update, or remove the configured Linux users and groups

bootstrap accounts status

Show the state of the configured Linux users and groups

bootstrap compose

Manage Docker Compose projects from `[bootstrap.compose]`

bootstrap compose apply

Apply Docker Compose projects from `[bootstrap.compose]`

bootstrap compose status

Show the state of Docker Compose projects from `[bootstrap.compose]`

bootstrap files

Manage system files and directories declared in `[bootstrap]`

bootstrap files apply

Create, update, or remove the configured system files and directories

bootstrap files status

Show the state of the configured system files and directories

bootstrap firewall

Manage the Linux host firewall from `[bootstrap.linux.firewall]`

bootstrap firewall apply

Apply the firewall from `[bootstrap.linux.firewall]`

bootstrap firewall status

Show the state of the firewall from `[bootstrap.linux.firewall]`

bootstrap linux

Manage systemd user units from `[bootstrap.linux.systemd.units]`

bootstrap linux systemd-units

Manage systemd user units from `[bootstrap.linux.systemd.units]`

Aliases: systemd

bootstrap linux systemd-units apply

Install and start the configured systemd user units

bootstrap linux systemd-units status

Show the state of the configured systemd user units

bootstrap macos

Manage macOS preferences and LaunchAgents from `[bootstrap.macos]`

bootstrap macos defaults

Manage macOS preferences such as Dock, Finder, and keyboard settings

bootstrap macos defaults apply

Write the configured macOS preferences

bootstrap macos defaults status

Show the state of the configured macOS preferences

bootstrap macos launchd-agents

Manage macOS LaunchAgents from `[bootstrap.macos.launchd.agents]`

Aliases: launchd

bootstrap macos launchd-agents apply

Install and load LaunchAgents from `[bootstrap.macos.launchd.agents]`

bootstrap macos launchd-agents status

Show the state of the configured LaunchAgents

bootstrap mise-shell-activate

Manage mise shell activation from `[bootstrap.mise_shell_activate]`

Aliases: shell

bootstrap mise-shell-activate apply

Write mise activation into the configured shell startup files

bootstrap mise-shell-activate status

Show the state of the configured shell activation

bootstrap packages

Manage packages from `[bootstrap.packages]`

bootstrap packages apply

Install or remove packages to match `[bootstrap.packages]`

Aliases: i, install

bootstrap packages brew

Manage Homebrew tap URLs in `[bootstrap.brew.taps]`

bootstrap packages brew tap

Add a Homebrew tap URL to the global `[bootstrap.brew.taps]`

bootstrap packages brew untap

Remove Homebrew tap URLs from `[bootstrap.brew.taps]`

Aliases: remove, rm

bootstrap packages export

Print the configured `nix:` packages as a NixOS module

bootstrap packages import

Record installed Homebrew formulae in `[bootstrap.packages]`

bootstrap packages prune

Uninstall packages that no config declares

bootstrap packages status

Show the state of packages from `[bootstrap.packages]`

Aliases: ls, list

bootstrap packages upgrade

Upgrade installed packages from `[bootstrap.packages]`

Aliases: up

bootstrap packages use

Add packages to `[bootstrap.packages]` and install them

Aliases: u

bootstrap packages where

Print the `opt` path of an installed Homebrew formula

bootstrap plan

Show what applying bootstrap resources would change

bootstrap plugins

Manage package manager plugins declared in `[bootstrap.plugins]`

bootstrap plugins apply

Install package manager plugins declared in `[bootstrap.plugins]`

bootstrap plugins status

Show whether declared package manager plugins are installed

bootstrap remote

Bootstrap one or more machines over SSH

bootstrap repos

Manage Git repositories from `[bootstrap.repos]`

bootstrap repos apply

Clone missing Git repositories and check out configured refs

bootstrap repos exec

Run a command in each configured Git repository

bootstrap repos status

Show the state of Git repositories from `[bootstrap.repos]`

bootstrap repos update

Clone missing Git repositories and fast-forward the rest

bootstrap secrets

Inspect bootstrap secret inputs without revealing their values

bootstrap secrets status

Show whether declared bootstrap secret inputs are available

bootstrap services

Manage services from `[bootstrap.services]`

bootstrap services apply

Apply the service state declared in `[bootstrap.services]`

bootstrap services remove

Uninstall a user-scope service

bootstrap services status

Show the state of services from `[bootstrap.services]`

bootstrap status

Show the state of every configured bootstrap part

Aliases: ls

bootstrap unapply

Remove what a config environment's bootstrap sections created

bootstrap user

Manage your login shell from `[bootstrap.user]`

bootstrap user apply

Set your login shell from `[bootstrap.user]`

bootstrap user status

Show whether your login shell matches `[bootstrap.user]`

cache

Manage the mise cache

cache clear

Delete cached data

Aliases: c, clean

cache path

Print the cache directory path

Aliases: dir

cache prune

Remove cache files that have not been accessed recently

Aliases: p

cache task

[experimental] Inspect artifact cache entries for a task

completion

Generate shell completions

Aliases: complete, completions

config

Manage config files

Aliases: cfg, toml

config explain

Describe each key in a mise TOML file

config get

Print a value from one mise TOML file

config ls

List config files currently in use, from lowest to highest precedence

Aliases: list

config set

Set a value in one mise TOML file

deactivate

Print the script to disable mise in the current shell session

daemons

[experimental] Manage project daemons with pitchfork

Aliases: daemon

daemons providers

[experimental] Manage shared servers from global `[daemon_providers]`

daemons providers ls

[experimental] List shared servers

daemons providers start

[experimental] Start shared servers

daemons providers stop

[experimental] Stop shared servers (data is kept)

daemons providers restart

[experimental] Restart shared servers with their current configuration

daemons start

[experimental] Start project daemons and the daemons they depend on

daemons register

[experimental] Register project daemons for on-demand startup

daemons stop

[experimental] Stop project daemons

daemons restart

[experimental] Restart project daemons

daemons ls

[experimental] List project daemons

Aliases: list

daemons urls

[experimental] Show each daemon's URL and port

daemons logs

[experimental] Show the output of project daemons

daemons status

[experimental] Show the status of project daemons

daemons tui

[experimental] Open the pitchfork dashboard

daemons prune

[experimental] Remove daemon state left by deleted projects

dotfiles

Deploy, track, and sync dotfiles

Aliases: dot

dotfiles add

Start deploying a file, or copy its edits back to the source

dotfiles apply

Link, copy, and render `[dotfiles]` entries into place

dotfiles capture

Run a command and save tracked files before and after it

dotfiles conflicts

Compare both sides of a sync conflict

dotfiles diff

Show what `mise dot apply` would change

dotfiles edit

Open a dotfile's source in your editor

dotfiles exclude

Never save paths matching a glob

dotfiles history

Browse saved versions of your tracked files

dotfiles history describe

Set the description of a checkpoint

dotfiles history diff

Compare checkpoints, or your files against one

dotfiles history ls

List checkpoints, newest first

Aliases: list

dotfiles history purge

Erase a path's saved versions from history

dotfiles history show

Show a checkpoint: its trigger, changes, and operation journal

dotfiles include

Stop excluding paths matching a glob

dotfiles notify

Send a test desktop notification

dotfiles origin

Show, connect, or disconnect the origin repository

dotfiles origin set

Connect an origin repository

dotfiles paths

List tracked paths and how they are saved

dotfiles pull

Write fetched changes from other machines to tracked files

dotfiles recover

Recover an interrupted dotfile operation

dotfiles rollback

Return files to the version a checkpoint holds

dotfiles save

Save a checkpoint of the tracked files now

dotfiles status

Show the state of your dotfiles and their history

Aliases: ls

dotfiles sync

Push saved checkpoints and fetch incoming changes

dotfiles track

Track a file or directory in place

dotfiles unapply

Remove files that `mise dot apply` deployed

dotfiles undo

Reverse the tracked-file changes from an operation

dotfiles untrack

Stop tracking a file or directory

dotfiles watch

Save tracked files as they change

doctor

Check your mise setup for problems

Aliases: dr

doctor path

Print the directories mise adds to PATH

Aliases: paths

doctor project

Run the project's diagnostic checks

en

Start a subshell with mise's tools and environment

env

Print the environment for the current configuration

Aliases: e

exec

Run a command with mise's tools and environment

Aliases: x

fmt

Format mise TOML configuration

generate

Generate project files such as CI workflows, git hooks, and scripts

Aliases: gen, g

generate config

Generate a mise.toml file

generate devcontainer

Generate a devcontainer configuration that installs mise and the project's tools

generate git-pre-commit

Generate a git hook that runs a mise task

Aliases: pre-commit

generate github-action

Generate a GitHub Actions workflow that runs a mise task

generate install-script

Generate a script that downloads and runs a pinned mise

generate task-docs

Generate Markdown documentation for project tasks

generate task-stubs

Generate scripts that run mise tasks

generate tool-stub

Generate or update a tool stub

implode

Remove the mise CLI and all related data

edit

Edit mise.toml interactively

install

Install the tools in your config, or specific tool versions

Aliases: i

install-into

Install a tool version into a directory outside mise

installs

[experimental] Inspect and choose identity-layout installations

installs ls

List the installations of the identity install layout

Aliases: list

installs migrate

Reinstall legacy installations into the identity install layout

installs select

Choose which installation mise uses when no lockfile pins one

latest

Print the latest version that matches a version request

link

Symlink a tool version into mise

Aliases: ln

lock

Create or refresh lockfile versions, checksums, and download URLs

ls

List installed and active tool versions

Aliases: list

ls-remote

List tool versions available to install

Aliases: list-all, list-remote

lsp

Run the language server for mise config files over stdin/stdout

mcp

Run the Model Context Protocol server over stdin/stdout

oci

[experimental] Build, push, and run OCI images of a project's tools

oci build

[experimental] Build an OCI image from the current mise.toml

oci push

[experimental] Build an OCI image and push it to a registry

oci run

[experimental] Build the project's image and run a command in it

packslip

Inspect and reset the signers mise has pinned for packslip tools

packslip forget

Forget a project's pinned signer so the next accepted release sets it

packslip pins

List the signer mise has pinned for each packslip project

Aliases: list

outdated

Show outdated tool versions

patrons

Show the individuals supporting mise as Patron-tier members

plugins

Manage plugins

Aliases: p, plugin, plugin-list

plugins install

Install plugins from a configured source, Git URL, or archive

Aliases: i, a, add

plugins link

Link a local plugin directory into mise for development

Aliases: ln

plugins ls

List installed plugins

Aliases: list

plugins ls-remote

List registry tools that have an asdf or vfox plugin backend

Aliases: list-remote, list-all

plugins uninstall

Remove an installed plugin

Aliases: remove, rm

plugins update

Update installed plugins

Aliases: up, upgrade

deps

[experimental] Manage project dependencies

Aliases: dep, prepare

deps add

Add packages to the project's dependencies

deps install

Install project dependencies

deps remove

Remove packages from the project's dependencies

prune

Delete tool versions that nothing uses

registry

List registry shorthand names and their backends

reshim

Create shims for executables provided by installed tools

run

Run tasks and their dependencies

Aliases: r

search

Search for available tools

secrets

[experimental] Inspect the project's secrets source

secrets ls

[experimental] List secret names from the project's secrets source

Aliases: list

self-update

Update mise itself

set

Set, show, or list environment variables in mise.toml

Aliases: ev, env-vars

settings

Manage settings

settings add

Append a value to an array setting

settings get

Show the effective value of a setting

settings ls

List configured settings and their sources

Aliases: list

settings set

Set a setting

Aliases: create

settings unset

Remove a setting from the global or project config

Aliases: rm, remove, delete, del

shell

Set a tool version for the current shell session

Aliases: sh

ssh

Open an SSH session, optionally borrowing read-only GitHub access

shell-alias

Manage shell aliases

shell-alias get

Show the command for a shell alias

shell-alias ls

List shell aliases

Aliases: list

shell-alias set

Set a shell alias in the global config

Aliases: add, create

shell-alias unset

Remove a shell alias from the global config

Aliases: rm, remove, delete, del

skills

List and link the agent skills that active tools ship

Aliases: skill

skills ls

List the skills the active tools declare

Aliases: list

skills sync

Link the active tools' skills where an agent looks for them

sponsors

Show the companies sponsoring mise and the jdx.dev open source tools

sync

Use tool versions installed by other version managers

sync node

Symlink node versions installed by nvm, nodenv, or Homebrew into mise

sync python

Symlink python versions installed by pyenv or uv into mise

sync ruby

Symlink ruby versions installed by Homebrew into mise

tasks

Manage tasks

Aliases: t, task

tasks add

Add a task

tasks deps

Show the dependency tree of tasks

tasks edit

Open a task in your editor

tasks graph

Show the monorepo project graph

tasks info

Show a task's definition

tasks ls

List available tasks

tasks validate

Check task definitions for errors

test-tool

Test that a tool installs and runs

token

Show which Git provider token mise uses

token forgejo

Show the Forgejo token mise uses for a host

token github

Show the GitHub token mise uses for a host

token gitlab

Show the GitLab token mise uses for a host

tool

Show information about a tool

tool-stub

Run a tool stub file

trust

Mark a config file as trusted

uninstall

Remove installed tool versions

unset

Remove environment variables from mise.toml

untrust

Remove explicit trust for a config

unuse

Remove tool requests from config files and prune unused installations

Aliases: rm, remove

upgrade

Upgrade outdated tools

Aliases: up

use

Install a tool and add it to configuration

Aliases: u

vars

List, set, and ask for config vars

vars ls

List every var, with the file it comes from

Aliases: list

vars prompt

Ask for the prompt vars that have no saved answer, or set answers directly

vars unset

Forget saved answers so they are asked for again

Aliases: rm, remove

version

Show the version of mise

Aliases: v

watch

Run tasks and rerun them when files change

Aliases: w

where

Show the install directory of a tool version

which

Show the path a tool's executable resolves to

MISE ACTIVATE

Print the script to activate mise in an interactive shell

Evaluate this command's output with the syntax for your shell; running it alone only prints the script. Activation updates tools and environment variables as this shell changes directories.

Add the matching example below once to your interactive startup file: ~/.bashrc for Bash, ~/.zshrc for Zsh, ~/.config/fish/config.fish for Fish, or $PROFILE for PowerShell. For Nushell, Elvish and other shells, see https://mise.jdx.dev/shell-setup.html.

The mise executable must be on PATH before that line runs. Otherwise use its absolute path, for example `eval "$(~/.local/bin/mise activate zsh)"`.

Use `mise exec -- command` for scripts and CI that do not need interactive hooks. The `status.*` settings control the messages mise prints when you change directories.

Usage: mise activate [OPTIONS] [<SHELL_TYPE>]

Options:

-q, --quiet

Suppress non-error messages from the hook that runs at each prompt

-s, --shell <SHELL>

Shell type to generate the script for

--no-hook-env

Do not run hook-env automatically

Use it for debugging: after `eval "$(mise activate zsh --no-hook-env)"`, run `mise hook-env` yourself to print the shell code it would evaluate, or `mise hook-env --trace` for more detail.

--shims

Put the shims directory on PATH instead of updating PATH at each prompt

Roughly equivalent to:

PATH="$HOME/.local/share/mise/shims:$PATH"

Shims do not support every feature of `mise activate`; see https://mise.jdx.dev/dev-tools/shims.html#shims-vs-path.

--status

Show "mise: <TOOL>@<VERSION>" message when changing directories

-h, --help

Print help Arguments:

<SHELL_TYPE>

Shell type to generate the script for

Defaults to the shell named by MISE_SHELL or SHELL. mise reports an error when neither names a supported shell, as in PowerShell and cmd on Windows. Examples:

Activate mise in Bash

eval "$(mise activate bash)"

Activate mise in Zsh

eval "$(mise activate zsh)"

Activate mise in Fish

mise activate fish | source

Activate mise in Xonsh

execx($(mise activate xonsh))

Activate mise in PowerShell

(&mise activate pwsh) | Out-String | Invoke-Expression

MISE TOOL-ALIAS

Manage tool backend and version aliases

A backend alias makes a tool name install from another backend: `[tool_alias] ripgrep = "aqua:BurntSushi/ripgrep"`. A version alias names a version request: `[tool_alias.node.versions] project = "20"` lets you write `node@project`.

With no subcommand, lists version aliases (same as `mise tool-alias ls`; the flags below are passed to it). See https://mise.jdx.dev/dev-tools/aliases.html

Usage: mise tool-alias [OPTIONS] [COMMAND]

Options:

-p, --tool <TOOL>

Filter aliases by tool

--no-header

Do not print the table header

-h, --help

Print help

MISE TOOL-ALIAS GET

Show the version a tool's version alias stands for

Reads `[tool_alias.TOOL.versions]` from every loaded config file and the aliases the tool's backend provides, such as node's `lts-*` aliases. It prints the stored request, which may itself be a prefix.

Usage: mise tool-alias get [OPTIONS] <TOOL> <ALIAS>

Options:

-h, --help

Print help Arguments:

<TOOL>

The tool to show the alias for

<ALIAS>

The alias to show Examples:

Show the version node's lts alias stands for

mise tool-alias get node lts 26

Read back an alias you set

mise tool-alias set node project 20 mise tool-alias get node project 20

MISE TOOL-ALIAS LS

List tool version aliases

Lists version aliases from `[tool_alias.<tool>.versions]` in any loaded config file and the aliases that tool backends provide, such as node's `lts-*` names or an asdf plugin's `bin/list-aliases`. For example:

[tool_alias.node.versions]
project = "20"

Backend aliases (`[tool_alias] tool = "backend"`) are not listed; run `mise tool <TOOL>` to see the backend a tool uses.

Usage: mise tool-alias ls [OPTIONS] [<TOOL>]

Options:

--no-header

Do not print the table header

-h, --help

Print help Arguments:

<TOOL>

Only show aliases for this tool Examples:

List node's version aliases

mise tool-alias ls node tool alias version node lts 26 node lts-jod 22 node project 20

MISE TOOL-ALIAS SET

Set a backend alias or a version alias in the global config

`mise tool-alias set TOOL BACKEND` makes TOOL install from BACKEND, written as `[tool_alias] TOOL = "BACKEND"`. `mise tool-alias set TOOL ALIAS VERSION` makes `TOOL@ALIAS` mean VERSION, written under `[tool_alias.TOOL.versions]`. Writes the global config (~/.config/mise/config.toml by default); add aliases to a project's mise.toml to share them.

Usage: mise tool-alias set [OPTIONS] <TOOL> <ALIAS> [<VALUE>]

Options:

-h, --help

Print help Arguments:

<TOOL>

The tool to alias

<ALIAS>

The version alias to set, or the backend when VALUE is omitted

<VALUE>

The version request the alias stands for Examples:

Install ripgrep from its aqua backend

mise tool-alias set ripgrep aqua:BurntSushi/ripgrep

Make node@project mean node@20

mise tool-alias set node project 20

MISE TOOL-ALIAS UNSET

Remove a backend alias or a version alias from the global config

With only TOOL, removes the tool's backend alias. With TOOL and ALIAS, removes that version alias. Edits the global config (~/.config/mise/config.toml by default).

Usage: mise tool-alias unset [OPTIONS] <TOOL> [<ALIAS>]

Options:

-h, --help

Print help Arguments:

<TOOL>

The tool to remove the alias from

<ALIAS>

The version alias to remove; omit it to remove the backend alias Examples:

Remove ripgrep's backend alias

mise tool-alias unset ripgrep

Remove node's project version alias

mise tool-alias unset node project

MISE BACKENDS

Manage backends

A backend is where mise installs a tool from: a package registry such as npm or cargo, a release host such as GitHub, or a plugin. Each tool uses one, either written as a prefix (`npm:prettier`) or chosen by the registry. With no subcommand, lists the built-in backends. See https://mise.jdx.dev/dev-tools/backends/.

Usage: mise backends [OPTIONS] [COMMAND]

Options:

-h, --help

Print help

MISE BACKENDS LS

List built-in backends

Backends that plugins add are listed by `mise plugins ls`.

Usage: mise backends ls [OPTIONS]

Options:

-h, --help

Print help Examples:

List the backends built into mise

mise backends ls

MISE BACKENDS SWITCH

Switch tools to the backend the registry now installs them from

When the registry moves a tool to another backend, mise keeps installing it from the backend recorded in mise.lock and warns that the registry has a newer one. This moves those lock entries to the registry's backend at the same versions, relocks them to record the new backend's checksums and URLs, and reinstalls installed versions so they come from the new backend.

It covers the lockfiles `mise lock` writes: the current project's, or the global config's with `--global`.

Usage: mise backends switch [OPTIONS] [<TOOL@VERSION>] ...

Options:

-n, --dry-run

Show what would switch without changing the lockfile or installs

-g, --global

Switch tools in the global config's lockfile instead of the project's

-h, --help

Print help Arguments:

<TOOL@VERSION>

Tools to switch

Defaults to every configured tool whose locked backend the registry has replaced. A version (`[email protected]`) limits the switch to that version. Examples:

Move communique to the registry's current backend

mise backends switch communique

List every locked tool the registry now installs from another backend

mise backends switch --dry-run

MISE BIN-PATHS

List the bin directories of the active tools

Prints the bin directories of the tool versions the current config selects. It does not include `_.path` entries from [env]; `mise doctor path` lists everything mise adds to PATH.

Usage: mise bin-paths [OPTIONS] [<TOOL@VERSION>] ...

Options:

--bin-names

Print executable names instead of bin directories

-J, --json

Print executables as JSON objects with `name`, `path`, and `symlink` (implies --bin-names)

-h, --help

Print help Arguments:

<TOOL@VERSION>

Only list these tools, such as `ruby@3` Examples:

Print the bin directory of every active tool

mise bin-paths

Print only node's bin directory

mise bin-paths node

List the executables the active tools provide

mise bin-paths --bin-names

MISE BOOTSTRAP

Set up this machine from your mise config

Applies each part your config declares, in this order. Each step names its parts as `--only` and `--skip` accept them, followed by any condition.

1. `accounts`, then `plugins` (package manager plugins) 2. `files` with `phase = "pre-packages"`, then built-in `packages` 3. The remaining `files`, then `services`, `firewall`, and `compose` 4. `repos`, then `dotfiles` 5. `mise-shell-activate`, `macos-defaults`, and `macos-launchd-agents` 6. `linux-systemd-units`, then `user` (the login shell) 7. `tools` 8. Plugin `packages`, then user `services` with `requires_tools = true` 9. `task` (the `bootstrap` task, if defined), then `final-hook`

Hooks run before and after packages, repos, dotfiles, macOS defaults, the login shell, and tools. The post-packages hook runs right after built-in packages, or after plugin packages when any are configured. See https://mise.jdx.dev/bootstrap.html#how-it-runs.

Parts that already match the config are left alone, but hooks and the `bootstrap` task run every time, so make them safe to repeat. Checking dotfile state can render templates, which may run `exec()`.

Preview with `--dry-run`. To inspect without applying, use `mise bootstrap status` for current state or `mise bootstrap plan` for resource-level changes.

Usage: mise bootstrap [OPTIONS] [COMMAND]

Options:

--from <GIT_URL>

Clone a bootstrap project (a Git repository with a mise.toml) and apply it

The checkout is reused on later runs; add `--update` to fast-forward it first. Append `?ref=<branch|tag|commit>` to check out a ref instead of the default branch, for example `https://github.com/example/workstation.git?ref=v1`. See https://mise.jdx.dev/bootstrap/from-repository.html.

--adopt <GIT_URL|OWNER/REPO>

Clone a repository of global mise config or dotfile history, then apply it

A repository of global config (`config.toml`, `conf.d/`, `tasks/`) is cloned into the global config directory, normally ~/.config/mise. A setup repository shared with `mise dotfiles origin set` restores its tracked files instead. `OWNER/REPO` is short for `https://github.com/OWNER/REPO.git`. Append `?ref=<branch>` to adopt a branch other than the default branch.

--replace-history

Discard this machine's dotfile history and adopt the repository's

Use it with `--adopt` when the two histories are unrelated. Files that differ from the repository still stop the adoption until you resolve them, or add `--take-remote-all` to take the repository's version of each.

--take-remote-all

Take the setup repository's version of every existing file that differs while adopting

The replaced versions are saved first, so `mise dot undo` restores them.

--from-dir <DIR>

Directory for the `--from` checkout (default: `$MISE_DATA_DIR/bootstrap-repo`)

--config-dir <DIR>

Link the global config directory to this directory of the `--from` checkout

mise links its config directory, normally ~/.config/mise, to the directory, then bootstraps from it, so its `config.toml`, `config.<env>.toml`, `conf.d/`, and `miserc.toml` are the global config from this run on. The directory must exist in the checkout, and the path to it is relative to the checkout and must stay inside it; `.` is the checkout itself. mise's config directory, where the link goes, must be missing, empty, or already this link. See https://mise.jdx.dev/bootstrap/from-repository.html#global-config-elsewhere.

-n, --dry-run

Show what would change without changing anything

Hooks and the `bootstrap` task are printed instead of run.

-y, --yes

Skip confirmation prompts

--skip-dirty

Skip configured repositories with local changes instead of failing

--force-dotfiles

Overwrite existing files that conflict with whole-file dotfile entries

--prune-dotfiles

Remove files that dotfile groups deployed but no active entry deploys now

The same pruning as `mise dot apply --prune`, run at the end of the dotfiles phase before its post hook: files of a group that is no longer selected or declared, and files a group stopped deploying because of a new `exclude` or a deleted source. Changed copies stay in place, and mise asks before removing anything unless `--yes` is given or there is no terminal. With `--dry-run`, nothing is removed.

--only <PART>

Run only these parts

Repeat the flag or separate parts with commas. Cannot be combined with `--skip`.

--prompt-secrets

Prompt securely for missing bootstrap secret inputs

--prompt-vars

Ask for `[vars]` entries that declare a `prompt` and have no saved answer

mise saves each answer under `$MISE_STATE_DIR`, not in any config file, and never asks for it again. Without a terminal, a var keeps its default. A `--dry-run` still saves the answers it asks for.

--skip <PART>

Skip these parts

Repeat the flag or separate parts with commas. Cannot be combined with `--only`.

--update

Refresh package metadata and update repositories before applying

Also fast-forwards a checkout that `--from` or `--adopt` reuses. Without `--update`, a reused checkout stays at its current commit.

--upgrade

Upgrade installed packages and tools as well as installing missing ones

In the packages phase, runs the equivalent of `mise bootstrap packages upgrade` after installing; in the tools phase, runs `mise upgrade` (without `--bump`) after installing. Package pins and tool version ranges are respected. Does not update mise itself, repositories, or container images, and does not restart services; see `--update` for repositories and `mise self-update` for mise.

-h, --help

Print help Examples:

Preview every configured part

mise bootstrap --dry-run

Apply every configured part

mise bootstrap

Apply only dotfiles and tools

mise bootstrap --only dotfiles,tools

Apply everything except tools and the bootstrap task

mise bootstrap --skip tools,task

Replace files that conflict with whole-file dotfile entries

mise bootstrap --force-dotfiles

Clone a bootstrap project and apply it

mise bootstrap --from [email protected]:example/workstation.git

Do the same and also load the project's mise.work.toml

mise -E work bootstrap --from [email protected]:example/workstation.git

Clone a dotfiles repository and link ~/.config/mise to its .config/mise

mise bootstrap --from https://github.com/example/dotfiles.git --from-dir ~/.dotfiles --config-dir .config/mise

Clone global config into ~/.config/mise, then apply it

mise bootstrap --adopt example/mise-config

Use a setup repository's dotfile history instead of this machine's

mise bootstrap --adopt example/setup --replace-history --yes

Refresh package metadata and fast-forward repositories first

mise bootstrap --update

MISE BOOTSTRAP ACCOUNTS

Manage Linux users and groups

Creates, updates, or removes the local accounts declared in `[bootstrap.users]` and `[bootstrap.groups]` on Linux. Run `status` or `apply --dry-run` before changing user IDs, group memberships, or account state.

Usage: mise bootstrap accounts [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE BOOTSTRAP ACCOUNTS APPLY

Create, update, or remove the configured Linux users and groups

Usage: mise bootstrap accounts apply [OPTIONS]

Options:

-n, --dry-run

Show what would change without changing anything

-y, --yes

Skip the confirmation prompt

-h, --help

Print help

MISE BOOTSTRAP ACCOUNTS STATUS

Show the state of the configured Linux users and groups

Usage: mise bootstrap accounts status [OPTIONS]

Options:

-J, --json

Output in JSON format

--missing

Exit with status 1 if any account differs from the config (all are still listed)

-h, --help

Print help

MISE BOOTSTRAP COMPOSE

Manage Docker Compose projects from `[bootstrap.compose]`

Needs a running Docker engine and the Docker Compose command on this machine.

Usage: mise bootstrap compose [OPTIONS] <COMMAND>

Options:

-h, --help

Print help Examples:

Show the state of every declared project

mise bootstrap compose status

Show what would change

mise bootstrap compose apply --dry-run

MISE BOOTSTRAP COMPOSE APPLY

Apply Docker Compose projects from `[bootstrap.compose]`

Usage: mise bootstrap compose apply [OPTIONS]

Options:

-n, --dry-run

Show what would change without changing anything

-y, --yes

Skip the confirmation prompt

-h, --help

Print help

MISE BOOTSTRAP COMPOSE STATUS

Show the state of Docker Compose projects from `[bootstrap.compose]`

Usage: mise bootstrap compose status [OPTIONS]

Options:

-J, --json

Output in JSON format

--missing

Exit with status 1 if any Compose project differs from the config (all are still listed)

-h, --help

Print help

MISE BOOTSTRAP FILES

Manage system files and directories declared in `[bootstrap]`

Applies `[bootstrap.files]` and `[bootstrap.directories]`: paths that need a specific owner, group, or mode, or that must exist or be absent system-wide, such as configuration under /etc. For files in your home directory that you edit, use `[dotfiles]` and `mise dotfiles`.

Usage: mise bootstrap files [OPTIONS] <COMMAND>

Options:

-h, --help

Print help Examples:

Exit with status 1 if any file or directory differs from the config

mise bootstrap files status --missing

Show what would change

mise bootstrap files apply --dry-run

Apply without a prompt

mise bootstrap files apply --yes

MISE BOOTSTRAP FILES APPLY

Create, update, or remove the configured system files and directories

Usage: mise bootstrap files apply [OPTIONS]

Options:

-n, --dry-run

Show what would change without changing anything

-y, --yes

Skip the confirmation prompt

--prompt-secrets

Prompt securely for missing bootstrap secret inputs

-h, --help

Print help

MISE BOOTSTRAP FILES STATUS

Show the state of the configured system files and directories

Usage: mise bootstrap files status [OPTIONS]

Options:

-J, --json

Output in JSON format

--missing

Exit with status 1 if any file or directory differs from the config (all are still listed)

--prompt-secrets

Prompt securely for missing bootstrap secret inputs

-h, --help

Print help

MISE BOOTSTRAP FIREWALL

Manage the Linux host firewall from `[bootstrap.linux.firewall]`

Works with nftables, firewalld, or UFW, and keeps mise's rules separate from other host rules. Over SSH, mise refuses a default incoming policy of deny or reject unless a rule allows the current connection or the config sets `allow_lockout = true`. Check `apply --dry-run` before applying a policy to a remote machine.

Usage: mise bootstrap firewall [OPTIONS] <COMMAND>

Options:

-h, --help

Print help Examples:

Show the firewall's state

mise bootstrap firewall status

Show the policy and rules that would change

mise bootstrap firewall apply --dry-run

MISE BOOTSTRAP FIREWALL APPLY

Apply the firewall from `[bootstrap.linux.firewall]`

Usage: mise bootstrap firewall apply [OPTIONS]

Options:

-n, --dry-run

Show what would change without changing anything

-y, --yes

Skip the confirmation prompt

-h, --help

Print help

MISE BOOTSTRAP FIREWALL STATUS

Show the state of the firewall from `[bootstrap.linux.firewall]`

Usage: mise bootstrap firewall status [OPTIONS]

Options:

-J, --json

Output in JSON format

--missing

Exit with status 1 if the firewall differs from the config

-h, --help

Print help

MISE BOOTSTRAP LINUX

Manage systemd user units from `[bootstrap.linux.systemd.units]`

The host firewall in `[bootstrap.linux.firewall]` is managed by `mise bootstrap firewall`.

Usage: mise bootstrap linux [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE BOOTSTRAP LINUX SYSTEMD-UNITS

Manage systemd user units from `[bootstrap.linux.systemd.units]`

Writes unit files to ~/.config/systemd/user, then enables and starts them as configured. An entry with `state = "absent"` is stopped, disabled, and deleted instead. Units run with your permissions and need a reachable systemd user manager. For system units, or a user service that also works on macOS and Windows, use `[bootstrap.services]`.

Usage: mise bootstrap linux systemd-units [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE BOOTSTRAP LINUX SYSTEMD-UNITS APPLY

Install and start the configured systemd user units

Usage: mise bootstrap linux systemd-units apply [OPTIONS]

Options:

-n, --dry-run

Show what would change without changing anything

-y, --yes

Skip the confirmation prompt

-h, --help

Print help

MISE BOOTSTRAP LINUX SYSTEMD-UNITS STATUS

Show the state of the configured systemd user units

Usage: mise bootstrap linux systemd-units status [OPTIONS]

Options:

-J, --json

Output in JSON format

--missing

Exit with status 1 if any unit differs from the config (all are still listed)

-h, --help

Print help

MISE BOOTSTRAP MACOS

Manage macOS preferences and LaunchAgents from `[bootstrap.macos]`

Usage: mise bootstrap macos [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE BOOTSTRAP MACOS DEFAULTS

Manage macOS preferences such as Dock, Finder, and keyboard settings

Applies `[bootstrap.macos.defaults]`, `[[bootstrap.macos.defaults_entries]]`, and the `[bootstrap.macos.dock]`, `finder`, `keyboard`, and `trackpad` sections. Preferences are written the way `defaults write` writes them. mise does not restart apps: Dock, Finder, and some others show a change only after they relaunch.

Usage: mise bootstrap macos defaults [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE BOOTSTRAP MACOS DEFAULTS APPLY

Write the configured macOS preferences

Usage: mise bootstrap macos defaults apply [OPTIONS]

Options:

-n, --dry-run

Show what would change without changing anything

-y, --yes

Skip the confirmation prompt

-h, --help

Print help

MISE BOOTSTRAP MACOS DEFAULTS STATUS

Show the state of the configured macOS preferences

Usage: mise bootstrap macos defaults status [OPTIONS]

Options:

-J, --json

Output in JSON format

--missing

Exit with status 1 if any preference differs from the config (all are still listed)

-h, --help

Print help

MISE BOOTSTRAP MACOS LAUNCHD-AGENTS

Manage macOS LaunchAgents from `[bootstrap.macos.launchd.agents]`

Writes each agent to ~/Library/LaunchAgents/dev.mise.<name>.plist and loads it into your GUI login session. Run it as the user who owns the agents; an SSH session without a GUI login may not be able to load them. For a user service that also works on Linux and Windows, use `[bootstrap.services]` with `scope = "user"`.

Usage: mise bootstrap macos launchd-agents [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE BOOTSTRAP MACOS LAUNCHD-AGENTS APPLY

Install and load LaunchAgents from `[bootstrap.macos.launchd.agents]`

Usage: mise bootstrap macos launchd-agents apply [OPTIONS]

Options:

-n, --dry-run

Show what would change without changing anything

-y, --yes

Skip the confirmation prompt

-h, --help

Print help

MISE BOOTSTRAP MACOS LAUNCHD-AGENTS STATUS

Show the state of the configured LaunchAgents

Usage: mise bootstrap macos launchd-agents status [OPTIONS]

Options:

-J, --json

Output in JSON format

--missing

Exit with status 1 if any LaunchAgent differs from the config (all are still listed)

-h, --help

Print help

MISE BOOTSTRAP MISE-SHELL-ACTIVATE

Manage mise shell activation from `[bootstrap.mise_shell_activate]`

Writes a managed activation block into each configured shell startup file. It does not activate mise in the shell you run it from; open a new shell afterward.

Usage: mise bootstrap mise-shell-activate [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE BOOTSTRAP MISE-SHELL-ACTIVATE APPLY

Write mise activation into the configured shell startup files

Usage: mise bootstrap mise-shell-activate apply [OPTIONS]

Options:

-n, --dry-run

Show what would change without changing anything

-y, --yes

Skip the confirmation prompt

-h, --help

Print help

MISE BOOTSTRAP MISE-SHELL-ACTIVATE STATUS

Show the state of the configured shell activation

Usage: mise bootstrap mise-shell-activate status [OPTIONS]

Options:

-J, --json

Output in JSON format

--missing

Exit with status 1 if any shell activation differs from the config (all are still listed)

-h, --help

Print help

MISE BOOTSTRAP PACKAGES

Manage packages from `[bootstrap.packages]`

Declare packages as `"manager:package" = "version"`. `apply` installs what is missing and removes what is declared absent, `use` adds an entry and installs it, and `upgrade` updates configured packages that are installed. `prune` uninstalls Homebrew formulae, casks, or package plugin packages that no config declares. `import` records installed Homebrew formulae, and `status` shows what differs from the config. See https://mise.jdx.dev/bootstrap/packages/ for each package manager.

Usage: mise bootstrap packages [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE BOOTSTRAP PACKAGES APPLY

Install or remove packages to match `[bootstrap.packages]`

Installs each configured package that is missing or does not match its declared version, and removes packages declared `state = "absent"` on the managers that support removal (pacman, scoop, snap, and zypper). On other managers, an installed package declared absent is left in place with a warning; `apply` fails for it only when you pass `--manager` or name the package. Built-in managers may use sudo when not running as root (see the `system_packages.sudo` setting); package plugins never do. Managers that are not available on this machine are skipped.

Name packages as `manager:package`, for example `apt:curl` or `brew:jq`, to install them without adding them to config; use `mise bootstrap packages use` to record them as well. When you name packages or pass `--manager`, an unavailable manager is an error instead of a skip.

Usage: mise bootstrap packages apply [OPTIONS] [<PACKAGE>] ...

Options:

-m, --manager <MANAGER>

Only apply packages for this built-in or plugin manager

-n, --dry-run

Show what would change without changing anything

-y, --yes

Skip the confirmation prompt

--update

Refresh package manager metadata first, where the manager supports it

For example, apt runs `apt-get update` and dnf adds `--refresh`. brew, brew-cask, flatpak, flatpak-user, macos-app, mas, and snap ignore this flag.

-h, --help

Print help Arguments:

<PACKAGE>

Packages as `manager:package`; defaults to every package in `[bootstrap.packages]` Examples:

Install missing packages and remove ones declared absent

mise bootstrap packages apply

Show what would change

mise bootstrap packages apply --dry-run

Apply only apt packages, without a prompt

mise bootstrap packages apply --manager apt --yes

On Debian or Ubuntu, install one package without adding it to config

mise bootstrap packages apply apt:curl

On macOS, install a formula and a cask without adding them to config

mise bootstrap packages apply brew:jq brew-cask:firefox

MISE BOOTSTRAP PACKAGES BREW

Manage Homebrew tap URLs in `[bootstrap.brew.taps]`

mise finds a third-party tap such as `acme/tools` at `https://github.com/acme/homebrew-tools` without an entry. Add one only when the tap's repository lives at a different GitHub URL; only GitHub taps are supported. These commands edit config; they do not run Homebrew.

Not available on Windows.

Usage: mise bootstrap packages brew [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE BOOTSTRAP PACKAGES BREW TAP

Add a Homebrew tap URL to the global `[bootstrap.brew.taps]`

Usage: mise bootstrap packages brew tap [OPTIONS] <TAP> [<URL>]

Options:

-l, --local

Write to the local config instead of the global config

-n, --dry-run

Show the config change without writing it

-p, --path, --file <PATH>

Write to this config file or directory

-h, --help

Print help Arguments:

<TAP>

Tap name, e.g. `owner/repo`

<URL>

GitHub URL of the tap; defaults to `https://github.com/<owner>/homebrew-<repo>.git` Examples:

Record a tap whose repository is not acme/homebrew-tools

mise bootstrap packages brew tap acme/tools https://github.com/acme/brew-tools.git

Write the entry to the local config instead

mise bootstrap packages brew tap acme/tools https://github.com/acme/brew-tools.git --local

MISE BOOTSTRAP PACKAGES BREW UNTAP

Remove Homebrew tap URLs from `[bootstrap.brew.taps]`

Usage: mise bootstrap packages brew untap [OPTIONS] <TAPS> ...

Options:

-l, --local

Write to the local config instead of the global config

-n, --dry-run

Show the config change without writing it

-p, --path, --file <PATH>

Write to this config file or directory

-h, --help

Print help Arguments:

<TAPS>

Tap names, e.g. `owner/repo` Examples:

Remove a tap entry from the global config

mise bootstrap packages brew untap acme/tools

MISE BOOTSTRAP PACKAGES EXPORT

Print the configured `nix:` packages as a NixOS module

Prints a module that adds each package to `environment.systemPackages`, without running Nix. Import it into a NixOS configuration; packages resolve against that configuration's `pkgs`. Entries for another OS or environment, and entries with `state = "absent"`, are left out. Only shorthand attributes such as `nix:ripgrep` can be exported: a flake reference or a version pin is an error, because the importing configuration decides where packages come from.

Usage: mise bootstrap packages export [OPTIONS]

Options:

--format <FORMAT>

Output format

-h, --help

Print help Examples:

Write the module to a file you can import from a NixOS configuration

mise bootstrap packages export --format nix > packages.nix

MISE BOOTSTRAP PACKAGES IMPORT

Record installed Homebrew formulae in `[bootstrap.packages]`

Adds a `brew:` entry for each linked formula you installed yourself, skipping formulae that were installed only as dependencies; `--all` includes those too. Formulae from third-party taps are written with their full name, and each tap gets a `[bootstrap.brew.taps]` entry with the URL already in your config or the default GitHub URL. Writes the local config unless you pass `-g`, `-e`, or `-p`.

Usage: mise bootstrap packages import [OPTIONS]

Options:

-e, --env <ENV>

Write to the config file for this environment (mise.<ENV>.toml)

-g, --global

Write to the global config (~/.config/mise/config.toml)

New entries go to the `write_targets.packages` file when that setting is set.

-m, --manager <MANAGER>

Package manager to import from

Default: brew

--all

Import every linked formula, including dependencies

-n, --dry-run

Show the entries that would be written without writing them

-p, --path, --file <PATH>

Write to this config file or directory

-h, --help

Print help Examples:

Show the entries that would be written

mise bootstrap packages import --dry-run

Write them to the local config

mise bootstrap packages import

Include formulae installed as dependencies

mise bootstrap packages import --all

Write to the global config

mise bootstrap packages import -g

MISE BOOTSTRAP PACKAGES PRUNE

Uninstall packages that no config declares

For `brew` (the default), removes every linked formula that is neither declared nor needed by a declared formula or cask, including formulae you installed with Homebrew itself. Run with `--dry-run` first, or record existing formulae with `mise bootstrap packages import`.

For `brew-cask`, removes only casks mise installed and can prove are unchanged. For a package plugin that supports uninstalling, removes only packages mise installed. A package is kept while the current config, or any trusted config mise has tracked, still declares it.

Usage: mise bootstrap packages prune [OPTIONS]

Options:

-m, --manager <MANAGER>

Package manager to prune: `brew`, `brew-cask`, or a package plugin

Default: brew

-n, --dry-run

Show what would be removed without removing anything

-y, --yes

Skip the confirmation prompt

--force

Remove `brew-cask` casks that mise installed even when it cannot prove they are unchanged, such as self-updating apps or casks with install scripts

mise removes the files it recorded installing that are still in place, but not what a cask's own install scripts created.

-h, --help

Print help Examples:

Preview which Homebrew formulae would be removed

mise bootstrap packages prune --dry-run

Remove them without a prompt

mise bootstrap packages prune --yes

Preview which casks would be removed

mise bootstrap packages prune --manager brew-cask --dry-run

Preview removals for a package plugin named vscode

mise bootstrap packages prune --manager vscode --dry-run

MISE BOOTSTRAP PACKAGES STATUS

Show the state of packages from `[bootstrap.packages]`

Usage: mise bootstrap packages status [OPTIONS]

Options:

-J, --json

Output in JSON format

--missing

Exit with status 1 if any package differs from the config (all are still listed)

-h, --help

Print help Examples:

List every configured package and its state

mise bootstrap packages status

Print the state as JSON

mise bootstrap packages status --json

Exit with status 1 if any package differs from the config

mise bootstrap packages status --missing

MISE BOOTSTRAP PACKAGES UPGRADE

Upgrade installed packages from `[bootstrap.packages]`

Refreshes package manager metadata, then upgrades the configured packages that are already installed. Each manager decides which version is current. Version pins in config are honored where the manager can install them; other pinned entries are skipped with a warning. Packages that are not installed yet are skipped; install them with `mise bootstrap packages apply`. See https://mise.jdx.dev/bootstrap/packages/ for what each manager does.

Name packages as `manager:package` to upgrade only those.

Usage: mise bootstrap packages upgrade [OPTIONS] [<PACKAGE>] ...

Options:

-m, --manager <MANAGER>

Only upgrade packages for this built-in or plugin manager

-n, --dry-run

Show what would change without changing anything

-y, --yes

Skip the confirmation prompt

-h, --help

Print help Arguments:

<PACKAGE>

Packages as `manager:package`; defaults to every package in `[bootstrap.packages]` Examples:

Show what would be upgraded

mise bootstrap packages upgrade --dry-run

Upgrade every configured package that is already installed

mise bootstrap packages upgrade

Upgrade only apt packages, without a prompt

mise bootstrap packages upgrade --manager apt --yes

Upgrade one Homebrew formula

mise bootstrap packages upgrade brew:postgresql@17

MISE BOOTSTRAP PACKAGES USE

Add packages to `[bootstrap.packages]` and install them

Like `mise use` for tools: writes a `"manager:package" = "version"` entry to the local mise.toml (or the global config with `-g`), then installs anything missing. If the manager is not available on this machine, such as `apt:` on macOS, the entry is written without installing.

Pin a version with `@`, as in `apt:[email protected]`; without `@`, or with `@latest`, the entry is `"latest"`. Homebrew puts versions in formula and cask names (`brew:postgresql@17`, `brew-cask:temurin@17`), so there `@` is part of the name. mas takes numeric App Store IDs and nix takes attribute paths or flake references, so neither accepts `@version`. aur, flatpak, flatpak-user, pacman, and snap accept `@version` but cannot install a pin, so installing skips those entries with a warning.

Usage: mise bootstrap packages use [OPTIONS] <PACKAGE> ...

Options:

-e, --env <ENV>

Write to the config file for this environment (mise.<ENV>.toml)

-g, --global

Write to the global config (~/.config/mise/config.toml) instead of the local one

New entries go to the `write_targets.packages` file when that setting is set.

-n, --dry-run

Show what would change without writing config or installing

-p, --path, --file <PATH>

Write to this config file or directory

-y, --yes

Skip the confirmation prompt

--no-install

Write the package declarations without checking or installing packages

-h, --help

Print help Arguments:

<PACKAGE>

Packages in `manager:package[@version]` form Examples:

Declare apt and winget packages; each machine installs the ones it can

mise bootstrap packages use apt:curl winget:BurntSushi.ripgrep.MSVC

On macOS, add a formula and a cask

mise bootstrap packages use brew:jq brew-cask:firefox

Add a versioned Homebrew formula to the global config

mise bootstrap packages use -g brew:postgresql@17

Pin an apt package to a version

mise bootstrap packages use apt:[email protected]

MISE BOOTSTRAP PACKAGES WHERE

Print the `opt` path of an installed Homebrew formula

Prints a path such as /opt/homebrew/opt/openssl@3 that keeps pointing at the installed version across upgrades. Name the formula as `brew:<formula>` or `brew:<owner>/<tap>/<formula>`, using its installed name; aliases are not resolved, and a tap-qualified name matches by formula name only. The command does not read mise config files, so only environment variables and global flags apply. If the formula is not installed, it prints nothing and exits with a nonzero status. Works on macOS on Apple silicon and on Linux (x86_64 and arm64).

Usage: mise bootstrap packages where [OPTIONS] <PACKAGE>

Options:

-h, --help

Print help Arguments:

<PACKAGE>

Formula to locate, as `brew:<formula>` or `brew:<owner>/<tap>/<formula>` Examples:

Put a formula's bin directory on PATH when it is installed

if root="$(mise bootstrap packages where brew:unzip)"; then
export PATH="$root/bin:$PATH" fi

MISE BOOTSTRAP PLAN

Show what applying bootstrap resources would change

Covers accounts, packages, files and directories, system and user services, the firewall, and Compose projects, in dependency order. Repositories, dotfiles, shell activation, macOS defaults, LaunchAgents, systemd user units, the login shell, tools, hooks, and the `bootstrap` task are not planned; preview the whole run with `mise bootstrap --dry-run`.

Usage: mise bootstrap plan [OPTIONS]

Options:

-J, --json

Output a stable machine-readable plan in JSON format

--detailed-exitcode

Exit 0 if nothing would change, 2 if something would, 1 on errors or unknown state

A resource's state is unknown when mise cannot reach its declared state on its own, for example a package whose manager is not available on this machine or cannot install the pinned version, or a service whose unit does not exist.

--prompt-secrets

Prompt securely for missing bootstrap secret inputs

-h, --help

Print help Examples:

Show the planned changes

mise bootstrap plan

Print the plan as JSON

mise bootstrap plan --json

Exit with status 2 if anything would change

mise bootstrap plan --detailed-exitcode

MISE BOOTSTRAP PLUGINS

Manage package manager plugins declared in `[bootstrap.plugins]`

A package plugin adds a package manager, such as one for VS Code extensions, that `[bootstrap.packages]` entries can use. `mise bootstrap` installs plugins before packages; when you run the narrower commands, run `plugins apply` before `packages apply`. Installing a plugin does not install its packages.

Usage: mise bootstrap plugins [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE BOOTSTRAP PLUGINS APPLY

Install package manager plugins declared in `[bootstrap.plugins]`

It does not ask for confirmation.

Usage: mise bootstrap plugins apply [OPTIONS]

Options:

-n, --dry-run

Show which plugins would be installed without installing them

-h, --help

Print help

MISE BOOTSTRAP PLUGINS STATUS

Show whether declared package manager plugins are installed

Usage: mise bootstrap plugins status [OPTIONS]

Options:

--missing

Exit with status 1 if a declared plugin is not installed

-h, --help

Print help

MISE BOOTSTRAP REMOTE

Bootstrap one or more machines over SSH

Packs a local project directory, copies it to each target, stages mise there, and runs `mise bootstrap`. The directory is `--source`. Without it, an inventory host uses its own `source`, then the one in `[bootstrap.remote]`, then the current directory; a `--host` target uses the current directory. Pick targets by name, `--tag`, or `--all` from `[bootstrap.remote.hosts]`, or give any SSH destination with `--host`.

Targets need a POSIX shell plus `tar`, `mktemp`, `cksum`, and `uname`; Windows targets are not supported. `--dry-run` still connects, uploads, and inspects each target, but changes nothing there. With `--adopt`, each target adopts the repository as `mise bootstrap --adopt` does, instead of receiving a project directory.

The `--github-relay-*` flags let targets read private GitHub repositories through this machine's credentials for the length of the run, without copying a token to them. See https://mise.jdx.dev/bootstrap/github-relay.html.

Usage: mise bootstrap remote [OPTIONS] [<TARGET>] ...

Options:

--adopt <GIT_URL|OWNER/REPO>

Adopt global configuration or shared dotfile history on each target

--all

Select every inventory host

--bootstrap-command <COMMAND>

Shell command, run on each target, that installs mise and puts it on PATH

--connect-timeout <SECONDS>

SSH connection timeout in seconds

Default: 10

--copy-link <PATH>

Copy the target of this source-relative symbolic link instead of the link; repeat for more

--copy-links

Copy the targets of every symbolic link in the source instead of the links

--exclude <PATTERN>

Another pattern to leave out of the archive; repeat for more

--fail-fast

Stop after the first failed target

--force-dotfiles

Overwrite files on each target that conflict with whole-file dotfile entries

--host <[USER@]HOST>

SSH destination that is not in the inventory (`[user@]host`); repeat for more

-i, --identity-file <PATH>

SSH identity file, overriding the inventory and SSH config

-n, --dry-run

Show what would change on each target without changing it

It still connects to each target, uploads the project, stages mise, and inspects the target.

--install-mise <PATH>

Install the provisioned mise on each host instead of only staging it

Defaults to `~/.local/bin/mise`; pass `--install-mise=<PATH>` for another path.

--keep-staging

Keep the remote staging directory for debugging

--mise-bin <PATH>

Upload this local mise executable, for platforms without an official release binary

--no-install-mise

Do not install mise on the host, even when the selected hosts configure it

--only <PART>

Run only these parts on each target

Repeat the flag or separate parts with commas. Cannot be combined with `--skip`.

--port <PORT>

SSH port, overriding the inventory and SSH config

--prompt-secrets

Prompt securely for missing secret inputs on the remote host

--remote-env <ENV>

Config environments to load on each target; repeat or separate with commas (for example, ci,dotfiles)

--remote-mise <COMMAND>

Existing mise executable name or path; relative paths use the staged project

--skip <PART>

Skip these parts on each target

Repeat the flag or separate parts with commas. Cannot be combined with `--only`.

--source <DIR>

Local directory to archive and send to each target

--ssh-option <OPTION>

OpenSSH `-o` option; repeat for multiple options

--tag <TAG>

Select configured hosts with this tag; repeat to match any tag

--update

Refresh package metadata and update repositories on each target

-y, --yes

Skip confirmation prompts on each target

--github-relay-read-only

Borrow read-only GitHub access for this run (Linux and macOS only)

Needs exactly one of `--github-relay-repo` or `--github-relay-all-repos`.

--github-relay-repo <OWNER/REPO>

Repository the targets may read through the relay; repeat for more (needs `--github-relay-read-only`)

--github-relay-all-repos

Let targets read every repository your local credentials can read (needs `--github-relay-read-only`)

--github-relay-log-requests

Log sanitized relay requests on local stderr (needs `--github-relay-read-only`)

--github-relay-no-log-requests

Turn off request logging, overriding the `github_relay` settings (needs `--github-relay-read-only`)

--github-relay-log-format <FORMAT>

Relay log and summary format, `text` or `jsonl` (needs `--github-relay-read-only`)

--github-relay-max-duration <DURATION>

End borrowed access after a duration such as `1h`; `0s` lasts the whole run (needs `--github-relay-read-only`)

-h, --help

Print help Arguments:

<TARGET>

Inventory host names from `[bootstrap.remote.hosts]` Examples:

Preview a run on a host that is not in the inventory

mise bootstrap remote --host devbox --dry-run

Bootstrap one inventory host

mise bootstrap remote cache

Bootstrap every inventory host tagged canary, without prompts

mise bootstrap remote --tag canary --yes

Bootstrap every inventory host and stop at the first failure

mise bootstrap remote --all --fail-fast

Leave mise installed on the host after the run

mise bootstrap remote --host [email protected] -i ~/.ssh/mise-cache --install-mise

Let the host read one private GitHub repository during the run

mise bootstrap remote --host devbox --github-relay-read-only --github-relay-repo example/setup

MISE BOOTSTRAP REPOS

Manage Git repositories from `[bootstrap.repos]`

A repository with uncommitted changes, a different origin, or something other than a Git checkout at its path stops `apply` and `update` before anything changes. Pass `--skip-dirty` to skip repositories with uncommitted changes and continue with the rest.

Usage: mise bootstrap repos [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE BOOTSTRAP REPOS APPLY

Clone missing Git repositories and check out configured refs

Usage: mise bootstrap repos apply [OPTIONS]

Options:

-n, --dry-run

Show what would change without changing anything

-y, --yes

Skip the confirmation prompt

--skip-dirty

Skip repositories with local changes instead of failing

-h, --help

Print help

MISE BOOTSTRAP REPOS EXEC

Run a command in each configured Git repository

Put the command and its arguments after `--`. Paths before `--` select repositories. The command runs directly, without a shell, so pipes and `&&` do not work. Missing or conflicting repositories are skipped with a warning. Use `--continue-on-error` to visit the rest after a failure.

Usage: mise bootstrap repos exec [OPTIONS] [<PATH>] ... <COMMAND> ...

Options:

-c, --continue-on-error

Continue running in other repositories after a command fails

-n, --dry-run

Print the commands that would run without running them

-h, --help

Print help Arguments:

<PATH>

Run only in repositories at these paths, as written in config or expanded

<COMMAND>

Command and arguments to run in each repository Examples:

Show uncommitted changes in every repository

mise bootstrap repos exec -- git status --short

Run a command in one repository

mise bootstrap repos exec ~/src/mise -- git log -1

Fetch every repository, even after one fails

mise bootstrap repos exec --continue-on-error -- git fetch

MISE BOOTSTRAP REPOS STATUS

Show the state of Git repositories from `[bootstrap.repos]`

Usage: mise bootstrap repos status [OPTIONS]

Options:

-J, --json

Output in JSON format

--missing

Exit with status 1 if any repository differs from the config (all are still listed)

-h, --help

Print help

MISE BOOTSTRAP REPOS UPDATE

Clone missing Git repositories and fast-forward the rest

For a repository without a `ref`, fetches and fast-forwards the current branch; one with a detached HEAD is skipped with a warning. A repository with a `ref` is checked out at that ref.

Usage: mise bootstrap repos update [OPTIONS] [<PATH>] ...

Options:

-n, --dry-run

Show what would change without changing anything

-y, --yes

Skip the confirmation prompt

--skip-dirty

Skip repositories with local changes instead of failing

-h, --help

Print help Arguments:

<PATH>

Only update repositories at these paths, as written in config or expanded (for example ~/src/mise) Examples:

Show the Git commands that would run

mise bootstrap repos update --dry-run

Update one repository

mise bootstrap repos update ~/src/mise

MISE BOOTSTRAP SECRETS

Inspect bootstrap secret inputs without revealing their values

Secret inputs are values declared in `[bootstrap.secrets]` that file and dotfile templates read with `secret()`. mise reads them from environment variables, or prompts for missing ones with `--prompt-secrets`.

Usage: mise bootstrap secrets [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE BOOTSTRAP SECRETS STATUS

Show whether declared bootstrap secret inputs are available

Usage: mise bootstrap secrets status [OPTIONS]

Options:

-J, --json

Output in JSON format

--missing

Exit with status 1 if a declared secret input is unset, empty, or not valid Unicode

-h, --help

Print help

MISE BOOTSTRAP SERVICES

Manage services from `[bootstrap.services]`

System-scope entries, the default for entries without `builtin`, start, stop, enable, disable, or mask systemd units that already exist on Linux. User-scope entries (`scope = "user"`, or any `builtin` service) define a service for the current user on every platform: a systemd user unit on Linux, a LaunchAgent on macOS, or a Scheduled Task on Windows. For options that only one platform has, see `mise bootstrap linux systemd-units` and `mise bootstrap macos launchd-agents`.

Usage: mise bootstrap services [OPTIONS] <COMMAND>

Options:

-h, --help

Print help Examples:

Show the state of every declared service

mise bootstrap services status

Show what would change

mise bootstrap services apply --dry-run

Uninstall a user service

mise bootstrap services remove mise-history

MISE BOOTSTRAP SERVICES APPLY

Apply the service state declared in `[bootstrap.services]`

Usage: mise bootstrap services apply [OPTIONS]

Options:

-n, --dry-run

Show what would change without changing anything

-y, --yes

Skip the confirmation prompt

-h, --help

Print help

MISE BOOTSTRAP SERVICES REMOVE

Uninstall a user-scope service

Removing a user-scope entry from config does not uninstall its systemd unit, LaunchAgent, or Scheduled Task. Use this command to uninstall it, whether or not it is still declared. If the entry is still declared, the next `mise bootstrap` installs it again.

It removes the dev.mise.NAME.service unit or dev.mise.NAME.plist agent, so it also removes one that [bootstrap.linux.systemd.units] or [bootstrap.macos.launchd.agents] wrote under that name. It does not remove .timer units.

Usage: mise bootstrap services remove [OPTIONS] <NAME>

Options:

-n, --dry-run

Show what would be removed without removing it

-h, --help

Print help Arguments:

<NAME>

Name of the installed user service Examples:

Preview uninstalling the user service named mise-history

mise bootstrap services remove mise-history --dry-run

MISE BOOTSTRAP SERVICES STATUS

Show the state of services from `[bootstrap.services]`

Usage: mise bootstrap services status [OPTIONS]

Options:

-J, --json

Output in JSON format

--missing

Exit with status 1 if any service differs from the config (all are still listed)

-h, --help

Print help

MISE BOOTSTRAP STATUS

Show the state of every configured bootstrap part

Lists secret inputs, packages, accounts, files and directories, services, the firewall, Compose projects, repositories, dotfiles, shell activation, macOS defaults, LaunchAgents, systemd user units, the login shell, `[tools]`, and the system dependencies of those tools, without changing anything. Checking dotfiles can render trusted templates, which may run `exec()`.

`--missing` exits with status 1 if anything differs from the config; it still lists every entry.

Usage: mise bootstrap status [OPTIONS]

Options:

-J, --json

Output in JSON format

--missing

Exit with status 1 if anything differs from the config (all entries are still listed)

--prompt-secrets

Prompt securely for missing bootstrap secret inputs

-h, --help

Print help Examples:

List every configured part and its state

mise bootstrap status

Exit with status 1 if anything differs from the config

mise bootstrap status --missing

Print the state as JSON

mise bootstrap status --json

MISE BOOTSTRAP UNAPPLY

Remove what a config environment's bootstrap sections created

Removes the files, directories, user services, systemd user units, and dotfile entries and edits that the named environments declare. Each named environment's config is loaded for this command even when `-E` or `MISE_ENV` does not select it.

mise plans the removal from the current config, not from a record of past runs, so keep the environment's config files until cleanup is done. Anything another selected config still declares is kept, and so is anything changed since it was applied unless you pass `--force`. A directory is removed only if it is empty afterward. Dotfile sources and config entries are left in place.

It asks before removing anything unless `--yes`, `MISE_YES`, or the `yes` setting is set, and fails when there is no terminal to ask. mise turns on the `yes` setting when `CI` is set.

Packages, repositories, and Compose projects are not removed; the output says how to clean them up. Accounts, system services, the firewall, and other sections are left alone.

Usage: mise bootstrap unapply [OPTIONS] <ENV> ...

Options:

-f, --force

Remove targets that changed since they were applied

-n, --dry-run

Show what would be removed without removing anything

-y, --yes

Skip the confirmation prompt

--prompt-secrets

Prompt securely for missing bootstrap secret inputs

-h, --help

Print help Arguments:

<ENV>

Config environments whose resources should be removed Examples:

Preview what removing the `ssh` environment's resources would do

mise bootstrap unapply ssh --dry-run

Remove them after a confirmation prompt

mise bootstrap unapply ssh

Remove the resources of two environments without a prompt

mise bootstrap unapply ssh gpg --yes

MISE BOOTSTRAP USER

Manage your login shell from `[bootstrap.user]`

Run it as the user whose shell should change. The new shell applies to future logins, not to the shell running this command.

Usage: mise bootstrap user [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE BOOTSTRAP USER APPLY

Set your login shell from `[bootstrap.user]`

Usage: mise bootstrap user apply [OPTIONS]

Options:

-n, --dry-run

Show what would change without changing anything

-y, --yes

Skip the confirmation prompt

-h, --help

Print help

MISE BOOTSTRAP USER STATUS

Show whether your login shell matches `[bootstrap.user]`

Usage: mise bootstrap user status [OPTIONS]

Options:

-J, --json

Output in JSON format

--missing

Exit with status 1 if your login shell differs from the config

-h, --help

Print help

MISE CACHE

Manage the mise cache

The cache holds data mise can fetch or rebuild again, such as version lists and release metadata. With no subcommand, prints the cache directory, like `mise cache path`. See https://mise.jdx.dev/cache-behavior.html.

Usage: mise cache [OPTIONS] [COMMAND]

Options:

-h, --help

Print help

MISE CACHE CLEAR

Delete cached data

With no arguments, deletes the whole cache directory, the cached environment, and every task's cached artifacts. With TOOL arguments, deletes only the cached data of those tools, such as their version lists. With --task, deletes only that task's cached artifacts. Installed tools are not removed; mise downloads or rebuilds what it needs again.

Usage: mise cache clear [OPTIONS] [<TOOL>] ...

Options:

--outdate

Mark all cache files as old

--task <TASK>

[experimental] Clear task artifact cache entries for a task name or pattern

-h, --help

Print help Arguments:

<TOOL>

Only clear the cache of these tools, such as `node` Examples:

Clear the whole cache

mise cache clear

Refresh node's version list

mise cache clear node

[experimental] Forget the build task's cached artifacts

mise cache clear --task build

MISE CACHE PATH

Print the cache directory path

Usage: mise cache path [OPTIONS]

Options:

-h, --help

Print help

MISE CACHE PRUNE

Remove cache files that have not been accessed recently

Removes cache files not accessed within the `cache_prune_age` setting. Set it to `0s` to keep cache files indefinitely. mise also prunes the cache now and then on its own.

Usage: mise cache prune [OPTIONS] [<TOOL>] ...

Options:

-v, --verbose

Show pruned files

--dry-run

Show what would be pruned without deleting anything

-h, --help

Print help Arguments:

<TOOL>

Only prune the cache of these tools, such as `node` Examples:

List what would be removed

mise cache prune --dry-run

MISE CACHE TASK

[experimental] Inspect artifact cache entries for a task

Lists the artifact cache entries of the tasks matching TASK with their key, size, run time, last access, and outputs, and marks the entry that matches the task's current inputs. Remove entries with `mise cache clear --task TASK`. See https://mise.jdx.dev/tasks/caching.html#enable-artifact-caching.

Usage: mise cache task [OPTIONS] <TASK>

Options:

-J, --json

Output in JSON format

-h, --help

Print help Arguments:

<TASK>

Task name or pattern to inspect Examples:

List the build task's cache entries

mise cache task build

MISE COMPLETION

Generate shell completions

Prints a completion script for SHELL, or with --install writes it where that shell loads completions from. The script asks mise for candidates as you type, so it also completes your project's task names and tool versions. See https://mise.jdx.dev/shell-setup.html#autocompletion.

Usage: mise completion [OPTIONS] [<SHELL>]

Options:

-s, --shell <SHELL>

Shell type to generate completions for

--include-bash-completion-lib

No longer has any effect; kept so older setup scripts keep working

--usage

No longer has any effect; kept so older setup scripts keep working

--install

Install the script where this shell looks for it, instead of printing it

It writes only the script file, never a shell startup file or PowerShell profile. If your shell needs a one-time setup line, such as zsh's `fpath+=` or PowerShell's dot-source, mise prints it for you to add.

--force

Replace a file at the target path that mise did not write

--tool <TOOL>

Generate completions for a tool installed with the `packslip:` backend

TOOL is the tool or one of its executables; with --install, pass the executable's name. The script matches the version active in the current directory and comes from the most verifiable source its packslip offers: a file the vendor shipped, a script derived from its CLI spec, or a command of the tool's own. With --install, mise writes a small stub that asks mise for the script each time the shell completes the tool, so it follows version changes without being rewritten.

-h, --help

Print help Arguments:

<SHELL>

Shell type to generate completions for (required) Examples:

Install completions for zsh; bash, fish, and powershell work the same way

mise completion zsh --install

Print the script to inspect it or save it somewhere else

mise completion zsh

Install completions for hk, a tool installed with the packslip backend

mise completion zsh --tool hk --install

MISE CONFIG

Manage config files

With no subcommand, lists the config files mise loads, from lowest to highest precedence, like `mise config ls`; the flags below apply to that listing.

Usage: mise config [OPTIONS] [COMMAND]

Options:

--truncate

Truncate long terminal output to fit the available width

Default: true

-J, --json

Output in JSON format

--no-header

Do not print the table header

--tracked-configs

List every config file mise has loaded, in any project

mise remembers the config files it loads so `mise prune` keeps the versions they use.

-h, --help

Print help

MISE CONFIG EXPLAIN

Describe each key in a mise TOML file

Lists every key the file sets, with its line and what it does, from the same schema editors use to check a config. A key mise does not read is marked, with the known key it most likely meant, and so is a deprecated one. Reads the highest-precedence loaded TOML file by default; select another with `--file`, `--global`, or `--system`.

Usage: mise config explain [OPTIONS] [<KEY>]

Options:

-f, --file, --path <FILE>

Config file to read, or a directory whose config file to read

Defaults to the highest-precedence loaded TOML file other than the global override files.

-g, --global

Read the global config file

--system

Read the system config file

--override

Read the global override file, `config.override.toml`

-J, --json

Print the keys as JSON

-h, --help

Print help Arguments:

<KEY>

Dotted key path to describe, with the keys under it; omit for the whole file

Quote a key with a dot in its name as TOML does, inside shell quotes: `'tasks."build.sh"'`. Unquoted, `tasks.build.sh` still finds the task `build.sh` when there is no key `build` in the way. Examples:

Describe the keys of the project config

mise config explain ~/src/app/mise.toml
1 tools dev tools to use
2 tools.node a version of the tool, or a table with its version and options
4 settings mise settings
5 settings.experimantal not a key mise reads; did you mean experimental?

Describe only the keys under [tasks]

mise config explain tasks

MISE CONFIG GET

Print a value from one mise TOML file

Reads the highest-precedence loaded TOML file by default. Select another with `--file`, `--global`, or `--system`. This reads stored values, not the merged or template-expanded environment; use `mise env` for the resolved environment.

Usage: mise config get [OPTIONS] [<KEY>]

Options:

-f, --file, --path <FILE>

Config file to read, or a directory whose config file to read

For a directory, mise reads the TOML config file already there, such as `.mise.toml`, or `mise.toml` when there is none. Defaults to the highest-precedence loaded TOML file other than the global override files.

-g, --global

Read the global config file

--system

Read the system config file

--override

Read the global override file, `config.override.toml`

-h, --help

Print help Arguments:

<KEY>

Dotted key path to print, such as `tools.python`; omit to print the whole file

Quote a key with a dot in its name as TOML does, inside shell quotes: `'tasks."build.sh"'`. Unquoted, `tasks.build.sh` still finds the task `build.sh` when there is no key `build` in the way. Examples:

Print the python request

mise config get tools.python 3.13

Print the whole file

mise config get

MISE CONFIG LS

List config files currently in use, from lowest to highest precedence

Later files override earlier ones. Global override files (`config.override.toml`) rank above all project config and are labeled `override`.

Usage: mise config ls [OPTIONS]

Options:

--truncate

Truncate long terminal output to fit the available width

Default: true

-J, --json

Output in JSON format

--no-header

Do not print the table header

--tracked-configs

List every config file mise has loaded, in any project

mise remembers the config files it loads so `mise prune` keeps the versions they use.

-h, --help

Print help Examples:

List the loaded config files and the tools each one requests

mise config ls Path Tools ~/.config/mise/config.toml node, python ~/work/api/mise.toml node, terraform

MISE CONFIG SET

Set a value in one mise TOML file

Edits the highest-precedence loaded TOML file by default, which may be an environment-specific override. Use `--file` to select an existing project file, or `--global`/`--system` to edit or create those config files.

This edits configuration without installing tools. Use `mise use` to install and select a version together. For environment variables and settings, `mise set` and `mise settings set` are shorter, but they choose their file differently: `mise set` writes the nearest `mise.toml`, and `mise settings set` writes the global config unless you pass `--local`.

Known settings use their declared type; boolean settings accept `true`, `false`, `yes`, `no`, `1`, and `0`. For other keys, `true` and `false` become booleans and every other value is stored as a string. Use `--type bool` to store `yes`, `no`, `1` or `0` as a boolean, `--type string` to store `true` or `false` as text, and `--type integer` for a number.

Usage: mise config set [OPTIONS] <KEY> [<VALUE>]

Options:

-f, --file, --path <FILE>

Config file to edit, or a directory whose config file to edit

For a directory, mise edits the TOML config file already there, such as `.mise.toml`, or `mise.toml` when there is none. Defaults to the highest-precedence loaded TOML file other than the global override files.

-g, --global

Edit the global config file

--override

Edit the global override file, `config.override.toml`

--system

Edit the system config file

--append

Append the value to a list without duplicating an existing entry

--remove

Remove the value from an existing list

-t, --type <TYPE>

TOML type to store the value as; inferred from the value by default

Default: infer

-h, --help

Print help Arguments:

<KEY>

Dotted key path to set, such as `tools.python`

Quote a key with a dot in its name as TOML does, inside shell quotes: `'tasks."build.sh"'`. Unquoted, `tasks.build.sh` still finds the task `build.sh` when there is no key `build` in the way.

<VALUE>

The value to set the key to (optional if provided as KEY=VALUE) Examples:

Request python 3.13

mise config set tools.python 3.13

Set an environment variable

mise config set env.NODE_ENV production

Settings get their declared type, here an integer

mise config set settings.jobs 4

List settings take comma-separated values

mise config set settings.disable_tools node,rust

Add a PATH entry unless it is already there

mise config set --append env._.path ~/.local/bin

Remove that PATH entry

mise config set --remove env._.path ~/.local/bin

Edit the global config

mise config set -g settings.experimental true

MISE DEACTIVATE

Print the script to disable mise in the current shell session

In a shell where mise is activated, run `mise deactivate`: the activation function evaluates the script for you. Calling the executable directly (`command mise deactivate`) only prints the script, so evaluate it yourself as in the examples below. New shells still activate mise; remove the line from your shell startup file to stop that.

Usage: mise deactivate [OPTIONS]

Options:

-h, --help

Print help Examples:

Turn mise off in an activated shell

mise deactivate

Bash or Zsh, calling the executable rather than the activation function

eval "$(command mise deactivate)"

Fish, calling the executable rather than the activation function

command mise deactivate | source

MISE DAEMONS

[experimental] Manage project daemons with pitchfork

Declare long-running processes in `[daemons]`, either as commands or as service presets such as `postgres` and `redis`, and mise runs them under pitchfork with the project's tools and environment. Requires `experimental = true`.

With no subcommand, lists the project's daemons like `mise daemons ls`.

See https://mise.jdx.dev/daemons.html

Usage: mise daemons [OPTIONS] [COMMAND]

Options:

--json

Output in JSON format, including ports, URLs, and data directories

-h, --help

Print help Examples:

Start the default group, or every project daemon

mise daemons start

Show the last 50 lines of api's output

mise daemons logs api -n 50

Stop every registered project daemon

mise daemons stop

MISE DAEMONS PROVIDERS

[experimental] Manage shared servers from global `[daemon_providers]`

A shared server is one PostgreSQL, CockroachDB, or NATS server declared in your global config, with a separate database or account for each checkout that uses it. Not supported on Windows. See https://mise.jdx.dev/daemons/sharing.html#shared-server-providers

Usage: mise daemons providers [OPTIONS] [COMMAND]

Options:

-h, --help

Print help Examples:

List shared servers

mise daemons providers ls

Start the shared server named local-postgres

mise daemons providers start local-postgres

MISE DAEMONS PROVIDERS LS

[experimental] List shared servers

Usage: mise daemons providers ls [OPTIONS]

Options:

--json

Output in JSON format

-h, --help

Print help

MISE DAEMONS PROVIDERS START

[experimental] Start shared servers

Usage: mise daemons providers start [OPTIONS] [<NAMES>] ...

Options:

-h, --help

Print help

MISE DAEMONS PROVIDERS STOP

[experimental] Stop shared servers (data is kept)

Usage: mise daemons providers stop [OPTIONS] [<NAMES>] ...

Options:

-h, --help

Print help

MISE DAEMONS PROVIDERS RESTART

[experimental] Restart shared servers with their current configuration

Usage: mise daemons providers restart [OPTIONS] [<NAMES>] ...

Options:

-h, --help

Print help

MISE DAEMONS START

[experimental] Start project daemons and the daemons they depend on

Installs missing tools and registers the project's daemons with pitchfork, then starts the selected daemons and waits until they are ready. With no names, starts the `default` group from `[daemon_groups]` when the project declares one, otherwise every project daemon.

Select daemons by name (`api` or a qualified ID such as `shop/api`), by group with `--group NAME`, or all of them with `--all`. `--all` covers every daemon in this project, including those the `default` group leaves out; unlike pitchfork's own `--all`, it never reaches other projects, and it cannot be combined with names or `--group`. Other flags pass through to `pitchfork start`.

Usage: mise daemons start [OPTIONS] [<ARGS>] ...

Options:

-h, --help

Print help Arguments:

<ARGS>

Daemon names (short, such as `api`, or qualified, such as `shop/api`), `--group NAME`, and flags passed to pitchfork Examples:

Start the default group, or every daemon

mise daemons start

Start api and the daemons it depends on

mise daemons start api

Start a group declared in [daemon_groups]

mise daemons start --group backend

MISE DAEMONS REGISTER

[experimental] Register project daemons for on-demand startup

Installs missing tools, validates daemon definitions and dependencies, and registers the generated configuration with pitchfork without starting anything. Covers every project daemon, including imported dependencies and daemons outside the `default` group. Daemons that are already running keep running.

A running pitchfork supervisor with its proxy enabled can then start a registered HTTP daemon when a request reaches its hostname. See https://mise.jdx.dev/daemons/worktrees.html#register-for-on-demand-startup

Usage: mise daemons register [OPTIONS]

Options:

-h, --help

Print help Examples:

Register every project daemon

mise daemons register

MISE DAEMONS STOP

[experimental] Stop project daemons

With no names, stops every daemon the project has registered, including daemons a removed group started. Data is kept. Select daemons as `mise daemons start` does: by name, with `--group NAME`, or with `--all`. Other flags pass through to `pitchfork stop`.

Usage: mise daemons stop [OPTIONS] [<ARGS>] ...

Options:

-h, --help

Print help Arguments:

<ARGS>

Daemon names (short, such as `api`, or qualified, such as `shop/api`), `--group NAME`, and flags passed to pitchfork Examples:

Stop one daemon

mise daemons stop postgres

MISE DAEMONS RESTART

[experimental] Restart project daemons

Installs missing tools first and selects daemons as `mise daemons start` does: with no names, the `default` group when the project declares one, otherwise every project daemon. A changed daemon declaration takes effect on restart. Other flags pass through to `pitchfork restart`.

Usage: mise daemons restart [OPTIONS] [<ARGS>] ...

Options:

-h, --help

Print help Arguments:

<ARGS>

Daemon names (short, such as `api`, or qualified, such as `shop/api`), `--group NAME`, and flags passed to pitchfork Examples:

Restart api with its current declaration

mise daemons restart api

MISE DAEMONS LS

[experimental] List project daemons

Shows each daemon's ID, status, and source without starting a supervisor or registering configuration.

Usage: mise daemons ls [OPTIONS]

Options:

--json

Output in JSON format, including ports, URLs, and data directories

-h, --help

Print help Examples:

Include ports, URLs, and data directories

mise daemons ls --json

MISE DAEMONS URLS

[experimental] Show each daemon's URL and port

Lists every project daemon with its proxy hostname URL, the port it binds, its proxy mode, and its status. A daemon's hostname does not change when its port does, so an HTTP service can be addressed by URL while concurrent checkouts keep separate ports. A daemon with no `port`, or with `proxy = false`, gets no hostname and is listed without a URL. Each project's table is followed by its project page URL and, in a linked Git worktree, its stack page URL.

See https://mise.jdx.dev/daemons/worktrees.html#stable-urls-per-worktree

Usage: mise daemons urls [OPTIONS]

Options:

--json

Output in JSON format, including ports, URLs, and data directories

-h, --help

Print help Examples:

Show the URLs for this checkout

mise daemons urls

MISE DAEMONS LOGS

[experimental] Show the output of project daemons

Requires a running pitchfork supervisor. With no names, shows every daemon the project has registered. Flags such as `-n`, `--since`, and `--grep` pass through to `pitchfork logs`.

Usage: mise daemons logs [OPTIONS] [<ARGS>] ...

Options:

-h, --help

Print help Arguments:

<ARGS>

Daemon names (short, such as `api`, or qualified, such as `shop/api`), `--group NAME`, and flags passed to pitchfork Examples:

Show the last 50 lines of api's output

mise daemons logs api -n 50

Show the last five minutes of output

mise daemons logs --since 5min

MISE DAEMONS STATUS

[experimental] Show the status of project daemons

Prints pitchfork's status for each selected daemon. With no names, covers every daemon the project has registered.

Usage: mise daemons status [OPTIONS] [<ARGS>] ...

Options:

-h, --help

Print help Arguments:

<ARGS>

Daemon names (short, such as `api`, or qualified, such as `shop/api`), `--group NAME`, and flags passed to pitchfork Examples:

Show the status of api

mise daemons status api

MISE DAEMONS TUI

[experimental] Open the pitchfork dashboard

Requires a running pitchfork supervisor. Takes `pitchfork tui` flags, not daemon names.

Usage: mise daemons tui [OPTIONS] [<ARGS>] ...

Options:

-h, --help

Print help Arguments:

<ARGS>

Flags passed to `pitchfork tui`

MISE DAEMONS PRUNE

[experimental] Remove daemon state left by deleted projects

Scans `$MISE_STATE_DIR/daemons/` for state that belongs to deleted projects, including removed Git worktrees. For each one, stops its daemons, unregisters its configuration, and deletes its state and data. Existing projects are not touched.

Use `--dry-run` to preview the paths and sizes. Removal cannot be undone and asks for confirmation. Pass the global `--yes` flag to prune without a prompt; entries that may belong to an unmounted volume or a deleted symlink are then skipped and need a separate interactive confirmation.

pitchfork must be available. State is kept when mise cannot confirm that the daemons have stopped or cannot unregister their configuration.

Usage: mise daemons prune [OPTIONS]

Options:

-n, --dry-run

Show what would be removed without deleting anything

-h, --help

Print help Examples:

Preview what would be removed

mise daemons prune --dry-run

Review the list and confirm removal

mise daemons prune

MISE DOTFILES

Deploy, track, and sync dotfiles

A `[dotfiles]` entry deploys a file (from a source with `symlink`, `symlink-each`, `copy`, or `template`, or from inline `content`), removes one (`mode = "absent"`), sets an existing path's `permissions`, edits part of a file, or tracks a live file where it is (`mode = "track"`). mise saves tracked files to a local Git history that you can browse and roll back, and syncs it with other machines through an origin repository. `mise dot` is a shorter alias.

Deploy files with `add`, `apply`, `diff`, `status`, and `unapply`. Track and restore files with `track`, `save`, `history`, `rollback`, and `undo`. Sync them with `origin`, `sync`, and `pull`.

See https://mise.jdx.dev/dotfiles.html and https://mise.jdx.dev/dotfiles/history.html

Usage: mise dotfiles [OPTIONS] <COMMAND>

Options:

--local

Work on this machine's local-only history (`mode = "track-local"`), which is never shared

-h, --help

Print help Examples:

Start managing ~/.zshrc from your dotfiles directory

mise dot add ~/.zshrc

Deploy every [dotfiles] entry

mise dot apply

Show the state of your dotfiles and their history

mise dot status

Save the history of a directory in place

mise dot track ~/.config/nvim

List saved checkpoints

mise dot history

MISE DOTFILES ADD

Start deploying a file, or copy its edits back to the source

For a target that is not managed yet, saves its contents as a source under `dotfiles.root` (or at the path given with `--source`), adds a `[dotfiles]` entry, and applies it unless you pass `--no-apply`. For a target that is already managed, updates its source from the live file. `--dry-run` previews the source and config changes without writing them.

A target inside the tree of a dotfile group is captured into that group's source instead, without a new `[dotfiles]` entry: the deepest group whose target contains it, or the one named with `--group`.

Usage: mise dotfiles add [OPTIONS] [<TARGET>] ...

Options:

--changed

Update the sources of every changed file managed in copy mode

-f, --force

Overwrite existing sources without prompting

-g, --global

Write to the global config (the default)

New entries go to the `write_targets.dotfiles` file when that setting is set.

-l, --local

Write to the project config instead of the global config

-m, --mode <MODE>

Mode for a target that is not managed yet: symlink, symlink-each, copy, or template (default: the `dotfiles.default_mode` setting)

A target that is already managed keeps its mode.

-n, --dry-run

Print the config and source changes without writing anything

--no-apply

Add the entry without applying it

-p, --path <PATH>

Write to this config file or directory

-s, --source <PATH>

Source path to use for a single target

A relative path starts from the current directory. The entry records it relative to the config file's directory when it lies inside it, and as an absolute path otherwise.

-y, --yes

Skip the confirmation prompt

--prompt-secrets

Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set

--group <NAME>

Capture into the tree of this dotfile group

-h, --help

Print help Arguments:

<TARGET>

Targets to add or update Examples:

Start managing ~/.zshrc from your dotfiles directory

mise dot add ~/.zshrc

Copy the file into place instead of symlinking it

mise dot add --mode copy ~/.config/starship.toml

Choose where the source is stored

mise dot add --source dotfiles/gitconfig ~/.gitconfig

Capture the file into a dotfile group's tree

mise dot add --group home ~/.config/starship.toml

Copy edits of every changed copy-mode file back to its source

mise dot add --changed

MISE DOTFILES APPLY

Link, copy, and render `[dotfiles]` entries into place

Applies the whole-file entries and edits that are not in their desired state. Whole-file entries symlink, copy, render templates, write inline `content`, set `permissions`, or remove targets declared `mode = "absent"`. Edit entries manage a marker-delimited block, a single line, or merged keys in a file mise does not otherwise own.

Entries that deploy mise's own configuration are applied first and the configuration is read again, so a rule the new file adds applies in the same run.

`apply` works from the files on this machine. It never fetches or pulls: to bring in changes from other machines, run `mise dot sync`, `mise dot pull`, then `mise dot apply`.

The `pre-dotfiles` and `post-dotfiles` bootstrap hooks run before and after the apply (with `--dry-run` they are printed, not run), and the matching `[history.reload]` commands run for the targets it wrote.

With `--prune`, also removes files that dotfile groups deployed but no active entry deploys now: files of a group that is no longer selected or declared, and files a group stopped deploying because of a new `exclude` or a deleted source.

Usage: mise dotfiles apply [OPTIONS] [<TARGET>] ...

Options:

-f, --force

Overwrite existing files that conflict with whole-file dotfile entries

-n, --dry-run

Print the actions that would run without writing anything

-y, --yes

Skip the confirmation prompt

--prune

Also remove files that dotfile groups deployed but no active entry deploys now

--prompt-secrets

Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set

-h, --help

Print help Arguments:

<TARGET>

Only apply these targets Examples:

Deploy every entry that is out of date

mise dot apply

Print what would change

mise dot apply --dry-run

Also remove files left by dotfile groups

mise dot apply --prune

Overwrite conflicting files without prompting

mise dot apply --force --yes

MISE DOTFILES CAPTURE

Run a command and save tracked files before and after it

Runs the command with your terminal and environment and saves a checkpoint before and after it, even when the command fails or changes nothing, so `mise dot undo` can reverse what it did to your tracked files. Edits you make while it runs are part of the same operation. Packages, services, and other system changes are not recorded and cannot be undone. If saving fails, mise warns and still exits with the command's status.

Usage: mise dotfiles capture [OPTIONS] <COMMAND> ...

Options:

--label <LABEL>

Describe this operation in history

-h, --help

Print help Arguments:

<COMMAND>

Command and arguments to run, after -- Examples:

Record what an upgrade changes

mise dot capture -- brew upgrade

Label the operation in history

mise dot capture --label "theme switch" -- ./switch-theme.sh

MISE DOTFILES CONFLICTS

Compare both sides of a sync conflict

Prints a unified diff from this machine's saved version to the version fetched from the origin. `--difftool` opens the comparison in Git's configured diff tool; when `diff.tool` is unset, Git falls back to `merge.tool`. This command changes neither side. Resolve a conflict with `mise dot pull --take-remote` or `--keep-local`.

Usage: mise dotfiles conflicts [OPTIONS] [<PATH>] ...

Options:

--difftool

Open the comparison in Git's configured diff or merge tool

--tool <TOOL>

Use this Git diff tool instead of the configured default

-h, --help

Print help Arguments:

<PATH>

Only inspect these conflicted paths Examples:

Show every conflict

mise dot conflicts

Show one conflicted file

mise dot conflicts ~/.zshrc

Open the comparison in Git's diff tool

mise dot conflicts --difftool ~/.zshrc

Use a specific diff tool

mise dot conflicts --difftool --tool meld ~/.zshrc

MISE DOTFILES DIFF

Show what `mise dot apply` would change

Prints a unified diff for every whole-file entry and edit that `mise dot apply` would change. Templates are rendered first, so trusted template functions may run. Tracked entries have nothing to apply; use `mise dot history diff` to see their unsaved changes.

Usage: mise dotfiles diff [OPTIONS] [<TARGET>] ...

Options:

--prompt-secrets

Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set

-h, --help

Print help Arguments:

<TARGET>

Only show these targets Examples:

Show every pending change

mise dot diff

Show the change for one target

mise dot diff ~/.zshrc

MISE DOTFILES EDIT

Open a dotfile's source in your editor

Opens the file that defines TARGET in `$VISUAL` or `$EDITOR`: the source for symlink, copy, and template entries; the file itself for tracked and permissions-only entries; and the declaring config for inline `content`, `absent` entries, and edits without a source file. A `fnox` entry is edited with `fnox edit --file`, which stores the change in fnox.

An unmanaged target is first added to the global `[dotfiles]`, as `mise dot add --no-apply` would add it, after a prompt that `--yes` skips. Without a terminal, an unmanaged target needs `--yes`. With `--apply`, applies the target after the editor exits.

Usage: mise dotfiles edit [OPTIONS] <TARGET>

Options:

--apply

Apply this target after the editor exits

-m, --mode <MODE>

Mode to use if the target is not managed yet: symlink, symlink-each, copy, or template (default: the `dotfiles.default_mode` setting)

-s, --source <PATH>

Source path to use if the target is not yet managed

-y, --yes

Skip the confirmation prompt when adding an unmanaged target

--group <NAME>

Dotfile group whose tree holds the target, when several groups deploy into its directory

--prompt-secrets

Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set

-h, --help

Print help Arguments:

<TARGET>

Target to edit Examples:

Edit the source of ~/.zshrc

mise dot edit ~/.zshrc

Edit the source, then deploy it

mise dot edit --apply ~/.config/starship.toml

MISE DOTFILES EXCLUDE

Never save paths matching a glob

Adds a glob to `[history] exclude` in the global config. The rule applies to every tracked path. Quote the glob so your shell does not expand it.

Use exclusions for logs, caches, databases, and session state. For files you want to save only on demand, track them with `mise dot track --no-autosave` instead. To limit what one tracked directory saves, edit the `exclude` or `include` list of its `[dotfiles]` entry.

Usage: mise dotfiles exclude [OPTIONS] <GLOB>

Options:

-h, --help

Print help Arguments:

<GLOB>

A glob such as `~/.config/hypr/plugins/**` Examples:

Never save Codex session logs

mise dot exclude '~/.codex/sessions/**'

MISE DOTFILES HISTORY

Browse saved versions of your tracked files

A checkpoint is a saved version of every `[dotfiles]` entry with `mode = "track"`. `mise dot save`, the watcher, and every command that changes tracked files (such as `mise bootstrap`, `mise dot apply`, `rollback`, `pull`, and `undo`) record one. Checkpoints hold file contents only, not packages or services. Files deployed in other modes are saved only if you also track them. With no subcommand, lists checkpoints newest first.

See https://mise.jdx.dev/dotfiles/history.html

Usage: mise dotfiles history [OPTIONS] [COMMAND]

Options:

-J, --json

Output in JSON format

-n, --limit <LIMIT>

Show at most this many checkpoints (0 for all)

Default: 20

--path <PATH>

Only checkpoints where this path (or something under it) changed

--trigger <TRIGGER>

Only checkpoints with this trigger, such as edit, save, agent, bootstrap, apply, rollback, or undo

`bootstrap` covers `mise bootstrap`, its `packages` commands, and `mise dot add`, `apply`, `edit`, and `unapply`. `apply` covers incoming changes written by `mise dot pull` or the watcher.

--label <LABEL>

Only checkpoints with this label

--pending

Only checkpoints recorded by operations that did not finish

-h, --help

Print help Examples:

List recent checkpoints

mise dot history

List checkpoints that changed one file

mise dot history --path ~/.config/hypr/bindings.lua

List the last five checkpoints from mise bootstrap or mise dot apply

mise dot history --trigger bootstrap -n 5

Show the newest checkpoint

mise dot history show latest

Show unsaved changes

mise dot history diff

MISE DOTFILES HISTORY DESCRIBE

Set the description of a checkpoint

Usage: mise dotfiles history describe [OPTIONS] <REF> <TEXT>

Options:

-h, --help

Print help Arguments:

<REF>

Numeric checkpoint ID, `latest`, `latest~N`, or `commit:<sha>`

<TEXT>

The new description Examples:

Describe the newest checkpoint

mise dot history describe latest "before the theme change"

MISE DOTFILES HISTORY DIFF

Compare checkpoints, or your files against one

Without arguments, shows unsaved changes: the files on disk against the latest checkpoint. With one reference, shows what that checkpoint changed since the one before it. With two, compares them.

Usage: mise dotfiles history diff [OPTIONS] [<A>] [<B>]

Options:

--operation

Compare an operation with the checkpoint it saved before it ran

With no reference, uses the newest operation, ignoring later saves. With one reference, uses that operation. Fails if the operation's earlier checkpoint is unavailable instead of comparing an unrelated save.

-p, --patch

Print the full patch instead of a per-file summary

--path <PATH>

Restrict to one path (a file or a directory)

--exit-code

Exit 1 when the two sides differ

-h, --help

Print help Arguments:

<A>

Numeric checkpoint ID, `latest`, `latest~N`, or `commit:<sha>`

<B>

Compare `A` with this checkpoint instead of its predecessor Examples:

Show unsaved changes

mise dot history diff

Show what checkpoint 12 changed

mise dot history diff 12

Print the full patch between two checkpoints

mise dot history diff 11 12 --patch

Show what the newest operation changed

mise dot history diff --operation

MISE DOTFILES HISTORY LS

List checkpoints, newest first

Usage: mise dotfiles history ls [OPTIONS]

Options:

-J, --json

Output in JSON format

-n, --limit <LIMIT>

Show at most this many checkpoints (0 for all)

Default: 20

--path <PATH>

Only checkpoints where this path (or something under it) changed

--trigger <TRIGGER>

Only checkpoints with this trigger, such as edit, save, agent, bootstrap, apply, rollback, or undo

`bootstrap` covers `mise bootstrap`, its `packages` commands, and `mise dot add`, `apply`, `edit`, and `unapply`. `apply` covers incoming changes written by `mise dot pull` or the watcher.

--label <LABEL>

Only checkpoints with this label

--pending

Only checkpoints recorded by operations that did not finish

-h, --help

Print help Examples:

List every checkpoint

mise dot history ls -n 0

List operations that did not finish

mise dot history ls --pending

MISE DOTFILES HISTORY PURGE

Erase a path's saved versions from history

Rewrites the history without the path, for a file you tracked by mistake that holds a secret. `untrack`, `rollback`, and `undo` only add checkpoints; they leave the old versions readable.

Checkpoints that changed only this path are removed. The others stay, with their descriptions, dates, and IDs, minus the path. Without `--yes`, the command lists what would change and asks first.

mise never rewrites history that is on the origin: if a saved version of the path was ever published, the command refuses. Rotate the secret, then see https://mise.jdx.dev/dotfiles/encryption.html#remove-plaintext-from-history.

This does not stop tracking the path. If the file is still tracked, the next save records its current contents again, so run `mise dot untrack` first (or encrypt it). Stop the watcher service while this runs.

Usage: mise dotfiles history purge [OPTIONS] <PATH> ...

Options:

-n, --dry-run

Show what would change without changing anything

-y, --yes

Rewrite without prompting

--backup

Keep the replaced history in the repository under `refs/mise/purge-backup/`

The backup still holds the content you are erasing; delete it with `git update-ref -d` once you are sure.

--keep-objects

Leave the replaced objects on disk instead of deleting them

-h, --help

Print help Arguments:

<PATH>

Files or directories to erase from history Examples:

List the checkpoints that hold the file

mise dot history purge ~/.aws/credentials --dry-run

Erase every saved version of the file

mise dot history purge ~/.aws/credentials --yes

MISE DOTFILES HISTORY SHOW

Show a checkpoint: its trigger, changes, and operation journal

Prints the checkpoint's trigger, description, time, and machine, the files that changed since the previous checkpoint, and the tracked entries it covers. For a checkpoint that an operation recorded, also prints the operation's journal of the files it wrote.

Usage: mise dotfiles history show [OPTIONS] [<REF>]

Options:

-J, --json

Output in JSON format

--files

List every file in the snapshot

--path <PATH>

Resolve `latest~N` among the checkpoints where this path changed

-h, --help

Print help Arguments:

<REF>

Numeric checkpoint ID, `latest` (the default), `latest~N`, or `commit:<sha>` Examples:

Show the newest checkpoint

mise dot history show

List every file in an older checkpoint

mise dot history show latest~2 --files

MISE DOTFILES INCLUDE

Stop excluding paths matching a glob

Removes a glob that `mise dot exclude` added to `[history] exclude` in the global config. Pass the pattern exactly as you excluded it. Other matching exclusion rules still apply. This command does not edit a tracked directory's `include` list; change that list in its `[dotfiles]` entry.

Usage: mise dotfiles include [OPTIONS] <GLOB>

Options:

-h, --help

Print help Arguments:

<GLOB>

The glob as written by `mise dot exclude` Examples:

Save Codex session logs again

mise dot include '~/.codex/sessions/**'

MISE DOTFILES NOTIFY

Send a test desktop notification

Checks that `history.notify` can reach you. On macOS the first notification asks for permission, so run this once to be prompted now instead of at the first sync conflict. Fails with the reason when this build or machine cannot show notifications: a macOS build that is not mise's signed release (such as Homebrew's), a missing `notify-send` on Linux, denied permission, or `history.notify = false`.

mise notifies you only when a sync conflict pauses syncing. Other problems, such as a watcher that cannot save, appear in `mise doctor` and `mise dot status`.

Usage: mise dotfiles notify [OPTIONS]

Options:

-h, --help

Print help Examples:

Send a test notification

mise dot notify

MISE DOTFILES ORIGIN

Show, connect, or disconnect the origin repository

The origin is a Git repository that shares the history of your tracked files with your other machines. With no subcommand, prints the connected URL, its branch, the config file that declares it, and the sync mode (the `history.sync` setting). `--remove` disconnects; local checkpoints and fetched history stay.

See https://mise.jdx.dev/dotfiles/sync.html

Usage: mise dotfiles origin [OPTIONS] [COMMAND]

Options:

--remove

Disconnect the origin by removing `[history.origin]`; local checkpoints and fetched history stay

-h, --help

Print help Examples:

Show the connected repository

mise dot origin

Connect a repository

mise dot origin set [email protected]:you/dotfiles.git

Disconnect the repository

mise dot origin --remove

MISE DOTFILES ORIGIN SET

Connect an origin repository

Use a private repository: every saved checkpoint is shared, including those saved before you connect. mise shows the sync mode and the tracked files before you confirm, then runs the first sync. It never replaces a repository that has unrelated history, and it refuses to push older plaintext versions of files you now encrypt. The connection is written to `[history.origin]` in `config.local.toml` next to your global config, so it stays on this machine.

The origin holds tracked-file history, not a checkout of your global config: connect a repository of its own, or a separate branch (`--branch`) of the one you adopt as global config with `mise bootstrap --adopt`.

Usage: mise dotfiles origin set [OPTIONS] <URL>

Options:

--branch <BRANCH>

The branch to sync (default: the repository's default branch)

Reconnecting a repository this machine already follows keeps that connection's branch. A repository with no branches gets `main`, which the first push creates.

--sync <MODE>

How to sync with the repository: sync, fetch-only, or manual

`sync` pushes saved checkpoints and applies incoming changes automatically. `fetch-only` fetches automatically and never pushes. `manual` makes no automatic network calls: `mise dot sync` pushes and fetches, and `mise dot pull` applies, only when you run them; local history is still saved automatically. When omitted, mise prompts; with `--yes`, it uses the `history.sync` setting.

-y, --yes

Skip the confirmation prompt

-h, --help

Print help Arguments:

<URL>

The repository URL (any Git URL; use a private repository) Examples:

Connect and choose a sync mode at the prompt

mise dot origin set https://github.com/you/dotfiles.git

Connect without automatic network activity

mise dot origin set [email protected]:you/dotfiles.git --sync manual

MISE DOTFILES PATHS

List tracked paths and how they are saved

Shows each tracked entry with the config file that declares it, whether it saves automatically, and how many files it covers. Entries mise cannot save are listed as invalid, omitted, or incomplete, so you can see what is not protected.

Usage: mise dotfiles paths [OPTIONS]

Options:

-J, --json

Output in JSON format

--preview <PATH>

List the files that tracking this path would save, without tracking it

--noisy

List the paths the watcher found changing constantly and saves less often

-h, --help

Print help Examples:

List tracked paths

mise dot paths

List the files tracking ~/.codex would save

mise dot paths --preview ~/.codex

List files the watcher saves less often

mise dot paths --noisy

MISE DOTFILES PULL

Write fetched changes from other machines to tracked files

Writes the changes that the last `mise dot sync` fetched from your other machines. (`mise dot apply` deploys your own `[dotfiles]` entries; `pull` writes what other machines pushed.) `pull` restores tracked paths, including tracked symlinks, but never deploys `copy`, `symlink`, or `template` entries: when a tracked file is the source of one, `pull` updates the source, and `mise dot apply` then writes the target your application reads. mise saves a checkpoint first, so `mise dot undo` reverses the whole pull, and runs the matching `[history.reload]` commands after writing.

A pull applies every incoming change together, including config files and the files they reference; it does not take paths. Nothing is written if an incoming config file does not parse, a file has unsaved local edits, your own checkout has staged Git changes, or a file changed on both sides. A file that changed on both sides is a conflict: compare the two versions with `mise dot conflicts`, then resolve it with `--take-remote` or `--keep-local`, or resolve every conflict with `--take-remote-all` or `--keep-local-all`. While any conflict remains, pushing and applying stop for all tracked files; local history and fetching continue.

In `sync` mode the watcher pulls on its own when there are no conflicts. When incoming config declares more tracked files, their versions from the origin are written in the same pull.

Usage: mise dotfiles pull [OPTIONS] [<PATH>] ...

Options:

-n, --dry-run

Show the plan without changing anything

-y, --yes

Accepted for compatibility; pull skips the apply confirmation

--take-remote <PATH>

Resolve a conflict with the origin's version

--keep-local <PATH>

Resolve a conflict by keeping this machine's version; the next sync pushes it

--take-remote-all

Resolve every remaining conflict with the origin's version

Paths named by `--keep-local` keep this machine's version; every other conflict takes the origin's. Use it on a newly connected machine, where each existing file that differs is a separate conflict.

--keep-local-all

Resolve every remaining conflict by keeping this machine's version

Paths named by `--take-remote` take the origin's version; every other conflict keeps this machine's. Each kept path must already be saved.

-h, --help

Print help Arguments:

<PATH>

Not supported; a pull always applies every incoming change Examples:

Show what would be written

mise dot pull --dry-run

Resolve a conflict with the origin's version

mise dot pull --take-remote ~/.zshrc

Resolve a conflict by keeping this machine's version

mise dot pull --keep-local ~/.zshrc

Take the origin's version of every conflict except one

mise dot pull --take-remote-all --keep-local ~/.zshrc

MISE DOTFILES RECOVER

Recover an interrupted dotfile operation

Finishes recovering from an operation that was interrupted, for example by a crash or Ctrl-C. With no argument, recovers every interrupted operation. mise restores files from the operation's recovery copies unless you have edited them since. When it cannot tell which version is safe, it lists the files: check them, then rerun with `--keep-current` to keep what is on disk and discard the operation's recovery copies. When several operations were interrupted, `--keep-current` needs the ID of one. Git history is not changed.

Usage: mise dotfiles recover [OPTIONS] [<OPERATION>]

Options:

--keep-current

Keep the files on disk instead of restoring the recovery copies

-y, --yes

Discard the operation's recovery copies without prompting

-h, --help

Print help Arguments:

<OPERATION>

The operation's checkpoint ID (see `mise dot history --pending`) or a unique prefix of its UUID Examples:

Recover every interrupted operation

mise dot recover

Keep the files on disk for operation 42

mise dot recover 42 --keep-current --yes

MISE DOTFILES ROLLBACK

Return files to the version a checkpoint holds

Without `--to`, each path returns to its most recent saved version that differs from what is on disk; other checkpoints do not affect the choice. With `--to REF`, the named checkpoint is the source, and `--all` restores everything it covers. mise saves the current state in a checkpoint first, so `mise dot undo` can reverse the rollback.

Usage: mise dotfiles rollback [OPTIONS] [<PATH>] ...

Options:

--to <REF>

The checkpoint to roll back to: numeric ID, `latest`, `latest~N`, or `commit:<sha>`

--all

With `--to`, restore everything the checkpoint covers

-n, --dry-run

Show the plan without changing anything

-y, --yes

Apply without prompting

--force

Replace a path whose type changed (file, symlink, directory)

-h, --help

Print help Arguments:

<PATH>

Paths to roll back (files or directories) Examples:

Restore the latest saved version that differs from the file

mise dot rollback ~/.config/hypr/bindings.lua

Restore ~/.zshrc as checkpoint 42 holds it

mise dot rollback ~/.zshrc --to 42

Preview restoring every file from three checkpoints ago

mise dot rollback --to latest~3 --all --dry-run

MISE DOTFILES SAVE

Save a checkpoint of the tracked files now

Exits non-zero when history cannot save or a named path is not tracked. With no changes since the latest checkpoint, nothing is saved unless you pass `--description`, `--label`, `--task`, or a `--trigger` other than `save`.

`--best-effort` turns a failure to write the checkpoint, such as missing Git, into a warning for update scripts that run under `set -e`. A disabled history or an untracked path still fails.

A save re-encrypts the files it captures to the current `[history.encryption] recipients`. `--re-encrypt` also re-encrypts the encrypted files it does not capture: files with `autosave = false` that it does not name, and variants for other platforms. It re-encrypts their saved versions and saves no unsaved edit. Run it after changing recipients so a machine added to the list can read every file. This machine must be able to unlock each one; otherwise nothing is saved and the error lists each file it cannot unlock.

Usage: mise dotfiles save [OPTIONS] [<PATH>] ...

Options:

-d, --description <TEXT>

A description for the checkpoint

--trigger <TRIGGER>

Record the checkpoint as a save, agent, or update checkpoint

Default: save

--task <ID>

The ID of the task an agent is working on, recorded with the checkpoint

--label <LABEL>

A label to find the checkpoint by later

--best-effort

Warn instead of failing when the checkpoint cannot be written

--re-encrypt

Re-encrypt every saved encrypted file to the current recipients

-h, --help

Print help Arguments:

<PATH>

Paths to save; every one must be tracked Examples:

Save every tracked file that changed

mise dot save

Save one file with a description

mise dot save ~/.zshrc -d "before the theme change"

Warn instead of failing in a script

mise dot save --best-effort

Re-encrypt every encrypted file after changing recipients

mise dot save --re-encrypt

MISE DOTFILES STATUS

Show the state of your dotfiles and their history

Lists the `[dotfiles]` entries that need attention, and counts the rest; `--verbose` lists every entry. Each has a state: `applied`, `missing`, `differs`, `source missing`, `tracked`, `would remove` for an `absent` entry whose target is still there, or `absent` for a removal that is done. A tracked entry whose variants all select other machines, such as one for an inactive profile, says `not on this machine`. Then shows the history state in sections: Tracking, Repository, Conflicts, Automatic capture, and Bootstrap, ending with the next steps.

Files a dotfile group deployed that no active entry deploys now are listed as `orphaned`: the group was deselected or removed, or a new `exclude` or a deleted source dropped them. `mise dot apply --prune` removes them.

Template entries are rendered to compare their output, so trusted template functions may run. `--json` prints `files`, `edits`, and `history`, with each entry's origin and a state of `applied`, `missing`, `differs`, `source_missing`, or `tracked`. Orphaned files appear in a separate `orphaned` array with the state `orphaned`, or `orphaned_changed` when the file was modified after it was deployed. See https://mise.jdx.dev/dotfiles/reference.html#status-states for every state.

Usage: mise dotfiles status [OPTIONS] [<TARGET>] ...

Options:

--truncate

Truncate long terminal output to fit the available width

Default: true

-J, --json

Output in JSON format

--missing

Exit with code 1 if any dotfile is not in its desired state (missing, source missing, or differs)

-v, --verbose

List every entry, including those already applied or tracked

By default the table lists only entries that need attention or have omitted files, with a one-line summary of the rest. Naming targets lists them regardless.

--prompt-secrets

Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set

-h, --help

Print help Arguments:

<TARGET>

Only show these targets Examples:

Show what needs attention

mise dot status

List every entry

mise dot status --verbose

Show one target

mise dot status ~/.zshrc

Print the state as JSON

mise dot status --json

Exit 1 if anything is out of date, for scripts and CI

mise dot status --missing

MISE DOTFILES SYNC

Push saved checkpoints and fetch incoming changes

Fetches the origin branch and pushes your local history to it. If the push is rejected, mise fetches again and reconciles the two histories without rewriting either. Incoming changes and conflicts are recorded for `mise dot pull`; this command never changes your files. With `--fetch-only`, or in `fetch-only` mode, nothing is pushed.

The watcher does this on its own in `sync` and `fetch-only` mode (the `history.sync` setting). See https://mise.jdx.dev/dotfiles/sync.html

Usage: mise dotfiles sync [OPTIONS]

Options:

--fetch-only

Fetch without pushing

--allow-plaintext-history

Allow pushing older unencrypted versions of files that are now encrypted, and versions that look like they contain secrets

--best-effort

Warn instead of failing when the origin is unreachable

-h, --help

Print help Examples:

Push and fetch now

mise dot sync

Fetch without pushing

mise dot sync --fetch-only

MISE DOTFILES TRACK

Track a file or directory in place

Adds a `[dotfiles]` entry with `mode = "track"` to your global config: the file stays where it is, nothing is copied or linked, and mise saves a checkpoint of it right away. While the watcher service runs, later edits are saved automatically; without it, `mise dot save` saves them. Use `--dry-run` to see what a large directory would add before tracking it.

`--os` and `--profile` declare a variant: machines that match the platform or config environment keep their own version of the file, so a Mac and a Linux machine can have different contents at the same path. `--machine` gives every machine its own version instead, for files such as a monitor layout that should never be applied on another machine.

See https://mise.jdx.dev/dotfiles/history.html

Usage: mise dotfiles track [OPTIONS] <PATH> ...

Options:

--os <OS>

Declare a variant for this platform (macos, linux, linux/arm64, …)

--profile <PROFILE>

Declare a variant for this config environment (`MISE_ENV` or `-E`)

--local

Keep this file's history on this machine only; it is never shared

--machine

Keep a separate stream on every machine, never applied on another

--no-autosave

Save only on `mise dot save <path>`, never automatically

--encrypt

Encrypt contents before saving them to history (requires `[history.encryption] recipients`)

--allow-plaintext

Save an explicitly tracked credential-named file in plaintext

-y, --yes

Accepted for compatibility; track no longer asks to confirm the paths

-n, --dry-run

Show what each path expands to (files, size, what is left out) without tracking it

-h, --help

Print help Arguments:

<PATH>

Paths to track (absolute or starting with ~/) Examples:

Track a file and a directory

mise dot track ~/.zshrc ~/.config/hypr

Show what tracking a directory would save

mise dot track --dry-run ~/.codex

Keep a separate version for macOS machines

mise dot track ~/.zshrc --os macos

Keep a separate version on every machine

mise dot track ~/.config/hypr/monitors.lua --machine

Keep the file's history on this machine only

mise dot track ~/.config/app/state.json --local

Encrypt the file before saving it

mise dot track ~/.config/app/credentials --encrypt

Save the file only when you run mise dot save

mise dot track ~/.config/app/state.json --no-autosave

MISE DOTFILES UNAPPLY

Remove files that `mise dot apply` deployed

Removes the targets of whole-file entries and the blocks and lines that edit entries added, but only what mise can identify as its own. Modified copies, modified templates, and plain-line edits need `--force`. Merged keys, `absent` entries, and permissions-only targets are left alone. Sources and config entries are kept, so run this before you delete a declaration, while mise can still identify its targets.

With `--group`, removes only that dotfile group's files, using what mise recorded when it applied them, so it works even after the group is deselected or deleted from the config.

Usage: mise dotfiles unapply [OPTIONS] [<TARGET>] ...

Options:

-f, --force

Remove modified or otherwise ambiguous managed files and lines

-n, --dry-run

Print the actions that would run without writing anything

-y, --yes

Skip the confirmation prompt

--group <NAME>

Only unapply the files of this dotfile group, even one that is no longer selected or declared

--prompt-secrets

Prompt for `[bootstrap.secrets]` values that templates need and the environment does not set

-h, --help

Print help Arguments:

<TARGET>

Only unapply these targets Examples:

Remove every target mise can identify

mise dot unapply

Remove one target

mise dot unapply ~/.zshrc

Remove one dotfile group's files

mise dot unapply --group work

Preview what would be removed

mise dot unapply --dry-run

Also remove modified targets, without prompting

mise dot unapply --force --yes

MISE DOTFILES UNDO

Reverse the tracked-file changes from an operation

Restores exactly the paths that an operation changed from the checkpoint it saved first, and leaves everything else as it is now. Without a reference, reverses the newest operation that has not been undone.

Works for operations that changed tracked files: `mise bootstrap`, `mise dot add`, `apply`, `edit`, `unapply`, `capture`, `rollback`, `pull` (including changes the watcher applied), and `undo` itself. Package installations, service state, and untracked files are not reversed.

Usage: mise dotfiles undo [OPTIONS] [<REF>]

Options:

-n, --dry-run

Show the plan without changing anything

-y, --yes

Apply without prompting

-h, --help

Print help Arguments:

<REF>

The operation's checkpoint: numeric ID, `latest`, `latest~N`, or `commit:<sha>` Examples:

Reverse the newest operation

mise dot undo

Show what would be restored

mise dot undo --dry-run

Reverse the operation recorded as checkpoint 42

mise dot undo 42

MISE DOTFILES UNTRACK

Stop tracking a file or directory

Removes the path's `mode = "track"` entry from your global config. When a project or system config declares the entry, mise turns it off on this machine in `config.local.toml` next to your global config instead.

A path inside a tracked directory has no entry of its own: mise adds a rule for it to `[history] exclude` in the global config, and `mise dot include <path>` removes that rule. The file itself and its existing checkpoints are not changed.

Usage: mise dotfiles untrack [OPTIONS] <PATH> ...

Options:

-h, --help

Print help Arguments:

<PATH>

Paths to stop tracking Examples:

Stop saving ~/.zshrc

mise dot untrack ~/.zshrc

Exclude one directory inside a tracked directory

mise dot untrack ~/.config/hypr/plugins

MISE DOTFILES WATCH

Save tracked files as they change

Runs in the foreground and saves a checkpoint once a changed file has been quiet for `history.watch.debounce`. A file that keeps changing does not delay the others and is still saved every `history.watch.max_interval`. The watcher also rescans every tracked path at startup, every `history.watch.reconcile`, and when the configuration changes. Entries tracked with `--no-autosave` are not watched.

With an origin connected, the watcher also syncs according to the `history.sync` setting. In `sync` mode it pushes within `history.sync_interval` of a save, fetches every `history.fetch_interval`, and applies incoming changes when there are no conflicts. In `fetch-only` mode it only fetches; in `manual` mode it does not use the network. A failed sync is retried with backoff while saving continues. `--once` runs one rescan and one sync, then exits.

The built-in `history-watch` service runs this for you:

[bootstrap.services.mise-history]
builtin = "history-watch"

Exits 0 when history is disabled or another watcher is already running, and 1 when Git is unusable, the store cannot be opened, or no watch can be installed. A failed save is retried with backoff and never drops the pending changes, and a save that would overlap another history operation is deferred. With `--once`, nothing is retried: a save that fails or is deferred, or a sync that fails, exits 1.

Usage: mise dotfiles watch [OPTIONS]

Options:

--once

Rescan and sync once, then exit (for timers and cron)

-J, --json

Print one JSON object per line instead of log lines

-h, --help

Print help Examples:

Watch and save until stopped

mise dot watch

Rescan and sync once, for a timer

mise dot watch --once

Print JSON lines instead of log lines

mise dot watch --json

MISE DOCTOR

Check your mise setup for problems

Prints mise's version, whether shell activation and shims are set up, its directories, the config files, tools, and environment in use, and its settings, then lists any problems and warnings with a suggested fix. Exits with status 1 when it finds a problem. Include this output when you report a bug.

Usage: mise doctor [OPTIONS] [COMMAND]

Options:

-J, --json

Output in JSON format

-h, --help

Print help Examples:

Check the setup and list problems

mise doctor

Print the report as JSON

mise doctor --json

MISE DOCTOR PATH

Print the directories mise adds to PATH

Lists tool bin directories and `_.path` entries from [env]. --full prints the whole PATH mise would set. `mise bin-paths` lists tool bin directories only.

Usage: mise doctor path [OPTIONS]

Options:

-f, --full

Print every PATH entry, including those mise does not provide

-h, --help

Print help Examples:

Print the directories mise adds to PATH

mise doctor path /home/user/.local/share/mise/installs/node/24.11.0/bin /home/user/.local/share/mise/installs/python/3.13.1/bin

Print the whole PATH mise would set

mise doctor path --full

MISE DOCTOR PROJECT

Run the project's diagnostic checks

Checks are declared in `[doctor.checks.<name>]` tables in mise.toml. Each command runs with the project's installed tools and environment. Checks should inspect state; mise does not sandbox them or run their suggested remedies. Exits with status 1 when a check fails. See https://mise.jdx.dev/configuration/project-diagnostics.html.

Usage: mise doctor project [OPTIONS]

Options:

-J, --json

Output the complete report as JSON

-h, --help

Print help Examples:

Run every check and report pass or fail

mise doctor project

Print the report as JSON

mise doctor project --json

MISE EN

Start a subshell with mise's tools and environment

This is an alternative to `mise activate` for starting a mise session explicitly. The new shell has the tools and environment variables from the config loaded. Unlike an activated shell, changing directories does not update the environment. Type `exit` to leave it.

Usage: mise en [OPTIONS] [<DIR>]

Options:

-s, --shell <SHELL>

Shell to start; defaults to $SHELL

-h, --help

Print help Arguments:

<DIR>

Directory to start the shell in

Default: .

Examples:

Start a shell with the project's tools and environment

mise en

Start the shell in another project

mise en ~/work/api

Skip loading .bashrc

mise en -s "bash --norc"

Skip loading .zshrc

mise en -s "zsh -f"

MISE ENV

Print the environment for the current configuration

Evaluate the shell output to load tools and variables once, without installing prompt hooks. Changing directories afterward does not recompute this environment. Use `mise exec -- command` to apply it to one child process instead.

JSON, dotenv, and shell output contain actual variable values, including secrets. `--redacted` selects variables marked for redaction; it does not mask their values. Tools you pass as TOOL@VERSION arguments are installed first if they are missing; missing tools from the config are reported, not installed.

Usage: mise env [OPTIONS] [<TOOL@VERSION>] ...

Options:

-D, --dotenv

Output in dotenv format

-J, --json

Output in JSON format

-s, --shell <SHELL>

Shell type to generate environment variables for

--json-extended

Output in JSON format with additional information (source, tool)

--redacted

Only include variables marked for redaction; their values are printed unmasked

--values

Only show values of environment variables

--paths

Print the PATH entries mise manages, in PATH order, one per line

-h, --help

Print help Arguments:

<TOOL@VERSION>

Tools to include in addition to those in the config, such as `node@24` Examples:

Load the environment once into the current bash session

eval "$(mise env -s bash)"

Same, for zsh

eval "$(mise env -s zsh)"

Same, for fish

mise env -s fish | source

Same, for xonsh

execx($(mise env -s xonsh))

Print the variables as JSON

mise env --json

List the PATH entries mise manages, such as tool bin directories

mise env --paths

Write a dotenv file; it contains secret values

mise env --dotenv > .env

MISE EXEC

Run a command with mise's tools and environment

Loads the tools and [env] from your config into one child process without changing the current shell. Use it in scripts and CI, or to run a tool that is not in the config.

TOOL@VERSION arguments add tools or override the configured version of that tool only: with `node = "24"` in mise.toml, `mise exec [email protected] -- python -V` still has node 24 on PATH.

Put the command after `--`, or pass a shell command string with `-c`. Missing tools are installed first unless the `exec_auto_install` or `auto_install` setting is off; when you name tools, only those are installed. The --allow-* and --deny-* flags sandbox the command; see https://mise.jdx.dev/sandboxing.html.

Usage: mise exec [OPTIONS] [<TOOL@VERSION>] ... [<COMMAND>] ...

Options:

-c, --command <COMMAND>

Command string to run through a shell (supports pipes and redirection)

-j, --jobs <JOBS>

How many tools to install in parallel; defaults to the `jobs` setting

Values below 1 are treated as 1.

Environment: MISE_JOBS

--allow-env <VAR>

Pass only VAR through from the environment (implies --deny-env)

Supports wildcards, such as --allow-env='MYAPP_*'.

--allow-net <HOST>

Allow network access only to HOST (not supported on any platform)

Per-host filtering does not work: Linux and macOS exit with an error, and Windows runs the command without network restrictions. See https://mise.jdx.dev/sandboxing.html#access-to-particular-hosts

--allow-read <PATH>

Allow reads from PATH (implies --deny-read for everything else)

--allow-write <PATH>

Allow writes to PATH (implies --deny-write for everything else)

--deny-all

Block reads, writes, network, and env vars

--deny-env

Block env var inheritance except PATH, HOME, USER, SHELL, TERM, COLORTERM, LANG

On Windows it also keeps the variables programs need to start, such as SystemRoot and TEMP.

--deny-net

Block all network access

--deny-read

Block filesystem reads (system libs and tool dirs still accessible)

--deny-write

Block filesystem writes except temporary and device paths (/tmp, /dev)

--fresh-env

Bypass the environment cache and recompute the environment

--no-deps

Skip automatic dependency preparation

--raw

Connect install commands directly to the terminal; implies --jobs=1

--secrets <SECRET>

[experimental] Give the command these secrets (comma-separated); by default it gets none

--secrets-all

[experimental] Give the command every secret the project can inject, except file secrets

-h, --help

Print help Arguments:

<TOOL@VERSION>

Tools to add or override, such as `node@24 [email protected]`

<COMMAND>

Executable and arguments to run directly, after `--` Examples:

Run app.js with node 24

mise exec node@24 -- node ./app.js

Run a shell command string

mise x node@24 [email protected] -c "node -v && python -V"

Run in another project's directory

mise x -C ~/work/api -- npm test

Run without network access

mise x --deny-net -- npm run build

[experimental] Pass one secret from the project's secrets source

mise x --secrets GH_TOKEN -- gh release list

MISE FMT

Format mise TOML configuration

Formats the config files in the current directory in place; --all formats every config file mise loads. Use --check in CI to fail when a file is not formatted, or --stdin to format a document from stdin to stdout.

Formatting normalizes whitespace and writes TOML 1.1 syntax, including multiline inline tables. Top-level entries written as plain, dotted, or inline-table keys go in a standard order: min_version, env_file, env_path, _, env, vars, hooks, watch_files, tools, other keys, tasks, task_config, redactions, alias, plugins, settings. `[table]` sections and the keys inside any table keep the order they were written in.

Lists whose order has no effect are sorted: task `sources` and `outputs`, `task_config.global_inputs` and `input_groups`, and `redactions`. File pattern lists put `@group:` references first, then globs, then literal paths. A list with a `!` exclusion or a comment is left as written.

Usage: mise fmt [OPTIONS]

Options:

-a, --all

Format every config file mise loads, not only those in the current directory

-c, --check

Check whether the configs are formatted without rewriting them; exits 1 if any are not

-s, --stdin

Format TOML from stdin and print it to stdout, without touching any file

-h, --help

Print help Examples:

Format the config files in the current directory

mise fmt

Exit 1 if any config file needs formatting

mise fmt --check

Print a formatted copy without changing the file

mise fmt --stdin < mise.toml

MISE GENERATE

Generate project files such as CI workflows, git hooks, and scripts

Usage: mise generate [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE GENERATE CONFIG

Generate a mise.toml file

Same as `mise edit`, which has the details. It opens the interactive editor, or without an interactive terminal (or with --yes) writes a commented starter template. If PATH already exists it stops with an error rather than replace the file; pass --force to replace it.

Usage: mise generate config [OPTIONS] [<PATH>]

Options:

-g, --global

Generate the global config file (~/.config/mise/config.toml)

-n, --dry-run

Print the result instead of writing it to the file

-f, --force

Replace an existing file with the starter template when not opening the editor

-t, --tool-versions <FILE>

Copy the tools from this .tool-versions file into the config, without opening the editor

-h, --help

Print help Arguments:

<PATH>

Config file to edit or create; defaults to mise.toml Examples:

Edit mise.toml in the current directory

mise generate config

Print the result instead of writing it

mise generate config -n

MISE GENERATE DEVCONTAINER

Generate a devcontainer configuration that installs mise and the project's tools

Prints JSON by default. `--write` saves .devcontainer/devcontainer.json in the repository root (or the current directory outside a git repository), replacing an existing file. Review the image, mounts, and setup commands before opening it.

Usage: mise generate devcontainer [OPTIONS]

Options:

-i, --image <IMAGE>

Base image; defaults to mcr.microsoft.com/devcontainers/base:ubuntu

-m, --mount-mise-data

Keep installed tools in a `mise-data-volume` Docker volume so they survive rebuilds

Mounts the volume at /mnt/mise-data, sets MISE_DATA_DIR to it, and adds its shims directory to PATH.

-n, --name <NAME>

Container name; defaults to mise

-w, --write

Write to .devcontainer/devcontainer.json instead of printing

-h, --help

Print help Examples:

Print the configuration

mise generate devcontainer

Keep installed tools in a volume and save .devcontainer/devcontainer.json

mise generate devcontainer --mount-mise-data --write

MISE GENERATE GIT-PRE-COMMIT

Generate a git hook that runs a mise task

The hook runs `mise run <TASK>` (default `pre-commit`) with the staged file names in the STAGED environment variable. It prints the hook unless you pass --write, which saves it in the repository's hooks directory and makes it executable.

For hooks that git gives a message file (commit-msg, prepare-commit-msg, applypatch-msg, sendemail-validate), the task gets that file as an argument. Other hook arguments, such as a pre-push hook's remote name and URL, are not passed on.

For a full git hook manager, see hk: https://hk.jdx.dev

Usage: mise generate git-pre-commit [OPTIONS] [<MISE_ARG>] ...

Options:

-t, --task <TASK>

The task to run when the hook is triggered

Default: pre-commit

-w, --write

Write the hook to the hooks directory and make it executable

The hooks directory is `.git/hooks`, or `core.hooksPath` when it is set. An existing hook of the same name is moved to `<HOOK>.old`.

--hook <HOOK>

Which git hook to write, such as pre-push

Default: pre-commit

-h, --help

Print help Arguments:

<MISE_ARG>

mise flags to embed in the generated hook, given after `--`

These are inserted between `mise` and `run`, so the hook carries the same context you would pass on the command line. Useful when the config is not at the repository root, since git runs hooks from the top level: `-- -C subdir` makes the hook find it. Examples:

Install the hook; each commit then runs `mise run pre-commit`

mise generate git-pre-commit --write --task=pre-commit

Use the config in subdir, since git runs hooks from the repository root

mise generate git-pre-commit --write -- -C subdir

MISE GENERATE GITHUB-ACTION

Generate a GitHub Actions workflow that runs a mise task

The workflow runs the task named by --task on pull requests, tags, manual dispatch, and pushes to the current branch. It prints YAML unless you pass --write, which saves `.github/workflows/<NAME>.yml` in the repository root and replaces an existing file. Define the task and review the triggers before committing the workflow.

Usage: mise generate github-action [OPTIONS]

Options:

-t, --task <TASK>

The task to run when the workflow is triggered

Default: ci

-w, --write

Write the workflow to `.github/workflows/<NAME>.yml` instead of printing it

--name <NAME>

Name of the workflow and its file

Default: ci

-h, --help

Print help Examples:

Print a workflow that runs the ci task

mise generate github-action

Save it as .github/workflows/ci.yml

mise generate github-action --write

Save a workflow that runs the lint task as .github/workflows/lint.yml

mise generate github-action --task lint --name lint --write

MISE GENERATE INSTALL-SCRIPT

Generate a script that downloads and runs a pinned mise

Commit the script, for example as bin/mise, so contributors and CI can run `./bin/mise install` without installing mise first. On first run it downloads the pinned mise version into the mise data directory, or into the project with --localize, then runs it with the arguments it was given.

`mise generate bootstrap` is a deprecated alias for this command and will be removed in mise 2027.9.0.

Usage: mise generate install-script [OPTIONS]

Options:

-l, --localize

Keep mise data and cache in a project-local directory (`.mise` by default)

Use `--localized-dir` to choose its location. This isolates mise state; it is not an OS sandbox for commands the generated script runs.

-V, --version <VERSION>

mise version to pin; defaults to the release `mise self-update` would install

-w, --write <PATH>

Write the script to PATH (./bin/mise when no path is given) and make it executable, instead of printing it

--localized-dir <DIR>

Directory for mise data when using --localize, relative to the project

Default: .mise

--windows

Also write a Windows launcher, `<PATH>.cmd`

Windows cannot run the bash script. Generate the launcher on any OS and commit it for contributors on Windows. Requires --write.

-h, --help

Print help Examples:

Write ./bin/mise; on first run it downloads the pinned mise, then runs it

mise generate install-script --write ./bin/mise

Keep mise and its tools in .mise inside the project

mise generate install-script --localize --write ./bin/mise

Also write bin/mise.cmd for contributors on Windows

mise generate install-script --write ./bin/mise --windows

MISE GENERATE TASK-DOCS

Generate Markdown documentation for project tasks

Documents the tasks defined for the current directory. Prints to stdout by default. Use `--output` to write a file, `--inject` to replace a marked section, or `--multi` for one file per task.

Usage: mise generate task-docs [OPTIONS]

Options:

-i, --inject

Replace the marked section of the --output file

Replaces everything between `<!-- mise-tasks -->` and `<!-- /mise-tasks -->` in the --output file, so you can rerun it to update the docs. The file must already contain both markers; mise reports an error and leaves the file unchanged if either is missing.

-I, --index

Write only an index of tasks, intended for use with `--multi`

-m, --multi

Render each task as a separate document; requires `--output` to be a directory

-o, --output <PATH>

Write the generated docs to a file or directory

-r, --root <ROOT>

Has no effect; tasks always come from the current directory

-s, --style <STYLE>

Has no effect; both styles produce the same output

Default: simple

-h, --help

Print help Examples:

Print the task documentation

mise generate task-docs

Write the task documentation to TASKS.md

mise generate task-docs --output TASKS.md

Update the marked section of README.md

mise generate task-docs --inject --output README.md

MISE GENERATE TASK-STUBS

Generate scripts that run mise tasks

Writes one executable stub per task into a directory, such as `bin/test` for the `test` task, that runs the task with mise. Pair them with `mise generate install-script` so contributors can run tasks without installing mise. When a task has subtasks, the parent's stub is written to `<parent>/_default`.

Hidden tasks and global tasks are skipped: the stubs are committed to the project, and global tasks come from each user's own config.

Usage: mise generate task-stubs [OPTIONS]

Options:

-d, --dir <DIR>

Directory to create task stubs inside of

Default: bin

-m, --mise-bin <PATH>

mise executable the stubs run; defaults to mise from PATH

Use `--mise-bin ./bin/mise` with a script from `mise generate install-script`. On Windows a path runs as written, so that script needs its `.cmd` launcher beside it; generate it with `mise generate install-script --write ./bin/mise --windows`. The default, `mise`, is a bare name that resolves from PATH and needs nothing extra.

Default: mise

--windows-launcher <KIND>

What to write beside each stub for Windows to launch

`cmd` writes `<task>.cmd`. cmd.exe re-parses the whole line before `%*` expands, so an argument containing `& ^ | " %VAR%` does not reach the task intact when the launcher is called from PowerShell.

`exe` writes a native `<task>.exe` instead, which receives its arguments unchanged from every shell. It is a copy of the mise-shim.exe that ships with the Windows build, so it can only be generated on Windows, and it adds ~220KB per task to a directory that is normally committed.

Default: cmd

-h, --help

Print help Examples:

Write a stub for each task into ./bin

mise generate task-stubs

Make the stubs run the mise that `mise generate install-script` wrote

mise generate task-stubs --mise-bin ./bin/mise

MISE GENERATE TOOL-STUB

Generate or update a tool stub

A tool stub is an executable file that names a tool and where to get it; running it installs the tool if needed and runs it. See https://mise.jdx.dev/dev-tools/tool-stubs.html.

Pass --url or --platform-url to create or extend a stub. mise downloads each artifact to record its checksum, size, and binary path unless you pass --skip-download. On an existing stub, new platforms are added and URLs you pass again are replaced. --fetch fills in missing checksums and sizes, and --lock records lock data for an existing stub, including one that uses a registry tool.

Usage: mise generate tool-stub [OPTIONS] <OUTPUT>

Options:

-b, --bin <BIN>

Binary path within the extracted archive

If not specified and the archive is downloaded, mise detects the most likely binary.

--bootstrap

Make the stub install mise when it is missing

The stub becomes a bash script that: 1. Uses mise from PATH, or ~/.local/bin/mise 2. Otherwise installs mise to ~/.local/bin with the embedded installer 3. Runs the tool stub with mise

--bootstrap-version <BOOTSTRAP_VERSION>

mise version the --bootstrap script installs; defaults to the latest release

Pin a version such as `2026.10.0` to keep the installer reproducible.

--checksum-algorithm <ALGORITHM>

Checksum algorithm for downloaded artifacts

Not available with --lock or --skip-download, which do not compute checksums.

Default: blake3

--fetch

Fetch checksums and sizes for an existing tool stub file

Reads an existing stub file and fills in missing checksum and size fields by downloading the files. URLs must already be present in the stub.

--http <HTTP>

Has no effect; kept so existing scripts that pass it keep working

Default: http

--lock

Resolve and record lock data (exact version, platform URLs and checksums) for an existing stub

The data goes into the `mise.lock` of the nearest project config above the stub, and the stub keeps its version request. It is an error when no project config is found.

--platform-bin <PLATFORM_BIN>

Binary path inside the archive for one platform, such as `linux-x64:bin/tool`; repeatable

--platform-url <PLATFORM_URL>

Download URL for one platform, as `PLATFORM:URL` or a bare URL; repeatable

With a bare URL, mise detects the platform from the file name, such as `--platform-url https://nodejs.org/dist/v24.11.0/node-v24.11.0-darwin-arm64.tar.gz`. When the output file already exists, new platforms are added to its platforms table, and a platform you pass again gets the new URL.

--skip-download

Do not download artifacts, so checksums, sizes, and the detected binary path are left out

-u, --url <URL>

URL to download the tool from

--version <VERSION>

Version of the tool

Default: latest

-h, --help

Print help Arguments:

<OUTPUT>

Output file path for the tool stub Examples:

Download and inspect a real archive to detect its binary and checksum

mise generate tool-stub ./bin/node --platform-url https://nodejs.org/dist/v24.11.0/node-v24.11.0-darwin-arm64.tar.gz

Add a Linux artifact to the same stub

mise generate tool-stub ./bin/node --platform-url linux-x64:https://nodejs.org/dist/v24.11.0/node-v24.11.0-linux-x64.tar.gz

Draft a stub without downloading; replace the placeholder URL before running it

mise generate tool-stub ./bin/my-tool --url https://example.com/my-tool.tar.gz --skip-download

Fill missing checksums and sizes in an existing stub

mise generate tool-stub ./bin/node --fetch

Resolve and record the version and platform lock data of an existing registry-backed stub

mise generate tool-stub ./bin/registry-node --lock --version 24

MISE IMPLODE

Remove the mise CLI and all related data

Deletes the mise executable and the data (including installed tools), state, and cache directories. It also deletes the system-wide shared directory used by `mise install --system` (MISE_SYSTEM_DATA_DIR, default /usr/local/share/mise), which other users on the machine may rely on. It asks before each removal; --yes skips the prompts. The config directory stays unless you pass --config.

If a package manager such as Homebrew or apt installed mise, uninstall it with that package manager instead. Remove the `mise activate` line from your shell startup file yourself. See https://mise.jdx.dev/installing-mise.html#uninstalling.

Usage: mise implode [OPTIONS]

Options:

-n, --dry-run

Print what would be removed, without removing anything

--config

Also remove the config directory

-h, --help

Print help Examples:

List what would be removed

mise implode --dry-run

MISE EDIT

Edit mise.toml interactively

Opens a terminal editor for PATH (default: mise.toml in the current directory) where you can add tools from the registry, pick versions, and set environment variables, tasks, and settings. It pre-fills tools it detects from files in the current directory, such as `.node-version`.

Without an interactive terminal, or with --yes, it writes a commented starter template instead. If PATH already exists it stops with an error rather than replace the file; pass --force to replace it. Use --dry-run to print the result without writing it.

Usage: mise edit [OPTIONS] [<PATH>]

Options:

-g, --global

Edit the global config file (~/.config/mise/config.toml)

-n, --dry-run

Print the result instead of writing it to the file

-f, --force

Replace an existing file with the starter template when not opening the editor

-t, --tool-versions <FILE>

Copy the tools from this .tool-versions file into the config, without opening the editor

-h, --help

Print help Arguments:

<PATH>

Config file to edit or create; defaults to mise.toml Examples:

Edit mise.toml in the current directory

mise edit

Edit another config file

mise edit mise.local.toml

Edit the global config

mise edit -g

Copy the tools from .tool-versions into mise.toml

mise edit -t .tool-versions

Print the result instead of writing it

mise edit -n

Write a commented starter config to a new file without opening the editor

mise edit -y new.toml

Replace an existing mise.toml with the starter config

mise edit -y --force

MISE INSTALL

Install the tools in your config, or specific tool versions

With no arguments, installs every tool version your config requests that is not installed yet. With TOOL@VERSION arguments, installs those versions; a bare tool name installs the version your config requests for it.

Installing does not add a tool to your config, so a tool you have not configured is not on PATH. Use `mise use` to install a tool and add it to mise.toml, or `mise exec <TOOL>@<VERSION> -- <COMMAND>` to run it once.

Versions install in parallel (see --jobs) under the mise data directory, by default `~/.local/share/mise/installs/<TOOL>/<VERSION>`.

Usage: mise install [OPTIONS] [<TOOL@VERSION>] ...

Options:

-f, --force

Reinstall even if already installed

With no TOOL arguments, reinstalls every configured tool.

-j, --jobs <JOBS>

How many tools to install in parallel; defaults to the `jobs` setting

Values below 1 are treated as 1.

Environment: MISE_JOBS

-n, --dry-run

Show what would be installed, without installing anything

-v, --verbose

Show installer output

Prints each backend's download, configure, and compile output.

--dry-run-code

Like --dry-run, but exit with status 1 when anything needs installing

Use it in scripts to check whether `mise install` has work to do.

--include-task-tools

Also install tools required by tasks in the current scope

This prepares task tools without running task commands or dependencies. Combine with --monorepo to include tasks from every configured root.

--include-lazy

Also install tools configured with `lazy = true`

By default, a bare `mise install` leaves lazy tools to be installed the first time you run one of their commands.

--minimum-release-age <AGE>

Only install versions released before a date or at least a duration ago

Takes a date such as `2024-06-01` or a duration such as `90d` or `1y`. Overrides the `minimum_release_age` setting and tool option.

--monorepo

Also install tools from every config root in `[monorepo].config_roots`

Requires `monorepo_root = true` and an explicit `config_roots` list in the monorepo root's config. Uses the active MISE_ENV.

Environment: MISE_MONOREPO

--raw

Connect install commands directly to the terminal; implies --jobs=1

--shared <DIR>

Install into DIR instead of the mise data directory

May require elevated permissions, depending on the path.

--system

Install into the system-wide shared directory

Installs to /usr/local/share/mise/installs (or MISE_SYSTEM_DATA_DIR/installs). On Unix, binary-download backends invoke sudo to publish into protected system directories unless system_packages.sudo is disabled. Run mise as your user, without sudo.

-h, --help

Print help Arguments:

<TOOL@VERSION>

Tools to install, such as `node@24`; defaults to every tool in the config Examples:

Install every tool the config requests

mise install

Install the node version the config requests

mise install node

Install the latest node 24.x release

mise install node@24

Install an exact version

mise install [email protected]

Also install tools marked lazy = true

mise install --include-lazy

Also install the tools your tasks need

mise install --include-task-tools

MISE INSTALL-INTO

Install a tool version into a directory outside mise

Downloads or builds TOOL@VERSION into PATH for use without mise. mise does not track the result, so it does not appear in `mise ls`.

If PATH is not empty, mise asks before deleting its contents; --yes deletes them without asking.

Usage: mise install-into [OPTIONS] <TOOL@VERSION> <PATH>

Options:

-h, --help

Print help Arguments:

<TOOL@VERSION>

Tool and version to install, such as `node@24`

<PATH>

Directory to install into; its existing contents are deleted Examples:

Install node 24 into ./mynode and run it

mise install-into node@24 ./mynode && ./mynode/bin/node -v v24.11.0

MISE INSTALLS

[experimental] Inspect and choose identity-layout installations

With `install_layout = "identity"`, each installation lives in its own `<label>-<hash>` directory, and several installations of one version can exist side by side (different options, platforms, pinned artifacts, or a refreshed copy). These commands list them, choose which one mise uses when no lockfile pins one, and move installations made before you turned the layout on into it. With no subcommand, runs `mise installs ls`. See https://mise.jdx.dev/dev-tools/install-layout.html.

Usage: mise installs [OPTIONS] [COMMAND]

Options:

-h, --help

Print help

MISE INSTALLS LS

List the installations of the identity install layout

Every installation is listed separately, so variants of one version (made with different options, or pinned to different artifacts by lockfiles) can be told apart. The Status column marks the installation mise uses when no lockfile pins one (`selected`), installations a lockfile pins (`pinned`), and installations in a read-only shared installs directory (`shared`).

Usage: mise installs ls [OPTIONS] [<TOOL>] ...

Options:

-J, --json

Output in JSON format

--no-header

Do not print the table header

-h, --help

Print help Arguments:

<TOOL>

Only show the installations of these tools Examples:

List every installation in the identity layout

mise installs ls

List the installations of node as JSON

mise installs ls node --json

MISE INSTALLS MIGRATE

Reinstall legacy installations into the identity install layout

Installations made before `install_layout = "identity"` was turned on stay in `installs/<tool>/<version>` and keep working; mise never moves them on its own, because tools record their own path in shebangs, virtual environments and package-manager files. This reinstalls each one into its own `<label>-<hash>` directory, then removes the old directory and puts the version link in its place, so a path that pointed into the old directory still resolves.

Each version is reinstalled from its backend, not copied, so the files are written for their new path. Run it while nothing is using the tools: the old directory is moved aside while its replacement installs, and put back if that fails. Versions whose recorded backend is not the one their tool resolves to now are left alone, as are tools that keep the legacy layout (`http:`, `rust`, `dotnet`).

A version that cannot be reinstalled (its release was withdrawn or is signed by someone else now, or the network is unavailable) is not an error: its directory is moved as it is into the identity layout, behind the same version link. Only a version that cannot be moved either keeps its old directory, reported as kept in the legacy layout. The command ends with a count of what was migrated, relocated, kept and failed, and fails only when a migration itself broke.

Usage: mise installs migrate [OPTIONS] [<TOOL@VERSION>] ...

Options:

-n, --dry-run

Show what would move without changing anything

-h, --help

Print help Arguments:

<TOOL@VERSION>

Only migrate these tools, or these versions of them

Defaults to every legacy installation. Examples:

List the legacy installations that would move

mise installs migrate --dry-run

Move every installed node and one python version

mise installs migrate node [email protected]

MISE INSTALLS SELECT

Choose which installation mise uses when no lockfile pins one

Several installations can match the same request, such as a refreshed copy next to one a lockfile pinned, or installations made for different lockfiles. For a request with no lockfile entry, mise uses the installation selected for that tool, version, platform, and options. If none is selected and several match, mise stops and tells you to run this command.

The selection is shared by every project on this machine that makes the same request without a lockfile. Projects whose lockfile pins an artifact keep the installation of that artifact. The version link (`installs/<tool>/<version>`) is pointed at the selected installation.

Usage: mise installs select [OPTIONS] <INSTALLATION>

Options:

-h, --help

Print help Arguments:

<INSTALLATION>

The installation to select: its directory name, or its path Examples:

Find jq's installations

mise installs ls jq

Use this one for requests with no lockfile entry

mise installs select jq-hm3qa4vb

MISE LATEST

Print the latest version that matches a version request

`mise latest node` prints the latest release, and `mise latest node@22` the latest 22.x release. Each backend decides what "latest" means, for example whether prereleases count and how channels and refs resolve. Nothing is installed and no config changes.

Usage: mise latest [OPTIONS] <TOOL@VERSION> [<ASDF_VERSION>]

Options:

-i, --installed

Print the latest installed version instead of the latest available one

--minimum-release-age <AGE>

Only consider versions released before a date or at least a duration ago

Takes a date such as `2024-06-01` or a duration such as `90d` or `1y`. Overrides the `minimum_release_age` setting and tool option.

-h, --help

Print help Arguments:

<TOOL@VERSION>

Tool, optionally with a version prefix, such as `node` or `node@22`

<ASDF_VERSION>

The version prefix to use when querying the latest version same as the first argument after the "@" used for asdf compatibility Examples:

Print the latest node release

mise latest node

Print the latest node 22.x release

mise latest node@22

Print the latest installed node 22.x version

mise latest node@22 --installed

Skip releases from the last 30 days

mise latest node --minimum-release-age 30d

MISE LINK

Symlink a tool version into mise

Use this to register an install that was compiled by hand or built with another tool. mise uses the version exactly as written, such as `[email protected]` or a name of your own like `node@brew`; `latest`, aliases, and channels are rejected.

Usage: mise link [OPTIONS] <TOOL@VERSION> <PATH>

Options:

-f, --force

Replace an existing installation of this version

-h, --help

Print help Arguments:

<TOOL@VERSION>

Tool and version to create a symlink for

<PATH>

Directory of the existing installation, such as `~/.nvm/versions/node/v24.11.0` Examples:

Link a node that node-build built into ~/.nodes/24.11.0

mise link [email protected] ~/.nodes/24.11.0

Register Homebrew's node as node@brew; then run `mise use node@brew`

mise link node@brew "$(brew --prefix node)"

MISE LOCK

Create or refresh lockfile versions, checksums, and download URLs

Operates on the current config root, including tools declared by tasks. Existing matching locked versions are preserved unless `--bump` re-resolves their requests. This command does not install tools; `--dry-run` previews changes.

`mise lock TOOL@VERSION` locks that exact version. When the version falls outside the configured request, such as `[email protected]` with `tiny = "2"`, mise also updates the request in mise.toml to match.

Usage: mise lock [OPTIONS] [<TOOL>] ...

Options:

-g, --global

Lock only the global and system config lockfiles

These are ~/.config/mise/mise.lock and the system config's lockfile. By default, only the current project's config root is locked.

-j, --jobs <JOBS>

How many jobs to run in parallel; defaults to the `jobs` setting

Values below 1 are treated as 1.

Environment: MISE_JOBS

-n, --dry-run

Show what would change, without writing anything

-p, --platform <PLATFORM>

Platforms to lock, comma-separated, such as `linux-x64,macos-arm64`

Defaults to the `lockfile_platforms` setting plus the current platform when that setting is configured, else the platforms already in the lockfile, else a common set for a new lockfile.

--bump

Re-resolve version requests against the latest available versions

By default, `mise lock` refreshes metadata for the currently locked versions. With this flag, requests such as "latest", "lts", or prefixes such as "24" are re-resolved against the latest matching remote versions, so the lockfile advances without installing anything. `--bump` never modifies config files: exact versions resolve to themselves and stay unchanged (use `mise upgrade --bump` to rewrite pins in mise.toml). If the remote versions cannot be fetched, it fails rather than keep the locked version.

--json

Output version changes as JSON

Prints an array of objects describing lockfile version changes: name, backend, lockfile, old_versions, new_versions. Version lists keep config/lockfile order; they are not sorted. Only version-level changes are reported: checksum and URL refreshes for unchanged versions produce no entries, so `mise lock --json` prints `[]` when no version changed, even though it still updates the lockfile. Suppresses the human-readable output. Combine with `--dry-run` to detect available updates without writing the lockfile.

--local

Update mise.local.lock, for tools in mise.local.toml, instead of mise.lock

--minimum-release-age <AGE>

Only lock versions released before a date or at least a duration ago

Takes a date such as `2024-06-01` or a duration such as `90d` or `1y`. Overrides the `minimum_release_age` setting and tool option. It filters only requests that are not exact, such as "24" or "latest"; exact versions such as "24.11.0" are not filtered. Existing matching lockfile entries are kept; this flag alone does not downgrade them.

--upgrade

Upgrade lockfiles to the latest format

mise keeps an existing lockfile at its format version during normal updates, so collaborators on an older mise can still read it. This flag rewrites it in the newest format, which adds request bindings, dependency-graph sidecars, and packslip repository IDs. It processes every configured tool and cannot be combined with tool arguments. See https://mise.jdx.dev/dev-tools/mise-lock-reference.html#format-versions.

--sidecars

List native dependency sidecars instead of updating lockfiles

Backends such as npm and pypi keep a tool's locked dependency graph in a sidecar directory next to mise.lock; see https://mise.jdx.dev/dev-tools/mise-lock-reference.html#native-dependency-sidecars. For each existing lockfile in scope, prints the sidecar directory mise keeps its dependency graphs in and every sidecar directory the lockfile references. Nothing is resolved, installed, or written. Paths are relative to the current directory when they are inside it, and absolute otherwise, such as the sidecars of a symlinked lockfile. Combine with `--json` for machine-readable output, or with `--local` and `--global` to choose the lockfiles.

-h, --help

Print help Arguments:

<TOOL>

Tools to lock, such as `node python`; defaults to every configured tool and every tool a task needs

Use `tool@version` to lock an exact version. If it falls outside the configured request, mise.toml is updated to match. Examples:

Create or refresh the project lockfile

mise lock

Refresh only node and python

mise lock node python

Lock an exact version; mise.toml keeps a request such as "24"

mise lock [email protected]

Lock only the linux-x64 platform

mise lock --platform linux-x64

Show what would change

mise lock --dry-run

Re-resolve requests such as "latest" or "24" to the latest matching versions

mise lock --bump

List available updates as JSON without writing

mise lock --bump --dry-run --json

Lock versions released before 2024-01-01 for requests that are not exact

mise lock --minimum-release-age 2024-01-01

Update mise.local.lock

mise lock --local

Update only the global lockfiles

mise lock --global

MISE LS

List installed and active tool versions

Lists the tools mise knows about: versions that are installed, and versions requested by a config file (active) whether or not they are installed. Each row shows the tool, the version (marked `(missing)` when it is not installed, or `(lazy)` when it is a lazy tool that installs on first use), the config file that requests it, and the request as written.

Usage: mise ls [OPTIONS] [<INSTALLED_TOOL>] ...

Options:

--truncate

Truncate long terminal output to fit the available width

Default: true

-b, --backend <BACKEND>

Only show tools from this backend, such as aqua, cargo, core, or go

Registry shorthands count as the backend they resolve to, so `jq` is listed under aqua. Repeat the flag to show several backends.

-c, --current

Only show versions the loaded config files request

-g, --global

Only show versions the global config requests

-i, --installed

Only show installed versions

Hides requested versions that are not installed.

--grouped

List tools in a separate section for each backend

Cannot be combined with --json; use --backend to filter JSON output.

-J, --json

Output in JSON format

-l, --local

Deprecated alias for --no-global

Removed in mise 2027.7.0.

--no-global

Only show versions that non-global config files request

Includes config files in parent directories and skips the global config, system config, and `MISE_<TOOL>_VERSION` environment variables. See --project for the nearest project's config alone.

--project

Only show versions the nearest project config requests

The project is the nearest directory, starting at the current one and moving up, that has a mise config file. Every config file in that directory counts, such as `mise.toml`, `mise.local.toml`, `conf.d` fragments, `.tool-versions` and idiomatic version files. Configs in parent directories and global or system configs do not, nor do `MISE_<TOOL>_VERSION` environment variables. A version that a later file in that directory overrides is not listed, as with --no-global; `mise uninstall --project` still removes it.

-m, --missing

Only show requested versions that are not installed

-o, --offline

Don't fetch information such as outdated versions

-p, --plugin <PLUGIN>
--all-sources

Show requests from every config file mise has seen, not only loaded ones

mise tracks the config files it loads so `mise prune` keeps the versions they use.

--monorepo

Also list tools from every config root in `[monorepo].config_roots`

Requires `monorepo_root = true` and an explicit `config_roots` list in the monorepo root's config. Uses the active MISE_ENV.

Environment: MISE_MONOREPO

--no-header

Do not print the header row

--outdated

Show whether each version is outdated

--prefix <PREFIX>

Only show versions starting with PREFIX (requires a tool argument)

--prunable

List only tools that can be pruned with `mise prune`

-h, --help

Print help Arguments:

<INSTALLED_TOOL>

Only show these tools Examples:

Show installed versions and the requests from the loaded config files

mise ls

Show only versions the loaded config files request

mise ls --current

Find requested versions that are not installed

mise ls --missing

Machine-readable output: an object keyed by tool name

mise ls --json

With a tool argument, JSON output is an array of its version records

mise ls node --json

Include requests from every config file mise has seen

mise ls --all-sources

Show only tools from the go or cargo backends

mise ls --backend go --backend cargo

List tools in a separate section for each backend

mise ls --grouped

MISE LS-REMOTE

List tool versions available to install

Results may be cached; run `mise cache clear TOOL` to refresh one tool before querying it again. Version formats and ordering are backend-specific.

Usage: mise ls-remote [OPTIONS] [<TOOL@VERSION>] [<PREFIX>]

Options:

--all

List available versions for every tool mise currently knows about

--minimum-release-age <AGE>

Only show versions released before a date or at least a duration ago

Takes a date such as `2024-06-01` or a duration such as `90d` or `1y`. Overrides the `minimum_release_age` setting and tool option.

-J, --json

Output in JSON format, with metadata such as `created_at` when available

--no-versions-host

Fetch versions from the tool's upstream instead of mise's version mirror

Same as `use_versions_host = false` for this command.

--prerelease

Include prerelease versions

Works for backends that report prerelease metadata or detect prereleases by pattern. Same as MISE_PRERELEASES=1 or the `prereleases` setting, for this command only.

--strict-metadata

Exit with an error when release metadata cannot be fetched

Without it, backends such as aqua and ruby fall back to a version list without release dates, or an empty one. Requires --json and --no-versions-host.

-h, --help

Print help Arguments:

<TOOL@VERSION>

Tool to get versions for

<PREFIX>

Version prefix to filter by; same as `TOOL@PREFIX` Examples:

List every node version

mise ls-remote node

List node 24.x versions

mise ls-remote node@24

Skip versions released in the last 30 days

mise ls-remote node --minimum-release-age 30d

Include release dates, as JSON

mise ls-remote github:cli/cli --json

MISE LSP

Run the language server for mise config files over stdin/stdout

Editors start this command and exchange Language Server Protocol messages with it.

It serves `mise.toml` and the other config files mise loads (`.mise.toml`, `mise.<env>.toml`, `mise.local.toml`, `mise/config.toml`, and the files of a `conf.d`). It ignores every other file, including files that `[task_config] includes` lists, so it can be attached to the TOML language without touching `Cargo.toml` or `pyproject.toml`.

It offers: - diagnostics: TOML syntax errors, unknown keys with a suggestion, values of the wrong type, deprecated keys, task names no task defines (`unknown-task`), and dependency cycles (`task-cycle`) - completion of keys, including inside inline tables, and of values that have a fixed set - hover documentation for keys - for tools: completion of tool names under `[tools]` from the registry, and hover with the tool's description and backends - quick fixes that replace an unknown key or task name with the suggested one, and rewrite a deprecated key to its replacement when the schema names one - formatting, as `mise fmt` does - semantic tokens, which color task, tool and env var names, env directives, deprecated keys and the `{{ }}` and `{% %}` of templates - for tasks: completion of task names in `depends`, `depends_post`, `wait_for` and `run = [{ task = "..." }]` (and of templates in `extends`), hover with the task's description and command, go to definition, find references, and rename together with every reference in the file

Tasks come from the open file, the configs in the directories above it and the TOML files their `[task_config] includes` name.

A client that runs another TOML server beside this one can switch features off with `initializationOptions`: `{"formatting": false, "hover": false, "completion": false, "definition": false, "references": false, "rename": false, "semanticTokens": false}`.

The server only parses a config. It never renders templates or runs anything, so opening an untrusted file is safe.

A mise that predates this command runs a task named `lsp` instead, so a client that needs to know whether the command exists can check that `mise help lsp` prints `Usage: mise lsp`.

See https://mise.jdx.dev/ide-integration.html for editor configuration.

Usage: mise lsp [OPTIONS]

Options:

-h, --help

Print help Examples:

Start the server; an editor's LSP configuration runs this command

mise lsp

MISE MCP

Run the Model Context Protocol server over stdin/stdout

Exposes project tools, tasks, environment, and configuration to an MCP client. The client, such as an AI coding assistant, starts this command and exchanges messages with it. Start it in the project directory or pass `--cd`: the resources describe that project.

Resources (JSON): - mise://tools: active tool versions (?include_inactive=true adds the rest) - mise://tasks: task definitions, including monorepo subproject tasks - mise://env: environment variables - mise://config: loaded config files and the project root

Environment resources contain real values, including secrets.

Tools: - list_commands: every mise command and its declared effect - run_task: run a task with your permissions; it can change files and call
external services - install_tool: install a tool version, as `mise install` does

run_task and install_tool refuse a project whose config files are not trusted; run `mise trust` there after reviewing them.

See https://mise.jdx.dev/mcp.html for client configuration and access controls.

Usage: mise mcp [OPTIONS]

Options:

-h, --help

Print help Examples:

Serve a project from another directory, as an MCP client config does

mise --cd /path/to/project mcp

MISE OCI

[experimental] Build, push, and run OCI images of a project's tools

Each tool version becomes its own image layer, so changing one tool version rebuilds that tool's layer instead of the whole image.

Requires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`). Behavior, flags, and output layout may change in future releases. See https://mise.jdx.dev/dev-tools/mise-oci.html

Usage: mise oci [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE OCI BUILD

[experimental] Build an OCI image from the current mise.toml

Each tool version becomes its own content-addressable OCI layer. Bumping a tool version invalidates that tool's layer (a Python bump also invalidates pypi tool layers, which are relocated against it); other tool layers and the base image layers are reused, while the generated /etc/mise/config.toml layer, image config, and manifest are regenerated. The output directory follows the OCI image-layout spec.

Only tools from project config files are packaged, including a monorepo root's config. The global and system configs and a config directly in your home directory, such as ~/mise.toml, are left out unless you pass `--include-global`.

Build on a Linux host with the image's architecture. Tools are packaged as installed on the host, and so is the running mise binary, at /usr/local/bin/mise, unless you pass `--no-mise`. asdf plugins are not supported; use a vfox plugin or any other backend for each tool. vfox plugins are copied into the image next to the tools they install.

Requires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`).

Usage: mise oci build [OPTIONS]

Options:

--copy <HOST_PATH:IMAGE_PATH>

Copy a host file, directory, or symlink into the image (repeatable, HOST:IMAGE)

-o, --output <OUTPUT>

Output directory for the OCI image layout

Default: ./mise-oci

--from <FROM>

Base image reference (overrides [oci].from and the oci.default_from setting)

--include-global

Also package tools from the global and system configs

By default `mise oci build` packages only project config files, including a monorepo root's config. With this flag it also includes the tools, `[oci]`, `[bootstrap.packages]`, and `[dotfiles]` of the global and system configs and of a config directly in your home directory, so personal tools from ~/.config/mise/config.toml end up in the image.

-t, --tag <TAG>

Tag to record in the image index (the org.opencontainers.image.ref.name annotation)

--mount-point <MOUNT_POINT>

Where tools install inside the image

Overrides [oci].mount_point and the oci.default_mount_point setting.

--no-mise

Do not embed the currently-running mise binary at /usr/local/bin/mise

--no-cache

Rebuild tool layers without reading or writing the local layer cache

--owner <UID[:GID]>

UID[:GID] to assign to every tar entry in generated layers

Overrides [oci].user_id and [oci].group_id. Defaults to 0:0. If GID is omitted, it defaults to UID. This affects file ownership only; [oci].user controls the image USER directive.

-h, --help

Print help Examples:

Build the project's image into ./mise-oci

mise oci build

Use another base image and record a tag

mise oci build --from ubuntu:24.04 --tag myorg/dev:latest -o ./img

Inspect the result

skopeo inspect oci:./img

Open a shell in it

mise oci run --image-dir ./img -- /bin/sh

MISE OCI PUSH

[experimental] Build an OCI image and push it to a registry

Builds from the project's config, as `mise oci build` does, unless `--image-dir` names an image layout built earlier. Then uploads only the blobs the registry does not already have. mise pushes with its own registry client, so skopeo, crane, and docker are not needed.

Tool layers whose tool, version, mount point, and file owner match the previously pushed image (or `--cache-from`) are reused without being rebuilt, so those tools need not be installed locally. Pass `--no-cache` to rebuild every tool layer.

Credentials come from the files docker and podman use: `$REGISTRY_AUTH_FILE`, `$XDG_RUNTIME_DIR/containers/auth.json`, `~/.config/containers/auth.json`, then `~/.docker/config.json`, including inline auths and credential helpers. Log in with `docker login` or `podman login`.

Requires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`).

Usage: mise oci push [OPTIONS] <REF>

Options:

--cache-from <REF>

Reuse unchanged tool layers from this image instead of the destination's current tag

Must be in the same repository as the destination. Useful when every push gets a new tag, as with per-commit tags in CI: `mise oci push --cache-from ghcr.io/me/dev:latest ghcr.io/me/dev:$SHA`. Cannot be combined with --no-cache.

--from <FROM>

Base image for the build

Overrides [oci].from and the oci.default_from setting.

--image-dir <IMAGE_DIR>

Push an existing OCI image layout instead of building one

Cannot be combined with --cache-from, --from, --include-global, --mount-point, --no-mise, or --owner.

--include-global

Also package tools from the global and system configs

See `mise oci build --help` for details.

--mount-point <MOUNT_POINT>

Where tools install inside the image

Overrides [oci].mount_point and the oci.default_mount_point setting.

--no-cache

Rebuild tool layers without using the remote or local layer cache

--no-mise

Do not embed the running mise binary at /usr/local/bin/mise

--owner <UID[:GID]>

UID[:GID] to assign to every tar entry when building

Overrides [oci].user_id and [oci].group_id. Defaults to 0:0. If GID is omitted, it defaults to UID. This affects file ownership only; [oci].user controls the image USER directive.

--update-index

Maintain the tag as a multi-arch image index

Pushes this build's manifest by digest and points the tag at an OCI image index containing one entry per platform, preserving entries other architectures pushed. Run `mise oci push --update-index` from one runner per platform to assemble a multi-arch tag.

-h, --help

Print help Arguments:

<REF>

Destination registry reference (e.g. `ghcr.io/me/devenv:latest`) Examples:

Build and push to GHCR

mise oci push ghcr.io/me/devenv:latest

Push an image built earlier

mise oci build -o ./img mise oci push --image-dir ./img ghcr.io/me/devenv:v1

MISE OCI RUN

[experimental] Build the project's image and run a command in it

Builds the image as `mise oci build` does, unless `--image-dir` names an existing layout, then loads it into podman or docker and runs the command in a container with stdin, stdout, and stderr attached. podman reads the OCI layout directly; docker receives it through `docker load`.

Requires `mise settings experimental=true` (or `MISE_EXPERIMENTAL=1`) and podman or docker.

Usage: mise oci run [OPTIONS] [<CMD>] ...

Options:

--engine <ENGINE>

Container engine to use; `auto` prefers podman and falls back to docker

Default: auto

--from <FROM>

Base image for the build

Overrides [oci].from and the oci.default_from setting.

--image-dir <IMAGE_DIR>

Use an existing OCI image layout instead of building one

Cannot be combined with --from, --include-global, --mount-point, --no-mise, or --owner.

--include-global

Also package tools from the global and system configs

See `mise oci build --help` for details.

--keep

Keep the loaded image in the engine's storage after the run

By default, both the container (`--rm`) and the loaded image are removed when the command exits, so repeated `mise oci run` calls do not fill podman or docker storage. With `--keep`, the image stays under the tag mise used (`mise-oci:run-*` for docker, the pulled image ID for podman).

--mount-point <MOUNT_POINT>

Where tools install inside the image

Overrides [oci].mount_point and the oci.default_mount_point setting.

--no-mise

Do not embed the running mise binary at /usr/local/bin/mise

--owner <UID[:GID]>

UID[:GID] to assign to every tar entry when building

Overrides [oci].user_id and [oci].group_id. Defaults to 0:0. If GID is omitted, it defaults to UID. This affects file ownership only; [oci].user controls the image USER directive.

--volume <HOST:CONTAINER>

Bind-mount a host path (repeatable, `HOST:CONTAINER[:MODE]`)

Unlike `docker run`, there is no `-v` short form because mise uses `-v` for --verbose. Use `--volume` or `--mount`.

-e, --env <KEY=VAL>

Set environment variable in the container (repeatable, `KEY=VAL`)

-i, --interactive

Run interactively (pass `-i` to the engine)

-t, --tty

Allocate a TTY (pass `-t` to the engine)

-w, --workdir <WORKDIR>

Working directory inside the container

-h, --help

Print help Arguments:

<CMD>

Command and arguments to run inside the container (after `--`) Examples:

Build the project's image and open bash in it

mise oci run -it -- bash

Run a one-shot command with an environment variable and a mounted directory

mise oci run -e DEBUG=1 --volume "$PWD:/work" -w /work -- npm test

Reuse a layout built earlier instead of building again

mise oci build -o ./img && mise oci run --image-dir ./img -- node -e 'console.log(process.version)'

MISE PACKSLIP

Inspect and reset the signers mise has pinned for packslip tools

mise verifies a tool installed with the `packslip:` backend against the identity its project name implies, then remembers the signer it accepted, the way SSH remembers host keys. A later release from another signer, a weaker signing scheme, a repackager where the vendor signed before, or one that drops build provenance is refused. After you confirm the change with the publisher, run `mise packslip forget <PROJECT>`, and update mise.lock if it records the old signer.

With no subcommand, lists the pins (same as `mise packslip pins`). See https://mise.jdx.dev/dev-tools/backends/packslip.html#pinned-signers

Usage: mise packslip [OPTIONS] [COMMAND]

Options:

-h, --help

Print help

MISE PACKSLIP FORGET

Forget a project's pinned signer so the next accepted release sets it

Do this after the vendor announces a new signing identity or key. Name the project as in its tool identifier: `github.com/owner/repo`, `owner/repo`, or a domain such as `tool.example.com`, with or without `packslip:`. This also resets the project's remembered release-list state.

It does not change `mise.lock`. If the lockfile records the old signer, delete the tool's entries and run `mise lock`.

Usage: mise packslip forget [OPTIONS] <PROJECT>

Options:

-h, --help

Print help Arguments:

<PROJECT>

The project whose pin to drop Examples:

Accept whichever signer the next hk release uses

mise packslip forget github.com/jdx/hk

MISE PACKSLIP PINS

List the signer mise has pinned for each packslip project

Each row is a project and the signer mise pinned the first time it accepted a release: the signing scheme, the signer identity, whether the vendor or a repackager attested it, and whether build provenance links were present. A later release that does not match is refused.

Usage: mise packslip pins [OPTIONS]

Options:

-J, --json

Output in JSON format

-h, --help

Print help Examples:

List every pinned signer

mise packslip pins Project Scheme Signer Attested by Provenance github.com/jdx/hk sigstore-oidc https://github.com/jdx/hk/.github/workflows/release.yml vendor yes

Include the issuer, pin time, and forge repository ID

mise packslip pins --json

MISE OUTDATED

Show outdated tool versions

Lists tools whose installed version is older than the newest version their config request allows. For `node = "20"`, that is the newest 20.x release; pass `--bump` to compare against the newest release overall instead. Run `mise upgrade` to install the newer versions.

Usage: mise outdated [OPTIONS] [<TOOL@VERSION>] ...

Options:

-b, --bump

Compare against the newest release overall, not only the configured range

With `node = "20"` in your config, `mise outdated` reports the newest 20.x release. With this flag the `latest` column shows the newest release overall, such as 24.1.0, and a `bump` column shows the request `mise upgrade --bump` would write, such as `24`.

-J, --json

Output in JSON format

-l

Deprecated shorthand for --bump

--inactive

Also check installed tools that the current config does not request

By default, `mise outdated` checks only tools that come from the current config.

--global

Only check tools defined in the global config

Reports the requests in the global and system config (~/.config/mise/config.toml, /etc/mise/config.toml), even where a project config or a `MISE_<TOOL>_VERSION` environment variable sets its own version of the tool: what `mise upgrade --global` would install.

--local

Deprecated alias for --no-global

Removed in mise 2027.7.0.

--no-global

Only check tools defined in project config files

Skips tools defined in the global config (~/.config/mise/config.toml) and tools set through `MISE_<TOOL>_VERSION` environment variables.

--monorepo

Placeholder for future monorepo outdated checks; `mise outdated --monorepo` is not implemented yet.

--no-header

Do not print the table header

-h, --help

Print help Arguments:

<TOOL@VERSION>

Tools to check, such as `node@20 [email protected]`

Checks every tool in the global and project configs when omitted. Examples:

Show tools with a newer version inside their configured range

mise outdated name requested current latest source node 20 20.0.0 20.1.0 ~/src/app/mise.toml python 3.11 3.11.0 3.11.1 ~/src/app/mise.toml

Compare against the newest release overall and show the request for it

mise outdated --bump name requested current bump latest source node 20 20.0.0 24 24.1.0 ~/src/app/mise.toml

Print the same information as JSON

mise outdated --json {
"node": {
"name": "node",
"requested": "20",
"current": "20.0.0",
"bump": null,
"latest": "20.1.0",
"source": {
"type": "mise.toml",
"path": "/home/me/src/app/mise.toml"
}
} }

Skip tools that only the global config requests

mise outdated --no-global

Check the global config's request for claude, even inside a project that sets its own

mise outdated --global claude --json

MISE PATRONS

Show the individuals supporting mise as Patron-tier members

Fetches the list from https://jdx.dev/patrons.json and caches it for a day; pass `--refresh` to fetch it now. If the fetch fails, the cached list is used. Terminals that support OSC 8 hyperlinks show each name as a link.

To appear here, become a patron at https://jdx.dev/sponsors.html.

Usage: mise patrons [OPTIONS]

Options:

-J, --json

Output in JSON format

--refresh

Fetch the list now instead of using the cached copy

-h, --help

Print help Examples:

List the patrons

mise patrons

Fetch the list now and print it as JSON

mise patrons --refresh -J

MISE PLUGINS

Manage plugins

Plugins add tools, backends, environment directives, or bootstrap package managers to mise. Most tools need no plugin because most registry tools use built-in backends, and mise installs a missing plugin when a configured tool needs it.

With no subcommand, lists installed plugins (same as `mise plugins ls`; the flags below are passed to it). See https://mise.jdx.dev/plugins.html

Usage: mise plugins [OPTIONS] [COMMAND]

Options:

-a, --all

List all available remote plugins (same as `mise plugins ls-remote`)

-c, --core

List the core tools built into mise instead of installed plugins

-u, --urls

Show each plugin's Git URL, ref, and commit

--refs

Show each plugin's Git ref and commit, such as `main 1234abc`

--user

List installed plugins

This is the default behavior but can be used with --core to show core and user plugins

-h, --help

Print help

MISE PLUGINS INSTALL

Install plugins from a configured source, Git URL, or archive

Most registry tools use built-in backends and need no plugin. When a tool's backend requires a plugin, mise installs it with the tool. Use this command to install one ahead of time or from a custom source.

Pass a name that the registry or a `[plugins]` entry knows, a name and a URL, or only a URL. With only a URL, the plugin is named after the repository without an `asdf-`, `mise-`, or `vfox-` prefix. Pass several names to install several plugins. Prefix a name with `vfox:`, `vfox-backend:`, `package:`, or `asdf:` to choose the plugin type.

A Git URL may end in `#ref` to select a plugin commit, tag, or branch. This selects the plugin code, separately from the tool version `mise use` installs.

Usage: mise plugins install [OPTIONS] [<NEW_PLUGIN>] [<GIT_URL>] [<REST>] ...

Options:

-a, --all

Install every plugin the current config needs that is not installed yet

Only plugins with a registry shorthand or a `[plugins]` entry can be installed this way.

-f, --force

Reinstall even if the plugin is already installed

-j, --jobs <JOBS>

Number of plugins to install in parallel (default: the `jobs` setting)

-v, --verbose

Show installation output

-h, --help

Print help Arguments:

<NEW_PLUGIN>

The plugin to install, or a URL to infer its name from

<GIT_URL>

Where to install from: a Git URL (optionally ending in #ref) or an archive URL Examples:

Install a plugin from a Git repository

mise plugins install my-tool https://github.com/your-org/mise-my-tool

Pin the plugin to a tag

mise plugins install my-tool 'https://github.com/your-org/mise-my-tool#v1.2.0'

Name the plugin after its repository (my-tool)

mise plugins install https://github.com/your-org/vfox-my-tool

Use a local plugin repository at a tag you created

mise plugins install my-tool file:///path/to/mise-my-tool#v1.0.0

Install the plugins that the current config needs

mise plugins install --all

MISE PLUGINS LINK

Link a local plugin directory into mise for development

Edits in the source directory take effect without reinstalling the plugin. Pass a name and a directory, or only a directory to name the plugin after it without an `asdf-`, `mise-`, or `vfox-` prefix. Use the bare name, without a `vfox:` or `package:` prefix: mise detects the plugin type from the directory. This does not install a tool version.

Usage: mise plugins link [OPTIONS] <NAME> [<DIR>]

Options:

-f, --force

Replace an existing plugin with the same name

-h, --help

Print help Arguments:

<NAME>

The plugin name, or the plugin directory when DIR is omitted

<DIR>

The local path to the plugin, such as ./mise-my-tool Examples:

Link ./mise-my-tool as the plugin my-tool

mise plugins link my-tool ./mise-my-tool

Infer the name my-tool from the directory

mise plugins link ./mise-my-tool

List versions through the linked plugin

mise ls-remote my-tool

MISE PLUGINS LS

List installed plugins

Use `--core` to list the core tools built into mise instead, or `--core --user` for both. `--outdated` checks each plugin's Git remote for newer plugin code; it does not compare tool versions. Use `mise ls` for installed tool versions and `mise registry` for tools you can install.

Usage: mise plugins ls [OPTIONS]

Options:

-a, --all

List all available remote plugins (same as `mise plugins ls-remote`)

-c, --core

List the core tools built into mise instead of installed plugins

-o, --outdated

Only show plugins whose Git remote has newer commits

-u, --urls

Show each plugin's Git URL, ref, and commit

--refs

Show each plugin's Git ref and commit, such as `main 1234abc`

--user

List installed plugins

This is the default behavior but can be used with --core to show core and user plugins

-h, --help

Print help Examples:

List installed plugins

mise plugins ls

Show each plugin's Git URL, ref, and commit

mise plugins ls --urls

List core tools and installed plugins

mise plugins ls --core --user

List plugins whose Git remote has newer commits

mise plugins ls --outdated

MISE PLUGINS LS-REMOTE

List registry tools that have an asdf or vfox plugin backend

Each line is a registry shorthand that lists an asdf or vfox plugin among its backends; mise may still install the tool through another backend first. `*` marks plugins you have installed. Entries from the `shorthands_file` setting are listed too. Use `mise registry` to list every registry tool and its backends in order.

Usage: mise plugins ls-remote [OPTIONS]

Options:

-u, --urls

Show the plugin source for each shorthand, e.g. vfox:jdx/vfox-poetry

--only-names

Only show the name of each plugin, without the `*` marking installed plugins

-h, --help

Print help Examples:

List registry tools with a plugin backend

mise plugins ls-remote

MISE PLUGINS UNINSTALL

Remove an installed plugin

Installed tool versions are kept unless you pass `--purge`, which also removes a tool plugin's installs, downloads, and cache. `--purge` does not remove the tools of a backend plugin (`<plugin>:<tool>`); uninstall those first with `mise uninstall --all <plugin>:<tool>`.

Usage: mise plugins uninstall [OPTIONS] [<PLUGIN>] ...

Options:

-a, --all

Remove all plugins

-p, --purge

Also remove a tool plugin's installs, downloads, and cache

-h, --help

Print help Arguments:

<PLUGIN>

Plugins to remove Examples:

Remove the plugin and keep the versions it installed

mise plugins uninstall my-tool

Also delete the versions it installed

mise plugins uninstall --purge my-tool

MISE PLUGINS UPDATE

Update installed plugins

With no names, updates every installed plugin. This updates the plugin code, not the tool versions it manages. Linked local plugins are skipped; plugins installed from an archive cannot be updated with Git.

Usage: mise plugins update [OPTIONS] [<PLUGIN>] ...

Options:

-j, --jobs <JOBS>

Number of plugins to update in parallel (default: the `jobs` setting)

-h, --help

Print help Arguments:

<PLUGIN>

Plugins to update; append #ref to switch to a branch, tag, or commit Examples:

Update every installed plugin

mise plugins update

Update one plugin

mise plugins update my-tool

Switch a plugin to its main branch

mise plugins update my-tool#main

MISE DEPS

[experimental] Manage project dependencies

Installs project dependencies such as node_modules, separately from the tools `mise install` manages. Each provider is one package-manager step: a built-in one such as npm or uv, or a custom `[deps.<name>]` command. A provider runs only when its inputs changed or its outputs are missing; `--explain` shows why.

With no subcommand, runs `mise deps install`. Providers with `auto = true` also run before `mise exec` and `mise run` unless you pass --no-deps.

Usage: mise deps [OPTIONS] [<PROVIDER>] [COMMAND]

Options:

--explain

Show why a provider is fresh or stale, and exit non-zero unless it is fresh (requires a PROVIDER argument)

-f, --force

Run providers even when their outputs are up to date

-n, --dry-run

Show which providers would run, without running them

--list

List configured providers with their status, sources, and outputs

--monorepo

Also run providers from every config root in `[monorepo].config_roots`

Requires `monorepo_root = true` and an explicit `config_roots` list in the monorepo root's config. Provider names then include their root, such as `//apps/api:uv`.

Environment: MISE_MONOREPO

--only <PROVIDER>

Run only these providers

--skip <PROVIDER>

Skip these providers

-h, --help

Print help Arguments:

<PROVIDER>

Run only this provider, or explain it with --explain Examples:

Run every provider that is out of date

mise deps

Show why the npm provider would or would not run

mise deps install npm --explain

Include providers from every monorepo config root

mise deps --monorepo

MISE DEPS ADD

Add packages to the project's dependencies

Runs the package manager's own add command, which updates the project's manifest (for npm, package.json) and its lockfile, not mise.toml. To install a CLI tool from npm for mise to manage, use `mise use npm:<package>` instead. Name each package as `<ecosystem>:<package>`, such as `npm:react` or `npm:@types/react@19`. See https://mise.jdx.dev/dev-tools/deps.html#adding-and-removing-packages.

Usage: mise deps add [OPTIONS] <PACKAGES> ...

Options:

-D, --dev

Add as a development dependency

-h, --help

Print help Arguments:

<PACKAGES>

Packages to add, such as `npm:react` or `npm:@types/react@19` Examples:

Add react to package.json

mise deps add npm:react

Add vitest as a dev dependency

mise deps add -D npm:vitest

MISE DEPS INSTALL

Install project dependencies

Runs each provider whose inputs changed or whose outputs are missing. Pass PROVIDER to run only that one, --force to run regardless, or `--explain PROVIDER` to see why it would or would not run. With --explain, mise runs nothing and exits non-zero unless the provider is fresh.

Usage: mise deps install [OPTIONS] [<PROVIDER>]

Options:

--explain

Show why a provider is fresh or stale, and exit non-zero unless it is fresh (requires a PROVIDER argument)

-f, --force

Run providers even when their outputs are up to date

-n, --dry-run

Show which providers would run, without running them

--list

List configured providers with their status, sources, and outputs

--monorepo

Also run providers from every config root in `[monorepo].config_roots`

Requires `monorepo_root = true` and an explicit `config_roots` list in the monorepo root's config. Provider names then include their root, such as `//apps/api:uv`.

Environment: MISE_MONOREPO

--only <PROVIDER>

Run only these providers

--skip <PROVIDER>

Skip these providers

-h, --help

Print help Arguments:

<PROVIDER>

Run only this provider, or explain it with --explain Examples:

Run every provider that is out of date

mise deps install

Run every provider, even fresh ones

mise deps install --force

Show which providers would run

mise deps install --dry-run

MISE DEPS REMOVE

Remove packages from the project's dependencies

Runs the package manager's remove command, which updates the project's manifest and its lockfile, not mise.toml. Name each package as `<ecosystem>:<package>`, such as `npm:lodash`.

Usage: mise deps remove [OPTIONS] <PACKAGES> ...

Options:

-h, --help

Print help Arguments:

<PACKAGES>

Packages to remove, such as `npm:lodash` Examples:

Remove lodash from package.json

mise deps remove npm:lodash

MISE PRUNE

Delete tool versions that nothing uses

mise records each config file it loads (in ~/.local/state/mise/tracked-configs) and each tool stub it runs (in ~/.local/state/mise/tracked-stubs). `mise prune` deletes installed versions that none of them selects. A config that requests `node = "20"` keeps only the 20.x version it resolves to. Versions installed only for `mise exec <TOOL>@<VERSION>` or through `MISE_<TOOL>_VERSION` are deleted. Versions that a running process was started from are kept, so a long-running program keeps its files.

It also forgets tracked, trusted, and ignored config files that no longer exist. Pass `--tools` or `--configs` to do only one of the two. List the versions it would delete with `mise ls --prunable`.

Usage: mise prune [OPTIONS] [<INSTALLED_TOOL>] ...

Options:

-n, --dry-run

Show what would change without changing anything

--configs

Only forget tracked, trusted, and ignored config files that no longer exist

--dry-run-code

Like --dry-run, but exit with code 1 if there are tools to prune

Use it in scripts that check whether tools need pruning.

--monorepo

Placeholder for future monorepo pruning; `mise prune --monorepo` is not implemented yet.

--tools

Only delete unused tool versions

-h, --help

Print help Arguments:

<INSTALLED_TOOL>

Prune only these tools Examples:

Preview what would be deleted and why

mise prune --dry-run mise [email protected] is prunable: node is required at 20.19.5 by ~/src/app/mise.toml mise [email protected] [dryrun] remove ~/.local/share/mise/installs/node/20.0.0, ~/.cache/mise/node/20.0.0

Delete unused node versions only

mise prune --tools node

MISE REGISTRY

List registry shorthand names and their backends

The registry maps short names to backends. For example, `node` uses the built-in node backend (`core:node`). When a tool lists several backends, mise uses the first one that this platform and your settings allow. An explicit identifier such as `aqua:jqlang/jq`, a `[tool_alias]` entry, or a `MISE_BACKENDS_<TOOL>` environment variable overrides that choice.

This is not a list of every tool mise can install. Use an explicit identifier such as `github:owner/repo` for a source without a registry shorthand.

Usage: mise registry [OPTIONS] [<NAME>]

Options:

-b, --backend <BACKEND>

Show only tools for this backend

--complete

Print all tools with descriptions for shell completions

--hide-aliased

Hide names that are aliases of another registry tool

-J, --json

Output in JSON format

--security

Include security features for each tool's backends in JSON output

Requires --json. Features are merged across a tool's backends. Each backend is resolved separately, so this slows down a full listing.

-h, --help

Print help Arguments:

<NAME>

Show only this tool's backends, in the order mise prefers them Examples:

List every registry tool and its backends

mise registry

Show the backends for one tool

mise registry jq aqua:jqlang/jq asdf:mise-plugins/asdf-jq

List the tools that have an aqua backend

mise registry --backend aqua

Print the registry as JSON

mise registry --json

MISE RESHIM

Create shims for executables provided by installed tools

Run this when an executable was added to an existing installation outside mise, for example after a language package manager installed a CLI globally. It rebuilds your shim directory (~/.local/share/mise/shims by default). `--system` rebuilds the system shim directory used by `mise install --system`.

Shims are created for all installed versions. When invoked, a shim picks the version to run from the current config. `--force` rebuilds mise-owned shims; it does not turn unrelated files into mise-owned shims. See https://mise.jdx.dev/dev-tools/shims.html

Usage: mise reshim [OPTIONS] [<TOOL>] [<VERSION>]

Options:

-f, --force

Rebuild all mise-owned shims

--system

Rebuild the system shims, for tools installed with `mise install --system`

-h, --help

Print help Examples:

Rebuild shims, then run node through its shim

mise reshim ~/.local/share/mise/shims/node -v v24.11.0

MISE RUN

Run tasks and their dependencies

Run one task with `mise run TASK [ARGS...]`, or several with `:::` between them. Put mise flags before the task name; everything after it goes to the task. With no task, mise runs the `default` task if there is one, or opens a task picker in an interactive terminal.

Tasks come from `[tasks]` in `mise.toml` and from task directories such as `mise-tasks/`. A task with `sources` and `outputs` is skipped while its outputs are up to date; `--force` runs it anyway. For example:

```toml [tasks.build] run = "npm run build" sources = ["src/**/*.ts", "package.json", "package-lock.json"] outputs = ["dist/**/*.js"] ```

The experimental artifact cache (a task's `cache` field) has separate `--task-cache` controls.

To create a script task, run `mise tasks add --file hello -- echo hello`, then `mise run hello`. See https://mise.jdx.dev/tasks/running-tasks.html

Usage: mise run [OPTIONS] [TASK] [ARGS]…

Options:

--affected

Run matching tasks only in projects affected by Git changes

Counts committed changes between the base and head revisions, plus staged, unstaged, and untracked changes in the working tree when the head revision is the checked-out commit. Requires a monorepo root (`monorepo_root = true`).

--affected-base <REV>

Git base revision for `--affected`

Defaults to `MISE_AFFECTED_BASE`, CI metadata, or `HEAD~1`.

--affected-committed

Count committed changes between the base and head revisions

Alone, ignores the working tree. Combines with `--affected-uncommitted` and `--affected-untracked`. With none of the three, every source counts (the working-tree sources only when the head revision is the checked-out commit). Also set by `MISE_AFFECTED_COMMITTED`.

--affected-explain

Explain why `--affected` selected each project and task

--affected-head <REV>

Git head revision for `--affected`

Defaults to `MISE_AFFECTED_HEAD`, CI metadata, or `HEAD`.

--affected-json

Print the affected projects and tasks as JSON without running tasks

--affected-uncommitted

Count staged and unstaged changes to tracked files

Combines with the other source flags. Alone, ignores committed changes. Needs the head revision to be the current checkout. Also set by `MISE_AFFECTED_UNCOMMITTED`.

--affected-untracked

Count untracked files that Git does not ignore

Combines with the other source flags. Alone, ignores committed changes. Needs the head revision to be the current checkout. Also set by `MISE_AFFECTED_UNTRACKED`.

--all

Open the task picker with tasks from every project in the monorepo

-c, --continue-on-error

Continue running tasks even if one fails

-C, --cd <DIR>

Change to this directory before running the tasks

-f, --force

Run the tasks even if their outputs are up to date

-j, --jobs <JOBS>

Number of tasks to run in parallel (default: the `jobs` setting)

Values below 1 are treated as 1.

Environment: MISE_JOBS

-n, --dry-run

Print the tasks in the order they would run, without running them

-o, --output <OUTPUT>

How task output is displayed

- `prefix` - Print stdout/stderr by line, prefixed with the task's label - `interleave` - Print directly to stdout/stderr instead of by line - `replacing` - Stdout is replaced each time, stderr is printed as is - `timed` - Only show stdout lines if they are displayed for more than 1 second - `keep-order` - Print stdout/stderr by line, prefixed with the task's label, but keep the order of the output - `quiet` - Deprecated; use `--output interleave --quiet` - `silent` - Do not show any output, including the task's stdout and stderr, except errors

Environment: MISE_TASK_OUTPUT

-q, --quiet

Do not show extra output

Environment: MISE_QUIET

-r, --raw

Connect the tasks directly to stdin, stdout, and stderr instead of reading their output by line

Redactions are not applied, and tasks run one at a time. Set the `raw` setting to make this the default.

--secrets <SECRET>

[experimental] Give the named tasks these secrets (comma-separated); their dependencies and subtasks do not get them

Put this flag before the task name. Not allowed in safe mode.

--secrets-all

[experimental] Give the named tasks every secret the project can inject; their dependencies and subtasks do not get them

Covers the fnox secrets with `env = true` or `env = "exec"`, never those with `env = false`. Put this flag before the task name. Not allowed in safe mode.

-s, --shell <SHELL>

Shell used to run TOML tasks that do not set their own `shell`

Defaults to `sh -o errexit -c` on Unix and `cmd /c` on Windows, from the `unix_default_inline_shell_args` or `windows_default_inline_shell_args` setting. A task's `shell` property takes precedence over this flag.

-S, --silent

Do not show any output except for errors

Environment: MISE_SILENT

-t, --tool <TOOL@VERSION>

Extra tools to use with the tasks, e.g. node@24 [email protected]

--allow-env <VAR>

Allow a specific env var through (implies `--deny-env` for everything else)

Supports wildcards, such as `--allow-env='MYAPP_*'`.

--allow-net <HOST>

Allow network access only to HOST (not supported on any platform)

Per-host filtering does not work: Linux and macOS exit with an error, and Windows runs the task without network restrictions. See https://mise.jdx.dev/sandboxing.html#access-to-particular-hosts

--allow-read <PATH>

Allow reads from a specific path (implies `--deny-read` for everything else)

--allow-write <PATH>

Allow writes to a specific path (implies `--deny-write` for everything else)

--deny-all

Block reads, writes, network, and env vars

--deny-env

Block env var inheritance except PATH, HOME, USER, SHELL, TERM, COLORTERM, and LANG

On Windows it also keeps the variables programs need to start, such as `SystemRoot` and `TEMP`.

--deny-net

Block all network access

--deny-read

Block filesystem reads (system libraries and tool directories stay readable)

--deny-write

Block filesystem writes except temporary and device paths (/tmp, /dev)

--fresh-env

Bypass the environment cache and recompute the environment

--no-cache

Do not use the cache for remote tasks

Environment: MISE_TASK_REMOTE_NO_CACHE

--no-deps

Do not run `[deps]` providers that have `auto = true` before the tasks

--no-timings

Hide the elapsed time printed after each task completes

Set `task.timings = false` to hide it by default.

--skip-deps

Run only the named tasks, not the tasks they depend on

Environment: MISE_TASK_SKIP_DEPENDS

--skip-tools

Do not install missing tools before running the tasks

Set `task.run_auto_install = false` to make this the default.

--task-cache <TASK_CACHE>

[experimental] Set artifact cache access for this run

- `read-write` - Read cached results and write new results - `read-only` - Read cached results without writing new results - `write-only` - Write new results without reading cached results - `off` - Disable the artifact cache - `local-only` - Read and write only the local cache, skipping any remote cache

Default: read-write

Environment: MISE_TASK_CACHE

--task-cache-explain

[experimental] Explain the inputs that produced each task's artifact cache key

--task-cache-explain-json

[experimental] Print cache-key input details as JSON Lines without running tasks (requires `--dry-run`)

--task-cache-stats

[experimental] Report artifact cache hits, restored bytes, and time saved

--timeout <TIMEOUT>

Stop the run if it takes longer than this, e.g. 30s or 5m

Overrides the `task.timeout` setting.

--timings

Show the elapsed time after each task completes

Set `task.timings = true` to show it by default. Examples:

Run the "lint" task, defined in mise.toml or as a script

mise run lint

Run "build" even if its outputs are up to date

mise run --force build

Run "test" connected directly to the terminal, one task at a time

mise run --raw test

Run the "lint", "test", and "check" tasks in parallel

mise run lint ::: test ::: check

Run several tasks, each with its own arguments

mise run cmd1 arg1 arg2 ::: cmd2 arg1 arg2

Run tasks one at a time

mise run -j 1 lint ::: test

Run every task that matches a pattern

mise run 'test:*'

Run a task in a monorepo project

mise run //services/api:build

Give "deploy" the DEPLOY_KEY secret (experimental); its dependencies do not get it

mise run --secrets DEPLOY_KEY deploy

MISE SEARCH

Search for available tools

Searches the registry and the tool lists of installed backend plugins for tools matching NAME. When nothing matches, it also searches the aqua registry. Prefix NAME with `npm:`, `cargo:`, `gem:`, or `dotnet:` to also search that package registry, or pass `--all` to search every source.

Matching is fuzzy by default. Use `--match-type equal` or `--match-type contains` for stricter matches.

Usage: mise search [OPTIONS] [<NAME>]

Options:

-a, --all

Search every source: the registry, aqua, installed backend plugins, and the npm, cargo, gem, and dotnet package registries

-i, --interactive

Show an interactive search menu

-m, --match-type <MATCH_TYPE>

Match type: equal, contains, or fuzzy

Default: fuzzy

--no-header

Do not print the table header

--complete

Print all tools with descriptions for shell completions

--complete-ids

Print only tool identifiers for shell completions

-h, --help

Print help Arguments:

<NAME>

The tool to search for Examples:

Fuzzy-search the registry for jq

mise search jq Tool Description jq Command-line JSON processor. https://github.com/jqlang/jq jqp A TUI playground to experiment with jq. https://github.com/noahgorstein/jqp jiq jid on jq - interactive JSON query tool using jq expressions. https://github.com/fiatjaf/jiq gojq Pure Go implementation of jq. https://github.com/itchyny/gojq

Look up one npm package by its exact name

mise search --match-type equal npm:typescript-language-server Tool Description npm:typescript-language-server Language Server Protocol (LSP) implementation for TypeScript using tsserver

Pick a tool from a filterable list

mise search --interactive

MISE SECRETS

[experimental] Inspect the project's secrets source

With no subcommand, lists secret names (same as `mise secrets ls`; the flags below are passed to it). See https://mise.jdx.dev/environments/secrets/fnox.html

Usage: mise secrets [OPTIONS] [COMMAND]

Options:

-J, --json

Output in JSON format

--no-header

Do not print the table header

-h, --help

Print help

MISE SECRETS LS

[experimental] List secret names from the project's secrets source

Shows names and metadata, never values. The source is declared in the project's `mise.toml` with `[secrets.fnox]`. A line describing the source goes to stderr and the table to stdout.

Columns: - ENV: the key's `env` setting in the source: true, exec, false, or - if unset - FILE: whether the value is handed over as a file - SCOPES: where mise can grant the key: run (tasks) and exec (`mise exec`) - TASKS: the tasks that request the key

A SCOPES value of - means the key cannot be granted. A file secret can be granted to tasks only, because `mise exec` cannot clean up the file after it hands the process over.

Usage: mise secrets ls [OPTIONS]

Options:

-J, --json

Output in JSON format

--no-header

Do not print the table header

--complete

Render completions: the injectable key names, one per line

-h, --help

Print help Examples:

List the secret names and how each can be granted

mise secrets ls KEY ENV FILE SCOPES TASKS DESCRIPTION AWS_ACCESS_KEY_ID - no run, exec (lease aws) DATABASE_URL true no run, exec deploy app database GCP_SA_JSON exec yes run service account SIGNING_KEY false no - release signing key

MISE SELF-UPDATE

Update mise itself

Installs the newest stable release, or VERSION, from GitHub Releases and verifies its signature before replacing the running binary. Without VERSION, releases younger than the minimum release age are skipped: the `self_update.minimum_release_age` setting, then `minimum_release_age`, else 24h. Installed plugins are updated too unless you pass `--no-plugins`. Set `self_update.auto` to update automatically.

If a package manager such as Homebrew or apt installed mise, update it with that package manager instead: https://mise.jdx.dev/installing-mise.html#updating Packagers can disable this command: https://mise.jdx.dev/packaging.html

Usage: mise self-update [OPTIONS] [<VERSION>]

Options:

--minimum-release-age <MINIMUM_RELEASE_AGE>

Minimum release age for this update, such as 7d

Defaults to the self_update.minimum_release_age setting, then the minimum_release_age setting, else 24h.

-f, --force

Update even if already up to date

Also updates when the package that installed mise has disabled self-update.

-y, --yes

Skip confirmation prompt

--no-plugins

Do not update installed plugins

-h, --help

Print help Arguments:

<VERSION>

Update to a specific version, skipping the minimum release age Examples:

Update to the newest eligible release

mise self-update

Install a specific release

mise self-update 2026.10.4

Update without prompting or touching plugins

mise self-update -y --no-plugins

MISE SET

Set, show, or list environment variables in mise.toml

`mise set KEY=VALUE` writes to the lowest-precedence TOML file in the nearest config directory (`mise.toml` rather than `mise.local.toml`), creating `mise.toml` in the current directory if there is none. Run in your home directory, it writes to the global config. `mise set KEY` prints one value, and `mise set` lists every variable with its source file. Use `--global`, `--file`, or `-E <env>` to write elsewhere. See https://mise.jdx.dev/configuration.html#target-file-for-write-operations

Usage: mise set [OPTIONS] [<ENV_VAR>] ...

Options:

-E, --env <ENV>

Write to mise.<ENV>.toml in the current directory, or to .mise.<ENV>.toml if that exists

-g, --global

Set the environment variable in the global config file

--override

Set the environment variable in the global override file, `config.override.toml`

The override file outranks all project config. With `--env`, writes `config.<ENV>.override.toml` instead. See https://mise.jdx.dev/configuration.html#override-file

--age-encrypt

[experimental] Encrypt the value with age before storing

--age-key-file <PATH>

[experimental] Age identity file whose public keys to encrypt to

Without --age-recipient, --age-ssh-recipient, or --age-key-file, mise encrypts to the identities in the `age.key_file` setting (or ~/.config/mise/age.txt if it exists) and to ~/.ssh/id_ed25519 and ~/.ssh/id_rsa when they exist.

--age-recipient <RECIPIENT>

[experimental] Age recipient (x25519 public key) for encryption

Can be used multiple times. Requires --age-encrypt.

--age-ssh-recipient <PATH_OR_PUBKEY>

[experimental] SSH recipient (public key or path) for age encryption

Can be used multiple times. Requires --age-encrypt.

--complete

Render completions

--file, --path <FILE>

The TOML file to update

Can be a file or a directory. For a directory, mise uses the config file already in it, or creates one named by MISE_DEFAULT_CONFIG_FILENAME (default `mise.toml`): https://mise.jdx.dev/configuration/settings.html#default_config_filename To move the global config file, set MISE_GLOBAL_CONFIG_FILE: https://mise.jdx.dev/configuration/settings.html#global_config_file

--no-redact

Show raw values instead of redacting secrets

--prompt

Prompt for environment variable values (input is masked only with --age-encrypt)

--remove, --rm, --unset <ENV_KEY>

Remove the environment variable from config file

Can be used multiple times.

--stdin

Read the value from stdin, for multiline input

Pass a single key without a value; the value is read from stdin until EOF.

-h, --help

Print help Arguments:

<ENV_VAR>

Environment variables to set, such as NODE_ENV=production Examples:

Set NODE_ENV in mise.toml

mise set NODE_ENV=production

Show one variable's value

mise set NODE_ENV production

List variables, their values, and their source files

mise set

Write the variable to mise.staging.toml

mise set -E staging NODE_ENV=staging

Prompt for the value; input is visible unless you add --age-encrypt

mise set --prompt PASSWORD

Read a multiline value from stdin

cat private.key | mise set --stdin MY_KEY

Prompt with hidden input and store the value encrypted with age (experimental)

mise set --age-encrypt --prompt API_KEY

MISE SETTINGS

Manage settings

With no arguments, lists the settings set in config files (same as `mise settings ls`). With SETTING, prints its effective value. With SETTING=VALUE or SETTING VALUE, writes it to the global config (~/.config/mise/config.toml), or to the nearest project config with `--local`. Every setting is described at https://mise.jdx.dev/configuration/settings.html

Usage: mise settings [OPTIONS] [<SETTING>] [<VALUE>] [COMMAND]

Options:

-a, --all

List all settings

-J, --json

Output in JSON format

-l, --local

Use only the nearest project config

Reads only its explicit settings, or writes to it instead of the global config.

-T, --toml

Output in TOML format

--complete

Print all settings with descriptions for shell completions

--json-extended

Output in JSON format with sources

-h, --help

Print help Arguments:

<SETTING>

Only show this setting, or the settings under this prefix such as `python`

<VALUE>

The value to set Examples:

List settings set in config files

mise settings

Show the effective value of one setting

mise settings jobs

Set jobs in the global config

mise settings jobs=4

Set a setting in the project config

mise settings --local node.mirror_url https://npmmirror.com/mirrors/node/

MISE SETTINGS ADD

Append a value to an array setting

Adds the value to an array setting such as `disable_hints`, keeping existing entries. Writes ~/.config/mise/config.toml, or the nearest project config with `--local`.

Usage: mise settings add [OPTIONS] <SETTING> [<VALUE>]

Options:

-l, --local

Write to the nearest project config instead of the global config

The nearest project config is the lowest-precedence TOML file in the nearest directory that has one, or ./mise.toml.

--override

Write to the global override file, `config.override.toml`

The override file outranks all project config, so the setting wins over the same setting in a project's `mise.toml`.

-h, --help

Print help Arguments:

<SETTING>

The array setting to append to

<VALUE>

The value to append (or pass SETTING=VALUE) Examples:

Stop showing the python_multi hint

mise settings add disable_hints python_multi

MISE SETTINGS GET

Show the effective value of a setting

Includes defaults, config files, and environment overrides. With `--local`, reads only the explicit settings in the nearest project config, and a setting that is not set there is an error. An optional setting with no default that is not set anywhere, such as `python.compile`, is also reported as not set and exits with an error. To inspect one file, use `mise config get settings.KEY --file path/to/mise.toml`.

Usage: mise settings get [OPTIONS] <SETTING>

Options:

-l, --local

Read only the explicit settings in the nearest project config

-h, --help

Print help Arguments:

<SETTING>

The setting to show Examples:

Show the effective number of parallel jobs

mise settings get jobs

Show the value set in the project config

mise settings get --local experimental

MISE SETTINGS LS

List configured settings and their sources

By default, lists the settings set in loaded TOML config files. `--all` also includes the effective value of every other setting. `--local` lists only the nearest project config, and `--json-extended` adds source information to JSON output. Use `mise settings get SETTING` for one effective value.

Usage: mise settings ls [OPTIONS] [<SETTING>]

Options:

-a, --all

List all settings

-J, --json

Output in JSON format

-l, --local

Use only the nearest project config

Reads only its explicit settings, or writes to it instead of the global config.

-T, --toml

Output in TOML format

--complete

Print all settings with descriptions for shell completions

--json-extended

Output in JSON format with sources

-h, --help

Print help Arguments:

<SETTING>

Only show this setting, or the settings under this prefix such as `python` Examples:

List settings set in config files

mise settings ls

Include settings left at their defaults

mise settings ls --all

Show the python settings as JSON with their sources

mise settings ls python --json-extended

MISE SETTINGS SET

Set a setting

Writes ~/.config/mise/config.toml, or the nearest project config with `--local`. Settings that mise reads before loading config files cannot be set here: set `global_config_file` and similar through their environment variables, and `ceiling_paths` and similar in a `miserc.toml` file or their environment variables. `--local` refuses settings that only the global config can set, such as `yes`. See https://mise.jdx.dev/configuration/settings.html

Usage: mise settings set [OPTIONS] <SETTING> [<VALUE>]

Options:

-l, --local

Write to the nearest project config instead of the global config

The nearest project config is the lowest-precedence TOML file in the nearest directory that has one, or ./mise.toml.

--override

Write to the global override file, `config.override.toml`

The override file outranks all project config, so the setting wins over the same setting in a project's `mise.toml`.

-h, --help

Print help Arguments:

<SETTING>

The setting to set

<VALUE>

The value to set (or pass SETTING=VALUE) Examples:

Run up to 4 jobs in parallel

mise settings set jobs 4

Enable experimental features in the project config

mise settings set --local experimental=true

MISE SETTINGS UNSET

Remove a setting from the global or project config

Edits ~/.config/mise/config.toml, or the nearest project config with `--local`. The setting then falls back to its default or to a value from another config file.

Usage: mise settings unset [OPTIONS] <KEY>

Options:

-l, --local

Write to the nearest project config instead of the global config

The nearest project config is the lowest-precedence TOML file in the nearest directory that has one, or ./mise.toml.

--override

Write to the global override file, `config.override.toml`

The override file outranks all project config, so the setting wins over the same setting in a project's `mise.toml`.

-h, --help

Print help Arguments:

<KEY>

The setting to remove Examples:

Remove jobs from the global config

mise settings unset jobs

MISE SHELL

Set a tool version for the current shell session

Installs the version if needed, then sets `MISE_<TOOL>_VERSION`, such as `MISE_NODE_VERSION`, to the resolved version in the current shell. That overrides config files until you close the shell or run `mise shell --unset <TOOL>`, or `mise shell --unset --all` to remove every version set this way. Requires `mise activate`: the shell function it defines applies the variable that this command prints.

Usage: mise shell [OPTIONS] [<TOOL@VERSION>] ...

Options:

-j, --jobs <JOBS>

Number of jobs to run in parallel (default: the `jobs` setting)

Environment: MISE_JOBS

-u, --unset

Remove a version set earlier with `mise shell`

--all

With `--unset`, remove every `MISE_<TOOL>_VERSION` in this shell

This includes any you exported yourself, not only those set by `mise shell`.

--raw

Connect the install commands' stdin, stdout, and stderr to the terminal

Implies `--jobs=1`.

-h, --help

Print help Arguments:

<TOOL@VERSION>

Tools to set, such as node@20 Examples:

Use node 20 in this shell

mise shell node@20 node -v v20.19.5

Go back to the version the config requests

mise shell --unset node

Drop every version set with `mise shell` or `MISE_<TOOL>_VERSION`

mise shell --unset --all

MISE SSH

Open an SSH session, optionally borrowing read-only GitHub access

Without relay flags, runs OpenSSH to DESTINATION and passes -i, -p, and -o through. With `--github-relay-read-only`, Git and mise on the remote host can clone, fetch, and download releases from the GitHub repositories you allow, using this machine's GitHub credentials, until the session ends. The token is not copied to the host, and pushes and API writes are refused.

`--github-relay-read-only` needs exactly one of `--github-relay-repo`, repeated for each repository, or `--github-relay-all-repos`. A compromised host can read what you allow while the session lasts. See https://mise.jdx.dev/bootstrap/github-relay.html

Usage: mise ssh [OPTIONS] [<DESTINATION>] [<COMMAND>] ...

Options:

-i, --identity-file <IDENTITY_FILE>

SSH identity file

-p, --port <PORT>

SSH port

-o, --ssh-option <SSH_OPTION>

OpenSSH option; repeat for multiple options

--github-relay-read-only

Borrow read-only GitHub access for this session only

--github-relay-repo <OWNER/REPO>

GitHub repository the host may read; repeat for more repositories

--github-relay-all-repos

Allow reads of every repository your local GitHub credentials can access

--github-relay-log-requests

Log sanitized relay requests on local stderr

--github-relay-no-log-requests

Turn off request logging even if the github_relay.log_requests setting is on

--github-relay-log-format <FORMAT>

Relay log and summary format: text or jsonl (default: the github_relay.log_format setting)

--github-relay-max-duration <DURATION>

End borrowed access after a duration such as 1h; 0s lasts the whole session

--relay-session <RELAY_SESSION>

Internal session adapter

--repository-bundle <REPOSITORY_BUNDLE>
--repository-origin <REPOSITORY_ORIGIN>
--repository-revision <REPOSITORY_REVISION>
--repository-update
--repository-require-branch

The bundled branch was requested with `?ref=`

--repository-yes
--repository-dry-run

Preview the transferred repository's installation without writing it

--repository-preview-directory <REPOSITORY_PREVIEW_DIRECTORY>
--global-config-directory
-h, --help

Print help Arguments:

<DESTINATION>

OpenSSH destination or SSH config alias (required)

<COMMAND>

Command to execute after --; omit for an interactive shell Examples:

Let devbox clone one private repository

mise ssh devbox --github-relay-read-only --github-relay-repo you/setup -- git clone https://github.com/you/setup.git

Open a shell that can read every repository your credentials can read

mise ssh devbox --github-relay-read-only --github-relay-all-repos

Run a command over plain SSH with an identity file, port, and option

mise ssh devbox -i ~/.ssh/devbox -p 2222 -o ServerAliveInterval=30 -- uname -a

MISE SHELL-ALIAS

Manage shell aliases

Shell aliases are defined under `[shell_alias]` in mise.toml. In a shell where mise is activated, mise sets them when you enter the directory and removes them when you leave. With no subcommand, lists them (same as `mise shell-alias ls`). See https://mise.jdx.dev/shell-aliases.html

Usage: mise shell-alias [OPTIONS] [COMMAND]

Options:

--no-header

Do not print the table header

-h, --help

Print help

MISE SHELL-ALIAS GET

Show the command for a shell alias

Usage: mise shell-alias get [OPTIONS] <shell_alias>

Options:

-h, --help

Print help Arguments:

<shell_alias>

The alias to show Examples:

Print the command that ll runs

mise shell-alias get ll ls -la

MISE SHELL-ALIAS LS

List shell aliases

Lists the shell aliases configured for the current directory: the `[shell_alias]` entries of every config file mise loads here.

Usage: mise shell-alias ls [OPTIONS]

Options:

--no-header

Do not print the table header

-h, --help

Print help Examples:

List the aliases set in this directory

mise shell-alias ls alias command ll ls -la gs git status

MISE SHELL-ALIAS SET

Set a shell alias in the global config

Writes the global config (~/.config/mise/config.toml by default). To share an alias with a project, add it under `[shell_alias]` in the project's mise.toml.

Usage: mise shell-alias set [OPTIONS] <shell_alias> [<COMMAND>]

Options:

-h, --help

Print help Arguments:

<shell_alias>

The alias name

<COMMAND>

The command to run (or pass ALIAS=COMMAND) Examples:

Define ll in every directory

mise shell-alias set ll "ls -la"

Use the ALIAS=COMMAND form

mise shell-alias set gs="git status"

MISE SHELL-ALIAS UNSET

Remove a shell alias from the global config

Edits the global config (~/.config/mise/config.toml by default). An alias defined in a project's mise.toml has to be removed there.

Usage: mise shell-alias unset [OPTIONS] <shell_alias>

Options:

-h, --help

Print help Arguments:

<shell_alias>

The alias to remove Examples:

Remove ll from the global config

mise shell-alias unset ll

MISE SKILLS

List and link the agent skills that active tools ship

A tool installed with the `packslip:` backend may declare an agent skill: a directory holding `SKILL.md` and whatever it references, in the Agent Skills format. mise knows which version of each tool is active here, so it can hand an agent the skill for exactly that version.

With no subcommand, lists the skills (same as `mise skills ls`). See https://mise.jdx.dev/dev-tools/packslip-resources.html#skills

Usage: mise skills [OPTIONS] [COMMAND]

Options:

-h, --help

Print help

MISE SKILLS LS

List the skills the active tools declare

Each line is a skill of a tool that is installed and active in the current directory, with the version it belongs to and the directory holding its `SKILL.md`.

Usage: mise skills ls [OPTIONS]

Options:

-J, --json

Output in JSON format

-h, --help

Print help Examples:

List the skills of the active tools

mise skills ls Skill Tool Version Path hk-configure packslip:github.com/jdx/hk 2.5.0 ~/.local/share/mise/installs/packslip-github-com-jdx-hk/2.5.0/skills/hk-configure hk-debug packslip:github.com/jdx/hk 2.5.0 ~/.local/share/mise/installs/packslip-github-com-jdx-hk/2.5.0/skills/hk-debug

MISE SKILLS SYNC

Link the active tools' skills where an agent looks for them

Writes one symlink per skill into DIR, named after the skill and pointing at the directory of the version that is active here. DIR defaults to the `skills.dir` setting, `.claude/skills`, under the project root: the directory of the nearest mise config. Run it again after `mise use` changes a version and the links follow, or set `skills.auto_sync` to have mise do that after every install and `mise use`.

mise replaces only the links it made, which point into its installs directory, and removes them only with --prune or the `skills.prune` setting. A real directory or a link of your own at a skill's name is left alone and reported.

Usage: mise skills sync [OPTIONS]

Options:

--dir <DIR>

The directory to link skills into

-g, --global

Link into the skills.dir directory under your home directory instead of the project's

With the default skills.dir, that is ~/.claude/skills.

--prune

Remove links mise made for skills that are no longer active

-h, --help

Print help Examples:

Link skills into the project's skills.dir (default .claude/skills)

mise skills sync

Link into .agents/skills and remove links for skills that are no longer active

mise skills sync --dir .agents/skills --prune

MISE SPONSORS

Show the companies sponsoring mise and the jdx.dev open source tools

Usage: mise sponsors [OPTIONS]

Options:

-h, --help

Print help

MISE SYNC

Use tool versions installed by other version managers

Links node versions from nvm, nodenv, or Homebrew, python versions from pyenv or uv, and ruby versions from Homebrew into mise, so `mise use` can select them without reinstalling.

Usage: mise sync [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE SYNC NODE

Symlink node versions installed by nvm, nodenv, or Homebrew into mise

Use this to make versions installed by another version manager available to mise. It does not overwrite managed installs, runtime aliases, or links from other providers. Pass one or more of --brew, --nodenv, and --nvm.

Usage: mise sync node [OPTIONS]

Options:

--brew

Get tool versions from Homebrew

--nodenv

Get tool versions from nodenv

--nvm

Get tool versions from nvm

-h, --help

Print help Examples:

Use the node that Homebrew installed

brew install node@24 mise sync node --brew mise use -g node@24

MISE SYNC PYTHON

Symlink python versions installed by pyenv or uv into mise

Use this to make versions installed by another version manager available to mise. It does not overwrite managed installs, runtime aliases, or links from other providers. With --uv, it also links mise's python versions into uv. Pass --pyenv, --uv, or both; with neither, nothing is linked.

Usage: mise sync python [OPTIONS]

Options:

--pyenv

Get tool versions from pyenv

--uv

Link uv's python versions into mise and mise's python versions into uv

-h, --help

Print help Examples:

Use a python that pyenv installed

pyenv install 3.13.0 mise sync python --pyenv mise use -g [email protected]

Share python versions with uv in both directions

uv python install 3.13.0 mise install [email protected] mise sync python --uv mise exec [email protected] -- python -V uv run -p 3.12.0 -- python -V

MISE SYNC RUBY

Symlink ruby versions installed by Homebrew into mise

Use this to make versions installed by another version manager available to mise. It does not overwrite managed installs, runtime aliases, or links from other providers. Homebrew is the only source, so --brew is required. mise links each [email protected] directory under Homebrew's opt directory, not opt/ruby.

Usage: mise sync ruby [OPTIONS]

Options:

--brew

Get tool versions from Homebrew

-h, --help

Print help Examples:

Link the Homebrew [email protected], then list it with the other installed versions

brew install [email protected] mise sync ruby --brew mise ls ruby --installed

MISE TASKS

Manage tasks

With no subcommand, lists tasks like `mise tasks ls` and accepts the same flags. With a task name, shows that task like `mise tasks info`. To run a task, use `mise run`.

Usage: mise tasks [OPTIONS] [<TASK>] [COMMAND]

Options:

-g, --global

Only show global tasks

-J, --json

Output in JSON format

-l, --local

Deprecated alias for --no-global

Removed in mise 2027.7.0.

--no-global

Only show non-global tasks

-x, --extended

Show all columns

-a, --all

Include tasks from every project in the monorepo, not only the current directory's hierarchy

--complete

Display tasks for usage completion

--hidden

Show hidden tasks

--name-only

Print only task names, one per line (for fzf and similar tools)

--no-header

Do not print the table header

--sort <COLUMN>

Column to sort by (default: name)

--sort-order <SORT_ORDER>

Sort direction (default: asc)

--usage
-h, --help

Print help Arguments:

<TASK>

Task to show, as `mise tasks info` does Examples:

List tasks

mise tasks

Show the build task

mise tasks build

Include hidden tasks, sorted by source

mise tasks --hidden --sort source

MISE TASKS ADD

Add a task

Writes a `[tasks.<name>]` table to the nearest project config file and marks that file as trusted. See https://mise.jdx.dev/configuration.html#target-file-for-write-operations for how the file is chosen.

With `--file`, creates an executable script in the project's task directory (for example `mise-tasks/`) instead, and does not change any config file.

Usage: mise tasks add [OPTIONS] <TASK> [<RUN>] ...

Options:

-a, --alias <ALIAS>

Other names for the task

-d, --depends <TASK>

Tasks to run before this one

-D, --dir <DIR>

Run the task in a specific directory

-f, --file

Create a file task instead of a TOML task

-H, --hide

Hide the task from `mise tasks` and completions

-q, --quiet

Do not print the command before running

-r, --raw

Connect the task directly to the terminal's stdin, stdout, and stderr

-s, --sources <GLOB>

Glob patterns of files this task uses as input

-w, --wait-for <TASK>

Wait for these tasks to finish if they are also being run

--depends-post <TASK>

Tasks to run after this one

--description <DESCRIPTION>

Description of the task

--outputs <GLOB>

Glob patterns of files this task creates, used to skip it when they are up to date

--run-windows <COMMAND>

Command to run on Windows (TOML tasks only; ignored with `--file`)

--shell <SHELL>

Run the task in a specific shell

--silent

Do not print the command or its output

-h, --help

Print help Arguments:

<TASK>

Name of the task to add

<RUN>

Command to run, given after `--` Examples:

Add a TOML task that is skipped while its outputs are up to date

mise tasks add build --description "Build the app" --sources 'src/**/*.ts' --outputs 'dist/**' -- npm run build

Create an executable lint script in the task directory

mise tasks add --file lint -- eslint .

Add a task that runs after lint and test

mise tasks add ci --depends lint --depends test -- echo done

MISE TASKS DEPS

Show the dependency tree of tasks

The tree is built from declared dependencies: `depends`, `depends_post`, and `wait_for`. Task references inside a `run` or `run_windows` array (`{ task = "..." }` or `{ tasks = [...] }`) are execution steps, not graph edges, so they do not appear here. Those nested tasks still run, including their own `depends`.

Usage: mise tasks deps [OPTIONS] [<TASKS>] ...

Options:

--compact

Collapse repeated dependencies after their first occurrence

--dot

Display dependencies in DOT format

--hidden

Show hidden tasks

-h, --help

Print help Arguments:

<TASKS>

Tasks to show (default: all tasks) Examples:

Show dependencies for all tasks

mise tasks deps

Show dependencies for the "lint", "test" and "check" tasks

mise tasks deps lint test check

Show dependencies in DOT format

mise tasks deps --dot

Collapse repeated dependencies

mise tasks deps --compact

MISE TASKS EDIT

Open a task in your editor

Opens the file that defines the task in `$VISUAL` or `$EDITOR`: the script for a file task, or the config file for a TOML task. If no task has that name, mise creates an executable bash script for it in the project's task directory (for example `mise-tasks/`) and opens that. `--path` prints the file's path instead of opening it; a missing task is still created.

Usage: mise tasks edit [OPTIONS] <TASK>

Options:

-p, --path

Print the task's file path instead of opening it

-h, --help

Print help Arguments:

<TASK>

Task to edit Examples:

Edit the build task

mise tasks edit build

Print the build task's file path

mise tasks edit --path build

MISE TASKS GRAPH

Show the monorepo project graph

Lists the projects mise infers from Cargo, uv, Go, Gradle, and Node.js workspace manifests, with each project's ID, root directory, dependencies, and metadata. `mise run --affected` uses this graph to decide which projects a change touches.

See https://mise.jdx.dev/tasks/workspace-graph.html

Usage: mise tasks graph [OPTIONS]

Options:

-J, --json

Output the project graph as JSON

--explain

Show which provider and workspace file each project, dependency, and task field came from

--no-header

Do not print table headers

-h, --help

Print help Examples:

List projects and their dependencies

mise tasks graph

Print the project graph as JSON

mise tasks graph --json

Show which workspace file each project, dependency, and task came from

mise tasks graph --explain

MISE TASKS INFO

Show a task's definition

Prints the task's description, source file, dependencies, sources, outputs, run commands, environment, and usage spec. `--json` prints the full definition.

Usage: mise tasks info [OPTIONS] <TASK>

Options:

-J, --json

Output in JSON format

-h, --help

Print help Arguments:

<TASK>

Name of the task to get information about Examples:

Show the test task and the file that defines it

mise tasks info test

Get the full structured task definition

mise tasks info test --json

MISE TASKS LS

List available tasks

Lists tasks from `[tasks]` in your config files and from task directories such as `mise-tasks/`, `.mise-tasks/`, and `.mise/tasks/`, including global tasks in `~/.config/mise/tasks/`. Tasks from parent directories and the global config are included; a project task overrides a global task with the same name. In a monorepo, `--all` also lists tasks from sibling projects.

See https://mise.jdx.dev/tasks/task-discovery.html

Usage: mise tasks ls [OPTIONS]

Options:

-g, --global

Only show global tasks

-J, --json

Output in JSON format

-l, --local

Deprecated alias for --no-global

Removed in mise 2027.7.0.

--no-global

Only show non-global tasks

-x, --extended

Show all columns

-a, --all

Include tasks from every project in the monorepo, not only the current directory's hierarchy

--complete

Display tasks for usage completion

--hidden

Show hidden tasks

--name-only

Print only task names, one per line (for fzf and similar tools)

--no-header

Do not print the table header

--sort <COLUMN>

Column to sort by (default: name)

--sort-order <SORT_ORDER>

Sort direction (default: asc)

--usage
-h, --help

Print help Examples:

List tasks

mise tasks ls

Include hidden tasks

mise tasks ls --hidden

List tasks from every monorepo project

mise tasks ls --all

Pick a task name interactively

mise tasks ls --name-only | fzf

MISE TASKS VALIDATE

Check task definitions for errors

Checks each task for dependency cycles; references to tasks that do not exist; `#USAGE` specs that do not parse; invalid `timeout` values; aliases that more than one task uses; missing or non-executable file tasks; invalid `dir` paths and templates; missing shell executables; invalid `sources` and `outputs` globs; broken task references in `run` arrays, empty scripts, and tasks with nothing to run; required `daemons` that no readable `[daemons]` section declares; and `secrets` grants that conflict with the sandbox or `[env]`, or, when the config is trusted, that name keys missing from the secrets source.

Exits 1 if any error is found, so you can run it in CI. Warnings are reported but do not fail the command.

Usage: mise tasks validate [OPTIONS] [<TASKS>] ...

Options:

--errors-only

Only show errors (skip warnings)

--json

Output validation results in JSON format

-h, --help

Print help Arguments:

<TASKS>

Tasks to validate (default: all tasks) Examples:

Validate all tasks

mise tasks validate

Validate specific tasks

mise tasks validate build test

Output results as JSON

mise tasks validate --json

Only show errors (skip warnings)

mise tasks validate --errors-only

MISE TEST-TOOL

Test that a tool installs and runs

Installs each tool and runs the `test` command from its registry entry (registry/<tool>.toml), checking the output. Use it when adding or changing a registry entry. The minimum release age is ignored so that new releases can be tested right away.

Warning: before testing, this deletes every installed version of each tested tool, along with its cache and downloads directories, so the test installs from scratch. To keep your installs and caches, run it with throwaway MISE_DATA_DIR and MISE_CACHE_DIR directories.

Registry tools with no `test` entry, or that registry/ marks as unsupported on this OS, are skipped without output, and the command still exits 0. Pass --include-non-defined to run `<tool> --version` for tools with no `test` entry.

Usage: mise test-tool [OPTIONS] [<TOOLS>] ...

Options:

-a, --all

Test every registry tool that defines a `test` and supports this OS

-j, --jobs <JOBS>

Number of tools to test in parallel (default 4)

Environment: MISE_TEST_TOOL_JOBS

--all-config

Test all tools specified in config files

--include-non-defined

Also test registry tools that have no `test` entry by running `<tool> --version`

These always report a failure that shows the output, for use when writing a test.

--raw

Connect the install commands' stdin, stdout, and stderr to the terminal

Implies `--jobs=1`.

-h, --help

Print help Arguments:

<TOOLS>

Tools to test Examples:

Reinstall ripgrep and run its registry test

mise test-tool ripgrep

Test every tool in the config without touching your installs

MISE_DATA_DIR=$(mktemp -d) MISE_CACHE_DIR=$(mktemp -d) mise test-tool --all-config

MISE TOKEN

Show which Git provider token mise uses

Shows the token mise would send to a GitHub, GitLab, or Forgejo host and where it came from, to debug authentication. See https://mise.jdx.dev/dev-tools/github-tokens.html

Usage: mise token [OPTIONS] <COMMAND>

Options:

-h, --help

Print help

MISE TOKEN FORGEJO

Show the Forgejo token mise uses for a host

Shows the token and where it came from, to debug authentication. The token is masked unless you pass --unmask.

Usage: mise token forgejo [OPTIONS] [<HOST>]

Options:

--unmask

Show the full unmasked token

-h, --help

Print help Arguments:

<HOST>

Forgejo hostname

Default: codeberg.org

Examples:

Show the token for codeberg.org

mise token forgejo codeberg.org: xxxx…xxxx (source: FORGEJO_TOKEN)

Show the whole token

mise token forgejo --unmask codeberg.org: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (source: FORGEJO_TOKEN)

Check a self-hosted Forgejo instance

mise token forgejo forgejo.mycompany.com forgejo.mycompany.com: (none)

MISE TOKEN GITHUB

Show the GitHub token mise uses for a host

Shows the token and where it came from, to debug authentication. The token is masked unless you pass --unmask or --raw.

Usage: mise token github [OPTIONS] [<HOST>]

Options:

--git-credential <GIT_CREDENTIAL>

Speak Git's credential helper protocol

--oauth

Use only native GitHub OAuth (a cached token, a refresh, or the device-code flow), ignoring other token sources

--raw

Print only the token, unmasked, for use in scripts

--refresh

With --oauth, get a new OAuth token even if the cached one has not expired, through the refresh-token grant or a new device-code flow. Use it after changing the GitHub App's installations or permissions: cached tokens keep their original access until they expire.

--unmask

Show the full unmasked token

-h, --help

Print help Arguments:

<HOST>

GitHub hostname

Default: github.com

Examples:

Show the token for github.com

mise token github github.com: ghp_…xxxx (source: GITHUB_TOKEN)

Show the whole token

mise token github --unmask github.com: ghp_xxxxxxxxxxxx (source: GITHUB_TOKEN)

Check a GitHub Enterprise host

mise token github github.mycompany.com github.mycompany.com: (none)

Get a new token through native GitHub OAuth

mise token github --oauth --refresh github.com: gho_…xxxx (source: GitHub OAuth)

Pass the resolved token to another tool

GH_TOKEN=$(mise token github --raw) gh api user

MISE TOKEN GITLAB

Show the GitLab token mise uses for a host

Shows the token and where it came from, to debug authentication. The token is masked unless you pass --unmask.

Usage: mise token gitlab [OPTIONS] [<HOST>]

Options:

--unmask

Show the full unmasked token

-h, --help

Print help Arguments:

<HOST>

GitLab hostname

Default: gitlab.com

Examples:

Show the token for gitlab.com

mise token gitlab gitlab.com: glpa…xxxx (source: GITLAB_TOKEN)

Show the whole token

mise token gitlab --unmask gitlab.com: glpat-xxxxxxxxxxxx (source: GITLAB_TOKEN)

Check a self-managed GitLab instance

mise token gitlab gitlab.mycompany.com gitlab.mycompany.com: (none)

MISE TOOL

Show information about a tool

Shows the tool's backend, its description and project URL when known, the installed, active, and requested versions, the config file that requests it, its tool options, and the backend's security features. Pass a field flag such as `--backend` to print one field, or `--json` for all of them.

Usage: mise tool [OPTIONS] <TOOL>

Options:

-J, --json

Output in JSON format

--active

Only show active versions

--backend

Only show backend field

--config-source

Only show config source

--description

Only show description field

--installed

Only show installed versions

--requested

Only show requested versions

--tool-options

Only show tool options

--url

Only show the project URL from the registry

-h, --help

Print help Arguments:

<TOOL>

The tool, such as `node` or `aqua:jqlang/jq` Examples:

Show everything mise knows about node

mise tool node Backend: core:node Installed Versions: 22.0.0 24.0.0 Active Version: 24.0.0 Requested Version: 24 Config Source: ~/.config/mise/config.toml Tool Options: [none] Security: checksum (sha256), gpg

Print only the backend

mise tool node --backend core:node

MISE TOOL-STUB

Run a tool stub file

A tool stub is an executable file whose shebang is `#!/usr/bin/env -S mise tool-stub` and whose body is TOML naming a tool, version, and executable. Running the stub runs this command, which installs the tool if needed and runs it with the stub's arguments. You rarely call it directly; create stubs with `mise generate tool-stub`.

```toml #!/usr/bin/env -S mise tool-stub # Node.js 24

tool = "node" version = "24" bin = "node" ```

See https://mise.jdx.dev/dev-tools/tool-stubs.html

Usage: mise tool-stub <FILE> [<ARGS>] ...

Arguments:

<FILE>

Path to the TOML tool stub file to execute

Every field is optional: `version` defaults to `latest`, `tool` defaults to the stub's file name (or `http:<file name>` when the stub sets `url` or platform URLs), and `bin` defaults to the stub's file name. A stub can also set backend-specific options.

<ARGS>

Arguments to pass to the tool

Every argument after the stub path is passed to the tool unchanged, including a literal `--`.

MISE TRUST

Mark a config file as trusted

Trust lets mise load the parts of a config file that can run code or change your environment. Without it, mise prompts, skips the file, or fails with an untrusted-config error when it cannot prompt.

A file with no template syntax that contains only `min_version`, `[tools]` entries with plain version strings (or arrays of them), and `[tasks]` in which no task lists `secrets` does not need trust unless paranoid mode is on. Commands that run project code (`mise run`, task shorthand such as `mise build`, `mise install`, `mise exec`, `mise watch`, and `mise daemons start|restart|register`) trust their active config automatically.

In paranoid mode, `mise trust` with no path also trusts the env files and scripts that config reads (`env._.file`, `env._.source` and the `env_file` setting), which have trust of their own. Give a file's path to trust only that file.

Trusting a config file in a repository's main checkout also trusts the same path in its git worktrees. Paranoid mode (https://mise.jdx.dev/paranoid.html) turns off automatic and worktree trust and requires trust, tied to the file's contents, for every config outside the global and system config. See https://mise.jdx.dev/security.html#configuration-trust

Usage: mise trust [OPTIONS] [<CONFIG_FILE>]

Options:

-a, --all

Trust all config files in the current directory, its parents, and its subdirectories

Subdirectories are walked respecting .gitignore, skipping hidden directories and common build and dependency directories (node_modules, vendor, target, dist, build).

--ignore

Do not trust this config and ignore it in the future

--show

Show the trust status of config files in the current directory and its parents

Does not trust or untrust any files.

--untrust

Remove explicit trust for this config

-h, --help

Print help Arguments:

<CONFIG_FILE>

The config file whose trust status to change Examples:

Trust the nearest untrusted config in this directory or a parent, and in paranoid mode the env files it reads

mise trust

Trust a specific file

mise trust ~/src/app/mise.toml

List configs here and above with their trust status

mise trust --show

MISE UNINSTALL

Remove installed tool versions

Removes installed versions but does not edit mise.toml. Use `mise unuse` to remove a tool from mise.toml and uninstall it. A tool name or version prefix, such as `node` or `node@22`, must match exactly one installed version unless you pass `--all`.

`--project` removes the installed versions that the project's own config files request. Installs are shared by every project, so other projects that use the same versions have to install them again.

Usage: mise uninstall [OPTIONS] [<INSTALLED_TOOL@VERSION>] ...

Options:

-a, --all

Remove every installed version of the named tools, or of every tool when none is named

--project

Remove the installed versions the nearest project config requests

The project is the nearest directory, starting at the current one and moving up, that has a mise config file. Every config file in that directory counts, such as `mise.toml`, `mise.local.toml`, `conf.d` fragments, `.tool-versions` and idiomatic version files. Configs in parent directories and global or system configs do not. Every version those files name is removed, including one that a later file overrides. Lists what it will remove and asks for confirmation unless `--yes` or a dry run is given. Tools set to a `path:` or `system` version are never removed.

-n, --dry-run

Show what would change without changing anything

--dry-run-code

Like --dry-run, but exit with code 1 if there are tools to uninstall

Use it in scripts that check whether tools need uninstalling.

-h, --help

Print help Arguments:

<INSTALLED_TOOL@VERSION>

Tools to remove, such as [email protected] Examples:

Uninstall a specific version

mise uninstall [email protected]

Uninstall node when exactly one version is installed

mise uninstall node

Uninstall every installed version of node

mise uninstall --all node

Preview the versions this project's config requests

mise uninstall --project --dry-run

MISE UNSET

Remove environment variables from mise.toml

Edits the same file `mise set` writes: the lowest-precedence TOML file in the nearest config directory, or the global config when run in your home directory. Use `--global` or `--file` to pick another file.

Usage: mise unset [OPTIONS] [<ENV_KEY>] ...

Options:

-f, --file, --path <FILE>

The TOML file to edit instead of the default target

Can be a file or a directory. For a directory, mise uses the config file in it, or one named by MISE_DEFAULT_CONFIG_FILENAME (default `mise.toml`): https://mise.jdx.dev/configuration/settings.html#default_config_filename To move the global config file, set MISE_GLOBAL_CONFIG_FILE: https://mise.jdx.dev/configuration/settings.html#global_config_file

-g, --global

Use the global config file

--override

Use the global override file, `config.override.toml`

See https://mise.jdx.dev/configuration.html#override-file

-h, --help

Print help Arguments:

<ENV_KEY>

Environment variables to remove, such as NODE_ENV Examples:

Remove NODE_ENV from the project config

mise unset NODE_ENV

Remove NODE_ENV from the global config

mise unset -g NODE_ENV

MISE UNTRUST

Remove explicit trust for a config

mise asks again before loading the parts of the file that can run code. With no file, untrusts the nearest config in this directory or a parent. Same as `mise trust --untrust`.

Usage: mise untrust [OPTIONS] [<CONFIG_FILE>]

Options:

-h, --help

Print help Arguments:

<CONFIG_FILE>

The config file to untrust Examples:

Stop trusting a specific file

mise untrust ~/src/app/mise.toml

MISE UNUSE

Remove tool requests from config files and prune unused installations

Without `--path`, `--global`, or `--env`, mise edits the first loaded config that declares one of the tools; in your home directory it edits the global config. A version argument matches the configured request literally: to remove `node = "20"`, use `mise unuse node@20`, not the installed version it resolved to. Omit the version to remove every request for that tool from the selected file.

The installed versions the arguments name are pruned only when no remaining tracked config or tool stub needs them; mise says which file keeps one. A tool named without a version has all of its unused versions pruned. Pass `--no-prune` to edit the config and keep the installations. To remove an installation without editing config, use `mise uninstall`.

Usage: mise unuse [OPTIONS] <INSTALLED_TOOL@VERSION> ...

Options:

-e, --env <ENV>

Edit mise.<ENV>.toml in the current directory, or .mise.<ENV>.toml if that exists

Not the same as the global -E, which only chooses which config files are loaded.

-g, --global

Use the global config file (`~/.config/mise/config.toml`) instead of the local one

-p, --path, --file <PATH>

Edit this config file, or the config file in this directory

--override

Write to the global override file, `config.override.toml`

The override file outranks all project config. With `--env`, writes `config.<ENV>.override.toml` instead. See https://mise.jdx.dev/configuration.html#override-file

--no-prune

Do not also prune the installed version

-h, --help

Print help Arguments:

<INSTALLED_TOOL@VERSION>

Tools to remove from the config, with the version written as in the config Examples:

Remove [email protected] from mise.toml and uninstall it if nothing else uses it

mise unuse [email protected]

Remove it from the global config instead

mise unuse -g [email protected]

Remove the node@20 request from mise.staging.toml

mise unuse --env staging node@20

MISE UPGRADE

Upgrade outdated tools

By default, keeps the range in mise.toml: with `node = "20"`, it installs the newest 20.x release. Use `--bump` to upgrade to the newest release overall and update the version in mise.toml. Also updates mise.lock when lockfiles are enabled; see https://mise.jdx.dev/dev-tools/mise-lock.html

The version you upgraded from is removed after the `upgrade.prune_after` setting's grace period unless a tracked config or tool stub still uses it. Pass `--prune` to remove it now or `--no-prune` to keep it.

Usage: mise upgrade [OPTIONS] [<INSTALLED_TOOL@VERSION>] ...

Options:

-b, --bump

Upgrade past the configured range to the newest release, and update the config to match

The config keeps its precision: `node = "20"` becomes `node = "22"`, and `node = "20.0.0"` becomes `node = "22.1.0"`. If you name a version on the command line (`node@latest`, `node@3`, or `node@prefix:3`), that request is written instead; `mise upgrade node@latest --bump` writes `latest`. With the `pin` setting on, a version request such as `node@3` is written as the version it resolved to, and a bare `mise upgrade --bump` writes the resolved version for every request that is not exact, such as `latest` or `20`. Requests that do not come from a config file mise can write, such as `MISE_NODE_VERSION`, are upgraded but not written.

--pin

With --bump, write the resolved version instead of keeping the request's precision

`node = "latest"` and `node = "20"` become `node = "24.14.0"`. A named request such as `node@3` is written as the version it resolved to. Make this the default with the `pin` setting (`MISE_PIN=1`).

-i, --interactive

Choose which tools to upgrade from a multiselect menu

-j, --jobs <JOBS>

Number of jobs to run in parallel (default: the `jobs` setting)

Environment: MISE_JOBS

-l

Deprecated shorthand for --bump

-n, --dry-run

Show what would change without changing anything

-x, --exclude <INSTALLED_TOOL>

Tools to exclude from upgrading, such as go python

--dry-run-code

Like --dry-run, but exit with code 1 if there are outdated tools

Use it in scripts that check whether tools need upgrading.

--inactive

Also upgrade installed tools that the current config does not request

--global

Only upgrade tools defined in the global config

Upgrades the requests in the global and system config (~/.config/mise/config.toml, /etc/mise/config.toml), even where a project config or a `MISE_<TOOL>_VERSION` environment variable sets its own version of the tool. It runs as if from outside any project, so project config, lockfiles, and `[env]` are neither read nor changed. Tools that update themselves, such as coding agents, run this instead of their own updater; see https://mise.jdx.dev/dev-tools/self-updating-tools.html

--local

Deprecated alias for --no-global

Removed in mise 2027.7.0.

--no-global

Only upgrade tools defined in project config files

Skips tools defined in the global config (~/.config/mise/config.toml) and tools set through `MISE_<TOOL>_VERSION` environment variables.

--minimum-release-age <MINIMUM_RELEASE_AGE>

Only upgrade to versions released before this date or older than this duration

Supports absolute dates such as "2024-06-01" and relative durations such as "90d" or "1y".

Applies only to requests that can match several versions, such as "20" or "latest". Exact versions such as "22.5.0" are not filtered.

--monorepo

Placeholder for future monorepo upgrades; `mise upgrade --monorepo` is not implemented yet.

--no-prune

Do not uninstall the versions that were upgraded away from

The old version is left in place and is not scheduled for removal. Use this when something outside mise points at the install directory.

Set `upgrade.auto_prune = false` to make this the default.

--prune

Immediately uninstall the versions that were upgraded away from

Use this to bypass `upgrade.prune_after`, or to override `upgrade.auto_prune = false` for a single run.

--raw

Connect the install commands' stdin, stdout, and stderr to the terminal

Implies `--jobs=1`.

-h, --help

Print help Arguments:

<INSTALLED_TOOL@VERSION>

Tools to upgrade, such as node@20 [email protected]

Upgrades every configured tool when omitted. Examples:

Upgrade every configured tool within its range

mise upgrade

Upgrade only node

mise upgrade node

Upgrade every tool to its newest release and update mise.toml

mise upgrade --bump

Show what would be upgraded

mise upgrade --dry-run

Upgrade everything except go

mise upgrade --exclude go

Choose tools from a menu

mise upgrade --interactive

Upgrade claude within the global config's request, leaving project config alone

mise upgrade --global claude

MISE USE

Install a tool and add it to configuration

Installs missing tool versions and records the requests in a config file. By default, mise selects the nearest directory with a supported config and writes to its lowest-precedence file, such as `mise.toml` rather than `mise.local.toml`. If no project config exists, it creates one in the current directory. Run from your home directory, it writes to the global config.

Use `--path` for an explicit file or directory, `--global` for personal defaults, or `--env` to write `mise.ENV.toml` in the current directory (an existing `.mise.ENV.toml` is used instead). If you pass more than one, the last one wins.

See https://mise.jdx.dev/configuration.html#target-file-for-write-operations for filename overrides and config precedence. The change takes effect in an activated shell at its next prompt, and immediately in `mise exec` commands.

Usage: mise use [OPTIONS] [TOOL@VERSION]…

Options:

-e, --env <ENV>

Write mise.<ENV>.toml in the current directory, or .mise.<ENV>.toml if that exists

Not the same as the global -E, which only chooses which config files are loaded.

-f, --force

Reinstall even if already installed

-g, --global

Write to the global config instead of the project config

Updates the global config file that already declares the tool, otherwise the file set by the `write_targets.tools` setting, otherwise ~/.config/mise/config.toml.

-j, --jobs <JOBS>

Number of jobs to run in parallel (default: the `jobs` setting)

Environment: MISE_JOBS

-n, --dry-run

Show what would change without changing anything

-p, --path <PATH>

Write to this config file, or to the config file in this directory

For a directory, mise picks the file by the usual write-target rules.

--override

Write to the global override file, `config.override.toml`

The override file outranks all project config. With `--env`, writes `config.<ENV>.override.toml` instead. See https://mise.jdx.dev/configuration.html#override-file

--dry-run-code

Like --dry-run, but exit with code 1 if there are changes to make

Use it in scripts that check whether tools need to be added or removed.

--fuzzy

Write the version as requested, such as `20` for node@20

This is the default unless the `pin` setting is on.

--minimum-release-age <MINIMUM_RELEASE_AGE>

Only install versions released before this date or older than this duration

Supports absolute dates such as "2024-06-01" and relative durations such as "90d" or "1y".

--pin

Write the resolved version, such as `20.19.5` for node@20

If the request exactly matches an available release, mise uses that release rather than an installed version that only matches it as a prefix. Write `prefix:` before the version, as in `node@prefix:20`, to force prefix matching. Make this the default with the `pin` setting (`MISE_PIN=1`).

To record exact versions without editing mise.toml, use a lockfile: https://mise.jdx.dev/dev-tools/mise-lock.html

--raw

Connect the install commands' stdin, stdout, and stderr to the terminal

Implies `--jobs=1`.

--remove <TOOL>

Remove these tools from the config file

-h, --help

Print help

--postinstall <COMMAND>

Command to run after installing this tool

--tool-option <KEY=VALUE>

Set an option for the tool that follows; repeat for several options

Values use inline tool-option types; unquoted text is a string. Put these flags before the tool they apply to. Arguments:

<TOOL@VERSION>

Tool to add to the config file, such as node@24, cargo:ripgrep@latest, or npm:prettier@3

Without a version, mise requests `latest` but reuses the newest installed version. Write `@latest` to install the newest release; in locked mode the lockfile still decides. With --pin it writes the resolved version. Tool options can also be set inline:

mise use "cargo:ripgrep[features=pcre2]" Examples:

Choose tools from an interactive selector

mise use

Use node 24.x in the project config and record the request `24`

mise use node@24

Run a command after installing a tool

mise use --postinstall "mbx setup --defaults" mr-boxington

Give each tool its own postinstall command

mise use --postinstall "corepack enable" node@24 --postinstall "python -m pip install -U pip" [email protected]

Enable a Rust tool option while installing Rust and mbx

mise use --tool-option mr_boxington=true rust mr-boxington

Use node 24.x globally and record the exact version it resolves to

mise use -g --pin node@24

Write mise.local.toml (an existing .mise.local.toml is used instead)

mise use --env local node@24

Write mise.staging.toml, which mise loads when MISE_ENV=staging

mise use --env staging node@24

MISE VARS

List, set, and ask for config vars

Like `mise set`: with no arguments, lists every var and where it comes from; `mise vars NAME=VALUE` saves a value on this machine and `mise vars NAME` prints one. Saved values live in `$MISE_STATE_DIR/vars.toml`, outside every config file, and sit above a var's `default` but below any value a config file sets. `mise vars prompt` asks for the `[vars]` that declare a `prompt`; only it and `mise bootstrap --prompt-vars` ever ask. See https://mise.jdx.dev/configuration/vars.html#prompt

Usage: mise vars [OPTIONS] [<NAME[=VALUE]>] ... [COMMAND]

Options:

-J, --json

Output in JSON format

--json-extended

Output in JSON format with sources

--no-header

Do not print the table header

-h, --help

Print help Arguments:

<NAME[=VALUE]>

Values to save (`NAME=VALUE`) or to print (`NAME`) Examples:

Save a value on this machine without asking

mise vars git_name="Ada Lovelace"

Print the saved value of git_name

mise vars git_name

List every var and its source

mise vars

MISE VARS LS

List every var, with the file it comes from

Lists the `[vars]` of every config file mise loads here, plus the answers saved on this machine (source: `$MISE_STATE_DIR/vars.toml`). Values hidden with `redact` show as `[redacted]`. A `required` var that is still unset only warns here. `--json` prints an object of names and values, and `--json-extended` adds each var's source.

Usage: mise vars ls [OPTIONS]

Options:

-J, --json

Output in JSON format

--json-extended

Output in JSON format with sources

--no-header

Do not print the table header

-h, --help

Print help

MISE VARS PROMPT

Ask for the prompt vars that have no saved answer, or set answers directly

Enter accepts the suggested default. Each answer, accepted defaults included, is saved and never asked for again; use `mise vars unset` to be asked again. With no arguments, asks about every unanswered `prompt` var in the config files that apply here. `NAME` asks for only that var; `NAME=VALUE` saves the answer without asking, as `mise set` does for an env var, so it needs no terminal.

Usage: mise vars prompt [OPTIONS] [<NAME[=VALUE]>] ...

Options:

-h, --help

Print help Arguments:

<NAME[=VALUE]>

Vars to ask for (`NAME`) or answers to save (`NAME=VALUE`) Examples:

Ask for every unanswered prompt var

mise vars prompt

Ask for git_name only

mise vars prompt git_name

Set the answer for git_name without asking

mise vars prompt git_name="Ada Lovelace"

MISE VARS UNSET

Forget saved answers so they are asked for again

Edits `$MISE_STATE_DIR/vars.toml`; no config is loaded. The next `mise vars prompt` or `mise bootstrap --prompt-vars` asks again.

Usage: mise vars unset [OPTIONS] [<NAME>] ...

Options:

-h, --help

Print help Arguments:

<NAME>

The vars whose answers to forget Examples:

Be asked for git_name again

mise vars unset git_name

MISE VERSION

Show the version of mise

Prints the version, OS, architecture, and build date, and warns when a newer release is available. `mise --version`, `mise -V`, and `mise -v` with no other arguments print the same line.

Usage: mise version [OPTIONS]

Options:

-J, --json

Print the version information in JSON format

-h, --help

Print help Examples:

Show the version

mise version 2026.10.4 linux-x64 (2026-10-07)

Also show the latest release and the build time, as JSON

mise version --json

MISE WATCH

Run tasks and rerun them when files change

Runs the tasks with `mise run` under watchexec, then reruns them whenever one of their `sources` changes, including the sources of their dependencies unless you pass `--skip-deps`. When no selected task declares `sources`, watchexec watches the current directory. With no task, runs the `default` task.

Choose what to watch with `--watch`, `--exts`, and `--filter`, and use `--print-events` to see what triggered a run. Arguments for the task go after `--`. Requires watchexec, which `mise use -g watchexec` installs.

To keep a server or database running alongside your tasks, with readiness checks and automatic restarts, see `mise daemons` (experimental): https://mise.jdx.dev/daemons.html. For cron scheduling and standalone process management, see pitchfork: https://pitchfork.jdx.dev

Usage: mise watch [OPTIONS] [<TASK>] [<ARGS>] ...

Options:

-t, --task-flag <TASK_FLAG>

Tasks to run

-g, --glob <GLOB>

Globs to watch instead of the tasks' sources

--skip-deps

Run and watch only the named tasks, not the tasks they depend on

-w, --watch <PATH>

Watch a file or directory

By default, mise watches each task's directory and any source directory outside it, and filters events to the tasks' `sources`. When no task declares sources, watchexec watches the current directory. Paths given here are added to the task directories, or replace the current-directory default when there are no sources. Events are still filtered to the sources, so use `--filter` to widen what triggers a rerun.

To watch a single file, watch its directory and filter on the file name instead: some editors replace a file when they save it, and some platforms do not report changes to the replacement. Repeat the flag to watch several paths.

-W, --watch-non-recursive <PATH>

Watch a directory without recursing into it

Repeat the flag to watch several directories.

-F, --watch-file <PATH>

Read paths to watch from a file, one per line

Each line is treated like a `--watch` value. The value `-` reads from stdin and cannot be combined with `--stdin-quit`.

-c, --clear <MODE>

Clear the screen before each run

If the default `clear` mode leaves output behind, use `--clear=reset`. Because the mode is optional, `mise watch --clear build` reads `build` as the mode: put `--clear` after the task name, as in `mise watch build --clear`, or write the mode with `=`.

-o, --on-busy-update <MODE>

What to do when files change while the tasks are running

`do-nothing` (the default) ignores the change, so files the tasks write do not trigger another run. `queue` runs the tasks again when the current run finishes. `restart` stops the running tasks and starts them again. `signal` sends the `--signal` signal and keeps the tasks running, for programs that reload their configuration on a signal.

Default: do-nothing

-r, --restart

Restart the tasks if they are still running when files change

Same as `--on-busy-update=restart`.

-s, --signal <SIGNAL>

Signal to send to the running tasks when files change

Implies `--on-busy-update=signal`. Accepts the same forms as `--stop-signal`. Signals are not supported on Windows, where the tasks are always killed.

--stop-signal <SIGNAL>

Signal that stops the tasks before a restart (default on Unix: SIGTERM)

Used by the `restart` and `signal` modes of `--on-busy-update` unless `--signal` is given. Accepts a full name (`SIGTERM`), a short name (`TERM`), or a number (`15`), in any case. If the tasks have not exited after `--stop-timeout`, they are killed. On Windows the tasks are always killed.

--stop-timeout <TIMEOUT>

How long to wait for the tasks to stop before killing them (default: 10s)

Takes a duration such as `5s` or `1min 20s`. Set it to 0 to kill the tasks right away. Has no effect on Windows, where the tasks are always killed.

Default: 10s

--map-signal <SIGNAL:SIGNAL>

Translate a signal that watchexec receives into one it sends to the tasks

Takes two signal names separated by a colon, such as `TERM:INT`. Leave out the second name to discard the first signal (`TERM:`). A mapped SIGINT or SIGTERM no longer stops watching; `INT:INT` passes Ctrl-C to the tasks without stopping watchexec. Repeat the flag to map several signals.

-d, --debounce <TIMEOUT>

How long to wait for more changes before running (default: 50ms)

One save can produce several events, and a file can be written in pieces, so watchexec waits this long after an event before running the tasks. Takes a duration such as `500ms` or `2s`.

Default: 50ms

--stdin-quit

Exit when stdin closes

--no-vcs-ignore

Do not apply Git and other version control ignore files

Use it to watch files that Git ignores. A task can turn this on for itself with `watch = { no_vcs_ignore = true }`.

--no-project-ignore

Do not apply ignore files in the project, such as `.gitignore` and `.ignore`

--no-global-ignore

Do not apply global ignore files, such as `~/.gitignore` and `~/.config/watchexec/ignore`

--no-default-ignore

Do not apply watchexec's built-in ignores

They cover editor swap files, `*.pyc`, `.DS_Store`, and version control directories such as `.git`.

--no-discover-ignore

Do not look for ignore files at all

Same as `--no-global-ignore --no-vcs-ignore --no-project-ignore`, but faster. Built-in ignores still apply.

--ignore-nothing

Ignore nothing

Same as `--no-discover-ignore --no-default-ignore`. Patterns from `--ignore` and `--ignore-file` still apply.

-p, --postpone

Wait for the first change before running the tasks

--delay-run <DURATION>

Wait this long after a change before running the tasks, e.g. 5s

--poll <INTERVAL>

Poll for changes instead of using native file watching

Use it on file systems where native events do not work, such as network shares. Takes an optional interval such as `2s` (default: 30s). Also accepted as `--force-poll`.

--shell <SHELL>

Use a different shell

By default, Watchexec will use '$SHELL' if it's defined or a default of 'sh' on Unix-likes, and either 'pwsh', 'powershell', or 'cmd' (CMD.EXE) on Windows, depending on what Watchexec detects is the running shell.

With this option, you can override that and use a different shell, for example one with more features or one which has your custom aliases and functions.

If the value has spaces, it is parsed as a command line, and the first word used as the shell program, with the rest as arguments to the shell.

The command is run with the '-c' flag (except for 'cmd' on Windows, where it's '/C').

The special value 'none' can be used to disable shell use entirely. In that case, the command provided to Watchexec will be parsed, with the first word being the executable and the rest being the arguments, and executed directly. Note that this parsing is rudimentary, and may not work as expected in all cases.

Using 'none' is a little more efficient and can enable a stricter interpretation of the input, but it also means that you can't use shell features like globbing, redirection, control flow, logic, or pipes.

Examples:

Use without shell:

$ watchexec -n -- zsh -x -o shwordsplit scr

Use with powershell core:

$ watchexec --shell=pwsh -- Test-Connection localhost

Use with CMD.exe:

$ watchexec --shell=cmd -- dir

Use with a different unix shell:

$ watchexec --shell=bash -- 'echo $BASH_VERSION'

Use with a unix shell and options:

$ watchexec --shell='zsh -x -o shwordsplit' -- scr

-n

Shorthand for '--shell=none'

--emit-events-to <MODE>

Configure event emission

Watchexec can emit event information when running a command, which can be used by the child process to target specific changed files.

One thing to take care with is assuming inherent behaviour where there is only chance. Notably, it could appear as if the `RENAMED` variable contains both the original and the new path being renamed. In previous versions, it would even appear on some platforms as if the original always came before the new. However, none of this was true. It's impossible to reliably and portably know which changed path is the old or new, "half" renames may appear (only the original, only the new), "unknown" renames may appear (change was a rename, but whether it was the old or new isn't known), rename events might split across two debouncing boundaries, and so on.

This option controls where that information is emitted. It defaults to 'none', which doesn't emit event information at all. The other options are 'environment' (deprecated), 'stdio', 'file', 'json-stdio', and 'json-file'.

The 'stdio' and 'file' modes are text-based: 'stdio' writes absolute paths to the stdin of the command, one per line, each prefixed with `create:`, `remove:`, `rename:`, `modify:`, or `other:`, then closes the handle; 'file' writes the same thing to a temporary file, and its path is given with the $WATCHEXEC_EVENTS_FILE environment variable.

There are also two JSON modes, which are based on JSON objects and can represent the full set of events Watchexec handles. Here's an example of a folder being created on Linux:

```json
{
"tags": [
{
"kind": "path",
"absolute": "/home/user/your/new-folder",
"filetype": "dir"
},
{
"kind": "fs",
"simple": "create",
"full": "Create(Folder)"
},
{
"kind": "source",
"source": "filesystem"
}
],
"metadata": {
"notify-backend": "inotify"
}
} ```

The fields are as follows:

- `tags`, structured event data.
- `tags[].kind`, which can be:
* 'path', along with:
+ `absolute`, an absolute path.
+ `filetype`, a file type if known ('dir', 'file', 'symlink', 'other').
* 'fs':
+ `simple`, the "simple" event type ('access', 'create', 'modify', 'remove', or 'other').
+ `full`, the "full" event type, which is too complex to fully describe here, but looks like 'General(Precise(Specific))'.
* 'source', along with:
+ `source`, the source of the event ('filesystem', 'keyboard', 'mouse', 'os', 'time', 'internal').
* 'keyboard', along with:
+ `keycode`. Currently only the value 'eof' is supported.
* 'process', for events caused by processes:
+ `pid`, the process ID.
* 'signal', for signals sent to Watchexec:
+ `signal`, the normalised signal name ('hangup', 'interrupt', 'quit', 'terminate', 'user1', 'user2').
* 'completion', for when a command ends:
+ `disposition`, the exit disposition ('success', 'error', 'signal', 'stop', 'exception', 'continued').
+ `code`, the exit, signal, stop, or exception code.
- `metadata`, additional information about the event.

The 'json-stdio' mode will emit JSON events to the standard input of the command, one per line, then close stdin. The 'json-file' mode will create a temporary file, write the events to it, and provide the path to the file with the $WATCHEXEC_EVENTS_FILE environment variable.

Finally, the 'environment' mode was the default until 2.0. It sets environment variables with the paths of the affected files, for filesystem events:

$WATCHEXEC_COMMON_PATH is set to the longest common path of all of the below variables, and so should be prepended to each path to obtain the full/real path. Then:

- $WATCHEXEC_CREATED_PATH is set when files/folders were created
- $WATCHEXEC_REMOVED_PATH is set when files/folders were removed
- $WATCHEXEC_RENAMED_PATH is set when files/folders were renamed
- $WATCHEXEC_WRITTEN_PATH is set when files/folders were modified
- $WATCHEXEC_META_CHANGED_PATH is set when files/folders' metadata were modified
- $WATCHEXEC_OTHERWISE_CHANGED_PATH is set for every other kind of pathed event

Multiple paths are separated by the system path separator, ';' on Windows and ':' on unix. Within each variable, paths are deduplicated and sorted in binary order (i.e. neither Unicode nor locale aware).

This is the legacy mode, is deprecated, and will be removed in the future. The environment is a very restricted space, while also limited in what it can usefully represent. Large numbers of files will either cause the environment to be truncated, or may error or crash the process entirely. The $WATCHEXEC_COMMON_PATH is also unintuitive, as demonstrated by the multiple confused queries that have landed in my inbox over the years.

Default: none

--only-emit-events

Only emit events to stdout, run no commands.

This is a convenience option for using Watchexec as a file watcher, without running any commands. It is almost equivalent to using `cat` as the command, except that it will not spawn a new process for each event.

This option requires `--emit-events-to` to be set, and restricts the available modes to `stdio` and `json-stdio`, modifying their behaviour to write to stdout instead of the stdin of the command.

--watchexec-env <KEY=VALUE>

Add env vars to the command

This is a convenience option for setting environment variables for the command, without setting them for the Watchexec process itself.

Use key=value syntax. Multiple variables can be set by repeating the option.

This is watchexec's '--env'. In mise, '-E'/'--env' selects the mise environment (`mise.<ENV>.toml`), as it does for every other command.

--wrap-process <MODE>

How to wrap the task process: group, session, or none

By default watchexec uses a session on macOS, a process group on other Unix systems, and a Job Object on Windows. Some programs need a session, and some do not work in a process group; `none` runs the command directly. On Windows, `group` and `session` both use a Job Object.

-N, --notify

Alert when commands start and end

With this, Watchexec will emit a desktop notification when a command starts and ends, on supported platforms. On unsupported platforms, it may silently do nothing, or log a warning.

--color <MODE>

When to use terminal colours

Setting the environment variable `NO_COLOR` to any value is equivalent to `--color=never`.

Default: auto

--timings

Print how long the command took to run

This may not be exactly accurate, as it includes some overhead from Watchexec itself. Use the `time` utility, high-precision timers, or benchmarking tools for more accurate results.

--watchexec-quiet

Don't print starting and stopping messages

By default Watchexec will print a message when the command starts and stops. This option disables this behaviour, so only the command's output, warnings, and errors will be printed.

This is watchexec's '--quiet'. In mise, '-q'/'--quiet' quiets mise's own messages, as it does for every other command.

--bell

Ring the terminal bell on command completion

--project-origin <DIRECTORY>

Set the project origin

Watchexec will attempt to discover the project's "origin" (or "root") by searching for a variety of markers, like files or directory patterns. It does its best but sometimes gets it it wrong, and you can override that with this option.

The project origin is used to determine the path of certain ignore files, which VCS is being used, the meaning of a leading '/' in filtering patterns, and maybe more in the future.

When set, Watchexec will also not bother searching, which can be significantly faster.

The directory must contain every watched task's sources, which mise makes relative to it.

--workdir <DIRECTORY>

Has no effect: mise runs each task from its own `dir`

Accepted so scripts that pass it keep working. Forwarding it would make the nested `mise run` look for tasks in that directory instead of this project.

-e, --exts <EXTENSIONS>

Only react to files with these extensions, e.g. js,ts

Give extensions with or without the leading dot. Repeat the flag or separate extensions with commas.

-f, --filter <PATTERN>

Only react to files that match this glob

Combined with the patterns mise derives from the tasks' `sources`. Repeat the flag for more patterns. Events that do not come from files, such as signals, pass through.

--filter-file <PATH>

Files to load filters from

Provide a path to a file containing filters, one per line. Empty lines and lines starting with '#' are ignored. Uses the same pattern format as the '--filter' option.

This can also be used via the $WATCHEXEC_FILTER_FILES environment variable.

Environment: WATCHEXEC_FILTER_FILES

-J, --filter-prog <EXPRESSION>

[experimental] Filter programs.

/!\ This option is EXPERIMENTAL and may change and/or vanish without notice.

Provide your own custom filter programs in jaq (similar to jq) syntax. Programs are given an event in the same format as described in '--emit-events-to' and must return a boolean. Invalid programs will make watchexec fail to start; use '-v' to see program runtime errors.

In addition to the jaq stdlib, watchexec adds some custom filter definitions:

- 'path | file_meta' returns file metadata or null if the file does not exist.

- 'path | file_size' returns the size of the file at path, or null if it does not exist.

- 'path | file_read(bytes)' returns a string with the first n bytes of the file at path.
If the file is smaller than n bytes, the whole file is returned. There is no filter to
read the whole file at once to encourage limiting the amount of data read and processed.

- 'string | hash', and 'path | file_hash' return the hash of the string or file at path.
No guarantee is made about the algorithm used: treat it as an opaque value.

- 'any | kv_store(key)', 'kv_fetch(key)', and 'kv_clear' provide a simple key-value store.
Data is kept in memory only, there is no persistence. Consistency is not guaranteed.

- 'any | printout', 'any | printerr', and 'any | log(level)' will print or log any given
value to stdout, stderr, or the log (levels = error, warn, info, debug, trace), and
pass the value through (so '[1] | log("debug") | .[]' will produce a '1' and log '[1]').

All filtering done with such programs, and especially those using kv or filesystem access, is much slower than the other filtering methods. If filtering is too slow, events will back up and stall watchexec. Take care when designing your filters.

If the argument to this option starts with an '@', the rest of the argument is taken to be the path to a file containing a jaq program.

Jaq programs are run in order, after all other filters, and short-circuit: if a filter (jaq or not) rejects an event, execution stops there, and no other filters are run. Additionally, they stop after outputting the first value, so you'll want to use 'any' or 'all' when iterating, otherwise only the first item will be processed, which can be quite confusing!

Find user-contributed programs or submit your own useful ones at <https://github.com/watchexec/watchexec/discussions/592>.

## Examples:

Regexp ignore filter on paths:

'all(.tags[] | select(.kind == "path"); .absolute | test("[.]test[.]js$")) | not'

Pass any event that creates a file:

'any(.tags[] | select(.kind == "fs"); .simple == "create")'

Pass events that touch executable files:

'any(.tags[] | select(.kind == "path" and .filetype == "file"); .absolute | file_meta | .executable)'

Ignore files that start with shebangs:

'any(.tags[] | select(.kind == "path" and .filetype == "file"); .absolute | file_read(2) == "#!") | not'

-i, --ignore <PATTERN>

Ignore files that match this glob

Repeat the flag for more patterns. Events that do not come from files, such as signals, pass through.

--ignore-file <PATH>

Read ignore patterns from a file, one per line

Empty lines and lines that start with `#` are skipped. The patterns use the same format as `--ignore`. Also read from `$WATCHEXEC_IGNORE_FILES`.

Environment: WATCHEXEC_IGNORE_FILES

--fs-events <EVENTS>

Filesystem events to filter to

This is a quick filter to only emit events for the given types of filesystem changes. Choose from 'access', 'create', 'remove', 'rename', 'modify', 'metadata'. Multiple types can be given by repeating the option or by separating them with commas. By default, this is all types except for 'access'.

This may apply filtering at the kernel level when possible, which can be more efficient, but may be more confusing when reading the logs.

Default: create,remove,rename,modify,metadata

--no-meta

Don't emit fs events for metadata changes

This is a shorthand for '--fs-events create,remove,rename,modify'. Using it alongside the '--fs-events' option is non-sensical and not allowed.

--print-events

Print the events that trigger each run

Use it to check which files `--watch`, `--filter`, and the tasks' `sources` are reacting to.

--manual

Show the manual page

This shows the manual page for Watchexec, if the output is a terminal and the 'man' program is available. If not, the manual page is printed to stdout in ROFF format (suitable for writing to a watchexec.1 file).

-h, --help

Print help Arguments:

<TASK>

Task to watch (default: `default`); separate several tasks with `:::`

<ARGS>

Arguments for the task; `:::` starts the next task Examples:

Run build and rerun it whenever its sources change

mise watch build

Clear the screen before each run

mise watch build --clear

Start an API server and restart it when Rust files in ./src change

mise watch serve --watch src --exts rs --restart

Pass arguments after -- to the task

mise watch test -- --verbose

MISE WHERE

Show the install directory of a tool version

Fails if no matching version is installed.

Usage: mise where [OPTIONS] <TOOL@VERSION> [<ASDF_VERSION>]

Options:

-h, --help

Print help Arguments:

<TOOL@VERSION>

Tool to look up, such as ruby@3

With a version prefix, shows the newest installed version that matches it. Otherwise, shows the active installed version.

<ASDF_VERSION>

the version prefix to use when querying the latest version same as the first argument after the "@" used for asdf compatibility Examples:

Show the newest installed node 20.x

mise where node@20 ~/.local/share/mise/installs/node/20.0.0

Show the active node, or the newest installed node if no config requests one

mise where node ~/.local/share/mise/installs/node/20.0.0

MISE WHICH

Show the path a tool's executable resolves to

Prints the real path of the executable mise would run for BIN_NAME in the current directory, bypassing shims. Use `--version` or `--plugin` to see which tool version provides it.

Usage: mise which [OPTIONS] [<BIN_NAME>]

Options:

-t, --tool <TOOL@VERSION>

Look in a specific tool version, such as `mise which npm --tool=node@20`

--complete
--plugin

Show the name of the tool that provides the executable

--version

Show the version instead of the path

-h, --help

Print help Arguments:

<BIN_NAME>

The executable to look up Examples:

Show the path of the node executable

mise which node ~/.local/share/mise/installs/node/20.0.0/bin/node

Show the tool that provides it

mise which node --plugin node

Show the version that provides it

mise which node --version 20.0.0

EXAMPLES

Install node 24 and add it to the project's mise.toml

mise use node@24

Make node 24 your global default

mise use -g node@24

Install every tool the config requests

mise install

Run a command with the project's tools on PATH

mise x -- npm install

Run a command with a tool that is not in the config

mise x [email protected] -- python app.py

Add an environment variable to mise.toml

mise set NODE_ENV=production

Run the build task

mise run build

Rerun the build task when its sources change

mise watch build

Choose tools to upgrade from a menu

mise upgrade --interactive

Turn off color in the global config

mise settings color=0

AUTHOR

Jeff Dickey <@jdx>