mise-en-place
The front-end to your dev env Pronounced "MEEZ ahn plahs"
- site: https://mise.jdx.dev/
You can now uninstall only the tools the current project requests, and new --no-global and --project flags replace the two different meanings --local had. Dotfiles can merge into JSONC files like VS Code's settings.json and can seed a file once without overwriting later edits. node@lts now resolves to Node.js 26. The rest of the release adds an ipv4_only setting, JSON output for mise vars, and fixes for Windows, lockfiles, pruning and GitHub release listing.
Added
-
mise uninstall --projectandmise ls --project.mise uninstall --projectremoves the installed versions requested by the nearest project's config files:mise.toml,mise.local.toml,conf.dfragments,.tool-versionsand idiomatic version files in that directory. Config in parent directories and global config is not included. It lists each version with the file that requests it and asks before removing anything.--yesskips the prompt, and--dry-runonly shows the list.mise ls --projectlists the same scope. Installs are shared between projects, so another project using the same version will need to reinstall it. #15079, #15081 (@jdx, @httpete-broadcom)$ cd ~/work/app # ~/work/mise.toml also exists $ mise ls --no-global # app's config and ~/work's, not the global config $ mise ls --project # app's config only $ mise uninstall --project # removes the versions app's config names, after asking -
--no-globalonls,outdated,upgradeandtasks ls. It selects tools or tasks from all non-global config, including parent directories, and does what--localdid on these commands. #15081 (@jdx) -
Dotfile merges into JSONC files. A
mergeentry can now edit files that contain comments and trailing commas, such as VS Code'ssettings.json. It keeps the file's comments, indentation and any keys the source doesn't set..jsonctargets are detected automatically. For other files, set the newformatkey (json,jsonc,tomloryaml). A.jsontarget withoutformatis still parsed as strict JSON. Merge sources that fail to parse now report the file path and the parse error. #15077 (@jdx, @TimonLukas)[dotfiles] "~/.config/Code/User/settings.json/shared" = { source = "vscode/shared.json", merge = true, format = "jsonc" } -
create_if_missingfor dotfiles.copy,templateand inlinecontententries withcreate_if_missing = truewrite the target only when nothing exists there. After that, local edits are left alone and do not count as drift inmise dot statusormise dot diff. If you delete the target, the next apply creates it again. This works for files that are filled in on each machine, such as local tokens. #15080 (@jdx, @thernstig)[dotfiles] "~/.config/mise/conf.d/private.local.toml" = { source = "templates/private.toml", mode = "copy", permissions = "0600", create_if_missing = true } -
permissionson dotfilemergeentries. The mode is applied only when the merge creates the file. Files that already exist keep their mode. Merge entries for the same file must not set different modes. #15087 (@jdx, @thernstig) -
ipv4_onlysetting. Setipv4_only = true(orMISE_IPV4_ONLY=1) for networks where a host fails over IPv6, for exampledl.google.comreturning 404 or Sigstore TUF fetches failing. This applies to mise's own HTTP connections: downloads, version lookups, GitHub API calls, attestation verification and vfox plugins. External programs such asgit,npmand thenpm:backend's package manager still use the system resolver. The default isfalse. #15057 (@jdx, @Alby02) -
mise vars --jsonand--json-extended. Prints vars as JSON.--json-extendedalso includes the file each value comes from. Redacted values stay[redacted]. #15069 (@jdx, @artemklevtsov) -
mise shell --unset --all. Removes everyMISE_<TOOL>_VERSIONoverride from the current shell in one command, including ones you exported by hand. #15088 (@jdx, @wfouche) -
Bootstrap hook descriptions. A hook table can set
description, andmise bootstrapprints it instead of the hook's script. Without a description, mise prints$followed by the command's first line, cut to the terminal width.--verboseand--dry-runstill print the full script. #15106 (@jdx, @owpac)[bootstrap.hooks.final] description = "Remove the root copy of pam_reattach if Homebrew removed the module" run = "..." -
Debian packages from the mise APT repository now include Bash, Zsh and Fish completions. #15074 (@gilesw)
-
Registry: added an aqua backend for
oxfmt. #15092 (@scop)
Changed
node@ltsnow resolves to Node.js 26, which entered Active LTS on 2026-10-28. It used to resolve to 24.lts/lithium(alsolts-lithium) selects the 26.x line. Aliases for older lines, such aslts/krypton, are unchanged. To stay on Node.js 24, pinnode@24ornode@lts/krypton. #15105 (@jdx)- Setting
system_packages.elevate_with = ""now means "never elevate": package manager commands run as the current user. This helps on hosts without root, such as Termux. Before, an empty value fell back tosudo,run0ordoas. If the setting is unset, mise still picks an elevator fromPATH. #15049 (@jdx, @iliqiliev)
Deprecated
--localonls,outdated,upgradeandtasks lsis deprecated in favor of--no-global. It still works and prints no warning for now. Warnings start in 2027.1.0, and the flag is removed in 2027.7.0.settings --localandlock --localare not affected. #15081 (@jdx)
Fixed
- On Windows, background tool updates started from the shell prompt no longer open a visible console window for each tool. #15038 (@yusoofsh)
mise pruneand automatic upgrade pruning used to keep every version of a tool while a process started through a runtime link such asinstalls/claude/latestwas running. They now keep only the version that process is running, so long-running sessions no longer stop old versions from being cleaned up. #15113 (@jdx)mise install pipx:<tool>no longer fails withmissing lockfile entrywhenlockfile_platformslists only the current platform. #15091 (@jdx, @drewbitt)- When api.github.com times out (5xx) listing releases for repositories with many assets per release, such as
github:be5invis/Iosevka, mise now retries with smaller pages of 30 and then 10 releases instead of failing. #15078 (@jdx) mise version --jsonno longer reports alatestolder than the running version, which happened with fresh or nightly builds because ofminimum_release_age. #15068 (@jdx)mise backends switchno longer fails withNo such file or directorywhen thelocks/directory next to it exists but is empty. Rollback after a failed switch also restores sidecar directories more reliably. #15060 (@zeitlinger)- Packages from a custom aqua registry whose names are not in
owner/repoform no longer printinvalid aqua toolrepeatedly. A name that no registry defines still fails withpackage not found. #15048 (@jdx, @trothwell) - A version file that links to a sibling version file, such as
.nvmrc -> .node-version, no longer prints anot readingwarning. Links to other files are still not read and still warn. #15058 (@jdx, @owpac) - Packslip versions held back by
minimum_release_ageor--beforeare now logged at debug level instead of printing one warning per version. #15056 (@jdx, @owpac) - Gem wrapper scripts now quote
GEM_HOMEand the executable path, so gems work when the install directory contains spaces or shell metacharacters. #15055 (@jdx) - Remote git sources (HTTPS and SSH) now reject a
refthat is empty, isHEAD, or starts with-. This stops option injection into git, and these sources now follow the same rules as plain git repo sources. #14832 (@Huge)
Documentation
- The secrets docs now note that reads through the fnox daemon require fnox 1.43.0. #15115 (@jdx)
New Contributors
Full Changelog: https://github.com/jdx/mise/compare/v2026.10.21...v2026.10.22
💚 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.