mise run --multi lets you pick several tasks from a checklist. [bootstrap.packages] keys without a manager: prefix now install through one available package manager, and the npm backend can install from an HTTPS tarball URL. Custom daemons can name several ports, and launchd agents can set resource limits. This release also changes the default prompt theme to base16 and fixes problems with tasks, mise env --dotenv, and installs.
Added
-
mise run --multi. Opens the task picker as a checklist. Press Space to check a task,/to filter, and Enter to run the checked tasks. They run as if you had joined them with:::, so they run in parallel unless one depends on another, and-jand the othermise runoptions still apply. Add--allto list tasks from every project in a monorepo.--multineeds an interactive terminal and can't be combined with a task name,--affectedor--tag. #15503 (@jdx)mise run --multi mise run --multi --all
-
Unprefixed
[bootstrap.packages]keys. A key without amanager:prefix now installs through exactly one manager, so the same config works across distributions and operating systems. mise uses the first manager that is available and allowed bysystem_packages.managers. The default order isapt,dnf,pacman,zypper,apk,brew,winget,scoop,choco. #15506 (@jdx, @thernstig)- The new
system_packages.prefersetting (MISE_SYSTEM_PACKAGES_PREFER) replaces that order, and only the managers it lists are considered. - Use the new
namesoption when a package has a different name under some managers. - mise picks the manager only by which managers are available, not by what their repositories contain. If the install fails, mise reports an error and does not try another manager.
- If no manager can install a key, mise warns and skips it.
mise bootstrap packages statuslists it asskipped. - Prefixed keys such as
"apt:git"work as before.
[bootstrap.packages] git = "latest" openssl = { names = { apt = "libssl-dev", dnf = "openssl-devel" } }
- The new
-
npm tools from HTTPS tarball URLs. The npm backend can now install a package from a tarball URL, such as a pkg.pr.new preview build. Use
npm:followed by the full URL as the tool name, for examplemise use 'npm:<tarball URL>'. The version is a prefix of the tarball's SHA-256, solatestmeans whatever the URL serves now, andmise upupdates the tool when that content changes. #15461 (@jdx, @kjanat)- Only HTTPS URLs work, and the
checksumoption isn't supported. - If the tarball depends on other URL packages, list them in
allow_exotic_deps. mise.lockrecords the version but not a dependency graph.
- Only HTTPS URLs work, and the
-
Named ports on custom daemons.
runandtaskdaemons can now declare several ports in aportstable, as presets and containers already can. Before, mise passed these entries to pitchfork, which ignored them. Each port is exported as<DAEMON>_<NAME>_PORT. A fixed number is used as written. Anautoport needs its ownbase, and each linked worktree gets a different port. Named ports are checked for collisions with other ports. #15504 (@jdx, @ponko2)[daemons.stack] run = "docker compose up" ports.app = { auto = true, base = 8080 } ports.db = { auto = true, base = 5432 } ports.admin = 9000
-
Resource limits for launchd agents.
[bootstrap.macos.launchd.agents]entries acceptsoft_resource_limitsandhard_resource_limits. You can now raise launchd's default limit of 256 open files without wrapping the program in aulimitshell command. The keys are launchd's nine limits in snake case, such asnumber_of_filesandnumber_of_processes. An empty table, or a soft limit above the hard limit, is an error. Based on @disintegrator's implementation. #15509 (@jdx)[bootstrap.macos.launchd.agents.proxy] program = "~/.local/bin/proxy" soft_resource_limits = { number_of_files = 10240 } hard_resource_limits = { number_of_files = 65536 }
-
history.lock_wait. Sets how longmise dotcommands that change history wait when another history operation is running. Set it in config or withMISE_HISTORY_LOCK_WAIT. The default is30s,0fails immediately, and any value above1his treated as1h.mise dot watchandmise dot recovernever wait. #15498 (@jdx, @zachbornheimer) -
Progress in
mise upgrade. After installing,mise upgradechecks every tracked config before removing old versions. This step now shows achecking tracked configsprogress line, so the command no longer looks stuck. The check is also faster with many tracked configs: with about 930 configs, the same check inmise prune --dry-rundropped from about 12s to 2-4s. #15489, #15512 (@jdx)
Changed
- Default prompt theme is now
base16. Interactive prompts, such as themise runtask picker, were hard to read on light terminals that don't setCOLORFGBG. Thebase16theme now uses the terminal's named colors, and unselected options and help text use the terminal's normal text color. On dark terminals, prompts now look different by default. To keep the previous look, setcolor_theme = "charm"orcolor_theme = "auto". #15494, #15524 (@jdx, @AdrianDC)
Fixed
- Broken TOML task
usage. A TOML task whoseusagecouldn't be loaded, such as a missing include file or a spec that didn't parse, used to breakmise tasks --usage,mise generate task-docsand completion for every task. Now mise warns about that task and the others keep working. A broken task that doesn't use its spec, such as one withraw_args = true, still runs.mise tasks validatestill reports the error. #15465 (@jdx) MISE_ORIGINAL_CWDwith--cd. Tasks run with-C/--cdorMISE_CDnow get the directory where mise was started, not the--cdtarget. #15464 (@jdx)- Faster task freshness checks. Checking whether a task is up to date no longer reads directories that can't contain its sources or outputs. For example,
sources = ["packages/*/src/**/*"]no longer reads everypackages/*/node_modules, and mise skips directories excluded by!**/node_modules/**. Tasks still select the same files. #15499 (@jdx, @2chanhaeng) mise env --dotenvoutput can be read back. Values are now quoted and escaped when needed, so values with#, newlines, quotes or$stay the same when the file is loaded with_.file. Simple values stay unquoted. Tools that don't handle quotes, such as Docker--env-file, read the quotes as part of the value. #15490 (@jdx)- Undefined
{{ env.X }}errors. When a template referred to an undefinedenvfield, the error listed the name of every environment variable, including secret names such as*_TOKEN. In an activated shell, mise printed this list at every prompt. The error now names only the missing field and suggestsget_env(name=..., default=""). #15510 (@jdx) - Nushell completion with activation. With
mise activate nu, pressing Tab aftermisenow completes mise subcommands and arguments instead of file paths. On Nushell versions before 0.116, flags still need^miseand the script frommise completion nu --install. #15505 (@jdx, @Deano217) - Command wrappers during installs. The cargo, npm, pipx and aube backends now run their install commands without command wrappers on
PATH. For example,cargo installno longer fails whencargois wrapped by mbx.mise exec,mise runand ordinary commands still use wrappers. #15495 (@jdx) cargo:tools withminimum_release_age. With an explicitminimum_release_ageand"core:rust" = "stable",cargo:tools failed to install because mise looked forrust@stableinstead of the dated Rust version it had installed. #15460 (@jdx)- Date-only release ages for Rust beta and nightly. A date-only
minimum_release_age, such as2026-11-09, now includesrust@betaandrust@nightlybuilds from that day instead of falling back to the day before. #15486 (@jdx) packslip:releases in monorepos. In repositories that publish releases for several components,packslip:couldn't find releases listed after another component's releases. A pinned version is now looked up by its tag, andlatestsearches more of the release history. #15501 (@jdx, @pepicrft)- Faster GitHub fallback on 5xx errors. When a GitHub release download URL returns a 5xx error, mise now retries the check once, then switches to the API asset URL. Before, it used up all
http_retriesfirst, which could take minutes per file. #15485 (@jdx, @csechuan) - Long cache keys in the
http:backend. Installs could fail withFile name too long, for example Yarn 2+ from apackageManagerwith a Corepack checksum. Temporary directory names now stay under the filesystem's name length limit. #15493 (@jdx) - Cleanup after failed installs. Installing a GitHub repo that isn't an asdf or vfox plugin no longer leaves its clone in the plugins directory. The error now suggests the
github:backend. A failed install also removes its cache directory. #15511 (@jdx, @gigaimage) - Homebrew tap casks with
zap :not_required. Previewing or installing these casks failed with anArgumentError. #15491 (@jdx, @cdenihan)
Full Changelog: v2026.11.5...v2026.11.6
💚 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.