This release expands bootstrap system setup with firewall rate limiting and more systemd directives, adds a scoped locked mode for mixing distribution and user tool policies, and fixes lazy tools so they install when invoked from tasks and mise x.
Added
-
bootstrap: New
action = "limit"for incoming TCP firewall rules rate-limits connections per source. It maps to UFW's native limiting and bounded per-source IPv4/IPv6 nftables meters; firewalld fails closed since it cannot express safe per-source limiting. Limit rules are treated as preserving SSH access by the lockout guard. (#12669 by @jdx) -
bootstrap: Bootstrap systemd units now support
requires(Requires=), repeatableenvironment_file(EnvironmentFile=),nice, andumask, with validation for nice ranges (-20 to 19) and octal umasks. Note thatrequiresdoes not imply ordering; useafterfor that. (#12683 by @jdx) -
config: New global-only
locked_scopessetting (alsoMISE_LOCKED_SCOPES) lets you scope locked mode to specific config sources, so a distribution can ship rolling or lazy tools through/etc/mise/config.tomlwithout forcing users to maintain a system lockfile. Defaults to all three scopes to preserve existing behavior. (#12667 by @jdx)[settings] locked_scopes = ["project", "global"]
Fixed
- task: Lazy tools (
lazy = true) now install when their command is invoked from amise runtask ormise x, matching the behavior of an activated shell. mise inserts the shim farms after real tool paths for lazy toolsets and reconciles missing bootstrap shims for hand-edited declarations, so tasks no longer fail withcommand: not found. (#12687 by @jdx) - env: Environment variables configured for removal (
falsevalues and unset directives) are now consistently unset acrossmise exec, tasks,mise env, hook-env, deps, and tool stubs, so inherited or secret variables are no longer leaked back into child processes. (#12664 by @jdx) - shim:
mise reshimcan now safely target shared executable directories like~/.local/binor/usr/local/bin. It identifies mise-owned shims and only replaces or prunes those, leaving unmanaged files and symlinks in place, and--forcerebuilds mise-owned shims rather than wiping the whole directory. (#12675 by @jdx) - brew-cask: Cask binaries that reference their surrounding extracted payload now keep that payload beside the staged binary, so tools like
codexthat exec helpers or read manifests from their own tree continue working after temporary install files are cleaned up. (#12686 by @azohra) - upgrade: Fixed recursive deferred tool pruning that could hang new terminals when prompt hooks triggered a full tracked-config scan. Deferred cleanup now takes a non-blocking lock and is skipped for shell-integration and
--no-configcommands. (#12676 by @jdx) - install: Install failures caused by a missing marker file now name the affected file and operation instead of reporting a bare OS error. (#12624 by @JamBalaya56562)
- install:
mise install --dry-runfor an s3 tool that only declares a URL for another platform now reports the missing platform and available options instead of falsely claiming it would install. (#12641 by @hktitof)
Changed
- registry: Registry command (shim) names are now inferred from the preferred Aqua package at build time, removing redundant
binsdeclarations from hundreds of registry entries. Explicitbinsare kept only where mise intentionally exposes a different command set, andmise registry --jsonexposes the inferred names. (#12668 by @jdx)
New Contributors
Full Changelog: v2026.9.0...v2026.9.1
💚 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.