v2026.8.15
jdx/misev2026.8.15Aug 30, 2026by mise-en-dev
AI Summary
This release expands the dotfiles/bootstrap workflow with previews, bulk capture, git-tracked manifests, and profile reconciliation. It adds scoped config collection updates and per-tool postinstall hooks, and includes a large batch of fixes across tasks, schema validation, Windows, lockfiles, and shims.
Key Highlights
- Dotfiles management grows a full preview-and-capture workflow with `mise bootstrap dotfiles diff` and bulk `add --changed`.
- Scoped config updates via `mise config set` with `--append`/`--remove` and explicit `--global`/`--system` targeting.
- Per-tool `--postinstall` hooks allow custom commands to run on installation.
- Safer upgrades where replaced tool versions linger for a grace period instead of immediate deletion.
New Features
- Dotfiles preview command `mise bootstrap dotfiles diff`
- Bulk capture `mise bootstrap dotfiles add --changed`
- Git-tracked directory manifests for copy and symlink-each entries
- Scoped config list updates (`--append`/`--remove`)
- Per-tool postinstall hooks via `mise use --postinstall`
- Project-level `mise bootstrap --from`
- Task source file filtering `task_source_files(only_changed=true)`
- Outdated JSON output with `release_url` field
Full Release Notes
This release expands the dotfiles/bootstrap workflow with previews, bulk capture, git-tracked manifests, and profile reconciliation, adds scoped config collection updates and per-tool postinstall hooks, and rounds it out with a large batch of fixes across tasks, schema validation, Windows, lockfiles, and shims.
## Highlights
- Dotfiles management grows a full preview-and-capture workflow: `mise bootstrap dotfiles diff`, bulk `add --changed`, git-tracked directory manifests, and automatic reconciliation when a profile switches a target's source.
- `mise config set` learns idempotent list updates (`--append`/`--remove`) and explicit `--global`/`--system` targeting, and `mise use` gains per-tool `--postinstall` hooks.
- Safer upgrades: replaced tool versions now linger for a grace period instead of being deleted immediately, so a bad upgrade is easier to recover from.
## Added
- **dotfiles:** New `mise bootstrap dotfiles diff` previews exactly what `apply` would change without writing anything, printing unified content patches for copy, template, and inline entries and structural summaries for symlinks and directories. Optional target filters use the same selection semantics as `apply`. ([#12511](https://github.com/jdx/mise/pull/12511) by @jdx)
- **dotfiles:** `mise bootstrap dotfiles add --changed` captures every drifted copy-mode target back into its source in one command, without naming each path. Directory copies, symlinks, templates, and inline content are skipped, and untrusted configs are blocked. ([#12512](https://github.com/jdx/mise/pull/12512) by @jdx)
- **dotfiles:** Directory `copy` and `symlink-each` entries can now set `manifest = "git"` to manage only paths returned by `git ls-files`, so a dotfiles repo that `gitignore`s everything and force-adds selected paths no longer traverses (or links) ignored home-directory content. Links are removed when a file drops out of the index. ([#12523](https://github.com/jdx/mise/pull/12523) by @jdx)
- **dotfiles:** `symlink-each` apply now reconciles stale links when a profile change (for example toggling `MISE_ENV` between home and work) points a target at a different source. Only links still pointing at the previously recorded source are removed; unmanaged paths and paths desired by another active source are left alone, and dry-run previews the removals. ([#12524](https://github.com/jdx/mise/pull/12524) by @jdx)
- **bootstrap:** `mise bootstrap --from <git-url>` clones a setup/dotfiles repo (into `$MISE_DATA_DIR/bootstrap-repo` by default, or `--from-dir`), then runs bootstrap from that checkout. Existing checkouts are reused when the origin matches, `--update` fast-forwards them, and `--dry-run` only prints the planned `git clone`/`git pull`. ([#12525](https://github.com/jdx/mise/pull/12525) by @jdx)
- **use:** `mise use --postinstall <COMMAND>` attaches a per-tool post-install hook that runs only when that tool is installed or reinstalled. Repeat the flag before each tool to give each its own hook. ([#12609](https://github.com/jdx/mise/pull/12609) by @jdx)
```sh
mise use --postinstall "mbx setup --defaults" mr-boxington
```
- **config:** `mise config set` gains `--append` and `--remove` for list-like keys (append without duplicates, remove matching entries, promote scalars to arrays as needed) while preserving TOML comments and formatting, plus explicit `--global`/`--system` targeting for `config get`/`set`. Tool postinstall hooks now also receive `MISE_CONFIG_FILE`, `MISE_GLOBAL_CONFIG_FILE`, `MISE_CONFIG_ROOT`, and `MISE_PROJECT_ROOT`. ([#12603](https://github.com/jdx/mise/pull/12603) by @jdx)
- **config:** Templates can now reference `config_source`, the absolute path of the config file the template lives in (not resolved through symlinks). This lets a shared config symlinked into `conf.d` add its own real directory to `PATH`, for example `{{ config_source | canonicalize | dirname }}/bin`. Available in `mise.toml`, `.tool-versions`, `[env]` directives, and `[settings.age]`. ([#12454](https://github.com/jdx/mise/pull/12454) by @Marukome0743)
- **task:** `task_source_files(only_changed=true)` returns only the sources written since the task last succeeded, so linters and formatters can run against just what changed. A failed run keeps its files outstanding until the task passes. ([#12470](https://github.com/jdx/mise/pull/12470) by @Marukome0743)
- **outdated:** `mise outdated --json` now includes a `release_url` field pointing at the release page for the offered version (from the versions host, aqua, GitHub/GitLab, or the rust core plugin). The key is omitted rather than null when no page is available. ([#12494](https://github.com/jdx/mise/pull/12494) by @Marukome0743)
## Changed
- **upgrade:** `mise upgrade` no longer deletes the replaced install immediately. When `upgrade.auto_prune` is on, the old version stays on disk and is scheduled for removal after `upgrade.prune_after` (default 24h), cleaned up opportunistically on later runs. `--prune` still removes immediately and `--no-prune` keeps the old tree with no scheduled cleanup. `mise ls` surfaces deferred removals. ([#12593](https://github.com/jdx/mise/pull/12593) by @jdx)
## Fixed
- **env,tasks:** `.env` files written as UTF-16 (the default from Windows PowerShell 5.1's `>` and `Out-File`) are now decoded and loaded instead of being silently dropped, and a UTF-16 task file now gets a clear hint to save it as UTF-8. ([#12507](https://github.com/jdx/mise/pull/12507) by @JamBalaya56562)
- **install:** `mise install --dry-run` no longer claims it would install a tool that cannot actually be installed on this platform. ([#12568](https://github.com/jdx/mise/pull/12568) by @JamBalaya56562)
- **exec:** `mise exec` now reports clearly when a requested tool is not available on the current platform. ([#12547](https://github.com/jdx/mise/pull/12547) by @JamBalaya56562)
- **config:** Request-specific tool options are preserved rather than dropped during config merges. ([#12060](https://github.com/jdx/mise/pull/12060) by @risu729)
- **config:** A bare `tool_alias` value is now resolved through the registry. ([#12506](https://github.com/jdx/mise/pull/12506) by @Marukome0743)
- **config:** Minimum-release-age exclusions from multiple configs are merged instead of overwritten. ([#12460](https://github.com/jdx/mise/pull/12460) by @jdx)
- **lockfile:** Version ties are broken correctly when a legacy lockfile answers `latest`, and links belonging to other backends are ignored. ([#12583](https://github.com/jdx/mise/pull/12583), [#12605](https://github.com/jdx/mise/pull/12605) by @Marukome0743, @jdx)
- **monorepo:** Idiomatic version files are resolved from the task's own config root. ([#12565](https://github.com/jdx/mise/pull/12565) by @kaii-zen)
- **task:** Several ordering fixes so injected and dependency tasks keep their intended slots, tasks that link back into themselves are skipped, and `taskkill` output is suppressed on Windows. ([#12450](https://github.com/jdx/mise/pull/12450), [#12466](https://github.com/jdx/mise/pull/12466), [#12482](https://github.com/jdx/mise/pull/12482), [#12510](https://github.com/jdx/mise/pull/12510), [#12563](https://github.com/jdx/mise/pull/12563) by @Marukome0743, @jrandolf, @JamBalaya56562, @sortA0329)
- **shims/generate:** Arguments are now delivered intact for `file`-mode shims and Windows launchers, and `mise generate` explains when a `--mise-bin` path has no Windows launcher. Non-executable system fallbacks are skipped. ([#12502](https://github.com/jdx/mise/pull/12502), [#12463](https://github.com/jdx/mise/pull/12463), [#12496](https://github.com/jdx/mise/pull/12496), [#12545](https://github.com/jdx/mise/pull/12545) by @JamBalaya56562, @jdx)
- **http:** Raw binaries are copied on Windows where a junction cannot name a file, and a download that fails because the path is too long now explains itself. ([#12465](https://github.com/jdx/mise/pull/12465), [#12550](https://github.com/jdx/mise/pull/12550) by @Marukome0743, @JamBalaya56562)
- **link/file:** Links whose target no longer exists can now be shown and removed. ([#12468](https://github.com/jdx/mise/pull/12468), [#12469](https://github.com/jdx/mise/pull/12469) by @JamBalaya56562)
- **trust:** The ignore list is now read by what its entries point at, matching how trust links are stored. ([#12428](https://github.com/jdx/mise/pull/12428) by @JamBalaya56562)
- **watch:** The terminal is restored when the watched process is signalled. ([#12451](https://github.com/jdx/mise/pull/12451) by @Marukome0743)
- **activate:** The pwsh deactivation preamble no longer pollutes `$Error`. ([#12483](https://github.com/jdx/mise/pull/12483) by @JamBalaya56562)
- **backend:** Rolling updates behind a versions host are now detected. ([#12440](https://github.com/jdx/mise/pull/12440) by @jdx)
- **github:** Stale cached attestations are retried. ([#12495](https://github.com/jdx/mise/pull/12495) by @jdx)
- **ls-remote:** Recorded listing errors now cause a failure instead of returning stale/empty results. ([#12551](https://github.com/jdx/mise/pull/12551) by @jdx)
- **npm:** Dangling aube-backed tool installs are repaired. ([#12570](https://github.com/jdx/mise/pull/12570) by @jdx)
- **bootstrap:** Brew cask dependencies are preserved during prune. ([#12461](https://github.com/jdx/mise/pull/12461) by @jdx)
- **azure:** The CLI now includes pip for extension support. ([#12555](https://github.com/jdx/mise/pull/12555) by @esteve)
- **registry:** Windows/arm64 can fall back to x64 backends, as aqua already does. ([#12560](https://github.com/jdx/mise/pull/12560) by @JamBalaya56562)
- **doctor:** The self-update leftover check is gated so it does not fire for installs that manage updates elsewhere. ([#12438](https://github.com/jdx/mise/pull/12438) by @salim-b)
- **schema:** Several JSON schema corrections so registry, plugin, tool-option, and settings definitions match what the build consumers actually accept. ([#12514](https://github.com/jdx/mise/pull/12514), [#12515](https://github.com/jdx/mise/pull/12515), [#12520](https://github.com/jdx/mise/pull/12520), [#12522](https://github.com/jdx/mise/pull/12522), [#12527](https://github.com/jdx/mise/pull/12527) by @risu729)
## Performance
- **brew:** Homebrew bootstrap bottles are now downloaded concurrently (bounded by `MISE_JOBS`), while pouring, source builds, and prefix linking stay in dependency order. ([#12604](https://github.com/jdx/mise/pull/12604) by @jdx)
## Registry
New tools: pkgx, onefetch, syncthing, ols, spin-framework, cursor-agent, 7zip, mosh, pastel, broot, exiftool, spotify-player, yt-dlp-nightly, and cliamp. magika and sbt now install from their GitHub releases, and pre-commit uses the pipx backend on Windows. Various dependency and OS-limit cleanups were also applied. ([#12272](https://github.com/jdx/mise/pull/12272), [#12437](https://github.com/jdx/mise/pull/12437), [#12448](https://github.com/jdx/mise/pull/12448), [#12484](https://github.com/jdx/mise/pull/12484), [#12485](https://github.com/jdx/mise/pull/12485), [#12478](https://github.com/jdx/mise/pull/12478), [#12486](https://github.com/jdx/mise/pull/12486), [#12532](https://github.com/jdx/mise/pull/12532), [#12535](https://github.com/jdx/mise/pull/12535), [#12533](https://github.com/jdx/mise/pull/12533), [#12538](https://github.com/jdx/mise/pull/12538), [#12539](https://github.com/jdx/mise/pull/12539), [#12542](https://github.com/jdx/mise/pull/12542), [#12581](https://github.com/jdx/mise/pull/12581), [#12553](https://github.com/jdx/mise/pull/12553), [#12567](https://github.com/jdx/mise/pull/12567), [#12549](https://github.com/jdx/mise/pull/12549))
## New Contributors
- @sortA0329 made their first contribution in [#12563](https://github.com/jdx/mise/pull/12563)
- @seuros made their first contribution in [#12519](https://github.com/jdx/mise/pull/12519)
- @pb3975 made their first contribution in [#12478](https://github.com/jdx/mise/pull/12478)
- @ThorstenHans made their first contribution in [#12485](https://github.com/jdx/mise/pull/12485)
**Full Changelog**: https://github.com/jdx/mise/compare/v2026.8.14...v2026.8.15
## 💚 Sponsor mise
mise is maintained by [@jdx](https://github.com/jdx), an open source developer for [**entire.io**](https://entire.io), the title sponsor of the [jdx.dev](https://jdx.dev) open source tools. Development is funded by sponsors.
If mise saves you or your team time, please consider sponsoring at [jdx.dev](https://jdx.dev/sponsors.html). Individual and company sponsorships keep mise fast, free, and independent.