Bootstrap can now install Windows packages with Chocolatey, manage systemd user units that a package already ships, and register launchd launch events. Release-based backends can filter tags with version_regex, and mise completion supports Nushell. The rest of the release fixes lockfile, OCI, dotfiles, shim and Windows bugs.
Added
-
Chocolatey package manager for bootstrap. You can declare
choco:packages in[bootstrap.packages]next towingetandscoop. Chocolatey installs packages machine-wide, which covers tools like Docker Engine and the Visual Studio build tools. It only works on Windows whenchocois onPATH, andchoco:entries are skipped on other platforms.statusworks without elevation, butapplyandupgradeneed an elevated terminal. Mise treats reboot-required exit codes (1641, 3010) as success and prints a warning.state = "absent", import and prune are not supported yet. #14978 (@jdx)[bootstrap.packages] "choco:git" = "latest" "choco:visualstudio2022buildtools" = "117.12.0"
-
Manage existing systemd user units from
[bootstrap.services]. On Linux, an entry withscope = "user"and nocommandorbuiltinnow manages a unit that already exists, such as one installed by a package. Mise runssystemctl --useragainst that unit and does not write adev.mise.*unit.state,enabledandmaskedwork the same way as for system services. Options that define a service, such ascommand,environmentorrestart, are rejected for these entries. Before, this configuration was always an error. Now, if you leave outcommandby mistake, mise reports a missing unit. #14980 (@jdx)[bootstrap.services.gnome-keyring-daemon] scope = "user" state = "running" enabled = true
-
launchd launch events. macOS LaunchAgents defined in bootstrap can now set
LaunchEvents, for example to react when a USB device is added or removed. #14992 (@deecewan) -
Let Homebrew manage casks that mise installs. With
homebrew_metadata = trueunder[bootstrap.brew], mise writes Homebrew's cask metadata after it installs abrew-caskpackage.brew upgrade,brew outdatedandbrew doctorthen recognize the cask, and from then on mise leaves it to Homebrew. This is off by default. #14929 (@jdx, @owpac) -
version_regextool option forgithub,gitlabandforgejobackends. Only release tags that match the regex are listed, resolved or installed. This helps with repositories that publish releases that aren't versions of the tool. If you also setversion_prefix, a tag must start with the prefix and match the regex. An invalid pattern is reported as an error. The registry also addsblaze, which uses this option. #14984 (@jdx)[tools] "github:indexable-inc/blaze" = { version = "latest", prerelease = true, version_regex = '^(v\d+\.\d+\.\d+|nightly)$' }
-
Nushell completions.
mise completion nu(ornushell) now works, including--install. #14999 (@jdx, @briankchan)mise completion nu > ~/.config/nushell/completions/mise.nu
-
Templates in
settings.dotfiles.root. For example,root = "{{ mise_config_dir }}/home"now resolves to a real path. Before, the template text was used as a literal path. A relative result resolves against the config root. #14969 (@jdx, @ponko2) -
jactionlintin the registry now prefers thepackslipbackend, thenaqua, thengithub. #14947 (@sahidvelji)
Changed
system_packages.elevate_withis now a global-only setting. This setting names the program mise runs instead ofsudo. Now only global config orMISE_SYSTEM_PACKAGES_ELEVATE_WITHcan set it. If a project'smise.tomlsets it, mise ignores the value and prints the usual warning. #14972 (@jdx)mise self-updateno longer replaces a mise that WinGet installed, because updating it in place breaks WinGet's management of the package. Instead, mise tells you to runwinget upgrade jdx.mise.--forceandMISE_SELF_UPDATE_AVAILABLE=truestill override this. #14977 (@jdx)- If a project config sets
write_targets.*, mise now warns that the value is ignored only when a write would have used it (mise use --global,mise dot add, ...). The warning names the file that mise writes to instead. The bootstrap docs also have a new section on keeping global config in a dotfiles repository. #14973 (@jdx)
Fixed
- Lockfiles
mise lockcan now add tools that are missing from the lockfile whentool_config.locked = true. Before, it failed with an error telling you to runmise lock. This affected Renovate bumps, for example. #15003 (@jdx, @staticaland)mise lockno longer resolves a tool, or warns about it, for platforms that the tool'sosoption excludes. #14959 (@jdx)- When the global config directory is a symlink, npm sidecars now stay in one location. Before, they switched between
locks/and.mise/locks/depending on the working directory. #14961 (@jdx) - When
mise lockor auto-locking downloads a vfox artifact, it now sends the headers from the plugin'sPreInstallhook. Before, private artifact repositories returned a 401. The headers go only to the plugin's origin and are never written tomise.lock. #15002 (@jdx, @carlosemart) - For a stale backend lock entry in the global lockfile, the warning now suggests
mise backends switch --global <tool>. Before, the suggested command didn't work. #14976 (@jdx, @jc00ke)
- Bootstrap
mise bootstrap --fromnow finds git when it was just installed outside the startupPATH, such as Homebrew in/opt/homebrew/binon a fresh Mac. #14919 (@pmmmwh)[bootstrap.compose]services that usenetwork_mode: service:X,ipc,pidorvolumes_fromno longer always reportupdate. #14958 (@jdx, @thurstonsand)- Cask apps are now staged in a hidden directory, so launchers such as Raycast no longer list them under a
Name.mise-tmp-<hash>name. #15001 (@jdx, @kyong0612)
- OCI images
- Tools whose backend comes from
[tool_alias]are now written to the image config under their resolved backend, so they still resolve inside the container. #14971 (@jdx, @artemklevtsov) - System package layers keep absolute symlink targets unchanged, and mise no longer prints false "dangling" warnings for links such as
/etc/alternatives/*. #14968 (@jdx)
- Tools whose backend comes from
- Dotfiles
mise dot statusnow shows the path of the local history repository, andmise dot trackexplains when it writes a tracking entry next to an existingcopy/symlink/templateentry. The docs now cover moving from a symlinked dotfiles repository to tracking. #14979 (@jdx)- A relative
mise dot add --sourcepath now resolves from the current directory. #14983 (@jdx, @sahidvelji) - On Windows, mise now retries
git write-treewhen Windows refuses to write a loose object. #15000 (@jdx)
- Shims and shell
- A concurrent reshim no longer briefly removes the shared command-wrappers directory. Before, a process that ran a wrapper during that window could fail with ENOENT. #14931 (@HackingGate)
- A stale or undecodable
__MISE_SESSIONno longer makesmise hook-envprintcannot install provided ErrorHookat every prompt. #14963 (@jdx) - On Windows,
hook-envno longer re-checks the health of largenpm:tool trees on every prompt. The result is cached until the install changes. #14960 (@jdx)
- Other
- When decrypting sops, mise no longer finds its own
sopsshim onPATHand recurses back into itself. It skips mise shims and keeps looking for a realsopsbinary. #14801 (@shuaiyafei) - Tera filters on
versionin tool option templates now work, for example{{ version | replace(from='-x', to='') }}in anhttpURL. If an expression mixesversionwithenvorvars, the whole expression is now rendered at install time and can no longer seeenvorvars. #14967 (@jdx) - netrc files can now contain
#comment lines. #14964 (@jdx) mise doctorno longer warns about a tool installed with an explicit backend that the registry lists for that tool. Its project output is now colored too. #14965, #14970 (@jdx, @Tsafaras)- On Windows, when a task fails, mise now stops sibling tasks that run through Git Bash instead of waiting for them to finish. The same applies to Ctrl-C and timeouts. #14966 (@jdx, @MareStare)
- When decrypting sops, mise no longer finds its own
Documentation
- The templates docs now list the settings that render templates. #15004 (@jdx, @Mossop)
- The
mise usedocs now explain that a bare tool name reuses the newest installed version. #14949 (@sahidvelji) - The IDE docs now include mise-zed, plus screenshots of mise-vscode and mise-zed. #14988 (@hverlin)
New Contributors
- @deecewan made their first contribution in #14992
- @HackingGate made their first contribution in #14931
- @shuaiyafei made their first contribution in #14801
- @sahidvelji made their first contribution in #14949
Full Changelog: v2026.10.19...v2026.10.20
💚 Sponsor mise
mise is built and maintained by @jdx, an open source developer at entire.io, the title sponsor of his open source work.
If mise saves you or your team time, please consider becoming an individual or company sponsor. Your support funds ongoing development and helps keep mise fast, free, and independent.