v2026.9.1

jdx/misev2026.9.1Sep 2, 2026by mise-en-dev

AI Summary

This release enhances the bootstrap system with firewall rate limiting and systemd directives, introduces a scoped locked mode to manage configuration sources, and fixes lazy tools to install correctly when invoked from tasks.

Key Highlights

  • New firewall rate limiting option (`action = 'limit'`) for TCP connections in bootstrap.
  • Enhanced bootstrap systemd support for `requires`, `environment_file`, `nice`, and `umask` directives.
  • Introduced scoped locked mode via `locked_scopes` setting to mix distribution and user tool policies.
  • Fixed lazy tools to install automatically when invoked from `mise run` tasks or `mise x`.

Breaking Changes

  • Registry command (shim) names are now inferred from Aqua packages, which may change exposed command names if specific `bins` declarations were relied upon.

New Features

  • Firewall rate limiting for bootstrap TCP rules.
  • Scoped locked mode configuration (`locked_scopes`).
  • Enhanced bootstrap systemd directives (`requires`, `environment_file`, `nice`, `umask`).
  • Automatic installation of lazy tools in tasks and `mise x`.

Full Release Notes

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](https://github.com/jdx/mise/pull/12669) by @jdx)
- **bootstrap:** Bootstrap systemd units now support `requires` (`Requires=`), repeatable `environment_file` (`EnvironmentFile=`), `nice`, and `umask`, with validation for nice ranges (-20 to 19) and octal umasks. Note that `requires` does not imply ordering; use `after` for that. ([#12683](https://github.com/jdx/mise/pull/12683) by @jdx)
- **config:** New global-only `locked_scopes` setting (also `MISE_LOCKED_SCOPES`) lets you scope locked mode to specific config sources, so a distribution can ship rolling or lazy tools through `/etc/mise/config.toml` without forcing users to maintain a system lockfile. Defaults to all three scopes to preserve existing behavior. ([#12667](https://github.com/jdx/mise/pull/12667) by @jdx)

  ```toml
  [settings]
  locked_scopes = ["project", "global"]
  ```

## Fixed
- **task:** Lazy tools (`lazy = true`) now install when their command is invoked from a `mise run` task or `mise 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 with `command: not found`. ([#12687](https://github.com/jdx/mise/pull/12687) by @jdx)
- **env:** Environment variables configured for removal (`false` values and unset directives) are now consistently unset across `mise exec`, tasks, `mise env`, hook-env, deps, and tool stubs, so inherited or secret variables are no longer leaked back into child processes. ([#12664](https://github.com/jdx/mise/pull/12664) by @jdx)
- **shim:** `mise reshim` can now safely target shared executable directories like `~/.local/bin` or `/usr/local/bin`. It identifies mise-owned shims and only replaces or prunes those, leaving unmanaged files and symlinks in place, and `--force` rebuilds mise-owned shims rather than wiping the whole directory. ([#12675](https://github.com/jdx/mise/pull/12675) by @jdx)
- **brew-cask:** Cask binaries that reference their surrounding extracted payload now keep that payload beside the staged binary, so tools like `codex` that exec helpers or read manifests from their own tree continue working after temporary install files are cleaned up. ([#12686](https://github.com/jdx/mise/pull/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-config` commands. ([#12676](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/12624) by @JamBalaya56562)
- **install:** `mise install --dry-run` for 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](https://github.com/jdx/mise/pull/12641) by @hktitof)

## Changed
- **registry:** Registry command (shim) names are now inferred from the preferred Aqua package at build time, removing redundant `bins` declarations from hundreds of registry entries. Explicit `bins` are kept only where mise intentionally exposes a different command set, and `mise registry --json` exposes the inferred names. ([#12668](https://github.com/jdx/mise/pull/12668) by @jdx)

## New Contributors
* @azohra made their first contribution in [#12686](https://github.com/jdx/mise/pull/12686)
* @hktitof made their first contribution in [#12641](https://github.com/jdx/mise/pull/12641)

**Full Changelog**: https://github.com/jdx/mise/compare/v2026.9.0...v2026.9.1

## 💚 Sponsor mise

mise is built and maintained by [@jdx](https://github.com/jdx), an open source developer at [**entire.io**](https://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](https://jdx.dev/sponsors.html). Your support funds ongoing development and helps keep mise fast, free, and independent.