v2026.9.4
jdx/misev2026.9.4Sep 9, 2026by mise-en-dev
AI Summary
This release introduces Nix support for bootstrap packages, environment selectors for conditional package activation, and man page support for packslip tools. It also features a significant performance boost for dotfiles history rebuilds and includes various fixes for lazy tool dependencies, macOS Homebrew signing, and cross-platform compatibility.
Key Highlights
- Nix is now a built-in manager in `[bootstrap.packages]` on Linux and macOS, allowing packages to be declared with a `nix:` prefix.
- Bootstrap packages can now be scoped to specific environments using the new `env` selector, ensuring packages are only active when the correct environment is active.
- Packslip tools can now ship static man pages, and `man <tool>` commands work seamlessly when a tool version is active.
- Dotfiles history index rebuilds are dramatically faster, cutting rebuild times from roughly 26-28 seconds to under a second.
New Features
- Nix bootstrap support (Linux/macOS) with `nix:` prefix declarations
- Environment selectors (`env`) for conditional package activation
- Man page shipping for packslip tools
- New `task.quiet` setting to suppress task messages
- Deterministic NixOS module export via `mise bootstrap packages export --format nix`
- Major performance improvement to dotfiles history rebuilds using gix
- Basecamp added to the registry
Full Release Notes
This release expands the bootstrap package model with Nix support and environment selectors, teaches packslip tools to ship man pages, and adds a task-scoped quiet setting. It also carries a wide batch of packslip, bootstrap, and cross-platform fixes plus a major speedup to dotfiles history rebuilds.
## Added
- **bootstrap:** Nix is now a built-in `[bootstrap.packages]` manager on Linux and macOS. Declare packages with the `nix:` prefix and apply them through your normal Nix profile; the manager supports use, apply, status JSON, and targeted upgrades while leaving Nix sources, caches, trust, and profile rollback under Nix control. This also adds `mise bootstrap packages export --format nix` to emit a deterministic NixOS module from your `nix:` declarations and `packages use --no-install` to record declarations without touching package managers. ([#13013](https://github.com/jdx/mise/pull/13013) by @jdx)
```toml
[bootstrap.packages]
"nix:ripgrep" = "latest"
```
- **bootstrap:** `[bootstrap.packages]` entries gain an `env` selector (a single environment or a list), so a package is only enabled when one of its listed mise environments is active via `-E` or `MISE_ENV`. When both `os` and `env` are set, both must match. Packages for inactive environments stay declared and are protected from pruning. ([#12956](https://github.com/jdx/mise/pull/12956) by @jdx)
```toml
[bootstrap.packages]
"brew:postgresql" = { version = "latest", env = ["dev", "test"] }
```
- **packslip:** Packslip-installed tools can now ship man pages declared as static `man` resources, alongside completions and agent skills. While a tool version is active, mise prepends its man root to `MANPATH` and keeps system and caller-defined paths visible, so `man <tool>` works. Existing installs need to be reinstalled to pick up man pages. ([#13012](https://github.com/jdx/mise/pull/13012) by @jdx)
- **task:** New `task.quiet` setting (and `MISE_TASK_QUIET`) suppresses mise's own task messages, prefixes, and command-echo headers without hiding task output or affecting other commands. The bundled `output = "quiet"` mode is deprecated in favor of explicit output style plus this setting; removal is scheduled for 2027.9.3. ([#12980](https://github.com/jdx/mise/pull/12980) by @jdx)
## Fixed
- **install:** A lazy tool whose `depends` target is also lazy now installs correctly on first use through a shim, `mise x`, or a task; mise installs the provider together with its still-missing configured dependencies instead of failing the preflight. ([#12997](https://github.com/jdx/mise/pull/12997) by @balintant)
- **backend:** 32-bit ARM resolution now uses Go's canonical `arm` architecture name for Aqua (so registry replacements apply), and automatic GitHub release asset selection no longer picks a generic `source.tar.gz` when no published binary targets the host. ([#13004](https://github.com/jdx/mise/pull/13004) by @jdx)
- **bootstrap:** Homebrew bottles with hard-linked Mach-O executables are now signed correctly on macOS. Every hard-link alias is tracked and included in the signing list after relocation, fixing cases like fish where an aliased binary was killed with SIGKILL after a successful install. ([#12988](https://github.com/jdx/mise/pull/12988) by @nettlesh)
- **packslip:** `mise lock --platform` now verifies the signed release manifest and records the correct URL, checksum, size, and signer for each requested target platform (including Windows x64), so locked installs work across platforms. ([#13002](https://github.com/jdx/mise/pull/13002) by @jdx)
- **packslip:** On glibc Linux, an artifact's `glibc_min` is now honored during selection: when the GNU build requires a newer glibc than the host, mise falls back to a matching static musl build if one exists. ([#13009](https://github.com/jdx/mise/pull/13009) by @jdx)
- **packslip:** Windows installs now link shims with the correct `.exe` filename, while Unix keeps extensionless names. ([#13006](https://github.com/jdx/mise/pull/13006) by @jdx)
- **packslip:** Activated man roots are now scoped to Packslip-backed tool versions, and the caller's original `MANPATH` is included in the environment-cache identity so one cached process cannot serve another caller's `MANPATH`. ([#13016](https://github.com/jdx/mise/pull/13016) by @jdx)
- **prune:** `mise prune` no longer exits successfully without pruning when it cannot show a confirmation prompt; it now fails with guidance to pass `--yes` or set `MISE_YES=1`. Follow-up prunes from commands like `mise unuse` still leave installs in place when nobody can answer. ([#13003](https://github.com/jdx/mise/pull/13003) by @jdx)
- **generate:** `mise generate tool-stub` now respects a stub's top-level `os` selector when deciding whether to write a Windows `.cmd` launcher, so a linux/macos-only stub no longer produces a launcher even with `--lock`. ([#13008](https://github.com/jdx/mise/pull/13008) by @jdx)
- **dotfiles:** History path filters resolve correctly when `HOME` is a symlink, so aliased, canonical, and tilde paths address the same history entry and `show latest`/`diff` no longer report a missing checkpoint. ([#12982](https://github.com/jdx/mise/pull/12982) by @azohra)
- **brew:** The published crate now includes the tap formula and cask metadata shims, fixing `cargo install --locked mise` builds from crates.io. ([#13001](https://github.com/jdx/mise/pull/13001) by @jdx)
## Changed
- **bootstrap:** `[bootstrap].config_roots` and the `mise bootstrap config-roots` command are now deprecated (hidden from help and removed from public docs), with removal scheduled for mise 2027.3.3. Existing configurations keep working during the compatibility window but emit a warning directing users to global or system bootstrap configuration. ([#13010](https://github.com/jdx/mise/pull/13010) by @jdx)
- **registry:** Added basecamp to the registry. ([#13024](https://github.com/jdx/mise/pull/13024))
## Performance
- **history:** Dotfiles history index rebuilds are dramatically faster, reconstructing checkpoint metadata in-process with gix instead of spawning Git per checkpoint. On an 80-checkpoint, 44-file reproducer this cut a rebuild from roughly 26-28 seconds and thousands of Git processes down to under a second. Removed annotations are now correctly dropped after a rebuild, and SHA-256 history repositories are supported. ([#13011](https://github.com/jdx/mise/pull/13011) by @jdx)
## Deprecated
- The task `output = "quiet"` mode (use `task.quiet` instead; removal in 2027.9.3) ([#12980](https://github.com/jdx/mise/pull/12980)).
- `[bootstrap].config_roots` and `mise bootstrap config-roots` (removal in mise 2027.3.3) ([#13010](https://github.com/jdx/mise/pull/13010)).
## New Contributors
* @balintant made their first contribution in [#12997](https://github.com/jdx/mise/pull/12997)
**Full Changelog**: https://github.com/jdx/mise/compare/v2026.9.3...v2026.9.4
## 💚 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.