Skip to content
mise-en-place

Every tool, env var, and task your project needs, in one file.

mise reads a mise.toml checked into your repo, installs the right versions of your dev tools, loads the project's environment, and runs its tasks. Point it at a fresh machine and mise bootstrap sets up the rest: packages, dotfiles, services.

Getting startedWatch the demo

Open source, MITmacOS, Linux, WindowsOne static binary, no dependencies

mise-en-place

Dev tools, env vars, and tasks in one CLI

mise.tomlchecked into your repo
[tools]
node = "24"
python = "3.13"
terraform = "1.13"
[env]
DATABASE_URL = "postgres://localhost/orders"
_.file = ".env.local"
[tasks.test]
depends = ["build"]
run = "pytest"
[bootstrap.packages]
"brew:postgresql@17" = "latest"
"apt:build-essential" = "latest"
[dotfiles]
"~/.zshrc" = {}
Dev tools$ mise install
mise [email protected] ✓ installed
mise [email protected] ✓ installed
mise [email protected] ✓ installed
Environments$ mise env
export DATABASE_URL=postgres://localhost/orders
export STRIPE_KEY=sk_test_51H… # from .env.local
Tasks$ mise run test
[build] $ npm run build
[test] $ pytest
42 passed in 1.02s
Bootstrap$ mise bootstrap
mise bootstrap: system packages
brew:postgresql@17 ✓ installed
mise bootstrap: dotfiles
~/.zshrc ✓ symlinked

01 Why mise

Clear the counter.

Most projects carry a drawer of version managers, dotfiles, and a README full of setup steps. Every new machine adds a Brewfile, a dotfiles manager, and a playbook. mise replaces them with one file that's checked in, so a fresh laptop is git clone and mise bootstrap.

Coming from asdf? mise reads .tool-versions as-is. Files like .nvmrc work too, once you enable them.

Before

  • nvm, pyenv, rbenv .nvmrc, .python-version
  • direnv .envrc
  • make, just Makefile
  • Homebrew Brewfile
  • chezmoi dotfiles repo
  • Ansible playbook.yml
  • README "Setup", 14 steps

After

  • mise mise.toml
toolsenvtasksbootstrap

03 Day to day

Change directory. Everything follows.

Activate mise in your shell once. From then on, entering a project puts its tool versions on your PATH and its env vars in your shell. Leaving takes them away again.

  • Shell hooks for bash, zsh, fish, nushell, PowerShell, and more
  • Shims for editors and scripts that never source your shell rc
  • mise exec and mise-action for Docker and CI
~/workzsh
$ cd api
$ node --version
v22.12.0
$ echo $DATABASE_URL
postgres://localhost/api
 
$ cd ../dashboard
$ node --version
v24.18.0
$ mise ls --current
Tool   Version   Source
bun    1.2.20    ~/work/dashboard/mise.toml
node   24.18.0   ~/work/dashboard/mise.toml

04 New machine

mise.toml~/.config/mise
[bootstrap.packages]
"brew:postgresql@17" = "latest"
"apt:build-essential" = "latest"
[bootstrap.repos]
"~/src/notes" = { url = "[email protected]:me/notes.git" }
[dotfiles]
"~/.gitconfig" = {}
"~/.config/nvim" = {}
[bootstrap.macos.dock]
autohide = true
[bootstrap.mise_shell_activate]
zshrc = "activate"

One config for the whole machine.

mise bootstrap sets up a new computer from the same file: OS packages, git repos, dotfiles, shell activation, macOS defaults, and services, then your tools. It converges, so running it again only does what's missing. It's what you'd otherwise assemble from a Brewfile, chezmoi, and an Ansible playbook.

  • Packages through brew, apt, dnf, pacman, apk, and mas
  • Dotfiles as symlinks, copies, or templates, plus single-line edits
  • Remote hosts over SSH with mise bootstrap remote
mise bootstrap --from [email protected]:you/dotfiles.git

Read the bootstrap guide

Chef's special

Mr Boxington: fix your target/.

Give every Cargo checkout one shared, self-pruning compilation cache, locally and in CI.

mr-boxington.jdx.dev

05 Quickstart

Set up in four steps.

  1. Step 1

    Install mise

    One command, one static binary. Homebrew, apt, cargo, and more also work.

    $ curl https://mise.run | sh
    $ mise --version
    2026.9.1 linux-x64
  2. Step 2

    Hook into your shell

    Optional, but this is what makes tools and env vars switch as you cd. Other shells are one line too.

    $ echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
    # bash: ~/.bashrc · fish: config.fish · pwsh: $PROFILE
  3. Step 3

    Add tools

    mise use installs the tool and pins it in mise.toml in one go. Commit the file.

    $ mise use node@24 [email protected]
    mise [email protected] ✓ installed
    mise [email protected] ✓ installed
    mise ./mise.toml tools: [email protected], [email protected]
  4. Step 4

    Add env vars and tasks

    They live in the same file, next to the tools they depend on. Teammates run mise install; a new laptop runs mise bootstrap.

    $ mise set DATABASE_URL=postgres://localhost/orders
    $ mise tasks add test -- pytest
    $ mise run test
    [test] $ pytest
    42 passed in 1.02s

Ready when you are

Allez. Prep your station.

curl https://mise.run | sh
MIT LicenseCopyright © 2026jdx.dev