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]
"~/.config/mise/config.toml" = { source = "config.toml", mode = "symlink" }
Dev tools$ mise install
mise node@24.18.0 ✓ installed
mise python@3.13.14 ✓ installed
mise terraform@1.13.2 ✓ 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 = "git@github.com:me/notes.git" }
[dotfiles]
"~/.config/mise/config.toml" = { source = "config.toml", mode = "symlink" }
"~/.gitconfig" = { source = "dotfiles/gitconfig", mode = "template" }
"~/.config/nvim" = { source = "dotfiles/nvim", mode = "symlink" }
[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. Run it again and mise skips anything that's already set up. mise has its own Homebrew implementation, so it installs formulae and casks without requiring Homebrew. It replaces 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 git@github.com: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 python@3.13
    mise node@24.18.0 ✓ installed
    mise python@3.13.14 ✓ installed
    mise ./mise.toml tools: node@24.18.0, python@3.13.14
  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