mise

Developer ToolsMIT

mise release notes.

Latest v2026.9.3 · by miseWritten in RustWebsitejdx/miseRSS

Release activity

Release activity — 28 releases across 26 days since Jul 23, 2026. Each cell is one day; darker means more releases that day. Nothing is recorded before Jul 23, 2026. Older weeks are hidden at this screen width.
JunJulAugSep
Sunday1 release on Jul 26, 2026No releases on Aug 2, 2026No releases on Aug 9, 2026No releases on Aug 16, 20261 release on Aug 23, 20261 release on Aug 30, 2026No releases on Sep 6, 2026
Monday1 release on Jul 27, 20261 release on Aug 3, 2026No releases on Aug 10, 20262 releases on Aug 17, 20261 release on Aug 24, 20261 release on Aug 31, 20261 release on Sep 7, 2026
TuesdayNo releases on Jul 28, 2026No releases on Aug 4, 20261 release on Aug 11, 2026No releases on Aug 18, 20261 release on Aug 25, 20261 release on Sep 1, 20261 release on Sep 8, 2026
Wednesday1 release on Jul 29, 20261 release on Aug 5, 20261 release on Aug 12, 20261 release on Aug 19, 20261 release on Aug 26, 20261 release on Sep 2, 2026No releases on Sep 9, 2026
Thursday1 release on Jul 23, 20262 releases on Jul 30, 2026No releases on Aug 6, 2026No releases on Aug 13, 20261 release on Aug 20, 2026No releases on Aug 27, 2026No releases on Sep 3, 2026
Friday1 release on Jul 24, 2026No releases on Jul 31, 20261 release on Aug 7, 20261 release on Aug 14, 2026No releases on Aug 21, 2026No releases on Aug 28, 2026No releases on Sep 4, 2026
SaturdayNo releases on Jul 25, 20261 release on Aug 1, 2026No releases on Aug 8, 2026No releases on Aug 15, 2026No releases on Aug 22, 2026No releases on Aug 29, 2026No releases on Sep 5, 2026

28 releases since Jul 23, 2026, busiest day 2

Changelog

v2026.9.3Latest

v2026.9.3: Winget bootstrap, signed vfox plugins, and faster inline commands

Added 4
  • WinGet is now a built-in bootstrap.packages manager on Windows for checking status, installing, and upgrading apps by exact package ID with support for version pins and source refresh
  • External vfox plugins can now be installed from signed packslip archives instead of Git clone, reusing packslip backend's release selection, signature verification, digest checks, and signer pins
  • Dotfile line edits gain position = "prepend" to insert a managed line at the top of a file instead of appending
  • macOS bootstrap defaults now support nested TOML arrays and tables with reading and writing through Core Foundation to preserve plist types
Changed 2
  • Bootstrap adoption is now spelled mise bootstrap --adopt and mise bootstrap remote --adopt, separate from mise bootstrap --from for running a bootstrap project
  • On Unix, plain inline commands now run directly when a conservative planner deems them safe, skipping the shell wrapper, cutting about 11% off elapsed time in microbenchmarks
Fixed 10
  • Git operations that GitHub challenges with HTTP 401 on public repositories can now authenticate using mise's existing GitHub token sources via a command-scoped github.com HTTPS credential helper
  • The default inline task shell is now sh -o errexit -c so shells that consume the argument after -c run the command correctly
  • Windows ARM64 stale command-wrapper shims that caused recursive .exe/.cmd dispatch after shim-mode changes are now pruned
  • Aqua ARM64 emulation candidates apply the registry's amd64 replacement so tools like LuaLS resolve published win32-x64 assets
  • Bootstrap no longer aborts on Arch when pacman -Q prints a file advisory for a missing package that shares its name with a directory in the current working directory
  • Read-restricted macOS Seatbelt profiles now allow metadata-only access to /private, fixing startup failures for load-relative binaries like Ruby 4.0.6
Deprecated 1
  • The --from-git spelling for bootstrap is hidden but still works as an alias and is scheduled for removal in mise 2026.10.0

From mise

This release brings Windows bootstrap into the package-manager era with WinGet support, extends the packslip signing model to vfox plugins, and speeds up simple tasks by skipping the shell on Unix. It also carries a batch of bootstrap, sandbox, and Windows ARM64 fixes.

Added
  • bootstrap: WinGet is now a built-in [bootstrap.packages] manager on Windows, so mise bootstrap packages can check status, install, and upgrade apps by exact package ID. It supports version pins, source refresh, and automatic source-agreement acceptance. Scoop, Chocolatey, and package removal remain future work. (#12928 by @jdx)

    [bootstrap.packages]
    "winget:Microsoft.PowerShell" = "latest"
    
  • vfox: External vfox plugins can now be installed from signed packslip archives instead of a Git clone, reusing the packslip backend's release selection, signature verification, digest checks, and signer pins. This is aimed at non-registry plugins; registry defaults and embedded plugins are unchanged. (#12948 by @jdx)

    mise plugins install vfox:bfs 'packslip:mise-plugins/vfox-bfs#0.1.0'
    
  • bootstrap: Dotfile line edits gain position = "prepend" to insert a managed line at the top of a file instead of appending (the default). An existing exact match is left in place, and unrelated bytes, CRLF endings, and a UTF-8 BOM are preserved. (#12941 by @jdx)

    [dotfiles]
    "/etc/zshrc/zdotdir" = { line = 'ZDOTDIR=$HOME/.config/zsh/', position = "prepend" }
    
  • bootstrap: macOS bootstrap defaults now support nested TOML arrays and tables (for example Dock persistent-apps), reading and writing preferences through Core Foundation so booleans, numbers, strings, arrays, and dictionaries keep their plist types. Collections apply as whole-value replacements; datetimes and binary plist data are still skipped with a warning. (#12947 by @jdx)

Changed
  • bootstrap: Adopting global configuration or a shared dotfile-history setup repository is now spelled mise bootstrap --adopt (and mise bootstrap remote --adopt), separate from mise bootstrap --from for running a bootstrap project. The dotfiles, history, setup, and services guides were reorganized to lead with usable examples. The previous --from-git spelling still works as a hidden alias but warns and is scheduled for removal in mise 2026.10.0. (#12953 by @jdx)
Fixed
  • github: Git operations (clones, fetches, submodules) that GitHub now challenges with HTTP 401 on public repositories can authenticate using mise's existing GitHub token sources via a command-scoped github.com HTTPS credential helper. Tokens are kept out of command arguments and URLs, and Enterprise hosts are out of scope. (#12945 by @jdx)
  • config: The default inline task shell is now sh -o errexit -c so shells that consume the argument right after -c (such as FreeBSD sh) run your command instead of trying to execute -o. (#12949 by @jdx)
  • windows: Fixed two Windows ARM64 issues: stale command-wrapper shims (like a leftover cargo.exe) that caused recursive .exe/.cmd dispatch after shim-mode changes are now pruned, and Aqua ARM64 emulation candidates apply the registry's amd64 replacement so tools like LuaLS resolve their published win32-x64 assets. (#12931 by @jdx)
  • bootstrap: Bootstrap no longer aborts on Arch when pacman -Q prints a file advisory for a missing package that shares its name with a directory in the current working directory (for example a fish/ folder in a dotfiles checkout). (#12932 by @nettlesh)
  • sandbox: Read-restricted macOS Seatbelt profiles now allow metadata-only access to /private, fixing startup failures for load-relative binaries like Ruby 4.0.6 when run under /private/tmp. Directory listings and descendant reads stay denied. (#12940 by @jdx)
  • bootstrap: The macOS notification helper is now built and Developer ID-signed at release time and spawned with a start handshake, so short dotfiles sync runs no longer race the helper and macOS accepts it. Unsigned source builds (such as Homebrew) disable notifications and warn during origin setup. (#12946 by @jdx)
  • vfox: vfox install phases now flow through the active install progress reporter, mapping noisy download, checksum, attestation, and extraction lines into concise phases instead of scrolling log output. (#12944 by @jdx)
  • java: The java -version banner shown during install verification now stays inside the interactive install progress row instead of printing to the terminal. (#12943 by @jdx)
  • version: The auto-update hint from mise version now uses the mise settings auto_update=true syntax to match the rest of mise settings. (#12957 by @jdx)
Performance
  • On Unix, plain inline commands (like node build.js) now run directly when a conservative planner deems them safe, skipping the shell wrapper. Anything involving shell syntax, quoting, expansion, builtins, ambiguous PATH lookup, explicit shell settings, or sandboxed/audited tasks still uses the shell, and Windows is unchanged. In a microbenchmark of short commands this cut about 11% off elapsed time. (#12950 by @jdx)
Registry
  • Added cargo-deny, kingfisher, nushell, shellharden, sherif, and tauri-cli. (#12938 by @jrandolf)
Documentation
  • Restored the prominent project name and pronunciation on the homepage. (#12936 by @jdx)
  • Dropped the "you need Git installed" prerequisite from the install docs. (#12958 by @jdx)

Full Changelog: https://github.com/jdx/mise/compare/v2026.9.2...v2026.9.3

💚 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.

View originalPermalink
How v2026.9.3 went
v2026.9.2

v2026.9.2: Packslip Backend, SSH Relay, and Reimagined Install Progress

Added 10
  • New packslip: backend installs tools from vendor-published, cryptographically signed release manifests with signer pinning, signature verification, and support for custom hosts and monorepo tools
  • Signer pinning records the first accepted release signer in pins.toml and refuses releases signed by anyone else or those that weaken provenance
  • New packslip.stampers setting requires that a trusted host has stamped a version before mise offers or installs it
  • Declared host requirements including OS/glibc minimums, shared libraries, and required commands are checked before download
  • Tools' packslip can ship shell completions and agent skills, with completion printing via mise completion and agent skills linking via mise skills sync
  • Redesigned install progress for interactive terminals showing a live region with install-wide fractional bar, per-tool phase/elapsed/artifact rows, and permanent completion lines
Changed 2
  • Bootstrap dotfiles-tracking model rebuilt to track files through ordinary Git commits synchronized with an origin
  • Resolver hosts and retry progress are surfaced in CI/pipe logs
Fixed 1
  • Dozens of fixes across shims, tasks, brew, Go, npm, and the schema
Security 1
  • Two security fixes implemented

From mise

This is a large release headlined by the new stable packslip: backend for installing tools from a vendor's own signed release manifest, a read-only GitHub SSH relay for remote onboarding, redesigned install progress for both terminals and CI logs, and a rebuilt dotfiles-tracking model for bootstrap. It also carries dozens of fixes across shims, tasks, brew, Go, npm, and the schema, plus two security fixes.

Highlights
  • The packslip: backend is now generally available: install tools directly from a project's cryptographically signed release manifest, with signer pinning, trusted stampers, host-requirement checks, shell completions, and agent skills all driven from the same signed source.
  • Install output was reimagined end to end. Interactive terminals get a live region with a fractional install-wide bar and permanent completion lines, while CI logs, pipes, and AI-agent terminals get a compact append-only reporter instead of thousands of scrolling rows.
  • Bootstrap grows a read-only GitHub SSH relay and --from-git onboarding, an AUR package manager, and a rebuilt dotfiles-history model that tracks files through ordinary Git commits synchronized with an origin.
Added
  • packslip: New packslip: backend installs tools from a vendor-published, signed release manifest (a sigstore bundle) that names every artifact with its digest, platform, format, and executables. The tool name is a pin, like a known_hosts entry: packslip:github.com/owner/repo accepts only a packslip signed by that repository's release workflow, and signature, log entry, statement, digest, and size are all verified before anything is unpacked. Custom hosts and monorepo tools are supported. The backend is no longer experimental. (#12778, #12811 by @jdx)

    [tools]
    "packslip:github.com/oxc-project/oxc/oxlint" = "latest"
    
  • packslip: Signer pinning remembers, per project, the signer that signed the first accepted release in a pins.toml file (like SSH's known_hosts) and records the signer in mise.lock, so a later release signed by anyone else, or one that weakens provenance, is refused. mise packslip pins lists what is pinned and mise packslip forget <project> accepts an announced key rotation. (#12783 by @jdx)

  • packslip: New packslip.stampers setting lets you require that a trusted host has stamped a version before mise offers or installs it (a scanning service, a mirror, or eventually the registry), with a per-tool trust = "vendor" override. (#12782 by @jdx)

  • packslip: Declared host requirements (OS/glibc minimums, shared libraries, required commands) are checked before download; confirmed failures refuse the install, gaps mise cannot verify warn only, and ignore_requirements = true overrides hard failures. latest also resolves from verified vendor recommendations. (#12804, #12805 by @jdx)

  • packslip: A tool's packslip can ship shell completions and agent skills. mise completion <shell> --tool <name> prints (or --install writes a version-aware stub for) completions for whichever version is active in the current directory, and mise skills ls / mise skills sync link a tool's Agent Skills into .claude/skills at the pinned version. Completions are also loaded automatically in activated shells. (#12779, #12780, #12848 by @jdx)

  • install: Redesigned install progress. Interactive terminals now show a live region with an install-wide fractional bar, per-tool phase/elapsed/artifact rows, dependency-wait rows ("waiting for node@24.20.0"), and permanent completion lines written into scrollback. prune, uninstall, and upgrade removals reuse the same session, so pruning hundreds of versions no longer floods the screen. (#12906 by @jdx)

  • install: CI logs, pipes, and AI-agent terminals (CLAUDECODE/AI_AGENT) get a compact append-only reporter: one permanent line per finished tool plus a periodic snapshot of the bar, active phases, transfer rates, and queue count, instead of hundreds of scrolling status rows. Resolver hosts and retry progress are surfaced too. (#12902, #12907 by @jdx)

  • ssh: New mise ssh runs ordinary OpenSSH sessions with optional session-scoped, read-only GitHub access, and mise bootstrap remote --from-git onboards a remote host from a Git repo. The initiating machine keeps the credential and brokers authorized clone/fetch and REST reads over an SSH Unix-socket forward; no token is installed on the target. (#12830 by @jdx)

    mise ssh devbox --github-relay-read-only --github-relay-repo jdx/dotfiles
    
  • bootstrap: mise bootstrap --from-git <GIT_URL> clones a repository-backed global config into $MISE_CONFIG_DIR so its config.toml, conf.d/, and tasks apply on the first bootstrap and stay active afterward. (#12715 by @jdx)

  • bootstrap: New aur: package manager installs from the Arch User Repository via yay (preferred) or paru, with foreign-package status detection so repo packages with colliding names cannot satisfy an AUR request. Bootstrap can also declare packages as absent to remove them, and now reports which root declarations were selected. (#12718, #12716, #12770 by @jdx)

  • bootstrap: Rebuilt dotfiles tracking. Files enrolled with mode = "track" stay in place while mise commits changes to a separate bare Git store with checkpoints, rollback/undo, and optional origin synchronization, including encryption of shared files before storage. (#12918 by @jdx)

  • activate: New activate_shims = false (MISE_ACTIVATE_SHIMS=false) keeps tool shim directories off PATH during activation and hooks without changing your auto-install or lazy-tool settings. Command wrappers such as mr-boxington's cargo keep working. (#12926 by @jdx)

  • core: Rust tools accept mr_boxington = true and mise use gains a repeatable --tool-option KEY=VALUE flag, so setting up the Cargo wrapper is a single command. (#12908 by @jdx)

    mise use --tool-option mr_boxington=true rust mr-boxington
    
  • ruby: mise now reads Bundler's ruby file: ".ruby-version" form from a Gemfile (resolving the path next to the Gemfile), so projects that pin Ruby through a sibling file resolve correctly. (#12914 by @jdx)

  • self-update: New global-only self_update.repository and self_update.api_url settings let organizations point manual updates, out-of-date hints, and automatic updates at a curated GitHub or GitHub Enterprise release mirror. Project config cannot redirect updates, and artifacts still pass the embedded-signature check. (#12735 by @jdx)

  • backend: install_env is now applied when resolving and downloading tools, not just at build time. (#12777 by @rabadin)

  • brew: mise can now evaluate ordinary third-party taps. (#12774 by @jdx)

Fixed
  • shim: Lazy tool names now match on Windows, and mise-shim.exe resolves correctly through a symlinked mise.exe. (#12699 by @jdx, #12915 by @acooler15)
  • activate: Paths are translated for the calling Windows POSIX shell, and PowerShell pipeline input is now forwarded. (#12736, #12925 by @jdx)
  • nushell: The activation prelude preserves the PATH list type. (#12754 by @Junaid-PK)
  • task: Task globs no longer loop on symlinks, sources accepts a single string, task status is preserved when the cache audit tracer fails, and POSIX shells no longer have PATH pre-converted (the shell already does it). (#12711, #12769 by @jdx, #12530 by @risu729, #12696 by @JamBalaya56562)
  • npm: Global installs now work with pnpm 12. (#12717 by @jdx)
  • go: Private modules resolve via Go, and loong64 uses the correct artifact architecture. (#12731 by @kejne, #12767 by @jdx)
  • brew: A tapped install now explains why it found no API metadata, and all tap formula layouts are supported. brew-cask packages with auto_updates enabled are upgraded correctly. (#12645 by @Marukome0743, #12837 by @soodoh, #12857 by @himkt)
  • github: Releases with no assets are omitted from the version list, and OAuth-refresh warnings are silenced during env export and shown only once when a refresh is rejected. (#12572 by @Marukome0743, #12855, #12911 by @jdx)
  • config: Every newly added .tool-versions line is now terminated with a newline. (#12740 by @dylanpulver)
  • env: Bootstrap shims for lazy tools are created when printing the env, and duplicate unset directives are removed from hook output. (#12726 by @hktitof, #12707 by @jdx)
  • http: A failed download's partial file is flushed before giving up, and cache compression finishes before files are published. (#12823 by @Marukome0743, #12894 by @jdx)
  • bootstrap: Tera templates render in hooks, tildes expand in managed file sources, and the relative config dir is pinned during reexec. (#12727, #12768, #12721 by @jdx)
  • backend: Disabled plugins are excluded from shorthand resolution, and installed plugins are included in plugin completion. (#12927, #12720 by @jdx)
  • rust: Incomplete rustup toolchains are reconciled. (#12771 by @jdx)
  • oci/vfox/aqua: OCI reused tool layers preserve their paths, vfox preserves the tool name from legacy lockfiles, and aqua handles repository transfers in attestations. (#12749, #12745, #12766 by @jdx)
  • sandbox: SYS_fork/SYS_vfork are omitted on aarch64. (#12807 by @jamescassell)
  • dotfiles: A stale directory the deeper walk already removed is tolerated. (#12697 by @vladbisceanu)
  • schema: Absent bootstrap packages, inline dotfile content, and missing built-in deps providers are now modeled. (#12785 by @nettlesh, #12738, #12739 by @risu729)
  • lockfile: The deferred provenance baseline is dropped once auto-lock verifies the upgrade. (#12825 by @jdx)
Security
  • http: URL replacements no longer forward authorization headers or URL credentials when an HTTPS origin is rewritten to HTTP; such credential-carrying downgrades are refused, and errors omit URLs so embedded credentials cannot leak through diagnostics. (#12879 by @jdx)
  • self-update: Self-update now requires secure release sources. (#12737 by @jdx)
New Contributors
  • @acooler15 made their first contribution in #12915
  • @soodoh made their first contribution in #12837
  • @jamescassell made their first contribution in #12807
  • @nettlesh made their first contribution in #12785
  • @Junaid-PK made their first contribution in #12754
  • @kejne made their first contribution in #12731
  • @dylanpulver made their first contribution in #12740
  • @Svector-anu made their first contribution in #12714
  • @vladbisceanu made their first contribution in #12697

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

💚 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.

View originalPermalink
How v2026.9.2 went
v2026.9.1

v2026.9.1: Bootstrap firewall limiting, scoped locked mode, and lazy tools in tasks

Added 3
  • Bootstrap firewall rules now support action = "limit" for incoming TCP connections, which rate-limits connections per source using UFW's native limiting and nftables meters
  • Bootstrap systemd units now support requires, repeatable environment_file, nice, and umask directives with validation for nice ranges (-20 to 19) and octal umasks
  • New global-only locked_scopes setting allows scoping locked mode to specific config sources so distributions can ship rolling or lazy tools without forcing users to maintain a system lockfile
Changed 1
  • Registry command names are now inferred from the preferred Aqua package at build time, removing redundant bins declarations from registry entries
Fixed 7
  • Lazy tools now install when their command is invoked from mise run tasks or mise x, matching the behavior of an activated shell
  • Environment variables configured for removal are now consistently unset across mise exec, tasks, mise env, hook-env, deps, and tool stubs to prevent leaking inherited or secret variables into child processes
  • mise reshim can now safely target shared executable directories by identifying mise-owned shims and only replacing or pruning those while leaving unmanaged files in place
  • Cask binaries that reference their surrounding extracted payload now keep that payload beside the staged binary so tools can continue working after temporary install files are cleaned up
  • Fixed recursive deferred tool pruning that could hang new terminals when prompt hooks triggered a full tracked-config scan
  • Install failures caused by missing marker files now name the affected file and operation instead of reporting a bare OS error
  • 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

From mise

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=), 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 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 by @jdx)

    [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 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 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 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 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 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-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 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 by @jdx)
New Contributors
  • @azohra made their first contribution in #12686
  • @hktitof made their first contribution in #12641

Full Changelog: https://github.com/jdx/mise/compare/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.

View originalPermalink
How v2026.9.1 went
v2026.9.0

v2026.9.0: Lazy Tool Shims

Added 9
  • Declare a tool as lazy in [tools] with lazy = true and mise generates bootstrap shims into its normal user/system shim farms, installing the provider only when one of its commands is first called
  • Registry tools derive their command names from registry bins, while explicit or non-registry backends declare them with lazy_bins
  • Add mise install --include-lazy to provision all lazy declarations
  • Add new global path settings shims_dir/MISE_SHIMS_DIR, system_installs_dir/MISE_SYSTEM_INSTALLS_DIR, and system_shims_dir/MISE_SYSTEM_SHIMS_DIR for system-scoped and collocated layouts
  • Add mise reshim --system to support system-scoped installations
  • Add erlang.precompiled_os setting and MISE_ERLANG_PRECOMPILED_OS environment variable to opt into a specific Bob Ubuntu build target including Ubuntu 26.04 on compatible glibc distributions
Fixed 1
  • Postinstall hooks now activate the exact tool version being installed so nested mise invocations resolve that version instead of an older discoverable one

From mise

This release introduces lazy tool shims, which install a tool automatically the first time one of its commands is invoked, plus an opt-in Erlang precompiled OS override and a fix for nested mise calls during postinstall hooks.

Added
  • tools: Declare a tool as lazy in [tools] with lazy = true and mise generates bootstrap shims into its normal user/system shim farms. The provider is installed only when one of its commands is first called, then executes immediately; subsequent calls run the real binary without another mise dispatch. Registry tools derive their command names from registry bins, while explicit or non-registry backends declare them with lazy_bins. A bare mise install skips lazy declarations; use mise install --include-lazy to provision them all. New global path settings (shims_dir/MISE_SHIMS_DIR, system_installs_dir/MISE_SYSTEM_INSTALLS_DIR, system_shims_dir/MISE_SYSTEM_SHIMS_DIR) and mise reshim --system support system-scoped and collocated layouts. (#12594 by @jdx)

    [tools]
    node = { version = "24", lazy = true }
    "github:example/acme" = { version = "1.2.3", lazy = true, lazy_bins = ["acme", "acmectl"] }
    
  • erlang: New erlang.precompiled_os setting (and MISE_ERLANG_PRECOMPILED_OS) opts into a specific Bob Ubuntu build target—including Ubuntu 26.04—on compatible glibc distributions. Automatic target detection is unchanged, and lockfiles now preserve the selected OS for reproducible builds. Note the portability constraints around shared-library SONAMEs documented with the setting. (#12637 by @jdx)

Fixed
  • install: Postinstall hooks now activate the exact tool version being installed, so nested mise invocations (such as mise which or mise ls) resolve that version instead of an older discoverable one—or losing the tool entirely when it was declared through a custom config path with mise use --path. (#12635 by @jdx)
Registry
New Contributors
  • @AndryOre made their first contribution in #12444

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

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.9.0 went
v2026.8.16

v2026.8.16: Command wrappers and Windows shell fixes

Added 1
  • New [wrappers] config lets you intercept an ordinary command name with a different command, arguments, and environment
Changed 2
  • acli, mimirtool, and specstory are no longer restricted to Linux and macOS and can now be installed and run on Windows
  • llama.cpp resolution now includes prereleases since upstream began flagging its rolling bNNNN builds as GitHub prereleases
Fixed 7
  • mise env and mise activate --shims now emit valid Elvish quoting instead of bash's, fixing stray quotes, wrong PATH separator, apostrophes, exclamation marks with backslashes, and newline sequences in paths
  • mise env -s fish now splits PATH on the host's separator and recognizes the Path spelling on Windows, so semicolon-separated Windows paths are no longer severed at each drive letter
  • The "No URL for platform" error now lists every platform key a tool actually declares in mise.toml instead of falling back to a misleading "requires 'url' option" message
  • When tools are current for their configured version ranges but newer releases exist beyond those ranges, mise upgrade now lists the affected tools with their current and available versions instead of printing "All tools are up to date"
  • Double-dash task arguments are now preserved with double_dash="preserve" instead of being consumed by the outer CLI parser
  • Embedded Aube npm installs are now isolated as a standalone one-package workspace so a pnpm-workspace.yaml above MISE_DATA_DIR can no longer redirect the install into the outer workspace
  • Repository status checks now honor the global --jobs limit so mise bootstrap status, apply, and update run these read-only git checks with bounded concurrency

From mise

This release adds configurable command wrappers for intercepting ordinary commands, alongside a batch of shell and PATH fixes that make Windows activation more reliable and clearer upgrade and error messaging.

Added
  • shims: New [wrappers] config lets you intercept an ordinary command name with a different command, arguments, and environment. Wrappers take precedence over mise-managed tools, and mise strips its dispatch directories before delegating so the underlying tool still resolves from mise or the system. Works with normal activation, activate --shims, and mise exec; managed wrapper shims are refreshed by mise reshim. (#12617 by @jdx)

    [tools]
    mr-boxington = "1.1.0"
    
    [wrappers.cargo]
    command = "mbx"
    env = { MBX_CARGO_SHIM_MODE = "1" }
    
Fixed
  • elvish: mise env and mise activate --shims now emit valid Elvish quoting instead of bash's. This fixes several corruptions that mostly surfaced on Windows: stray quotes and the wrong PATH separator in activate --shims, apostrophes and ! arriving with backslashes, and \n sequences in paths like C:\nodejs being turned into newlines. (#12584 by @JamBalaya56562)

  • fish: mise env -s fish now splits PATH on the host's separator and recognizes the Path spelling on Windows, so semicolon-separated Windows paths are no longer severed at each drive letter. Empty PATH segments are dropped rather than adding the current directory. (#12582 by @JamBalaya56562)

  • http: The "No URL for platform" error now lists every platform key a tool actually declares in mise.toml, including typos and unrecognized names, instead of falling back to a misleading "requires 'url' option" message with an empty available list. (#12580 by @JamBalaya56562)

  • upgrade: When tools are current for their configured version ranges but newer releases exist beyond those ranges, mise upgrade no longer prints "All tools are up to date". It now lists the affected tools with their current and available versions plus the config source, and points to mise upgrade --bump. (#12613 by @jdx)

    Newer versions are available but do not match the configured version ranges:
      node 26.7.0 → 26.8.1 (~/.config/mise/config.toml)
    Run `mise upgrade --bump` to update the configuration and upgrade.
    
  • task: Double-dash task arguments are now preserved with double_dash="preserve". The first -- separator was previously consumed by the outer CLI parser and lost before reaching the task. (#12628 by @jdx)

  • npm: Embedded Aube npm installs are now isolated as a standalone one-package workspace, so a pnpm-workspace.yaml above MISE_DATA_DIR can no longer redirect the install into the outer workspace or mutate it. This mainly affects GitLab CI layouts where the data dir lives under CI_PROJECT_DIR. (#12630 by @jdx)

  • bootstrap: Repository status checks now honor the global --jobs limit, so mise bootstrap status, apply, and update run these read-only git checks with bounded concurrency. (#12629 by @jdx)

Changed
  • registry: acli, mimirtool, and specstory are no longer restricted to Linux and macOS and can now be installed and run on Windows. (#12627 by @JamBalaya56562)
  • registry: llama.cpp resolution now includes prereleases, since upstream began flagging its rolling bNNNN builds as GitHub prereleases. The existing minimum-release-age and b version prefix behavior is unchanged. (#12614 by @jdx)

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.15...v2026.8.16

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.8.16 went
v2026.8.15

v2026.8.15: Dotfiles diff and capture, scoped config updates, and per-tool postinstall hooks

Added 11
  • Add `mise bootstrap dotfiles diff` to preview exactly what apply would change without writing anything
  • Add `mise bootstrap dotfiles add --changed` to capture every drifted copy-mode target back into its source in one command
  • Add `manifest = "git"` option for directory `copy` and `symlink-each` entries to manage only paths returned by `git ls-files`
  • Add automatic reconciliation of stale symlinks when a profile change points a target at a different source
  • Add `mise bootstrap --from <git-url>` to clone a setup/dotfiles repo and run bootstrap from that checkout
  • Add `mise use --postinstall <COMMAND>` to attach a per-tool post-install hook that runs when that tool is installed or reinstalled
Changed 2
  • Change `mise upgrade` to no longer delete replaced installs immediately, instead scheduling them for removal after `upgrade.prune_after` (default 24h) when `upgrade.auto_prune` is on
  • Add `MISE_CONFIG_FILE`, `MISE_GLOBAL_CONFIG_FILE`, `MISE_CONFIG_ROOT`, and `MISE_PROJECT_ROOT` environment variables to tool postinstall hooks
Fixed 4
  • Fix `.env` files written as UTF-16 to be decoded and loaded instead of being silently dropped
  • Fix UTF-16 task files to receive a clear hint to save as UTF-8
  • Fix `mise install --dry-run` to not claim it would install a tool that cannot actually be installed on the current platform
  • Fix `mise exec` to report clearly when a requested tool is not available on the current platform

From mise

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 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 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 gitignores 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 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 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 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 by @jdx)

    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 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 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 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 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 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 by @JamBalaya56562)
  • install: mise install --dry-run no longer claims it would install a tool that cannot actually be installed on this platform. (#12568 by @JamBalaya56562)
  • exec: mise exec now reports clearly when a requested tool is not available on the current platform. (#12547 by @JamBalaya56562)
  • config: Request-specific tool options are preserved rather than dropped during config merges. (#12060 by @risu729)
  • config: A bare tool_alias value is now resolved through the registry. (#12506 by @Marukome0743)
  • config: Minimum-release-age exclusions from multiple configs are merged instead of overwritten. (#12460 by @jdx)
  • lockfile: Version ties are broken correctly when a legacy lockfile answers latest, and links belonging to other backends are ignored. (#12583, #12605 by @Marukome0743, @jdx)
  • monorepo: Idiomatic version files are resolved from the task's own config root. (#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, #12466, #12482, #12510, #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, #12463, #12496, #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, #12550 by @Marukome0743, @JamBalaya56562)
  • link/file: Links whose target no longer exists can now be shown and removed. (#12468, #12469 by @JamBalaya56562)
  • trust: The ignore list is now read by what its entries point at, matching how trust links are stored. (#12428 by @JamBalaya56562)
  • watch: The terminal is restored when the watched process is signalled. (#12451 by @Marukome0743)
  • activate: The pwsh deactivation preamble no longer pollutes $Error. (#12483 by @JamBalaya56562)
  • backend: Rolling updates behind a versions host are now detected. (#12440 by @jdx)
  • github: Stale cached attestations are retried. (#12495 by @jdx)
  • ls-remote: Recorded listing errors now cause a failure instead of returning stale/empty results. (#12551 by @jdx)
  • npm: Dangling aube-backed tool installs are repaired. (#12570 by @jdx)
  • bootstrap: Brew cask dependencies are preserved during prune. (#12461 by @jdx)
  • azure: The CLI now includes pip for extension support. (#12555 by @esteve)
  • registry: Windows/arm64 can fall back to x64 backends, as aqua already does. (#12560 by @JamBalaya56562)
  • doctor: The self-update leftover check is gated so it does not fire for installs that manage updates elsewhere. (#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, #12515, #12520, #12522, #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 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, #12437, #12448, #12484, #12485, #12478, #12486, #12532, #12535, #12533, #12538, #12539, #12542, #12581, #12553, #12567, #12549)

New Contributors
  • @sortA0329 made their first contribution in #12563
  • @seuros made their first contribution in #12519
  • @pb3975 made their first contribution in #12478
  • @ThorstenHans made their first contribution in #12485

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.14...v2026.8.15

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.8.15 went
v2026.8.14

v2026.8.14: npm/aube install fixes and cleaner temp/prune handling

Fixed 4
  • Aube-backed npm installs no longer drop a synthetic `.npmrc` into the per-tool install directory, with install-scoped settings now stored as typed TOML in `.config/aube/config.toml`
  • mise now intercepts the private `__node-gyp-bootstrap` trampoline to prevent failures in `allow_builds` installs whose lifecycle scripts call `node-gyp`
  • Failed extraction in HTTP cache operations now cleans up temporary directories instead of leaving permanent hash-named directories behind
  • `mise prune --configs` on Windows now correctly removes trusted config links whose target no longer exists

From mise

This is a small release focused on bug fixes for npm (aube-backed) installs, HTTP cache cleanup, and Windows config pruning.

Fixed
  • npm: Aube-backed npm installs no longer drop a synthetic .npmrc into the per-tool install directory. Install-scoped settings such as minimumReleaseAge, trustPolicyExclude, allowedUnpopularPackages, and (for CLI installs) globalDir/globalBinDir now go into .config/aube/config.toml as typed TOML, while allowBuilds stays in package.json. Inline-table trust_policy_excludes / allow_low_downloads in mise.toml still round-trip correctly. (#12425 by @jdx)
  • npm: mise now intercepts the private __node-gyp-bootstrap trampoline that embedded aube's lazy node-gyp shim re-execs. Previously naked-run rewriting turned it into mise run __node-gyp-bootstrap … and failed with "no tasks defined", breaking allow_builds installs whose lifecycle scripts call node-gyp (for example gemini-cli via node-pty). (#12429 by @jdx)
  • http: A failed extraction (truncated download, unreadable archive, full disk, or Ctrl-C mid-extraction) no longer leaves a permanent hash-named temp directory behind in http-tarballs. All failure paths now clean up the temp directory. (#12420 by @Marukome0743)
  • prune: mise prune --configs on Windows now removes trusted config links whose target no longer exists. Because Windows stores these links as plain files holding the target path, the previous existence check never fired; the link's target is now resolved before deciding whether to prune. (#12418 by @JamBalaya56562)

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.13...v2026.8.14

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.8.14 went
v2026.8.13

v2026.8.13: Task exclusions, visible conf.d fragments, and a broad round of fixes

Added 3
  • New `task_config.excludes` lets file-task discovery skip config-root-relative paths, directories, and glob patterns
  • Project configuration can now be split into visible `mise/conf.d/*.toml` fragments
  • Added `--skip-dirty` to `mise bootstrap`, `mise bootstrap repos apply`, and `mise bootstrap repos update` to warn and skip repos with local changes
Fixed 12
  • Restored dynamic shell completions that broke after the switch to usage-rs for task names, task-specific flags, task value choices, and `run=` completers
  • Command-prefix and runtime environment overrides are no longer wiped when reconstructing the pre-mise environment in an activated shell
  • A leading UTF-8 byte-order mark in an env file is now stripped before parsing
  • Fixed a regression where an offline `latest` request failed for a tool installed only with `mise install --system`
  • When a lockfile records a checksum but no provenance, mise no longer probes the GitHub releases API at install time
  • Cask installs now recursively extract single nested archives and bare cask `.pkg` downloads are staged correctly

From mise

This release adds a few configuration and task features and delivers a large batch of fixes across completions, tools, lockfiles, tasks, config parsing, and shell integration. It also restores dynamic shell completions that regressed after the recent CLI parser change.

Added
  • task: New task_config.excludes lets file-task discovery skip config-root-relative paths, directories, and glob patterns, so accidental TOML files (like a pyproject.toml inside a task directory) or entire subtrees are no longer treated as tasks. The closest config that sets excludes replaces inherited values, and an empty list clears the cascade. Relative task.disable_paths now resolve from the declaring config file. (#12366 by @jdx)

    [task_config]
    excludes = ["scripts/vendor", "**/*.generated.toml"]
    
  • config: Project configuration can now be split into visible mise/conf.d/*.toml fragments, mirroring the existing .mise/conf.d and .config/mise/conf.d support but without a hidden dot-directory. Fragments merge alphabetically, mise/config.toml still wins over fragments, and environment-specific and .local variants (for example mise/conf.d/tools.development.toml) follow the usual env config rules. (#12395 by @jdx)

  • bootstrap: Added --skip-dirty to mise bootstrap, mise bootstrap repos apply, and mise bootstrap repos update to warn and skip repos with local changes so the remaining repos still update. Origin mismatches and non-git targets still fail closed as before. (#12364 by @jdx)

Fixed
  • completion: Restored dynamic shell completions that broke after the switch to usage-rs. Task names, task-specific flags, task value choices, and run= completers work again in fish and zsh, while native file/path completion still falls back correctly. (#12376, #12379 by @jdx)
  • env: Command-prefix and runtime environment overrides (for example VAR=override mise run ...) are no longer wiped when reconstructing the pre-mise environment in an activated shell; mise-managed values are only rolled back when the live value still matches what mise recorded. (#12390 by @jdx)
  • env: A leading UTF-8 byte-order mark in an env file is now stripped before parsing. (#12320 by @JamBalaya56562)
  • backend: Fixed a regression where an offline latest request failed for a tool installed only with mise install --system; the effective install directory is now recovered so system/shared-only installs satisfy latest. (#12406 by @jdx)
  • github: When a lockfile records a checksum but no provenance, mise no longer probes the GitHub releases API at install time. This avoids hard install failures under rate limiting in high-concurrency CI, since the lockfile checksum already guarantees artifact integrity. The lockfile checksum now also takes priority over release-metadata digests. (#12377 by @effati)
  • brew: Cask installs now recursively extract single nested archives (matching Homebrew's extract_nestedly, for example a zip containing only a DMG), and bare cask .pkg downloads are staged correctly. (#12373, #12371 by @jdx)
  • pipx: Non-GitHub Git latest requests now resolve to the remote default branch HEAD and are treated as a rolling channel, so outdated and upgrade detect branch movement. An unavailable configured executable is now rejected instead of failing later. (#12407, #12416 by @jdx)
  • lockfile: Each new version is now attributed to its own request source, so in monorepo or parent/child layouts that request the same tool at different versions, every lockfile receives its own entry instead of the first request's lockfile getting them all. Monorepo root requests are also included in lockfile maintenance. (#12381, #12382 by @pikeas)
  • task: Several ordering and output fixes: keep-order buffers are flushed instead of discarded, injected tasks are anchored at their parent's keep-order slot, #MISE header keys that need quoting are no longer dropped, and negative template argument bounds are rejected. Sandbox errors now name which paths do not exist yet. (#12370, #12397, #12415, #12421, #12309)
  • config: Clearer parse errors, each reported once: TOML and settings parse failures name the offending file a single time (through the logger), and a message now explains what a backslash does when a config fails to parse. Picker descriptions are truncated safely. (#12329, #12327, #12330 by @JamBalaya56562; #12422 by @jdx)
  • generate: Generated files are now each named in output, and a task stub is named after the task rather than its file. (#12333, #12341 by @JamBalaya56562)
  • trust: A path that does not exist is now refused rather than trusting its parent. (#12372 by @JamBalaya56562)
  • prune: Tracked configs that cannot be a config file are now removed. (#12380 by @Marukome0743)
  • self-update: A failure updating plugins no longer fails the whole command. (#12363 by @JamBalaya56562)
  • cli: On Windows, mise now defaults to an editor that exists and names the editor that failed to launch. (#12375 by @JamBalaya56562)
  • nushell: __MISE_SESSION is now unset on deactivate. (#12361 by @NgoQuocViet2001)
  • elvish: The prepended PATH entry is now separated correctly from the existing PATH. (#12362 by @NgoQuocViet2001)
  • ui: Tables no longer pad the last column past its content. (#12334 by @JamBalaya56562)
Documentation
  • security: Updated the description of paranoid mode behavior. (#12394 by @jdx)
Registry

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.12...v2026.8.13

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.8.13 went
v2026.8.12

v2026.8.12: Cleaner diagnostics and a raft of task, config, and tool fixes

Added 1
  • Package-plugin managers now support pruning via an optional PackageUninstall hook, so mise bootstrap packages prune --manager <plugin> is no longer Homebrew-only
Fixed 14
  • Version-declaring files that begin with a UTF-8 byte-order mark now parse correctly instead of silently vanishing or resolving to a corrupt version
  • Saving from mise edit and the interactive TUI now preserves comments including leading, trailing, and section comments
  • An idiomatic file such as package.json that was disabled no longer triggers a spurious cannot update idiomatic version file warning on read-only operations
  • A cd target that cannot be entered is now reported with the path and OS reason instead of panicking
  • A task whose child process is killed by SIGINT is now treated as an interruption exiting 130 without failing sibling tasks
  • Value-taking usage flags without a default now stay string-typed during template rendering so path filters work on them

From mise

This release adds package uninstall support to the plugin bootstrap flow and fixes a broad set of task, config, tool, and diagnostic edge cases. Many changes turn silent failures and cryptic errors into actionable messages, so it is largely a robustness and quality-of-life release.

Added
  • bootstrap: Package-plugin managers now support pruning via an optional PackageUninstall hook, so mise bootstrap packages prune --manager <plugin> is no longer Homebrew-only. mise records ownership only for packages that go from missing to installed during an install, and prune removes only owned packages that are absent from the current config and trusted tracked configs. Pre-existing and manually installed packages are never claimed, dry-run never invokes the hook, and the keep-set is reloaded after confirmation so newly declared packages cannot be removed without another prompt. (#12332 by @jdx)
Fixed
  • config: Version-declaring files that begin with a UTF-8 byte-order mark now parse correctly. Previously a leading BOM (as written by Notepad or PowerShell's Out-File -Encoding utf8) could make .tool-versions, .node-version, package.json packageManager, registry-scraped files like Earthfile, and .sdkmanrc entries silently vanish or resolve to a corrupt version. Cached idiomatic parses written by an older mise are re-parsed so the fix takes effect on upgrade. (#12325 by @JamBalaya56562)
  • config: Saving from mise edit (and the interactive TUI) now preserves comments — leading, trailing, and section comments are captured on parse and written back on save, instead of being stripped. (#12319 by @Marukome0743)
  • config: An idiomatic file such as package.json that was tracked while enabled and later disabled no longer triggers a spurious "cannot update idiomatic version file" warning on read-only operations like mise ls --all-sources. The tracking entry is retained so re-enabling the tool reactivates it. (#12194 by @xqm32)
  • cli: A cd target that cannot be entered (for example via MISE_CD pointing at a missing directory, or a directory the process cannot chdir into) is now reported with the path and OS reason instead of panicking. (#12314 by @JamBalaya56562)
  • task: A task whose child process is killed by SIGINT (Ctrl-C reaching only the child) is now treated as an interruption, exiting 130 without failing sibling tasks, instead of reporting a spurious failure. Signalled processes now render as killed by SIGINT/killed by SIGTERM rather than "no exit status". (#12323 by @Marukome0743)
  • task: Value-taking usage flags without a default (for example --file <file>) now stay string-typed during template rendering, so path filters like dirname work on them. Switch flags still default to booleans and count flags to integers. (#12355 by @jdx)
  • tasks: On Windows, task files skipped because they have no known extension or shebang now explain why and give platform-appropriate guidance, instead of producing no output or a misleading "Are you in a project directory?" message. Outdated chmod +x advice is gone from Windows messages. (#12324 by @JamBalaya56562)
  • tool-stub: Non-cached tool-stub execution now keeps the toolset's env_with_path rather than rebuilding PATH from a pristine environment, restoring project _.path directories and fixing discovery of sibling stubs. The stub-selected tool version is no longer shadowed by an outer task's install directories. (#12322 by @tmkx)
  • watch: mise watch --clear=reset --restart no longer leaves the terminal without echo after Ctrl-C. The controlling terminal (preferring /dev/tty) is now saved and restored from a drop guard, so it recovers on normal return, errors, and cancellation, including when stdin is redirected or a second terminal is in use. (#12328 by @Marukome0743)
  • go: go install no longer inherits a GOROOT that mise exported for a different Go, which caused compile: version ... does not match go tool version ... failures when another go was first on PATH. An explicitly configured install_env GOROOT is still honored. (#12342 by @Marukome0743)
  • doctor: mise doctor now flags a tool whose install directory exists but is empty (for example after an interrupted download), marking it (empty) and suggesting mise install --force, instead of silently treating it as installed. (#12321 by @Marukome0743)
  • env: When an age SSH identity cannot be used (passphrase-protected, encrypted, hardware-backed, or an unsupported key type), decryption failures now explain which identity could not be read and why, instead of the misleading "No matching keys found". (#12339 by @Marukome0743)
  • env: The warning for an unexpanded $VAR now names the key or directive that referenced the missing variable and the config file it lives in, making it possible to find the offending line in a large [env] block. (#12316 by @Marukome0743)
  • brew-cask: Casks already owned by Homebrew are now recognized as installed (read-only) rather than reported missing and then blocked by the ownership guard, making declarative bootstrap idempotent for Homebrew-managed casks. mise leaves such installations untouched across status, apply, use, upgrade, and prune. (#12346 by @donbeave)
  • registry: oc (OpenShift client) now installs from channel aliases such as oc = "stable" by resolving the unversioned artifact name within the channel directory, fixing a 404. (#12326 by @Marukome0743)
Documentation
  • tasks: PowerShell task guidance now points extensionless tasks at MISE_TASK_DIR for locating sibling files, which works consistently across Linux, macOS, and Windows without renaming the task. (#12313 by @JamBalaya56562)
New Contributors
  • @tmkx made their first contribution in #12322

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.11...v2026.8.12

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.8.12 went
v2026.8.11

v2026.8.11: Automatic updates, remote mise installs, and versioned lockfiles

Added 7
  • Add opt-in automatic self-updates with `auto_update` setting and configurable `auto_update_check_duration` that re-executes commands with the updated binary
  • Add remote bootstrap capability to install a persistent mise on target hosts via `install_mise` setting or `--install-mise` flag
  • Add lockfile versioning with `lockfile_version = 1` to bind each request to its resolved version, with `mise lock --upgrade` for migration
  • Add Corepack replacement functionality that honors `+sha...` checksums in `packageManager` and `devEngines.packageManager` with artifact verification
  • Add SHA-224 and SHA-384 hashing support and Windows script launcher for Yarn's JS CLI
  • Add `mise prune --dry-run` explanation output showing why each version is prunable
  • Recognize Oracle GraalVM innovation feature releases
Changed 1
  • Replace CLI parser from clap to usage-rs
Fixed 13
  • Relocate pipx virtual environments when packed into OCI images by rewriting shebangs and rebasing venv interpreter links
  • Skip glibc precompiled binaries on musl Linux and fall back to ruby-build
  • Stop applying environment in bash activation under `--no-hook-env`
  • Fold any spelling of `PATH` onto a single key on Windows
  • Filter deprecated versions during npm resolution
  • Fix cargo warnings to use crate names and correct `go install` warning paths

From mise

This release adds opt-in automatic self-updates, lets remote bootstrap leave a working mise behind on each target, and introduces versioned lockfiles that bind each request to the version it resolved. It also replaces the CLI parser with usage-rs, hardens remote Git task handling, and fixes a wide range of tool-installation, task, and config edge cases.

Highlights
  • mise can now keep itself up to date and provision itself onto remote hosts, closing two long-standing gaps in unattended and remote workflows.
  • Lockfiles gained an explicit format version so overlapping loose and exact requests can pin distinct versions, with mise lock --upgrade for safe migration and no surprise drift for existing files.
  • The CLI parser moved from clap to usage-rs, and remote Git task paths are now contained against traversal, symlink, and Windows path escapes.
Added
  • self-update: New opt-in automatic updates. Enable auto_update (with auto_update_check_duration, default 7d) and mise will update itself before eligible interactive commands, then re-exec your original invocation with the new binary. Updates are throttled and lock-serialized, skipped in CI, offline, non-interactive, and shell-integration contexts, and failures never block the requested command. Package-managed builds are steered toward the official optimized binaries. (#12288 by @jdx)

    [settings]
    auto_update = true
    auto_update_check_duration = "7d"
    
  • bootstrap: Remote bootstrap can now install a persistent mise on each target instead of tearing it down with the staging directory. Set install_mise in [bootstrap.remote] (or per host) or pass --install-mise[=/path]; the same checksum-verified executable that ran the bootstrap is installed, so the host converges on the orchestrating mise version. (#12284 by @jdx)

    [bootstrap.remote]
    install_mise = true  # installs to ~/.local/bin/mise
    
  • lock: Lockfiles now carry lockfile_version = 1 and bind each original request to the entry it resolved, so overlapping requests like "1" and "1.0.0" can lock different versions. Existing unversioned lockfiles stay on format 0 during ordinary mise lock/install/upgrade to avoid drift; run mise lock --upgrade to migrate (transactional, rolls back on failure). (#12299 by @jdx)

  • node: mise can now act as a Corepack replacement, honoring the +sha... checksum suffixes in packageManager / devEngines.packageManager and verifying the exact npm, pnpm, Yarn, or bun artifact before installing. Adds SHA-224/SHA-384 hashing and a Windows script launcher for Yarn's JS CLI. (#12214 by @jdx)

  • prune: mise prune --dry-run now explains why each version is prunable, naming either the kept versions and the configs requiring them or the fact that nothing tracked references the tool. (#12304 by @Marukome0743)

  • java: Oracle GraalVM "innovation" feature releases are now recognized. (#12189 by @roele)

Fixed
  • oci: pipx virtual environments are now relocated when packed into OCI images, rewriting host-absolute shebangs and rebasing venv interpreter links (including aliases like python/latest) onto the image's Python, so tools no longer dangle at runtime. (#12211 by @jdx)
  • ruby: glibc precompiled binaries are now skipped on musl Linux, falling back to ruby-build. (#12289 by @risu729)
  • bash: activation no longer applies the environment under --no-hook-env. (#12218 by @JamBalaya56562)
  • env: any spelling of PATH now folds onto a single key on Windows. (#12312 by @JamBalaya56562)
  • npm: deprecated versions are now filtered during resolution. (#12226 by @risu729)
  • aqua: cargo warnings use crate names, go install warning paths render correctly, and mise suggests compatible package backends. (#12252, #12251, #12225 by @risu729)
  • brew: cask artifacts behind flight-created symlinks now resolve correctly. (#12243 by @jdx)
  • bootstrap: progress display is suspended while sudo prompts, brew casks are no longer reinstalled on content drift, overlapping dotfile footprints are rejected, and brew cask pkgutil patterns match correctly. (#12244, #12222, #12290, #12297 by @jdx)
  • config: dotted conf.d fragments load unconditionally again, and mise no longer prompts for trust when stdin is not a tty. (#12242 by @jdx, #12268 by @Marukome0743)
  • lock: the "run mise lock" hint now points at --global when only global config has tools. (#12260 by @jdx)
  • ls-remote: JSON prerelease output now distinguishes unknown from stable. (#12265 by @risu729)
  • doctor: the new-version warning is now reported in JSON output too. (#12267 by @JamBalaya56562)
  • install-script: the pinned binary now defaults under the data dir rather than the cache dir. (#12261 by @Guria)
  • set: mise set --file now refuses a file it cannot read back. (#12207 by @JamBalaya56562)
  • sandbox: macOS root path traversal is now allowed. (#12263 by @jrandolf)
  • task: several task fixes — Rust cache paths map to the task root (#12235 by @jrandolf), Git task snapshots are preserved (#12000 by @risu729), global task scope precedence is enforced (#12229 by @risu729), silent template overrides are preserved (#12215 by @risu729), pwsh shebang file tasks run on Windows (#12274 by @JamBalaya56562), and file task arguments forward through a -c shell (#12277 by @JamBalaya56562).
Changed
  • cli: The command-line parser, help output, and shell completions moved from clap to usage-rs. Completions and help are now generated from compiled usage metadata rather than an external usage CLI, and mise completion --install writes self-contained scripts. This raises the minimum supported Rust version to 1.95. (#12221 by @jdx)
  • generate: mise generate bootstrap is renamed to mise generate install-script to avoid confusion with mise bootstrap. The old spelling still works as a hidden, deprecated alias (removal scheduled for 2027.9.0). (#12247 by @jdx)
  • prompts: confirmation prompts now distinguish "could not ask" from an explicit "no". (#12273 by @Marukome0743)
Security
  • task: Remote Git task paths are now contained to the checkout root, rejecting .. traversal, Windows absolute/backslash and drive-qualified forms, and intermediate symlink escapes, and refusing non-regular-file targets. This closes escapes that could chmod +x and execute attacker-chosen files outside the checkout. (#12254 by @risu729)
Deprecated
  • config (Alpine): The distro-wide all_compile = true default on Alpine now warns and is scheduled for removal in 2027.8.0; precompiled musl binaries become the default path. Set all_compile = true explicitly to keep building from source. (#12287 by @risu729)
  • config (idiomatic files): Minimum-version floors in go.mod (go X.Y) and CMakeLists.txt (cmake_minimum_required) now warn when they resolve a version and stop being read in 2026.11.0. toolchain goX.Y.Z is unaffected. Only affects users who opted these tools into idiomatic_version_file_enable_tools. (#12259 by @jdx)
Documentation
  • Clarified brew-cask TCC warnings on bootstrap (#12223 by @jdx), _.source being bash-only (#12286 by @risu729) and its cacheable source example (#12278 by @Marukome0743), cross-file hook execution order (#12295 by @jdx), that --system is shared storage rather than a mise-free install (#12253 by @jdx), which backends lockfile strict mode skips (#12306 by @Marukome0743), that task deps ignores run-array refs (#12285 by @risu729), and that raw serializes execution (#12307 by @Marukome0743).
Registry
  • Added hugo-extended-withdeploy (#12230 by @Perlence), skim (#12239 by @risu729), ticker (#12269 by @i-api), and cloc (#12280 by @szepeviktor).
Performance
  • Aqua registry search avoids allocating registry ids (#12231 by @risu729), and install state is loaded per tool instead of scanning every install (#12236 by @jdx).
Breaking Changes
  • The CLI parser migration (#12221) raises the minimum supported Rust version to 1.95 for building from source, and mise completion's --include-bash-completion-lib / --usage flags are now no-ops. Command behavior, flags, and aliases are otherwise preserved.
New Contributors
  • @szepeviktor made their first contribution in #12280
  • @i-api made their first contribution in #12269
  • @jrandolf made their first contribution in #12263
  • @Perlence made their first contribution in #12230

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.10...v2026.8.11

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.8.11 went
v2026.8.10

v2026.8.10: Remote bootstrap environments and asset-matching fixes

Added 3
  • Remote bootstrap can now select which mise.<env>.toml layers load on each SSH target by setting a default with [bootstrap.remote].mise_env or passing --remote-env on the command line
  • Independent config roots can now contribute symlink-each trees that share the same target directory as long as their leaf paths are disjoint
  • mise doctor now detects leftover Windows self-update helper files in TEMP and reports their count and total size
Changed 1
  • Foreground blob lookups during rustc cache restores are now batched into a single blob-pack request instead of one request per digest
Fixed 8
  • Arch packages satisfied by an installed provider through Provides are no longer reported as missing by using pacman -T to distinguish genuinely missing packages
  • Twelve aqua backends including d2, typstyle, gitui, gradle, ktlint, kubeseal, and velero now point at their renamed canonical package ids
  • On Windows x64, azure-cli now installs from the official bundled-Python ZIP release instead of PyPI
  • Homebrew cask metadata now deserializes when the API sends auto_updates: null by treating it as the default false
  • Restored the strict preference for Windows ZIP archives over all tarball formats
  • Shorthand archive extensions like .tbz and .tbz2 are now normalized correctly when matching preferred asset names and stem-only checksums
  • External-provider link reconciliation no longer removes links owned by another source or races with concurrent installs
  • On Windows, stale helper copies in TEMP are now swept before the TEMP-length check during self-update

From mise

This release lets remote bootstrap pick which config environments run on each target, fixes several tool-installation edge cases (archive naming, Windows ZIP preference, renamed aqua packages, Homebrew cask metadata), and hardens pacman package detection and Windows self-update cleanup.

Added
  • bootstrap: Remote bootstrap can now select which mise.<env>.toml layers load on each SSH target without inheriting the orchestrator's full environment. Set a default with [bootstrap.remote].mise_env, override per host in your inventory, or pass --remote-env (repeatable or comma-separated) on the command line. (#12182 by @jdx)

    [bootstrap.remote]
    mise_env = ["production"]
    
  • bootstrap: Independent config roots can now contribute symlink-each trees that share the same target directory, as long as their leaf paths are disjoint. Overlapping leaves and file/directory collisions still fail before any changes, reporting both declaring config origins. (#12190 by @jdx)

  • doctor: mise doctor now detects leftover Windows self-update helper files (__relocated__ / __selfdelete__ copies in TEMP) and reports their count and total size, noting that a subsequent mise self-update removes them. (#12205 by @JamBalaya56562)

Fixed
  • system (pacman): Arch packages satisfied by an installed provider through Provides are no longer reported as missing. mise now uses pacman -T to distinguish genuinely missing packages, recovers the provider's version for status, and skips provider-satisfied aliases during targeted upgrades so pacman does not try to replace the provider. (#12183 by @jdx)
  • registry (aqua): Twelve aqua: backends (including d2, typstyle, gitui, gradle, ktlint, kubeseal, and velero) now point at their renamed, canonical package ids, so they install even in networks where api.github.com is unreachable. A regression test prevents this drift from returning. (#12186 by @kkom)
  • registry (azure-cli): On Windows x64, azure-cli now installs from the official bundled-Python ZIP release instead of PyPI, fixing az failing with 'python' is not recognized or No module named 'azure'. Linux and macOS continue to use the existing pipx install. (#12161 by @JamBalaya56562)
  • brew: Homebrew cask metadata now deserializes when the API sends "auto_updates": null, treating it as the default false. This was breaking metadata fetches for the majority of current casks. (#12192 by @jdx)
  • backend: Restored the strict preference for Windows ZIP archives over all tarball formats (tar.zst > tar.xz > other), which a prior change had accidentally reduced to a tiebreak. (#12200 by @risu729)
  • backend: Shorthand archive extensions like .tbz and .tbz2 are now normalized correctly when matching preferred asset names and stem-only checksums, including mixed-case suffixes. This prevents assets from losing the preferred-name bonus and selecting the wrong archive. (#12199 by @risu729)
  • sync: External-provider link reconciliation no longer removes links owned by another source or races with concurrent installs. Managed installs, runtime aliases, and links from unselected providers are preserved, and stale dangling links are correctly replaced with the winning provider's install. (#11682 by @risu729)
  • self-update: On Windows, stale helper copies in TEMP are now swept before the TEMP-length check, so cleanup still runs on the long-TEMP machines that need it most. (#12205 by @JamBalaya56562)
Performance
  • cache: Foreground blob lookups during rustc cache restores are now batched into a single blob-pack request when the remote supports it, instead of one request per digest, with response metadata validated and a safe fallback to individual blob GETs. (#12191, #12193 by @jdx)
Documentation
  • Fixed mobile table rendering and banner overlays on the docs site. (#12184 by @jdx)
  • Clarified the registry-addition popularity bar and used neutral config-file wording in trust help. (#12208, #12210 by @jdx, @risu729)
New Contributors
  • @kkom made their first contribution in #12186

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.9...v2026.8.10

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.8.10 went
v2026.8.9

v2026.8.9: Composable Bootstrap, Environment-Aware conf.d, and Faster Startup

Added 9
  • Bootstrap can now compose declarative resources from multiple independent config roots via [bootstrap].config_roots, with provenance tracking and conflict diagnostics
  • Declaration provenance is now retained and exposed for dotfiles and managed files/directories in bootstrap plan, bootstrap status, and dotfiles status commands
  • Homebrew-compatible support for self-updating casks and adoption of existing app bundles in [bootstrap.packages]
  • Remote bootstrap gains symlink materialization controls with --copy-link and --copy-links options and configuration in [bootstrap.remote]
  • Environment-specific conf.d fragments load only when that config environment is active, supporting .mise/conf.d/*.{env}.toml files
  • ignored_config_paths now supports relative entries and glob patterns including recursive **
Changed 1
  • Startup is dramatically faster on machines with vfox plugins through opt-in idiomatic file detection and cached vfox plugin metadata
Fixed 6
  • Runtime environment overrides now persist between refreshes instead of being reverted on every prompt
  • Aqua now prefers glibc release assets on unqualified glibc Linux targets, falling back to musl only when no glibc sibling exists
  • Automatic venv creation now resolves the configured uv even when invoked through a tool override
  • mise which <bin> --tool=<tool>@<version> now correctly reports when the requested version is not installed
  • The pwsh command-not-found hook now branches on command exit code and skips mise's own commands
  • Bootstrap now creates missing parent directories when bootstrapping
Security 2
  • Forge tokens no longer leak to third-party hosts
  • Safe mode now blocks tool-level install hooks

From mise

This release expands declarative bootstrap into a composable, multi-root system; adds environment-specific conf.d fragments and glob-based ignored config paths; smooths out shell activation so runtime overrides stick; and delivers major startup performance gains for vfox-backed setups. It also includes several security hardening fixes worth noting.

Highlights
  • Bootstrap can now compose declarative resources (dotfiles, files, directories, services, and Compose projects) from multiple independent config roots, with provenance tracking and clear conflict diagnostics.
  • Startup is dramatically faster on machines with vfox plugins: idiomatic file detection is now gated on opt-in, and vfox plugin metadata is cached on disk, cutting common invocations from hundreds of milliseconds to single digits.
  • Security hardening: forge tokens no longer leak to third-party hosts, and safe mode now blocks tool-level install hooks.
Added
  • bootstrap: Compose declarative resources from multiple independent config roots via [bootstrap].config_roots. Selected roots contribute [dotfiles], [bootstrap.files], [bootstrap.directories], [bootstrap.services], and [bootstrap.compose] without gaining precedence from list or glob order; identical declarations are deduplicated and conflicting declarations fail with both origins reported. (#12105, #12132 by @jdx)

    [bootstrap]
    config_roots = ["bundles/*"]
    
  • bootstrap: Declaration provenance is now retained and exposed for dotfiles and managed files/directories. mise bootstrap plan, bootstrap status, and mise dotfiles status include origin details (declaring config, config root, environment, resolved source) in JSON, and human-readable tables gain a Config column. (#12100 by @jdx)

  • bootstrap: Homebrew-compatible support for self-updating and adopted casks in [bootstrap.packages]. Casks declaring auto_updates: true are left to update themselves, and existing app bundles can be adopted globally with [bootstrap.brew].adopt = true or per cask with adopt = true. (#12074 by @ascarter)

  • bootstrap: Remote bootstrap gains symlink materialization controls. Use --copy-link <PATH> (repeatable) to dereference selected source-relative symlinks or --copy-links to recursively dereference all archived symlinks; both are also configurable in [bootstrap.remote] and per-host. Default behavior is unchanged (links stay links). (#12121 by @jdx)

  • config: Environment-specific conf.d fragments. Files like .mise/conf.d/*.{env}.toml (and .local variants) load only when that config environment is active, applying to project, global, and system conf.d directories. (#12151 by @jdx)

  • config: ignored_config_paths now supports relative entries and glob patterns (including recursive **). Entries in .miserc.toml resolve against the declaring file, while MISE_IGNORED_CONFIG_PATHS resolves against the invocation directory — making it easy to exclude vendored repos portably. (#12169 by @jdx)

  • config: mise run, naked mise <task>, mise install, mise exec, and mise watch now implicitly trust and persist the active config in normal mode, avoiding a redundant prompt. Automatic hook-env/inspection commands still require explicit trust, and paranoid and safe modes are unchanged. (#12107 by @jdx)

  • system: Plugins can declare an ordered list of candidate package names per package manager in systemDependencies, so the same capability can be expressed across distro renames (for example apt = { "libaio1t64", "libaio1" }). mise resolves the first available candidate. (#12149 by @jdx)

  • vfox: Traditional vfox plugins can now read configured [tools] options from ctx.options in PreInstall and PostInstall hooks, with scalars as strings and arrays/tables as structured Lua values. Existing hook environment variables continue to work. (#12174 by @jdx)

Fixed
  • hook-env: Runtime environment overrides now persist between refreshes. Changes made with export, shell aliases, sourced scripts, or direct PATH edits are no longer reverted on every prompt, reversing the continuous enforcement introduced in 2026.8.0. (#12094 by @jdx)
  • aqua: Prefer glibc release assets on unqualified glibc Linux targets, falling back to a musl asset only when no glibc sibling exists. Explicit libc selections stay strict. (#12093 by @jdx)
  • python: Automatic venv creation now resolves the configured uv even when invoked through a tool override (for example mise x tiny@3), so python.uv_venv_auto no longer reports uv as missing right after mise installs it. (#12177 by @jdx)
  • which: mise which <bin> --tool=<tool>@<version> now reports that the requested version is not installed (with an install hint) instead of the misleading "not currently active" message. (#12106 by @TrevorBurnham)
  • shell: The pwsh command-not-found hook now branches on the command exit code and skips mise's own commands, and the environment is refreshed on auto-install when --no-hook-env omits the hook. (#12089, #12131, #12117 by @JamBalaya56562)
  • bootstrap: Create missing parent directories when bootstrapping. (#12096 by @jdx)
  • github: Match arm assets on arm64 hosts. (#12098 by @jdx)
  • use: Scope global install hooks correctly. (#12101 by @jdx)
  • task: Support Azure DevOps cloud SSH URLs as remote git task sources, and normalize Windows task environment paths. (#12102 by @cheesemans, #12173 by @jdx)
  • system: Resolve dependency executables on Windows. (#12178 by @jdx)
  • backend: Keep flavour queries from crossing a +, and key the remote version cache by listing tool options. (#12118 by @Marukome0743, #12164 by @JamBalaya56562)
  • http: Order remote versions consistently. (#12170 by @jdx)
  • vfox: Follow symlinks when fingerprinting plugin sources, honor systemDependencies in embedded plugins, and apply netrc credentials to HTTP requests. (#12155, #12152, #12168 by @jdx)
  • Asset selection now handles non-gz tar variants. (#12156 by @sgammon)
Changed
  • backend: Removed the remaining legacy RTX_* environment variables (including RTX_TOOL_OPTS__* and RTX_ADD_PATH) passed to asdf and vfox plugin hooks. Plugin authors should use the equivalent MISE_* variables; standard ASDF_* variables remain available to asdf plugins. (#12172 by @jdx)
Performance
  • config: Idiomatic version file detection is now gated on idiomatic_version_file_enable_tools, so mise no longer boots a Lua VM for every vfox plugin on ordinary invocations. Common commands dropped from hundreds of milliseconds to single-digit milliseconds, and nested mise run/mise x chains improved dramatically. (#12143 by @jdx)
  • vfox: Filesystem plugin metadata (idiomatic filenames, dependencies, system dependencies) is now cached on disk and invalidated by plugin file changes, avoiding repeated Lua execution. (#12145 by @jdx)
  • activate: pwsh no longer runs hook-env twice per directory change. (#12147 by @jdx)
  • cache: Batch remote blob prefetch. (#12103 by @jdx)
Security
  • backend: GitLab and Forgejo authentication headers are now bound to the configured API origin, preventing tokens from leaking to third-party release asset hosts or cross-origin pagination URLs. (#12167 by @jdx)
  • Safe mode (MISE_SAFE=1) now blocks tool-level postinstall hooks and install_env from running during installation. (#12140 by @jdx)
Registry
  • Added workerd via github:cloudflare/workerd. (#12180 by @mikea)
  • Pointed vlang at the maintained vfox:jdx/vfox-v backend so it shares versions with v, replacing an unmaintained third-party version source. (#12153 by @jdx)
Breaking Changes
  • conf.d filenames: A conf.d fragment with an extra dot before .toml (for example node.tools.toml) is now interpreted as environment-specific. Use hyphens for unconditional multi-word fragment names (for example node-tools.toml). (#12151)
  • vlang versions: Configs pinning vlang = "2026.x"-style versions must move to a real upstream version such as 0.5.2 or a weekly.* tag, since the previous version strings did not correspond to upstream tags. (#12153)
  • RTX_ variables:* Plugins relying on legacy RTX_* variables must switch to MISE_*. (#12172)
New Contributors
  • @sgammon made their first contribution in #12156
  • @ascarter made their first contribution in #12074
  • @TrevorBurnham made their first contribution in #12106

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.8...v2026.8.9

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.8.9 went
v2026.8.7

v2026.8.7: Windows launchers, project conf.d, and safer installs

Added 10
  • Include tools declared by tasks when installing project dependencies
  • Support project-level conf.d configuration fragments
  • Add --windows bootstrap launchers and write Windows launchers beside generated tool stubs
  • Create real symlinks on Windows when Developer Mode or sufficient privileges allow it
  • Support launchd throttle intervals and queue-directory keys
  • Add MISE_BREW_CASK_OPT_APPDIR for choosing the application installation directory
Fixed 8
  • Detect archive formats from the final URL after redirects
  • Preserve metadata for installed backend versions
  • Redact caller-provided values used by required environment directives
  • Write configuration files atomically and match runtime options against the configured version
  • Avoid loading project configuration while generating completions
  • Exclude OS-inactive versions from inspection results
  • Support byte-order marks before file-task shebangs, attached run-option values, trailing ** source/output globs, and correct task-relative cache paths; unknown file-task header keys now warn instead of failing
  • Improve PowerShell quoting and shell detection, default environment output to PowerShell, handle POSIX .sh task siblings, and avoid unsupported UNC working directories in cmd.exe on Windows

From mise

[!IMPORTANT] The automated release for v2026.8.7 failed before binaries were published. This release is retained for changelog and version history only and intentionally has no assets. Use v2026.8.8 or newer for downloadable binaries containing these changes.

This release expands Windows support across generated launchers, dotfiles, shells, and file tasks; adds project conf.d fragments, task-specific tool installation, and APK bootstrap support; and includes a broad set of reliability and security fixes.

Added
  • install: include tools declared by tasks when installing project dependencies. (#11988 by @Marukome0743)
  • config: support project-level conf.d configuration fragments. (#12061 by @Marukome0743)
  • generate: add --windows bootstrap launchers and write Windows launchers beside generated tool stubs. (#11919, #11888 by @JamBalaya56562)
  • dotfiles: create real symlinks on Windows when Developer Mode or sufficient privileges allow it. (#11978 by @JamBalaya56562)
  • bootstrap: support launchd throttle intervals and queue-directory keys. (#12015 by @CallumKerson)
  • brew-cask: add MISE_BREW_CASK_OPT_APPDIR for choosing the application installation directory. (#12068 by @st1971)
  • generate: support selecting the checksum algorithm for generated tool stubs. (#12047 by @Marukome0743)
  • task: expose the selected prefix color to task processes. (#12056 by @Marukome0743)
  • cache: report action-cache phase timings. (#12077 by @jdx)
  • oci: support APK packages during bootstrap. (#12083 by @jdx)
Fixed
  • http: detect archive formats from the final URL after redirects. (#12011 by @Marukome0743)
  • backend: preserve metadata for installed backend versions. (#12010 by @jdx)
  • env: redact caller-provided values used by required environment directives. (#12017 by @stevenpollack)
  • config: write configuration files atomically and match runtime options against the configured version. (#12040 by @TheTrueFerret, #11714 by @risu729)
  • completion: avoid loading project configuration while generating completions. (#12018 by @Marukome0743)
  • tool: exclude OS-inactive versions from inspection results. (#12021 by @risu729)
  • task: support byte-order marks before file-task shebangs, attached run-option values, trailing ** source/output globs, and correct task-relative cache paths. Unknown file-task header keys now warn instead of failing. (#12013, #12070, #12022, #11995, #12007)
  • Windows: improve PowerShell quoting and shell detection, default environment output to PowerShell, handle POSIX .sh task siblings, and avoid unsupported UNC working directories in cmd.exe. (#12016, #12050, #12055, #11992, #12066 by @JamBalaya56562)
  • shims: match mise's own executable name case-insensitively on Windows and use the snap payload path for Unix shims. (#11986 by @JamBalaya56562, #12035 by @jdx)
  • sops/age: support multiple age keys and resolve key paths relative to their configuration files. (#12034, #12052 by @Marukome0743)
  • vfox: install the latest compatible ChromeDriver on Windows. (#12039 by @jdx)
  • brew: avoid copying cask applications more than once. (#12072 by @jdx)
  • use: preserve concurrent updates to the global configuration file. (#12069 by @jdx)
  • activate: prevent the shims directory from growing repeatedly in PATH. (#12063 by @Marukome0743)
  • tera: quote strings safely for POSIX shells. (#12065 by @Marukome0743)
  • self-update: handle Windows MAX_PATH limits safely and stop leaving large temporary copies behind after failed updates. (#12062, #12080 by @JamBalaya56562)
  • aqua: keep lock-time artifact downloads outside Windows TEMP. (#12064 by @JamBalaya56562)
  • erlang: verify checksums for precompiled installations. (#12053 by @leosmigel)
  • file: safely inspect directory links and validate whether configured extensions are launchable by the current OS. (#11715 by @risu729, #12023 by @JamBalaya56562)
  • armv7: use the hard-float suffix for GNU EABI targets. (#12082 by @neheb)

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.6...v2026.8.7

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

AI-assisted — Tool: Codex; model: openai/gpt-5; version: unavailable.

View originalPermalink
How v2026.8.7 went
v2026.8.8

v2026.8.8: Restore ARMv7 release builds

Fixed 1
  • The armv7-unknown-linux-gnueabihf build now installs a newer libclang (LLVM 6), which the aws-lc-sys bindgen step requires

From mise

[!NOTE] The automated v2026.8.7 release failed before binaries were published. v2026.8.8 includes all changes from v2026.8.7 and is the supported downloadable release for those changes.

This release restores the ARMv7 (hard-float) build so those binaries can be published again.

Fixed
  • release: the armv7-unknown-linux-gnueabihf build now installs a newer libclang (LLVM 6), which the aws-lc-sys bindgen step requires. Previously the release job panicked on every ARMv7 build because the cross Ubuntu 16.04 image shipped libclang 3.8. (#12088 by @jdx)

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.7...v2026.8.8

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

AI-assisted — Tool: Codex; model: openai/gpt-5; version: unavailable.

View originalPermalink
How v2026.8.8 went
v2026.8.6

v2026.8.6: Resumable downloads, richer Homebrew casks, and monorepo task fixes

Added 7
  • Interrupted HTTP downloads now resume via HTTP Range requests when a strong ETag or Last-Modified validator is available, with abandoned partials expiring after 30 days
  • Homebrew cask backend now supports structured symlink steps, generic cask artifacts, and copy/installer flight steps with transactional rollback
  • mise run --all opens the interactive task picker with tasks from the entire monorepo
  • Add task.cache.audit_report to write the complete cache-audit report to a JSON Lines file
  • Whole-file dotfiles entries can now declare their body inline with content = "..." instead of requiring a separate source file
  • Deps provider config fields now render Tera templates using the defining config file's context with shell-style environment expansion
  • Add a config-root-scoped [tool_config] locked = true policy that requires tools declared by configs sharing that root to resolve and install from their lockfiles
Fixed 9
  • In monorepo mode, running a task by its bare or :-prefixed name now works from any directory below a config root
  • Retry HTTP/2 REFUSED_STREAM failures which CDNs emit as backpressure
  • Honor system install destinations for downloads
  • When a downloaded checksum file lists per-file hashes but none match the target filename, mise now errors instead of silently returning a wrong checksum
  • Discover wheel-only package versions from PEP 503 Simple API indexes so packages published only as wheels now appear in mise ls-remote
  • The rolling nightly Rust channel now resolves to a concrete nightly-YYYY-MM-DD toolchain via the official channel manifest for reproducible lock and offline reuse

From mise

This release adds resumable HTTP downloads, expands Homebrew cask support, and lands a large batch of fixes across tasks, config, install, and platform-specific behavior — with a particular focus on monorepos and Windows.

Highlights
  • Interrupted artifact downloads now resume instead of restarting from zero, and more transient network failures (including HTTP/2 REFUSED_STREAM) are retried automatically.
  • The Homebrew cask backend gained structured symlinks, generic artifacts, and copy/installer flight steps, closing several gaps in cask installation.
  • A wide round of monorepo task, config precedence, and Windows path handling fixes.
Added
  • http: interrupted downloads now resume via HTTP Range requests when a strong ETag or Last-Modified validator is available, keeping validated partial files across retries and mise invocations instead of re-downloading from byte zero. mise falls back to a clean restart when validators do not match, and abandoned partials expire after 30 days. (#11866 by @Marukome0743)

  • brew: the Homebrew cask backend now supports structured symlink steps (with path bases, templates, guards, source globs, and sudo control), generic cask artifacts, and copy/installer flight steps, with transactional rollback if an install fails. (#11962, #11963, #11964 by @jdx)

  • task: mise run --all opens the interactive task picker with tasks from the entire monorepo, matching the load path already used by mise tasks ls --all. The default picker stays scoped to the current directory hierarchy. (#11920 by @jdx)

    mise run --all
    
  • task: add task.cache.audit_report (MISE_TASK_CACHE_AUDIT_REPORT) to write the complete cache-audit report to a JSON Lines file. The console still caps at 20 paths per task, but the file now captures every undeclared read and write so large audits (e.g. Jest over node_modules) are actually usable. (#11997 by @stevenpollack)

    MISE_TASK_CACHE_AUDIT_REPORT=audit.jsonl mise run --force build
    
  • dotfiles: whole-file [dotfiles] entries can now declare their body inline with content = "..." instead of requiring a separate source file, useful for small configs and user-writable paths outside $HOME. content cannot be combined with source, mode, or exclude. (#11983 by @jdx)

  • deps: deps provider config fields (paths, commands, env, descriptions, timeouts) now render Tera templates using the defining config file's context, with shell-style environment expansion and rendered env values folded into freshness identity. Template errors surface as clear configuration errors before commands run. (#11886 by @Marukome0743)

  • config: add a config-root-scoped [tool_config] locked = true policy that requires tools declared by configs sharing that root to resolve and install from their lockfiles, without forcing global or parent-root tools into strict mode. [settings] locked, --locked, and MISE_LOCKED remain invocation-wide. (#11940 by @jdx)

Fixed
  • task: in monorepo mode, running a task by its bare or :-prefixed name now works from any directory below a config root, resolving to the nearest enclosing project instead of failing. (#11941 by @pikeas)
  • task: normalize task cwd for source freshness (#11987 by @jdx), bound buffered command output (#11922), avoid zsh process-substitution hangs (#11904), and normalize variadic usage env values (#11881) by @Marukome0743; mask archive modes in remote cache nodes (#11877 by @stevenpollack).
  • http: retry send failures that never produced a response, including HTTP/2 REFUSED_STREAM, which CDNs emit as backpressure and which previously failed on the first attempt even with retries enabled. (#11961 by @mariadeluna-tomtom)
  • http: honor system install destinations for downloads. (#11851 by @Marukome0743)
  • aqua: when a downloaded checksum file lists per-file hashes but none match the target filename, mise now errors instead of silently returning a wrong checksum. (#11973 by @jakedgy)
  • pipx: discover wheel-only package versions from PEP 503 Simple API indexes, so packages published only as wheels now appear in mise ls-remote and latest resolution. (#11959 by @jdx)
  • rust: the rolling nightly channel now resolves to a concrete nightly-YYYY-MM-DD toolchain via the official channel manifest, making nightly lock, outdated, upgrade, and offline reuse reproducible while keeping mise.toml on nightly. (#11980 by @Marukome0743)
  • ruby: support ruby-build CLI options. (#11918 by @Marukome0743)
  • conda: preserve cross-platform lock data (#11946 by @jdx) and honor URL replacements (#11930 by @Marukome0743).
  • npm: render lifecycle logs through the progress display. (#11939 by @jdx)
  • oci: strip the tag from name:tag@digest references so pulling a base image by combined tag-and-digest no longer produces a malformed token scope, while preserving registry ports. (#11979 by @fire-ant)
  • install: write tool manifests atomically. (#11957 by @jdx)
  • lock: include task-specific tools in the lockfile. (#11976 by @Marukome0743)
  • deps: invalidate deps state when a provider's command, environment, working directory, or shell changes, so an edited run command is no longer skipped as fresh (#11849); honor source and output overrides (#11896) by @Marukome0743.
  • hooks: skip tool installation in preinstall tasks. (#11927 by @Marukome0743)
  • exec: allow a symlinked resolv.conf inside the sandbox. (#11958 by @jdx)
  • generate: honor absolute localized directories. (#11975 by @NgoQuocViet2001)
  • config: allow typing j/k to filter in the mise edit tool picker (#11969 by @jakedgy); create the config directory before writing into it (#11934) and stop a conf.d drop-in from becoming the write target (#11917) by @JamBalaya56562.
  • bootstrap: avoid sudo for user-writable files (#11984) and allow Windows bootstrap without system files (#12003) by @jdx.
  • semver: stop labeling a mangled value as a semver range. (#11949 by @JamBalaya56562)
Windows fixes
  • cli: mise activate and mise completion now both accept pwsh and powershell, and shell detection recognizes .exe suffixes. (#11928 by @JamBalaya56562)
  • shell: resolve a shell named by a full Windows path. (#11950 by @JamBalaya56562)
  • shims: stop treating a full-path argv[0] as a shim name. (#11982 by @JamBalaya56562)
  • toolset: accept a Windows tool path spelled with backslashes (#11937) and reject cmd.exe metacharacters in a Windows tool path (#11947) by @JamBalaya56562.
  • dotfiles: treat an unmanaged file as a conflict on Windows too. (#11981 by @JamBalaya56562)
  • tasks: stop telling Windows users to run chmod +x. (#11923 by @JamBalaya56562)
Changed
  • upgrade/outdated: -b is now the shorthand for --bump. The old -l bump shorthand is hidden and deprecated (removal planned for 2027.8.5) so -l can later mean --local. When tools are current within configured ranges but a bump is available outside them, both commands now say so instead of reporting everything up to date. (#11945 by @jdx)
  • cli: mise use --global alongside a path is now rejected instead of silently ignored. (#11935 by @JamBalaya56562)
Deprecated
  • config: the automatic all_compile = true default on NixOS is deprecated and scheduled for removal in 2027.8.0. It currently forces source builds for Node, Python, Erlang, and Ruby even when precompiled binaries work through nix-ld; mise now warns and points to enabling nix-ld or setting all_compile = true explicitly. Alpine's source-build default is unchanged. (#11956 by @jdx)
Registry
New Contributors
  • @stevenpollack made their first contribution in #11997
  • @mariadeluna-tomtom made their first contribution in #11961
  • @pikeas made their first contribution in #11941
  • @phall1 made their first contribution in #11942

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.5...v2026.8.6

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.8.6 went
v2026.8.5

v2026.8.5: PyPy on the precompiled path, Node source patches, and a broad batch of fixes

Added 2
  • PyPy can now be installed on the precompiled path when python.compile=false and unconditionally on Windows
  • Add node.apply_patches setting to apply local or remote patches to the Node source build before ./configure runs
Changed 1
  • Remote build-cache prefetch now downloads output blobs concurrently up to 48 in parallel
Fixed 10
  • Global config precedence inside ~/.config/mise now matches documentation with config.local.toml overriding config.toml overriding conf.d/*.toml
  • mise use now updates a single tool version in place within a standard [tools.<name>] table, preserving comments, key ordering, whitespace, and nested option tables
  • Inline preinstall and postinstall hooks now run from the owning project root so relative paths resolve consistently
  • mise use --pin now prefers an exact available release when pinning instead of reusing a more-specific installed fuzzy match
  • Editing a root [task_templates.*] definition or monorepo task default now correctly invalidates affected tasks
  • Rust backend now reuses a complete external rustup installation when default Rust homes are not initialized

From mise

This release lets mise install PyPy on the precompiled path (including on Windows), adds Node source-build patching, and lands a wide set of fixes across config precedence, install hooks, version pinning, and the Rust, conda, and vfox backends.

Added
  • python: PyPy can now be installed on the precompiled path — when python.compile=false, and unconditionally on Windows, where PyPy versions previously never appeared in mise ls-remote python and could not be installed at all. mise reads the upstream downloads.python.org/pypy index, downloads and extracts the correct archive, runs ensurepip, and records a blake3 checksum in the lockfile on first install (PyPy publishes no machine-readable checksums). (#11846 by @JamBalaya56562)

    mise install python@pypy3.10-7.3.17
    
  • node: add node.apply_patches (MISE_NODE_APPLY_PATCHES) to apply local or remote patches to the Node source build before ./configure runs, mirroring ruby.apply_patches. It accepts a newline-separated list of patch files or URLs. Strip level is auto-detected from git- or diff-style markers, and patches are recorded in the lockfile since they change the built artifact. If patches are set but a precompiled Node was installed, mise now warns instead of silently dropping them. (#11850 by @JamBalaya56562)

    [settings.node]
    compile = true
    apply_patches = "./patches/local.patch"
    
Fixed
  • config: global config precedence inside ~/.config/mise now matches the documentation — config.local.toml overrides config.toml, which overrides conf.d/*.toml. Previously the order was reversed for [settings], [tools], and [env] when ~/.config/mise was outside the cwd walk. (#11906 by @halms)
  • config: mise use now updates a single tool version in place within a standard [tools.<name>] table, preserving comments, key ordering, whitespace, and nested option tables instead of collapsing the table to inline form. (#11848 by @Marukome0743)
  • install: inline preinstall and postinstall hooks now run from the owning project root, so relative paths resolve consistently even when mise install is started from a subdirectory. The invocation directory remains available through MISE_ORIGINAL_CWD. (#11857 by @jdx)
  • use: mise use --pin now prefers an exact available release when pinning, instead of reusing a more-specific installed fuzzy match. For example mise use --pin erlang@27.3 will pin 27.3 if that exact release exists remotely, rather than depending on which versions happen to be installed. (#11838 by @Marukome0743)
  • task: editing a root [task_templates.*] definition or a monorepo task default now correctly invalidates affected tasks, so stale outputs are no longer marked up to date after a template change. (#11858 by @jdx)
  • rust: mise now reuses a complete external rustup installation (for example one installed by Homebrew) when the default Rust homes are not initialized, instead of downloading and initializing its own. Explicitly configured Cargo/Rustup homes continue using the mise-managed path. (#11840 by @Marukome0743)
  • conda: conda package commands now run through prefix-aware launchers that activate each command's own conda prefix, fixing tools like jdtls that expand ${CONDA_PREFIX} and rely on activation scripts. Dependency executables stay isolated from the user's shell PATH. (#11855 by @Marukome0743)
  • python: disable_tools = ["python"] (and allowlist forms like enable_tools = ["node"]) now also suppress the _.python.venv directive, so a disabled Python no longer leaves its virtualenv activated on PATH. (#11885 by @JamBalaya56562)
  • vfox: configured vfox tool options are now exposed to plugin hooks through MISE_TOOL_OPTS__* (with legacy RTX_TOOL_OPTS__* aliases), so hooks reading os.getenv("MISE_TOOL_OPTS__...") see the resolved options during install, uninstall, exec-env, and lock paths. (#11884 by @Marukome0743)
  • aqua: explicit github_release package-type overrides from version and platform overrides are now applied, fixing installs such as recent Claude Code releases that failed with "relative URL without a base". (#11901 by @Marukome0743)
Changed
  • cache: remote build-cache prefetch now downloads output blobs concurrently (up to 48 in parallel) while reserving foreground slots for compiler lookups, dramatically speeding up large Rust cache restores that previously downloaded thousands of small artifacts serially. (#11905 by @jdx)
Documentation
  • env: clarified _.source PATH handling. (#11889 by @jdx)
  • task: fixed boolean flag usage examples. (#11887 by @Marukome0743)
Registry
  • Use aqua for helmsman. (#11908 by @scop)
Breaking Changes
  • If you relied on disable_tools = ["python"] while still keeping a _.python.venv activated, that virtualenv will no longer be activated. The existing venv remains on disk and is restored automatically when Python is re-enabled. (#11885)

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.4...v2026.8.5

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.8.5 went
v2026.8.4

v2026.8.4: Cross-backend ls, semver ordering, and bootstrap cask pruning

Added 10
  • Tools can now declare an explicit version_order (source or semver) so that latest and version-prefix resolution follow semantic precedence instead of source or chronological order for Aqua, GitHub, GitLab, Forgejo, and HTTP backends
  • mise ls <name> now matches a tool installed from multiple backends
  • mise install --force now works without tool arguments, reinstalling every configured OS-supported tool
  • Add an upgrade.auto_prune setting (default true) that controls whether mise upgrade removes the version it replaced, plus a --prune flag to force removal
  • mise bootstrap packages prune --manager brew-cask can now conservatively remove mise-owned Homebrew casks that are no longer declared in [bootstrap.packages]
  • [bootstrap.packages] entries can now use table form with a version and os-style selectors for platform-specific packages
Fixed 9
  • mise watch with no task name now runs the default task, matching mise run
  • --silent and --log-level are now forwarded into the generated activation hook
  • SOPS files decrypted through the external sops CLI are no longer skipped when no age key is present
  • On Windows, dependency DLLs are now placed beside the binaries in .mise-bins, fixing tools such as conda:postgresql and conda:zstd
  • On Windows, mise now installs the highest RubyInstaller2 build revision instead of always using the superseded -1 build
  • Concurrent Rust toolchain installs are now serialized to avoid conflicts, and Rust homes are resolved from the config environment

From mise

This release adds explicit semantic version ordering for major backends, teaches mise ls and mise install --force to work across backends, extends bootstrap package management with platform filters and cask pruning, and lands a broad batch of task, config, and platform-specific fixes.

Added
  • backend: tools can now declare an explicit version_order (source or semver) so that latest and version-prefix resolution follow semantic precedence instead of source/chronological order. This is enabled for Aqua, GitHub, GitLab, Forgejo, and HTTP backends, and fixes cases where a backport or older release line was picked ahead of a newer version (for example neo4j, victoria-metrics, go-getter, talosctl, rpk, and tealdeer). mise ls-remote continues to show upstream source order. (#11774 by @jdx)

  • ls: mise ls <name> now matches a tool installed from multiple backends. Previously, installing a tool from both its registry backend and, say, a cargo: or ubi: build would show only one of them under mise ls <name> even though both were on PATH. Spelling out a backend (e.g. mise ls ubi:jqlang/jq) still narrows to that single backend. (#11822 by @JamBalaya56562)

  • install: mise install --force now works without tool arguments, reinstalling every configured, OS-supported tool (or the monorepo union with --monorepo). (#11802 by @Marukome0743)

  • upgrade: add an upgrade.auto_prune setting (default true) that controls whether mise upgrade removes the version it replaced, plus a --prune flag to force removal on for a single run when the setting is off. Useful when a mise-managed interpreter backs a virtualenv you do not want deleted on unattended upgrades. (#11788 by @JamBalaya56562)

    [settings]
    upgrade.auto_prune = false
    
  • bootstrap: mise bootstrap packages prune --manager brew-cask can now conservatively remove mise-owned Homebrew casks that are no longer declared in [bootstrap.packages]. Removal is gated by install-time receipt metadata, fingerprint checks, and ownership validation, and Homebrew-owned, pkg, lifecycle, drifted, or shared casks are skipped with an explicit reason. (#11810 by @jdx)

  • bootstrap: [bootstrap.packages] entries can now use table form with a version and [tools]-style os selectors, so a single config can target macOS-only casks and Linux fonts. Platform-incompatible packages surface as unavailable in status output instead of aborting the run, while explicit requests for unsupported packages still error. (#11809 by @jdx)

  • brew: the brew-cask manager now supports installing font casks directly from git URLs, including selecting a branch and staging files from a subdirectory. (#11781 by @roele)

  • aqua: relative aqua.registries entries in a config file are now resolved against that config's root, so a registry.yaml committed inside a project repository can be referenced without a machine-specific absolute path. (#11804 by @JamBalaya56562)

    [settings]
    aqua.registries = ["registry.yaml"]
    
  • spm: spm: installs can now be pinned to a commit via rev:<commit> (and compatible ref:<commit>), building from source. (#11815 by @Marukome0743)

  • generate: generated git hooks can now carry extra mise flags. Anything after -- is inserted between mise and run, so a hook can target config in a subdirectory or set other global flags. (#11820 by @JamBalaya56562)

    mise generate git-pre-commit --task lint -- -C subdir -E ci
    
Fixed
  • watch: mise watch with no task name now runs the default task, matching mise run, instead of failing with "No tasks specified". (#11836 by @Marukome0743)
  • activate: --silent and --log-level are now forwarded into the generated activation hook, so per-directory hook-env output can actually be silenced. (#11831 by @JamBalaya56562)
  • sops: SOPS files decrypted through the external sops CLI (sops.rops = false) are no longer skipped when no age key is present, so KMS, Vault, PGP, and other key services work in non-strict mode. (#11834 by @Marukome0743)
  • conda: on Windows, dependency DLLs are now placed beside the binaries in .mise-bins, fixing tools such as conda:postgresql and conda:zstd that previously failed to start with a missing-DLL error. (#11825 by @JamBalaya56562)
  • ruby: on Windows, mise now installs the highest RubyInstaller2 build revision (-2, -3, …) instead of always using the superseded -1 build. (#11807 by @JamBalaya56562)
  • rust: concurrent toolchain installs are now serialized to avoid conflicts, and Rust homes are resolved from the config environment. (#11794, #11798 by @Marukome0743)
  • task: Azure DevOps remote git includes are now handled correctly. (#11768 by @cheesemans)
  • task: project-qualified monorepo tasks now match without requiring the leading //. (#11782 by @williamsjokvist)
  • task: incomplete task outputs are now detected, and task arguments are validated before dependencies run. (#11786, #11787 by @Marukome0743)
  • hooks: hook arrays are now parsed before run tables, fixing certain hook configurations. (#11792 by @jgillich)
  • vfox: a non-table hook response now returns an error instead of panicking, and URL replacements are honored. (#11793 by @JamBalaya56562, #11795 by @Marukome0743)
  • aqua: package metadata is now looked up by aqua package name, and version bounds with four components and the != operator are accepted. (#11828, #11832 by @JamBalaya56562)
  • generate: generated git hooks forward hook arguments, and nested task stub conflicts are handled. (#11801 by @JamBalaya56562, #11800 by @Marukome0743)
  • config: dropped the --file alias where -f means --force, and ignored_config_paths now matches on Windows. (#11789, #11818 by @JamBalaya56562)
  • settings: config-file writes are now refused for env-only settings, list settings no longer panic when set from the environment, and the go.set_gopath deprecation message is corrected. (#11791, #11799 by @JamBalaya56562, #11835 by @jdx)
  • exec: resolution failures now name installed-but-inactive tools to point you at the fix. (#11803 by @JamBalaya56562)
  • go: go list diagnostics are kept out of default output. (#11816 by @JamBalaya56562)
  • tera: the pat argument is honored on v1 trim_start/trim_end. (#11811 by @JamBalaya56562)
  • link: install path aliases are now rejected. (#11785 by @NgoQuocViet2001)
  • cli: the base of sub-N: version prefixes is resolved before subtracting. (#11796 by @JamBalaya56562)
  • core: zero jobs is now treated as one, and forced colors are honored in tables. (#11790 by @Marukome0743, #11847 by @jdx)
  • bootstrap: compose is now planned before dependency installation. (#11829 by @jdx)
  • registry: flutter URLs no longer double the -stable suffix. (#11808 by @JamBalaya56562)
Documentation
  • Clarified what the not-found handler can install (#11830 by @JamBalaya56562), what libc detection actually does (#11813 by @JamBalaya56562), and task_config.shell in the task.shell defaults (#11775 by @pynappo).
  • Linked the Homebrew cask cookbook for cask lifecycle concepts (#11773 by @himkt) and fixed dead bootstrap package-plugin example URLs (#11780 by @Bartok9).
Registry
  • Added android-cli (#11797 by @ggoggam) and zk (#11827 by @laraochan).
New Contributors
  • @laraochan made their first contribution in #11827
  • @williamsjokvist made their first contribution in #11782
  • @NgoQuocViet2001 made their first contribution in #11785
  • @jgillich made their first contribution in #11792
  • @pynappo made their first contribution in #11775
  • @cheesemans made their first contribution in #11768

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.3...v2026.8.4

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.8.4 went
v2026.8.3

v2026.8.3: Flatpak, Font Casks, and Task Precedence Fixes

Added 4
  • Manage per-user Flatpak installations with a new flatpak-user package manager
  • The built-in brew-cask manager now works on Linux for font-only casks, installing fonts under $XDG_DATA_HOME/fonts via Linuxbrew
  • Add a per-tool registry_url option for pipx so version listing and latest resolution can target a private PyPI-style index
  • Add a not_found_system_fallback setting to prevent a shim for a missing tool from silently falling back to a same-named binary on PATH
Fixed 14
  • Inline [tasks.<name>] definitions now take precedence over a same-named task from an included TOML file
  • A metadata-only inline task in a higher-precedence file now overlays the command-bearing definition from a lower file
  • Tasks declaring double_dash="required" again accept values passed after --
  • Configured backend options such as postinstall are now applied to explicitly requested runtime versions that carry registry defaults
  • Setting lockfile = true now creates missing project lockfiles during mise use, mise install, and upgrade flows
  • A plain mise lock now preserves the python-build-standalone artifact already recorded for each platform instead of churning the lockfile

From mise

This release expands bootstrap package management with per-user Flatpak support and Linux font casks, adds a per-tool pipx registry option and a shim safety setting, and lands a batch of task precedence, lockfile, and Python fixes.

Added
  • bootstrap: manage per-user Flatpak installations with a new flatpak-user package manager. The existing flatpak:<id> entries stay system-scoped, and you can now declare both scopes in the same config, including the same application ID. (#11757 by @jdx)

  • brew: the built-in brew-cask manager now works on Linux for font-only casks, installing fonts under $XDG_DATA_HOME/fonts via Linuxbrew. Non-font casks on Linux fail with a clear unsupported-platform error. (#11758 by @jdx)

    mise bootstrap packages use brew-cask:font-heavy-data-nerd-font
    
  • pipx: add a per-tool registry_url option so version listing and latest resolution can target a private PyPI-style index without changing the global pipx.registry_url. The latest-version cache is keyed by registry URL to avoid cross-registry reuse. (#11754 by @jdx)

  • shim: add a not_found_system_fallback setting (MISE_NOT_FOUND_SYSTEM_FALLBACK, default true). Setting it to false prevents a shim for a missing tool from silently falling back to a same-named binary on PATH, failing loudly instead — useful for hardened environments that pin an explicit allowlist of tools. (#11755 by @richid)

Fixed
  • task: inline [tasks.<name>] definitions now take precedence over a same-named task from an included TOML file instead of being silently discarded. Metadata-only inline blocks overlay the included command rather than replacing it. (#11734 by @jdx)
  • task: a metadata-only inline task in a higher-precedence file such as mise.local.toml now overlays the command-bearing definition from a lower file instead of wiping out its run. Command-bearing higher-precedence tasks still fully replace the lower one. (#11745 by @jdx)
  • task: tasks declaring double_dash="required" again accept values passed after --, which had regressed to being rejected. (#11729 by @jdx)
  • config: configured backend options such as postinstall are now applied to explicitly requested runtime versions (e.g. mise install solidity@0.8.2) that carry registry defaults, instead of being skipped. (#11550 by @risu729)
  • lockfile: setting lockfile = true now creates missing project lockfiles during mise use, mise install, and upgrade flows. An unset setting continues to update existing lockfiles only. (#11746 by @jdx)
  • python: a plain mise lock now preserves the python-build-standalone artifact already recorded for each platform instead of churning the lockfile to the newest build. Use mise lock --bump to advance the PBS build explicitly. (#11747 by @jdx)
  • python: skip junctions when syncing installs to uv to avoid errors on Windows. (#11683 by @risu729)
  • github: release-age filters like minimum_release_age now use GitHub's published_at timestamp rather than the commit created_at, so a newly published release pointing at an older commit no longer bypasses the filter. Applies across Aqua, GitHub, Ubi, SPM, Pipx, and GitHub-backed core tools. (#11756 by @jdx)
  • use: adding multiple tools in a single mise use now keeps an already-sorted [tools] table alphabetically ordered. (#11713 by @jdx)
  • rust: expand ~ in the home setting. (#11752 by @xqm32)
  • vfox: resolve backend aliases for custom plugins. (#11736 by @jdx)
  • vfox: cancel in-flight HTTP retries when interrupted with Ctrl-C. (#11735 by @jdx)
  • npm shim: npm link <package-name> (and its npm ln alias) now triggers an auto-reshim, since it installs a package globally. (#11748 by @cheezmil)
  • ls-remote: suppress the minimum_release_age warning during shell completions. (#11727 by @beisenherz)
  • docs: fix an incorrect ripgrep URL in the tool-stub docs. (#11725 by @arti5an)
New Contributors
  • @richid made their first contribution in #11755
  • @xqm32 made their first contribution in #11752
  • @cheezmil made their first contribution in #11748
  • @arti5an made their first contribution in #11725
  • @beisenherz made their first contribution in #11727

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.2...v2026.8.3

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.8.3 went
v2026.8.2

v2026.8.2: Declarative System Bootstrap

Added 15
  • mise bootstrap plan previews what bootstrap would change before applying, with table or JSON output and optional detailed exit codes
  • mise bootstrap gains declarative resource management with stable identities, dependency graphs, and validation for duplicates, missing dependencies, and cycles
  • Manage privileged files and directories via bootstrap.files and bootstrap.directories with content, ownership, mode, and explicit present/absent state
  • Secret inputs for managed files via bootstrap.secrets to reference sensitive values through environment variables
  • Managed files support template rendering with secret references via {{ secret(name="...") }}
  • mise bootstrap secrets status reports secret availability without revealing values, and --prompt-secrets prompts securely for missing secrets
Changed 3
  • ruby.compile = false is now a strict precompiled-only mode that errors with no precompiled ruby found instead of falling back to ruby-build
  • Ruby version listings for fuzzy resolution are filtered to versions with precompiled binaries for your platform when compile = false
  • task.auto_infer is now opt-in per provider via configuration instead of running whenever experimental features are enabled

From mise

This release turns mise bootstrap into a full declarative host-provisioning system: alongside packages, mise can now converge privileged files, Linux users and groups, systemd services, Docker Compose projects, and firewall rules — all with plan/apply/status workflows, secret handling, and the ability to run over SSH against remote hosts. It also makes Ruby's ruby.compile=false a strict precompiled-only mode and lands a batch of install and lockfile fixes.

Highlights
  • mise bootstrap gains a Terraform-style declarative model. A new mise bootstrap plan previews changes with table or JSON output and detailed exit codes, and each resource type has its own apply/status commands that converge only when something actually differs.
  • Bootstrap can now provision far more than tools and packages: privileged files and directories, Linux accounts, systemd services, Compose projects, and host firewall rules, with dependency ordering, fail-closed safety checks, and secret inputs sourced from environment variables (never stored in config).
  • The same bootstrap project can be applied to remote machines over SSH via mise bootstrap remote, including automatic detection of the target's OS/arch/libc and signature-verified download of the matching mise binary.
Added
  • bootstrap: declarative resource plans. mise bootstrap plan previews what bootstrap would change before applying, with table or --json output and optional --detailed-exitcode (0 = no changes, 2 = changes, 1 = error). Resources have stable identities, dependency graphs, and validation for duplicates, missing dependencies, and cycles. (#11669 by @jdx)
  • bootstrap: manage privileged files and directories via [bootstrap.files] and [bootstrap.directories], with content (inline or from a source), ownership, mode, and explicit present/absent state. Writes are atomic, removal is opt-in (and requires recursive = true for non-empty directories), and privileged work runs through hidden helpers that never expose file content in argv or logs. (#11674 by @jdx)
  • bootstrap: secret inputs for managed files. [bootstrap.secrets] references sensitive values through environment variables so nothing is stored in config, and managed files with template = true can render them via {{ secret(name="...") }}. mise bootstrap secrets status reports availability without revealing values, and --prompt-secrets prompts securely for anything missing. (#11680 by @jdx)
  • bootstrap: manage Linux users and groups via [bootstrap.users] and [bootstrap.groups], with create/update/remove, supplementary groups, home handling, and explicit state = "absent". Accounts converge before the files that reference them, and UID/GID collisions fail closed. (#11681 by @jdx)
  • bootstrap: manage Linux systemd services via [bootstrap.services] for running/stopped, enabled/disabled, and masked state. Managed files and directories can set notify to trigger reload, restart, or reload_or_restart handlers, but only after a real file change. (#11688 by @jdx)
  • bootstrap: manage Docker Compose projects via [bootstrap.compose] for running, stopped, and absent states, with pull/build/recreate/wait policies, one-shot services, orphan/volume/image removal, and explicit dependencies. Convergence compares live container runtime and health to the rendered Compose model (Compose v2 only). (#11689 by @jdx)
  • bootstrap: manage Linux host firewall rules via [bootstrap.linux.firewall] with nftables, firewalld, and UFW backends (backend = "auto"). Includes SSH-lockout protection (default-deny requires a covering allow rule or allow_lockout = true), drift detection, and preservation of undeclared rules unless exclusive is set. (#11694 by @jdx)
  • bootstrap: run bootstrap over SSH with mise bootstrap remote, targeting a named [bootstrap.remote.hosts] inventory or ad-hoc user@host targets. mise archives and stages your project, provisions a compatible mise binary on the host, runs bootstrap with forwarded flags, and cleans up staging afterward. (#11690 by @jdx)
  • bootstrap: remote provisioning now detects each target's OS, architecture, and Linux libc (glibc vs musl) and, when the local binary is not compatible, downloads the matching raw executable for the same release from GitHub with minisign-verified checksums. Custom or debug builds fail closed and require an explicit mise_bin, remote_mise, or bootstrap_command. (#11693 by @jdx)
Changed
  • ruby: ruby.compile = false is now a strict precompiled-only mode, matching python.compile. Installs error with no precompiled ruby found instead of silently falling back to ruby-build, and version listings (mise ls-remote ruby, fuzzy resolution) are filtered to versions that actually have a precompiled binary for your platform. Previously false was a no-op after precompiled binaries became the default in 2026.8.0. Unset and compile = true are unchanged; Windows is unaffected. (#11710 by @jdx)
  • task: workspace task inference is now opt-in per provider via task.auto_infer (e.g. task.auto_infer = ["node"]) instead of running whenever experimental features are enabled. Explicit mise tasks always take precedence over inferred package scripts on name and alias collisions. (#11706 by @jdx)
Fixed
  • brew: :any_skip_relocation bottles no longer leave unresolved @@HOMEBREW_*@@ placeholders in scripts and config files. That tag now only skips binary linkage relocation while text placeholders are still replaced. (#11665 by @jdx)
  • brew-cask: detect extensionless DMG downloads (such as Raycast) by their UDIF trailer instead of treating them as raw executables and failing to find the app bundle. (#11692 by @jacobbednarz)
  • lock: mise lock --bump now errors instead of writing an incomplete lockfile when a version bump would drop platform coverage that the previous locked version had. Best-effort skips are retained for platforms a tool never supported. (#11664 by @jdx)
  • pipx: release-age gating now uses PyPI's precise RFC3339 upload_time_iso_8601 timestamp instead of the timezone-naive upload_time, which previously made freshly released packages appear up to ~24h younger and over-gated them under minimum_release_age. (#11662 by @Guria)
  • pacman: pacman -Q is now parsed under LC_ALL=C so missing-package detection works in non-English locales; previously [bootstrap.packages] could bail on a translated "was not found" message. (#11673 by @rarandeyo)
  • sync: clear stale incomplete markers when an external link (from uv, nvm, pyenv, nodenv, or Homebrew) is confirmed healthy, so mise where no longer treats a working external version as incomplete after an interrupted install. (#11172 by @risu729)
  • completions: an explicit -- no longer hijacks task argument completion after usage v5. mise run <task> -- <TAB> again offers the task's declared choices instead of falling back to filenames, while still forwarding extra arguments. (#11711 by @jdx)
  • registry: shim auto-install uses new declared bins metadata to pick the correct provider before falling back to incidental executables, fixing cases where invoking the npm shim could run Node's bundled npm instead of the configured npm version. (#11666, #11671, #11676, #11677, #11678 by @jdx)
New Contributors
  • @jacobbednarz made their first contribution in #11692
  • @rarandeyo made their first contribution in #11673

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.1...v2026.8.2

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.8.2 went
v2026.8.1

v2026.8.1: Task Cache Goes Remote, Affected Tasks, and Config Ergonomics

Added 11
  • Experimental mise run --affected selects and runs only tasks in projects affected by Git changes, combining workspace dependency graph, global_inputs, and provider lockfile diffs, with support for --affected-base/--affected-head overrides, JSON output, and --explain breakdown
  • Remote task cache with composite store that layers local and remote backends, reading local first and promoting remote hits, then mirroring writes with hardened requests and read/write access modes
  • Authenticated remote cache with credentials resolving in precedence: explicit bearer token, global-only token file via MISE_TASK_CACHE_REMOTE_TOKEN_FILE, or GitHub Actions OIDC when MISE_TASK_CACHE_REMOTE_OIDC_AUDIENCE is set, with HTTPS enforcement except for loopback development
  • task.cache_max_size and task.cache_max_age settings cap the task output cache independently of global prune age, evicting least-recently-accessed entries after writes and rejecting expired entries on restore
  • mise cache task <task> command to inspect task cache with table or --json output reporting stored size, restorable bytes, saved time, last access, and outputs
  • mise cache clear --task <task> command to remove only that task's cache entries without touching working-tree outputs
Fixed 2
  • Tool versions may now contain a colon, so templated versions like {{ exec(...) | split(pat=': ') | last }} and selectors resolved from templates no longer fail config loading
  • Cache artifacts are now checksum-verified and cache declarations are audited on load

From mise

This release rounds out mise's experimental task artifact cache with size/age limits, inspection tooling, and a full local-plus-remote cache backend (including authenticated CI caching), adds experimental mise run --affected for monorepos, and lands a batch of config, upgrade, and install fixes.

Highlights
  • The experimental task output cache now supports remote sharing: a composite store reads locally first, promotes remote hits, and mirrors writes, with authenticated requests backed by token files or GitHub Actions OIDC. Cache entries can be inspected, cleared per-task, and bounded by size and age.
  • Experimental mise run --affected runs only the tasks in monorepo projects touched by your Git changes, using workspace dependency graphs, global task inputs, and provider lockfile attribution to decide what is affected.
  • The config-writing flags are now more forgiving: --file and --path are interchangeable across the commands that write config, so you no longer have to remember which name each subcommand expects.
Added
  • task: experimental mise run --affected selects and runs only the tasks in projects affected by Git changes, combining the workspace dependency graph, global_inputs, and provider lockfile diffs. Base and head revisions can be overridden with --affected-base/--affected-head or MISE_AFFECTED_*. Includes JSON output and an --explain breakdown of why each task was selected. (#11590, #11587, #11589, #11591, #11593 by @jdx)

    mise run --affected test
    mise run --affected --affected-base main test
    
  • task: remote task cache. A composite store layers local and remote backends, reading local first and promoting remote hits, then committing locally before mirroring writes so a remote failure never loses a local hit. Requests are hardened, verified, streamed, and support read/write access modes. (#11622, #11623, #11624, #11626, #11627 by @jdx)

  • task: authenticated remote cache. Credentials resolve in fixed precedence: an explicit bearer token, a global-only token file (MISE_TASK_CACHE_REMOTE_TOKEN_FILE), then GitHub Actions OIDC when MISE_TASK_CACHE_REMOTE_OIDC_AUDIENCE is set. HTTPS is enforced except for loopback development endpoints. (#11625, #11653 by @jdx)

  • task: task.cache_max_size and task.cache_max_age settings cap the task output cache independently of the global prune age, evicting least-recently-accessed entries after writes and rejecting expired entries on restore. (#11610 by @jdx)

  • task: inspect and selectively clear the cache with mise cache task <task> (table or --json, reporting stored size, restorable bytes, saved time, last access, and outputs) and mise cache clear --task <task>, which removes only that task's entries without touching your working-tree outputs. (#11604 by @jdx)

  • task: mise run --task-cache-explain <task> prints a structural breakdown of what feeds a task's cache key (input categories, counts, env/var names and presence, platform) without emitting secret-derived hashes, and works under --dry-run. Companion changes report cache miss reasons, cache statistics, resolved cache paths, and add JSON explanation output. (#11595, #11597, #11599, #11600, #11601 by @jdx)

  • task: cache artifacts are now checksum-verified and cache declarations are audited on load. (#11605, #11617 by @jdx)

  • config: --file and --path are now interchangeable across the commands that write config: mise use, mise set, mise unuse, mise unset, mise config get, and mise config set. (#11577, #11616, #11631, #11640 by @JamBalaya56562)

    mise use --file mise.local.toml node@22
    mise set --path mise.local.toml FOO=bar
    
  • upgrade: mise upgrade --no-prune keeps the version being replaced instead of uninstalling it, so external references such as virtualenvs built from a mise-managed Python keep working. Also works with --bump. (#11639 by @JamBalaya56562)

  • env: on Windows, mise now warns when the generated PATH exceeds the ~8191-character length at which cmd.exe silently drops the variable, which otherwise makes every command appear unrecognized. (#11643 by @JamBalaya56562)

  • vfox: Lua plugins gain strip_components = 1 on archiver.decompress plus sorted file.list, file.glob, and file.move, letting plugins flatten versioned archive roots and rename executables portably without shelling out. (#11652 by @jdx)

Fixed
  • config: tool versions may now contain a colon, so templated versions like {{ exec(...) | split(pat=': ') | last }} and selectors resolved from templates no longer fail config loading. (#11580 by @JamBalaya56562)
  • config: config writes no longer pick a target that config loading would ignore, honor ignore filters when a --path <dir> is given, and no longer write the global config into a conf.d drop-in. (#11571, #11609, #11633 by @JamBalaya56562)
  • upgrade: mise upgrade --bump now applies every eligible tool bump in the same config file instead of letting the last save overwrite earlier ones, and preserves successful bumps when another tool in the file fails to install. (#11572 by @Marukome0743)
  • install: a failed backend install no longer leaves runtime aliases such as latest pointing at the removed version; mise rebuilds valid symlinks (or removes dangling ones) after cleanup. (#11579 by @Marukome0743)
  • brew: Linux Homebrew bottles containing shebang executables with binary payloads (such as Watchman's watchman-diag zipapp) now relocate correctly with long Linuxbrew prefixes. (#11632 by @Marukome0743)
  • pipx: extras are now applied to git-based installs. (#11586 by @jdx)
  • prune: read-only shared installs are excluded from pruning. (#11644 by @Marukome0743)
  • task: dangling task symlinks are skipped, wildcard task matching respects group boundaries, shared pre/post dependencies are supported, and task-list flags are rejected on subcommands. Task cache writes are serialized and abandoned partial writes are cleaned up. (#11574, #11581, #11578 by @Marukome0743; #11638, #11606, #11608 by @jdx)
  • schema: JSON schemas are now published alongside the documentation. (#11596 by @jdx)
Documentation
  • Recommend installing official release binaries, clarify Node dependency behavior for npm-backed tools, offer shims as a workaround for the Windows PATH length limit, and fix a dead tool-stub example URL and an npmmirror node.mirror_url example. (#11615, #11637 by @jdx; #11642 by @JamBalaya56562; #11377, #11460 by @Bartok9)
  • Document the remote cache protocol and its trust requirements. (#11621, #11628 by @jdx)

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.0...v2026.8.1

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.8.1 went
v2026.8.0

v2026.8.0: 15% faster shims, multi-language workspaces, and precompiled Ruby

Added 7
  • Cargo workspaces are now inferred for the task graph without requiring the cargo binary
  • uv (Python) workspaces are inferred from pyproject.toml without invoking uv or Python
  • Go workspaces are discovered from go.work and go.mod files without running the go binary
  • Node workspace provider imports task suggestions including inputs, outputs, cache, and dependsOn metadata from turbo.json
  • mise tasks graph --explain shows provider and metadata-source provenance for every inferred project, dependency edge, task, and field
  • Tasks support per-task watch.no_vcs_ignore option to watch sources excluded by .gitignore
  • Groundwork for affected-project task selection with Git base/head revision resolution and CI auto-detection
Changed 4
  • Shims have 15% lower latency on Linux x64
  • Config-aware commands are 8-11% faster on Linux x64
  • Release artifacts are smaller: 11.1% for .tar.xz, 5.9% for .tar.gz, 5.0% for .tar.zst
  • Precompiled Ruby binaries are now the default when ruby.compile is unset
Fixed 1
  • --path <dir> now correctly targets a config file inside that directory for use, unuse, set, unset, dotfiles add, and system subcommands

From mise

This release makes mise noticeably faster on Linux x64: shims have 15% lower latency, while config-aware commands are 8–11% faster in local release-to-release benchmarks. It also significantly expands the experimental monorepo task workflow with dependency inference across Cargo, uv (Python), Go, and Node workspaces, and makes precompiled Ruby binaries the default.

⚡ Performance: up to 15% lower latency

Official checksum-verified Linux x64 GNU binaries were compared on an AMD Ryzen 9 7950X3D using an isolated offline fixture with warm filesystem caches (20 warmups and 200 measured runs per command):

Workloadv2026.7.18v2026.8.0Lower latency
Node shim dispatch6.990 ms5.929 ms15.2%
tasks ls7.353 ms6.574 ms10.6%
env -s bash7.942 ms7.187 ms9.5%
current7.667 ms6.961 ms9.2%
settings5.823 ms5.331 ms8.5%
--help5.036 ms4.731 ms6.1%
version5.108 ms4.884 ms4.4%
registry7.457 ms7.181 ms3.7%

Release downloads are smaller as well:

Linux x64 artifactSize change
.tar.xz11.1% smaller
.tar.gz5.9% smaller
.tar.zst5.0% smaller
Allocated ELF sections0.6% smaller

The raw executable file is 2.5% larger because of the BOLT file layout, despite its smaller allocated sections and compressed artifacts. Shim dispatch was measured in two reversed-order 300-run rounds. These are whole-release results against v2026.7.18, so they include all changes between the releases rather than isolating BOLT alone.

Highlights
  • Workspace inference now spans four ecosystems. mise tasks graph discovers projects and internal dependency edges from Cargo, uv, Go, and Node workspace metadata without needing the underlying toolchain installed, and --explain attributes every project, edge, and task field to its source.
  • Precompiled Ruby binaries are now the default, cutting install times for most users while keeping source builds available on demand.
Added
  • task: Cargo workspaces are now inferred for the task graph. mise parses root and member Cargo.toml files (no cargo binary required) to build cargo:<package> projects and internal edges from normal, dev, build, target-specific, renamed, and inherited workspace = true path dependencies, with provenance surfaced in graph output. (#11554 by @jdx)

  • task: uv (Python) workspaces are inferred from pyproject.toml. When [tool.uv.workspace] is present, member globs and exclusions define uv:<package> projects and edges come from [tool.uv.sources] workspace = true / local path entries across main, optional, dependency-group, and legacy dev dependencies — again without invoking uv or Python. (#11556 by @jdx)

  • task: Go workspaces are discovered from go.work use directives and each module's go.mod, registering stable go:<module-path> projects without running the go binary. Dependency ordering is supplied explicitly via [monorepo.projects] overrides. (#11559 by @jdx)

  • task: workspace providers can now contribute task suggestions. The Node provider imports supported inputs, outputs, cache, and dependsOn metadata from matching turbo.json entries for inferred package scripts, tracking turbo.json as a task definition source. Unsupported Turbo expressions are left unset. (#11543 by @jdx)

  • task: mise tasks graph --explain shows provider and metadata-source provenance for every inferred project, dependency edge, task, and provider-suggested field, and --json now serializes the same attribution. Config overrides are labeled as configuration rather than misattributed to inference. (#11547 by @jdx)

    mise tasks graph --explain
    
  • task: mise watch gains a per-task watch.no_vcs_ignore option so tasks can watch sources that are excluded by .gitignore (such as generated files). VCS ignores stay enabled by default to avoid scanning broad build directories; one opted-in task enables it for the combined watch process. (#11535 by @Marukome0743)

    [tasks.generate]
    run = "process generated/output.json"
    sources = ["generated/output.json"]
    watch = { no_vcs_ignore = true }
    
  • task: groundwork for affected-project task selection: mise can now resolve affected Git base/head revisions (with MISE_AFFECTED_BASE/MISE_AFFECTED_HEAD overrides and CI auto-detection for GitHub Actions and GitLab), map changed files to the workspace projects that own them, and expand that set through transitive reverse-dependency edges across providers. (#11585, #11569, #11583 by @jdx)

Changed
  • ruby: precompiled Ruby binaries are now the default when ruby.compile is unset — installs try jdx/ruby binaries first and fall back to a source build when none are available. Set ruby.compile = true to force a source build as before. (#11584 by @jdx)
Fixed
  • config: --path <dir> now targets a config file inside that directory for use, unuse, set, unset, dotfiles add, and the system subcommands. Previously --path was silently discarded when the current directory already had a config in scope, so mise unuse --path ../other could remove a tool from the wrong file. (#11575 by @JamBalaya56562)
  • task: Ctrl-C is now treated as an interruption rather than a task failure. mise run stops starting new work, exits with status 130, and no longer prints no exit status or task failed, while still allowing post-dependency cleanup to run. (#11511 by @Marukome0743)
  • task: sources and outputs now support brace globs (e.g. {a,b}/**), and literal single-element braces are preserved rather than being mangled. (#11555, #11565 by @Marukome0743)
  • python: mise run --tool python@3.12 now honors the selected interpreter when creating a _.python.venv, instead of building the venv from the first [tools] python entry. (#11567 by @JamBalaya56562)
  • unuse: mise unuse node@20 on node = ["20", "22"] now removes only the matching version and preserves the rest, including structured options and .tool-versions entries. The whole tool key is removed only for an unversioned request or after the last version is unused. (#11563 by @Marukome0743)
  • env: an explicit redact = false on a variable now excludes it from matching redactions patterns, so a short opted-out value no longer leaks into the global scrubber and partially redacts unrelated secrets. (#11564 by @jdx)
  • hook-env: if a shell command overwrites a mise-managed variable or removes a PATH entry added by mise, hook-env now detects the drift and restores it, while leaving user-owned variables, added PATH entries, and PATH reordering untouched. (#11568 by @Marukome0743)
  • dotfiles: symlink-each no longer recursively walks shared targets like ~ for status, apply, and unapply. mise now records exact source-to-target pairs in a manifest under $MISE_STATE_DIR/dotfiles, avoiding traversal of unrelated and unreadable home-directory trees. Existing installs are backfilled on their next apply. (#11549 by @jdx)
  • asdf: dependencies declared via [tools].depends are now on the PATH given to bin/download and bin/install scripts during the same mise install, fixing first-install failures where a dependency's executable was still missing. bin/install now also fails when it installs nothing. (#11531 by @Marukome0743, #11553 by @JamBalaya56562)
  • vfox: plugins whose pre_install hook returns a sha1 or md5 checksum are now verified instead of panicking with not implemented: sha1. (#11536 by @JamBalaya56562)
  • aqua: checksum files that carry a byte-order mark are now read correctly, and the checksum manifest is fetched with the text-fetching path again. (#11552, #11558 by @JamBalaya56562)
  • brew-cask: direct cask pours are hardened with transactional activation, content-fingerprinted receipts, validated paths, and structured terminate_process/postflight handling, covering current cask shapes such as Cloudflare WARP, TablePlus, Zoom, OrbStack, Surge, Plex Media Server, and Zed Preview. Homebrew-owned casks are left byte-for-byte untouched. (#11215 by @donbeave)
  • forgejo: the new fj macOS key path is now supported. (#11545 by @jdx)
  • github, gitlab: gh/glab config is now found on Windows. (#11508 by @JamBalaya56562)
  • http: HTTP client initialization failures are now handled gracefully instead of aborting. (#11561 by @Marukome0743)
Performance
  • shim: shims reuse the resolved toolset and config roots, reducing per-invocation overhead. (#11534 by @jdx)
  • task: workspace discovery caches its filesystem access. (#11562 by @jdx)
  • release: the Linux x64 binary is optimized with BOLT and overall release binary size is reduced. (#11533, #11520 by @jdx)
Documentation
  • task: workspace task precedence is now documented. (#11542 by @jdx)
Registry
  • Updated the herdr repository. (#11518 by @ogulcancelik)

Full Changelog: https://github.com/jdx/mise/compare/v2026.7.18...v2026.8.0

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

AI-assisted — Tool: Codex; model: unavailable/unavailable; version: unavailable.

View originalPermalink
How v2026.8.0 went
v2026.7.18

v2026.7.18: Monorepo task ergonomics and a broad round of fixes

Added 3
  • Add `mise tasks deps --compact` flag that expands each shared dependency subtree only once and marks later references as (already shown)
  • Monorepo task dependencies now support `./`-prefixed relative paths resolved from the declaring task's own monorepo location
  • Trailing `...` patterns in monorepo task dependencies now include the base project itself in addition to its descendants
Fixed 14
  • Cargo installs now record effective install options (features, default-features, bin, crate, locked) and reinstall automatically when any of them change
  • Plugin entries can now point at local filesystem paths (absolute, `~/`, or explicit `./`/`../` relative to the config root) and are installed as symlinks for local asdf, vfox, vfox-backend, and package plugins
  • Batch `plugins install`, `plugins install --all`, and `plugins update` now finish every plugin even when one fails and report all failures together
  • Computed environments now collapse exact duplicate PATH entries first-wins, fixing runaway `_.path` accumulation in nested shells and IDE terminals
  • Installing a tool no longer touches loaded config files to prevent spurious "file changed on disk" warnings in editors
  • mise prune --tools no longer discards references from untrusted idiomatic version files and plain `.tool-versions`

From mise

This release refines mise's experimental monorepo task workflow with relative dependency paths and a compact dependency tree view, and lands a wide batch of fixes across Cargo installs, plugins, PATH handling, Windows program resolution, Aqua locks, GitLab pagination, and more.

Added
  • task: mise tasks deps gains a --compact flag that expands each shared dependency subtree only once and marks later references as (already shown), keeping every incoming edge visible while avoiding the recursive blow-up that wildcard-heavy monorepo graphs produced. Default output is unchanged unless you pass the flag. (#11502 by @jdx)

    mise tasks deps --compact
    
  • task: monorepo task dependencies now support ./-prefixed relative paths, resolved from the declaring task's own monorepo location, so one aggregate declaration works unchanged at the root, in nested apps, and in leaves without hard-coded absolute paths. Trailing ... patterns now include the base project itself in addition to its descendants. (#11503 by @jdx)

    [tasks.test]
    depends = [{ task = "./...:groups:tests:*", optional = true }]
    
Fixed
  • cargo: installs now record the effective install options (features, default-features, bin, crate, locked) and reinstall automatically when any of them change, so changing feature flags or the selected binary no longer silently reuses the wrong artifact. Incompatible shared/system installs are shadowed in your primary install directory instead of being modified. (#11480 by @Marukome0743)
  • plugins: [plugins] entries can now point at local filesystem paths (absolute, ~/, or explicit .//../ relative to the config root). Local asdf, vfox, vfox-backend, and package plugins are installed as symlinks so source edits take effect immediately, while Git URLs, refs, archives, and file:// sources keep their existing behavior. (#11487 by @Marukome0743)
  • plugins: batch plugins install, plugins install --all, and plugins update now finish every plugin even when one fails, preserving successful changes and reporting all failures together (in deterministic order) with a failing exit status. (#11490 by @Marukome0743)
  • env: computed environments (mise env, mise x child PATHs, mise doctor) now collapse exact duplicate PATH entries first-wins, fixing the runaway _.path accumulation that appeared in nested shells and IDE terminals that inherit an activated PATH without mise's state vars. The live shell PATH is intentionally left untouched. (#11491 by @JamBalaya56562)
  • install: installing a tool no longer touches your loaded config files, so editors stop reporting spurious "file changed on disk" warnings. hook-env still detects installs and PATH changes via the mise data directory. (#11495 by @Marukome0743)
  • prune: mise prune --tools no longer discards references from untrusted idiomatic version files and plain .tool-versions, preventing removal of versions still in use by other projects. (#11501 by @jdx)
  • monorepo: idiomatic_version_file_enable_tools set in a config root's own [settings] is now honored by monorepo-wide commands like mise ls --monorepo and mise install --monorepo, instead of only being applied when mise runs from inside that root. (#11463 by @kaii-zen)
  • asdf: bin/list-all and bin/latest-stable scripts now receive your resolved mise [env] values, removals, and _.path additions, so plugins that need a credential or helper on PATH can list versions. Caches are partitioned per environment so results are never reused across differing configs. (#11492 by @Marukome0743)
  • aqua: locked HTTP installs (such as Cabal artifacts on downloads.haskell.org) again retain prefix-scoped format and file metadata, so archives are extracted correctly rather than copied as the executable. (#11499 by @jdx)
  • gitlab: authentication headers are now sent on every page of paginated release/tag requests, fixing anonymous page-2 requests on private or rate-limited GitLab projects when MISE_LIST_ALL_VERSIONS is set. (#11507 by @JamBalaya56562)
  • backend (Windows): mise now resolves a genuinely spawnable program instead of a bare name, fixing program not found errors when a tool is present only as a .cmd shim (for example a scoop- or pip-installed pipx.cmd). Interpreter-only files such as .ps1 and .vbs are recognized correctly, with .vbs file tasks routed through cscript. (#11486, #11489 by @JamBalaya56562)
  • watch: mise watch --wrap-process group is now honored on macOS instead of being silently dropped for watchexec's platform default of session. The --help text also documents the platform-dependent defaults. (#11512 by @JamBalaya56562)
  • lockfile: monorepo legacy path discovery is now cached, avoiding redundant work during lockfile operations. (#11500 by @jdx)
Registry
  • Added witr. (#11505 by @Jelenkee)
New Contributors
  • @Jelenkee made their first contribution in #11505
  • @kaii-zen made their first contribution in #11463

Full Changelog: https://github.com/jdx/mise/compare/v2026.7.17...v2026.7.18

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.7.18 went
v2026.7.17

v2026.7.17: Monorepo Task Inference and Root Defaults

Added 6
  • Node workspace packages now expose their package.json scripts as mise tasks without needing a mise.toml in every package, with stable IDs like node:@scope/app#build and monorepo path aliases such as //packages/app:build
  • Node workspaces now infer project dependency edges by matching declared internal package names to other discovered packages, surfaced through mise tasks graph
  • Experimental root task defaults via [monorepo.task_defaults.<name>] in the root mise.toml, applied by task name to both inferred and explicit workspace tasks
  • Experimental ^task upstream dependency syntax so a task can require the same task in every upstream workspace project before it runs, expanding through the project graph and skipping projects that lack the task
  • Optional dependencies via optional = true on structured task dependencies, which run all matches when present and are silently omitted when nothing matches
  • idiomatic_version_file_disable_files setting lets you disable individual idiomatic version files per tool using tool:filename pairs
Changed 1
  • mise bootstrap dotfiles add now applies captured entries by default, moves real paths into the dotfiles source before linking, normalizes and sorts [dotfiles] entries, and reports config writes and concrete apply actions
Fixed 6
  • Creating an unrelated file in a config-search ancestor directory no longer forces env._.source and full config reloads to re-run on every prompt indefinitely
  • The fish directory-change hook now stays active while commands run, so each cd in a compound command applies the matching mise environment immediately
  • Zsh activation now works with POSIX_IDENTIFIERS enabled; MISE_* changes are captured correctly instead of hitting a bad math expression error
  • Homebrew casks using the new command_wrapper artifacts and structured run lifecycle steps now install and reconcile correctly
  • Aqua version overrides now match their version_prefix family before evaluating constraints, and locked installs parse the release tag from the download URL so prefix-scoped overrides apply
  • Python uv auto-venv now respects UV_PROJECT_ENVIRONMENT when selecting, creating, and activating the virtual environment, and folds the resolved path into env cache keys

From mise

This release builds out mise's experimental monorepo task story: Node workspaces now infer project dependency graphs, import package scripts as first-class tasks, and can share configuration through root task defaults and upstream (^task) dependencies. It also adds per-tool control over idiomatic version files, a smoother dotfiles workflow, and a batch of fixes across shell activation, hook-env, Homebrew casks, Aqua, and Python uv environments.

Highlights
  • Node monorepo workspaces gain end-to-end task support: inferred project dependency edges, imported package.json scripts as node:<package>#<script> tasks, root task defaults shared by task name, and experimental ^task upstream dependencies for "build upstream projects first" ordering.
  • New optional = true task dependencies run when they match and are silently skipped when they don't, and idiomatic version files can now be disabled per tool so .nvmrc and package.json no longer fight over your Node version.
  • A round of environment and shell fixes stops hook-env from reloading every prompt after unrelated file writes, keeps the fish cd hook working during compound commands, and fixes zsh activation under POSIX_IDENTIFIERS.
Added
  • task: Node workspace packages now expose their package.json scripts as mise tasks without needing a mise.toml in every package. Scripts get stable IDs like node:@scope/app#build plus monorepo path aliases such as //packages/app:build, run in their package root through the detected package manager (npm/pnpm/Yarn/Bun) with raw argument passthrough, and explicit tasks take precedence while keeping both names linked. (#11466 by @jdx)

  • task: Node workspaces now infer project dependency edges by matching declared internal package names (dependencies, devDependencies, optionalDependencies, peerDependencies) to other discovered packages, surfaced through mise tasks graph. This is the graph that powers dependency-aware ordering. (#11435 by @jdx)

  • task: experimental root task defaults via [monorepo.task_defaults.<name>] in the root mise.toml, applied by task name to both inferred and explicit workspace tasks. Task-local config and extends templates still win. (#11473 by @jdx)

    [monorepo.task_defaults.build]
    sources = ["src/**", "package.json"]
    outputs = ["dist/**"]
    cache = { enabled = true }
    
    [monorepo.task_defaults.test]
    env = { NODE_ENV = "test" }
    
  • task: experimental ^task upstream dependency syntax so a task can require the same task in every upstream workspace project before it runs, expanding through the project graph (including transitive upstreams) and skipping projects that lack the task. Supported in depends only. (#11476 by @jdx)

    [monorepo.task_defaults.build]
    depends = ["^build"]
    
  • task: optional dependencies via optional = true on structured task dependencies. Optional deps run all matches when present and are silently omitted when nothing matches, while invalid selectors still error. Works across depends, depends_post, and wait_for. (#11471 by @jdx)

  • config: idiomatic_version_file_disable_files lets you disable individual idiomatic version files per tool using tool:filename pairs, so you can keep .nvmrc selecting Node while ignoring package.json devEngines, with pnpm still reading package.json. (#11470 by @jdx)

    mise settings add idiomatic_version_file_disable_files node:package.json
    
  • dotfiles: mise bootstrap dotfiles add now applies captured entries by default (use --no-apply for capture-only workflows), moves real paths into the dotfiles source before linking, normalizes and sorts [dotfiles] entries, and reports config writes and concrete apply actions, with rollback on failure. (#11451 by @jdx)

Fixed
  • hook-env: creating an unrelated file in a config-search ancestor directory no longer forces env._.source and full config reloads to re-run on every prompt indefinitely. Forced fast-path runs now always refresh the session. (#11458 by @Marukome0743)
  • activate: the fish directory-change hook now stays active while commands run, so each cd in a compound command applies the matching mise environment immediately, matching Bash and Zsh behavior. (#11478 by @Marukome0743)
  • activate: zsh activation now works with POSIX_IDENTIFIERS enabled; MISE_* changes are captured correctly instead of hitting a bad math expression error. (#11467 by @jdx)
  • brew: Homebrew casks using the new command_wrapper artifacts and structured run lifecycle steps (for example Firefox and OrbStack) now install and reconcile correctly instead of failing on unknown metadata. (#11472 by @jdx)
  • aqua: version overrides now match their version_prefix family before evaluating constraints, so packages with multiple tag families (like oxlint's oxlint_v and apps_v) resolve to the right override. Locked installs also parse the release tag from the download URL so prefix-scoped overrides apply. (#11469, #11482 by @jdx)
  • python: uv auto-venv now respects UV_PROJECT_ENVIRONMENT when selecting, creating, and activating the virtual environment (resolving relative paths from the workspace root), and folds the resolved path into env cache keys so alternate venv locations are honored. (#11475 by @Marukome0743)
  • lockfile: shim resolution with explicit unified monorepo lockfiles ([monorepo] lockfile = true) no longer rescans every configured monorepo root per tool, removing repeated filesystem traversal on the hot path. (#11468 by @jdx)
  • config: alias and bootstrap writers, aliased tool keys, and version arrays now preserve surrounding comments when rewriting mise.toml. (#11453, #11474, #11454 by @JamBalaya56562)
  • self-update: when self-update is disabled and no packager instructions file exists (as on Homebrew and Arch installs), mise now shows a generic upgrade hint instead of reporting an out-of-date version with no follow-up advice. (#11449 by @JamBalaya56562)
  • task: source metadata hashes now include mtime, improving change detection for task sources. (#11455 by @JamBalaya56562)
Documentation
  • Updated the stephane-robert guide URL and external post dates. (#11252 by @Bartok9)

Full Changelog: https://github.com/jdx/mise/compare/v2026.7.16...v2026.7.17

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.7.17 went
v2026.7.16

v2026.7.16: Task Workspaces, MCP Command Effects, and Dotfiles Cleanup

Added 10
  • Add per-run task cache controls via --task-cache flag and MISE_TASK_CACHE environment variable with modes read-write, read-only, write-only, off, and local-only
  • Add experimental task.cache_dir setting and MISE_TASK_CACHE_DIR environment variable to place task output artifacts on dedicated volumes or project-specific locations
  • Add experimental cache.command_inputs for cacheable tasks to invalidate on command-derived state like compiler versions
  • Add experimental workspace project graph model and provider interface for monorepo discovery including Node workspace discovery for npm, pnpm, Yarn, and Bun via Aube
  • Add new list_commands tool to mise mcp exposing each command's declared effect (read, write, destructive, or unclassified) and help text
  • Graduate cargo.binstall_native from experimental to discover conventionally named GitHub release artifacts from a crate's linked repository
Fixed 3
  • Report network failures while listing remote versions as fetch failures instead of misleading no versions found message
  • Memoize network failures per process to avoid redundant HTTP retries and reduce duplicate warning spam
  • Preserve trailing inline comments when rewriting mise.toml in mise use, mise up --bump, and mise set commands
Deprecated 1
  • Deprecate top-level mise dotfiles command in favor of mise bootstrap dotfiles with warnings in 2027.2.0 and removal in 2028.2.0

From mise

This release expands the experimental task output cache with per-run controls, a configurable cache directory, and command-derived cache inputs, and lays the groundwork for monorepo-aware task workspaces starting with Node discovery. It also teaches mise mcp to expose each command's read/write/destructive effect to agents, consolidates dotfiles management under mise bootstrap, and lands a broad batch of fixes across brew, npm, tasks, config rewriting, and OCI pushes.

Highlights
  • The experimental task output cache gains per-run controls (--task-cache / MISE_TASK_CACHE), a configurable task.cache_dir, and cache.command_inputs so cache keys can fold in runtime state like compiler versions.
  • New experimental workspace project graph model with Node monorepo discovery (npm, pnpm, Yarn, Bun) via Aube, the foundation for monorepo-aware affected-project and task inference.
  • mise mcp can now tell agents what a command does: the new list_commands tool returns each command's read/write/destructive effect so agents can reason about safety before running anything.
Added
  • task: per-run cache controls via --task-cache <mode> and MISE_TASK_CACHE, supporting read-write (default), read-only, write-only, off, and local-only. Read-only lets untrusted CI jobs consume existing results without publishing misses, write-only warms the cache without consuming entries, and off gives a clean diagnostic path while preserving normal sources freshness. Honored by mise run and bootstrap/naked task entry points. (#11396 by @jdx)

  • task: experimental task.cache_dir setting and MISE_TASK_CACHE_DIR to place task output artifacts on dedicated volumes or project-specific locations without relocating mise's entire cache. mise cache clear and mise cache prune cover the custom location. (#11399 by @jdx)

  • task: experimental cache.command_inputs so cacheable tasks invalidate on command-derived state (like node --version or a generated config fingerprint) that isn't captured by source files. Each command runs in the task directory with the resolved tool environment, and its text plus stdout/stderr hashes fold into the cache key. (#11381 by @jdx)

    [tasks.build]
    run = "..."
    sources = ["src/**/*.rs"]
    outputs = ["dist/app"]
    cache = { enabled = true, command_inputs = ["rustc --version"] }
    
  • task: experimental workspace project graph model and provider interface, the ecosystem-neutral foundation for Node, Cargo, uv, and Go monorepo discovery, plus Node workspace discovery for npm, pnpm, Yarn, and Bun monorepos powered by Aube's shared manifest parsing and workspace-confined scanning. (#11400, #11418, #11420, #11422, #11424, #11427, #11430, #11445 by @jdx)

  • mcp: new list_commands tool exposing mise's command tree with each command's declared effect (read, write, destructive, or unclassified), help text, and hidden status, so agents can see what a command does before invoking it. An optional include_hidden controls visibility, and unclassified is explicitly treated as unknown rather than safe. (#11389 by @jdx)

  • cargo: cargo.binstall_native graduates from experimental and can now discover conventionally named GitHub release artifacts from a crate's linked repository when package.metadata.binstall is absent, so more precompiled binaries install without crate-specific configuration. It also works under the default locked = true path. (#11433 by @jdx)

  • dotfiles: new mise bootstrap dotfiles unapply (with hidden mise dotfiles unapply compatibility alias) to remove managed symlinks, copies, templates, and edit blocks while preserving unmanaged content. Supports target filters, --dry-run, --yes, and requires --force for modified or ambiguous content. (#11437 by @jdx)

  • bootstrap: dotfiles management is now consolidated under mise bootstrap dotfiles (add, edit, apply, status), which runs pre-dotfiles/post-dotfiles hooks correctly. The top-level mise dotfiles command is hidden and deprecated (warnings in 2027.2.0, removal in 2028.2.0) but still works. (#11436 by @jdx)

  • bootstrap: added bs as a visible shorthand alias for mise bootstrap. (#11439 by @jdx)

  • spm: new install_command option for source installs runs a custom command from the checked-out package, and fails the install when the command exits successfully but installs nothing into bin/ (protecting against scripts that swallow build failures). (#11369 by @Marukome0743)

Fixed
  • backend: a network failure while listing remote versions is now reported as a fetch failure instead of a misleading "no versions found matching date filter". The failure is memoized per process to avoid redundant HTTP retries, cutting duplicate warning spam and install time roughly in half in the failing case. (#11391 by @jdx)
  • config: mise use, mise up --bump, and mise set now preserve trailing inline comments when rewriting mise.toml, matching the existing behavior for comments above a line and for .tool-versions. (#11415 by @JamBalaya56562)
  • oci: chunked mise oci push now accepts 201 Created on the chunk PATCH, fixing large-layer pushes to AWS ECR that previously failed with blob chunk upload failed: 201. (#11376 by @fire-ant)
  • npm: tools resolved from a mise.lock pin are now trusted through aube's low-download popularity gate for the requested package, so reproducing an existing lockfile no longer requires allow_low_downloads. First-time unlocked installs and OSV malicious-package checks are unchanged. (#11384 by @jdx)
  • npm: aube confirmation prompts are now routed through mise's shared prompt path. (#11441 by @jdx)
  • pipx: no longer suggests uv when uvx is disabled for the package. (#11373 by @JamBalaya56562)
  • dotfiles: symlink-each now prunes stale mise-managed symlinks left behind when a source file is deleted (reporting them as drift in mise dotfiles status), collapses emptied directories, and gains exclude glob patterns for directory-walking modes, while leaving unmanaged files and user links untouched. (#11388 by @jdx)
  • brew: maintain linked-keg compatibility records (#11371 by @benjaminwestern), adopt existing cask completion links (#11383 by @jdx), and use the download client for artifacts (#11428 by @jdx).
  • aqua: preserve legacy root binary layouts so tools that expect binaries at the install root keep working. (#11397 by @jdx)
  • shim: missing executables are now attributed to the configured tool that should provide them. (#11398 by @jdx)
  • bootstrap: the generated install script honors MISE_VERSION and MISE_INSTALL_PATH (#11401 by @JamBalaya56562), and mise-managed mas is now detected (#11429 by @jdx).
  • generate: git pre-commit hooks respect quiet flags (#11310), use the current env directive syntax (#11311), and resolve hooks correctly in git worktrees (#11313) — all by @Marukome0743.
  • task: support mixed file task dependencies (#11382 by @jdx), deduplicate equivalent task sources (#11204 by @risu729), support multi-line arrays in file task headers (#11412 by @Marukome0743), allow false to override script headers (#11112 by @risu729), and treat a missing content-hash baseline as stale (#11447 by @JamBalaya56562).
  • link: reject selector-style link requests. (#11218 by @risu729)
  • progress output no longer repaints over interactive confirmation prompts; the shared renderer is now suspended while a prompt owns the terminal. (#11421 by @jdx)
Documentation
  • Documented external cache inputs (#11395 by @jdx) and how packagers can disable self-update (#11446 by @JamBalaya56562).
  • Replaced the dead Taobao Node mirror example with npmmirror (#11217 by @Bartok9) and fixed a redactions glob example using removed nested syntax (#11448 by @Marukome0743).
Registry
  • Added micro (#11378 by @Jai-JAP), tealdeer (#11390 by @Jai-JAP), and aws-cdk (#11394 by @garysassano).
New Contributors
  • @Jai-JAP made their first contribution in #11390
  • @fire-ant made their first contribution in #11376
  • @benjaminwestern made their first contribution in #11371

Full Changelog: https://github.com/jdx/mise/compare/v2026.7.15...v2026.7.16

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.7.16 went
v2026.7.15

v2026.7.15: Experimental Task Output Caching

Added 10
  • Experimental local task artifact caching allows tasks with sources and outputs to restore their outputs from a content-addressed cache instead of rerunning
  • Task dependency artifact keys now fold into a task's cache key so downstream tasks reuse cached outputs when their dependencies resolve to the same artifacts
  • Result-only caching via empty outputs for checks like lint, test, and typecheck that produce no files
  • Reusable and global cache inputs with named input_groups referenced from sources and task_config.global_inputs
  • task_config.global_env for scoped environment inputs that participate in cache keys and pass_through_env to keep selected ambient variables available without affecting cache keys
  • outputs now support ordered exclusions and re-inclusions with backslash escaping
Fixed 3
  • source_freshness_hash_contents = true now skips mtime comparison entirely so tasks no longer re-run on every CI job after a cache restore resets timestamps
  • Confirming or auto-confirming the executable-bit prompt for a file task now runs the task in the same mise run instead of chmod-ing the file and still failing
  • Circular dependency detection now runs on the fully resolved graph to report cycles through wait_for, usage, and depends_post dependencies before any task runs

From mise

This release lands the first version of experimental local task output caching, letting eligible tasks restore their declared outputs and replay their logs without rerunning. It also adds structured registry idiomatic-version-file parsing, a standalone Aube installer mode, and a broad batch of task, Homebrew, shell, and Windows path fixes.

Highlights
  • Experimental local task artifact caching restores task outputs (and replays their logs) across deletions, checkouts, and unchanged CI runs, with cache keys derived from source contents, task config, tools, and environment. It works for tasks that produce files, tasks with no filesystem outputs, and multi-task graphs, and stays opt-in and conservative on any failure.
  • Registry-backed tools can now parse idiomatic version files (like dagger.json, Taskfile.yml, .chezmoiversion, and 8 more) in-process, with no plugin or shell execution.
Added
  • task: experimental, opt-in local artifact caching. Tasks with sources and explicit outputs can restore their outputs from a content-addressed cache instead of rerunning, and successful stdout/stderr are replayed through whatever output mode the current run uses. Cache keys combine source contents, task configuration and arguments, declared and allowlisted ambient environment, resolved tools, OS, and architecture. Cache failures degrade to misses or warnings rather than failing a task. (#11328, #11347 by @jdx)

    [tasks.build]
    run = "..."
    sources = ["src/**/*.rs"]
    outputs = ["dist/app"]
    cache = { enabled = true, env = ["CI"] }
    
  • task: dependency artifact keys now fold into a task's cache key, so downstream tasks reuse cached outputs when their dependencies resolve to the same artifacts, and an upstream input change correctly invalidates downstream results. (#11340 by @jdx)

  • task: result-only caching via outputs = [] for checks like lint, test, and typecheck that produce no files. Their successful result and replayable logs are cached without writing an archive. (#11351 by @jdx)

  • task: reusable and global cache inputs. Define named [task_config.input_groups] referenced from sources as @group:<name>, and task_config.global_inputs to apply config-rooted patterns to every task in scope, so shared lockfiles and toolchain files no longer need repeating per task. (#11356 by @jdx)

  • task: task_config.global_env for scoped environment inputs that participate in cache keys, plus pass_through_env / task_config.global_pass_through_env to keep selected ambient variables (like tokens) available under deny_env without affecting cache keys. (#11363 by @jdx)

  • task: outputs now support ordered ! exclusions and re-inclusions (mirroring sources), with \! escaping. Excluded paths are omitted from freshness hashes and cache archives, and existing excluded files are preserved on restore. (#11367 by @jdx)

  • task: task_config.shell sets a project-scoped default shell for tasks, with task-local and template shell still taking precedence. This gives users a safe migration path after the 2026.7.14 change that ignored project-level default shell-arg settings. (#11354 by @jdx)

  • config: registry idiomatic_files entries can now define structured version_regex, version_json_path, and version_expr parsers, adding in-process idiomatic version-file parsing for 11 tools including Dagger, Task, chezmoi, CMake, Earthly, golangci-lint, GoReleaser, Lefthook, Pixi, pre-commit, and Ruff. Parsing runs without executing plugin or shell code, and remains opt-in per tool. (#11341 by @jdx)

    mise settings add idiomatic_version_file_enable_tools dagger task lefthook
    
  • npm: new npm.package_manager = "aube_cli" mode installs npm: tools through a separately installed standalone Aube executable while mise still resolves versions itself, avoiding Aube's npm compatibility shim. The default embedded aube behavior is unchanged. (#11357 by @jdx)

  • deps: explicitly configured mise deps providers that are currently inapplicable now stay visible. mise deps --list shows an active/inactive status with a reason (e.g. inactive (missing package-lock.json)), and mise deps <provider> --explain or an explicit run fails with that reason instead of silently disappearing. (#11182 by @risu729)

Fixed
  • task: source_freshness_hash_contents = true now skips mtime comparison entirely, so tasks no longer re-run on every CI job after a cache restore resets timestamps. Output integrity is tracked with a content hash that also detects missing, partially deleted, and modified outputs. (#11319 by @rabadin)
  • task: confirming (or auto-confirming) the executable-bit prompt for a file task now runs the task in the same mise run, instead of chmod-ing the file and still failing with "no task found". Respects --yes, MISE_YES, and the trusted yes setting. (#11337 by @jdx)
  • task: circular dependency detection now runs on the fully resolved graph, so cycles through wait_for, {{usage.*}} dependencies, and depends_post are reported with a concrete path before any task runs, while valid post-dependency graphs are no longer rejected. (#11329 by @jdx)
  • task: $ ... task headers now display forwarded arguments accurately for inline and shebang tasks, no longer making multiline tasks appear to pass args to their first command. (#11344 by @jdx)
  • task: --output and MISE_TASK_OUTPUT overrides now honor raw and interactive tasks the same way task.output config does, fixing mixed command/timing output for tasks that need inherited stdio. (#11355 by @jdx)
  • brew: mise bootstrap packages upgrade no longer fails to link kegs when formulae were already installed and linked by real Homebrew. mise now recognizes brew's directory symlinks, resolves link targets one hop like brew does, and expands directory symlinks into real directories before linking. This also fixes second-upgrade failures for formulae shipping versioned dylib aliases in pure-mise setups. (#11320 by @mjun0812)
  • brew: mise bootstrap packages prune now correctly removes a keg's unversioned dylib alias links instead of leaving them dangling. (#11330 by @mjun0812)
  • env: ~/ paths now expand using the platform path separator, so Windows install and tool locations no longer surface mixed separators (e.g. C:\Users\me\.local/share/mise) through mise where, shims, and related output. (#11312 by @JamBalaya56562)
  • shell: mise activate pwsh now works under Set-StrictMode, guarding uninitialized globals that previously aborted activation, fixing a bare mise invocation, restoring chpwd hook chaining, and silencing command-not-found errors when PSReadLine is unavailable. (#11314 by @JamBalaya56562)
  • backend: a plugin whose backend is listed in disable_backends no longer shadows the registry entry, so a registry shorthand falls back to an enabled backend instead of failing to install. Already-installed tools keep reporting their recorded backend. (#11362 by @JamBalaya56562)
  • generate: mise generate task-docs --inject now errors with a clear message when the <!-- mise-tasks --> markers are missing or reversed, instead of truncating or clobbering the target file. (#11359 by @JamBalaya56562)
  • mcp: the MCP initialize response now reports the server as mise at mise's version, instead of inheriting rmcp's default identity. (#11361 by @jdx)
Documentation
  • settings: choice descriptions now render markdown. (#11335 by @jdx)
  • tasks: clarified shebang argument behavior. (#11336 by @jdx)
  • shims: documented how activate treats the shims directory with auto-install. (#11366 by @JamBalaya56562)
Registry
  • Added oh-my-pi (#11324 by @slbls) and filled in missing tool descriptions (#11322 by @risu729).
New Contributors
  • @mjun0812 made their first contribution in #11330

Full Changelog: https://github.com/jdx/mise/compare/v2026.7.14...v2026.7.15

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.7.15 went
v2026.7.14

v2026.7.14: Multi-asset GitHub installs, safer defaults, and Windows pip

Added 3
  • GitHub/GitLab/Forgejo release backend now accepts additional_asset_patterns to overlay multiple release archives from the same tag into one installation directory
  • npm tool option allow_low_downloads lets embedded aube install bypass the weekly-download popularity gate for the requested package only
  • Structured env files support an explicit expand = true option for shell-style variable expansion
Fixed 15
  • Values loaded from JSON/YAML/TOML env files are literal by default again, fixing shell-expansion regression
  • pip is now usable on fresh Windows installs with synthesized pip.cmd/pip3.cmd wrappers and Scripts directory in PATH
  • .exe release assets are now preferred on Windows for tools shipping both extensionless and .exe binaries
  • Rejected GitHub token now produces actionable error naming the token source and including GitHub's response
  • Archive containing single binary with OS/arch suffix is now renamed to clean name on PATH
  • brew-cask installs now handle completion stanzas and system_command in lifecycle blocks, and artifact links elevate through sudo policy
Security 1
  • Config-trust security gap around default shell arguments closed

From mise

This release adds overlay installs for GitHub-based tools, closes a config-trust security gap around default shell arguments, and lands a wide batch of correctness fixes across tasks, lockfiles, npm, Swift, brew casks, and Windows Python.

Added
  • github: the GitHub/GitLab/Forgejo release backend now accepts additional_asset_patterns, so a single install can overlay multiple release archives from the same tag into one installation directory. Each supplemental artifact is locked and verified (checksums and provenance) on its own, and --locked fails if the recorded set no longer matches. This models release layouts like Ollama's optional ROCm archive without making a large payload unconditional. (#11272 by @jdx)

    [tools."github:ollama/ollama"]
    version = "latest"
    additional_asset_patterns = ["ollama-linux-amd64-rocm.tgz"]
    
  • npm: new allow_low_downloads tool option lets an embedded aube install bypass the weekly-download popularity gate for the requested package only, so curated tools like bibtex-tidy and purty install again without npm.shell_out. Transitive dependencies still hit the gate. (#11305 by @jdx)

  • env: structured env files (env._.file loading JSON/YAML/TOML) support an explicit expand = true option for shell-style variable expansion, including references to earlier values. See Fixed below for the default-behavior change. (#11269 by @jdx)

Fixed
  • env: values loaded from JSON/YAML/TOML env files are literal by default again, fixing a regression where every value was shell-expanded when env_shell_expand was on. That corrupted literals such as bcrypt-style $6$salt$hash and could pull in matching process-environment values. Opt back into expansion with expand = true. (#11269 by @jdx)
  • python: pip is now usable on fresh Windows installs. mise synthesizes pip.cmd/pip3.cmd wrappers, adds the install's Scripts directory to PATH so pip-installed console scripts resolve, and fixes default-package installation on Windows. (#11278 by @JamBalaya56562)
  • github: .exe release assets are now preferred on Windows, so tools that ship both an extensionless and .exe binary no longer install the non-runnable one and fail with "cannot find binary path". (#11257 by @gologames)
  • github: a rejected GitHub token (401) now produces an actionable error that names the token source (gh CLI, github_tokens.toml, OAuth, env var, etc.) and includes GitHub's response and a remediation hint, instead of a bare 401 Unauthorized. (#11236 by @Marukome0743)
  • backend: an archive containing a single binary with an OS/arch suffix (e.g. gdscript-formatter-macos-aarch64) is now renamed to its clean name on PATH, matching the existing behavior for single-file downloads. (#11232 by @Marukome0743)
  • brew: brew-cask installs handle more real-world casks — completion stanzas and system_command in lifecycle blocks are supported, and artifact links into root-owned directories like /usr/local/bin now elevate through mise's sudo policy instead of failing with permission errors. Fixes installing docker-desktop. (#11273 by @jdx)
  • lockfile: prefix: tool requests now honor the locked version on mise install instead of silently re-resolving to the newest match. Constrained upgrades via mise upgrade/mise lock --bump still work. (#11255 by @JamBalaya56562)
  • aqua: cross-platform lockfiles for aqua HTTP packages preserve a reachable v-prefixed URL, fixing 404s where an entry locked to another platform's unprefixed URL. (#11267 by @jdx)
  • swift: Swift lockfile entries now record the target Linux distro (ubuntu24.04, fedora39, ubi9, ...) so checksums are no longer verified across mismatched distro tarballs, and mise lock writes meaningful entries and re-locks correctly after changing swift.platform. (#11299 by @jdx)
  • task: with a git worktree checked out inside the main checkout, mise no longer loads the enclosing monorepo root's tasks into the nested root's namespace. Env, tools, and vars still inherit as before. (#11283 by @jdx)
  • task: changing a task's run command, sources, or outputs now invalidates its cached state, so tasks are no longer incorrectly skipped after such edits. (#11288 by @rabadin)
  • task: a task's source hash is now persisted only after a successful run, so a failed run no longer marks stale sources as up to date. (#11296 by @rabadin)
  • completions: shell completion no longer offers mise's own global flags after a task name (where they aren't valid), and a task flag that shares a name with a mise flag now completes its own values correctly. (#11284 by @jdx)
  • npm: npm package versions with very large numeric components (up to Number.MAX_SAFE_INTEGER) now sort correctly, fixing cases where a 0.0.* build could be picked over a newer stable release. (#11280 by @jdx)
  • npm: aube trust-downgrade failures now surface a clearer explanation, and aube's own progress display no longer competes with mise's output (bumped to 1.33.1). (#11292, #11308 by @jdx)
  • npm: aube allow_builds is now serialized as a map. (#11262 by @jdx)
  • version: the update-check cache now negative-caches, so machines that can't reach the network (or run a build newer than the latest release) stop re-running the full check — including building an HTTP client and parsing the CA trust store — on every invocation. This is a significant speedup for commands like mise --version in those cases. (#11285 by @jdx)
  • env: remaining std::env::vars() call sites now use vars_safe(). (#11309 by @JamBalaya56562)
Changed
  • usage: every mise command now declares its effect on the system — read-only, modifies state, or destructive — surfaced in the command reference. This requires usage 4.0 (min_usage_version bumped), so shell completions and doc rendering now depend on it. (#11306 by @jdx)
Security
  • config: the Unix/Windows default file and inline shell-argument settings are now global-only. Because local config is loaded before trust evaluation, an untrusted repository could previously influence how commands from trusted sources were executed. Global config and MISE_* environment variables still apply. Reported by @arpitjain099. (#11293 by @jdx)

[!WARNING] Breaking change: project-local values for unix_default_file_shell_args, unix_default_inline_shell_args, windows_default_file_shell_args, and windows_default_inline_shell_args are ignored in this release. Projects that used these settings to standardize task shells should set shell on each task for now. A config-scoped task_config.shell replacement is proposed in #11354.

Performance
  • cli: the clap command tree is no longer rebuilt twice on every invocation. (#11297 by @jdx)
Documentation
  • npm: documented Socket integrations. (#11268 by @jdx)
  • backend: corrected the bin_path/asset_pattern template variable docs. (#11298 by @jdx)
  • Retargeted a dead clap.rs link to docs.rs/clap. (#11194 by @Bartok9)
  • Added a generated llms.txt index for AI agents. (#11300 by @jdx)
Registry
New Contributors
  • @gologames made their first contribution in #11257

Full Changelog: https://github.com/jdx/mise/compare/v2026.7.13...v2026.7.14

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.7.14 went
v2026.7.13

v2026.7.13: Multi-binary renaming, cask completions, and go.mod support

Added 4
  • rename_exe now accepts a table mapping source patterns to target names, allowing an archive to expose multiple executables on PATH instead of only one
  • brew-cask now installs shell completions declared in bash_completion, fish_completion, zsh_completion files and generate_completions_from_executable for bash, zsh, fish, and pwsh
  • go.mod can now be used as an idiomatic version file, with toolchain goX.Y.Z resolving as an exact pin and go X.Y minimum resolving to the latest matching patch
  • PowerShell task shells now run with -NoProfile by default, matching POSIX shell behavior, with opt-out available via the windows_powershell_no_profile setting
Fixed 16
  • _.path/_.file/_.source directives within a single [env]._ block are now resolved in written order
  • failed installs no longer print a contradictory installed but not activated hint before the real error
  • logical state mutations during install are now serialized to avoid races
  • upgrading a locked github: tool to a newer version that is already installed no longer triggers a false provenance regression error
  • npm install failures now surface the full cause chain instead of an opaque failed to resolve dependencies message
  • inline task definitions now follow a consistent first-wins precedence model across local, conf.d, and monorepo configs
Deprecated 1
  • the legacy virtualenv tool option is deprecated in favor of the _.python.venv env directive and is scheduled for removal around 2027.7.0

From mise

This release expands archive backends to rename multiple binaries from a single release, adds Homebrew cask shell completions and go.mod version-file support, and fixes a broad batch of task, install, lockfile, and language-plugin correctness issues.

Added
  • backend: rename_exe now accepts a table mapping source patterns to target names, so an archive that ships several executables can expose all of them cleanly on PATH instead of only one. The existing string form is unchanged. (#11231 by @jdx)

    [tools."github:DanielGavin/ols"]
    version = "latest"
    rename_exe = { "ols-*" = "ols", "odinfmt-*" = "odinfmt" }
    
  • brew: brew-cask now installs shell completions (declared bash_completion/fish_completion/zsh_completion files and generate_completions_from_executable for bash, zsh, fish, and pwsh) instead of skipping them, tracking them in cask receipts and installed-state checks. (#11198 by @jdx)

  • go: go.mod can now be used as an idiomatic version file. A toolchain goX.Y.Z directive resolves as an exact pin, while a go X.Y minimum resolves to the latest matching patch. It is opt-in and unchanged unless enabled per-tool. (#11213 by @JamBalaya56562)

    mise settings add idiomatic_version_file_enable_tools go
    
  • task: PowerShell task shells (pwsh/powershell) now run with -NoProfile by default, matching how mise spawns POSIX shells, so a profile that mutates PATH (such as a mise activation snippet) can no longer shadow a task's own tools and cause confusing "cannot find binary path" errors. Opt out with the new windows_powershell_no_profile setting (MISE_WINDOWS_POWERSHELL_NO_PROFILE=false). (#11199 by @jdx)

Fixed
  • env: _.path/_.file/_.source directives within a single [env]._ block are now resolved in written order, so a _.path can reference a variable exported by a _.source written before it. (#11163 by @JamBalaya56562)
  • install: failed installs no longer print a contradictory "installed but not activated" hint before the real error. (#11227 by @jdx)
  • install: logical state mutations during install are now serialized to avoid races. (#11207 by @risu729)
  • lockfile: upgrading a locked github: tool to a newer version that is already installed on disk no longer triggers a false supply-chain "provenance regression" error. (#11230 by @jdx)
  • npm: aube install failures now surface the full cause chain instead of an opaque "failed to resolve dependencies" message, with mise-native remediation guidance (trust_policy_excludes or npm.shell_out) for trust-downgrade errors. (#11226 by @jdx)
  • task: inline task definitions now follow a consistent first-wins precedence model across local, conf.d, and monorepo configs, so lower-precedence metadata no longer leaks into script tasks and the winning config's context is preserved. (#11103 by @risu729)
  • task: source freshness now tracks files correctly for workspace-rooted sources patterns used in nested subproject tasks, so edits inside a subproject trigger a rerun. (#11202 by @rabadin)
  • brew: cask upgrades handle structured preflight_steps/postflight_steps for move/remove operations, and cleanup-only zap pkgutil IDs are no longer treated as install receipts (which could leave pkg cask status permanently missing). (#11197 by @jdx)
  • brew: cask upgrades no longer fail when removing a protected app backup (e.g. docker-desktop) hits "Permission denied", recovering permissions the way Homebrew does before retrying. (#11219 by @jdx)
  • python: a python3 executable is now provided on Windows. (#11212 by @jdx)
  • ruby: custom ruby.precompiled_url = "owner/repo" sources now fetch release metadata directly from GitHub instead of the restricted versions host, avoiding 403 warnings. (#11154 by @risu729)
  • ruby: Gemfile version pins with multi-digit segments (e.g. ruby "3.4.10") are now parsed correctly. (#11229 by @capnregex)
  • bootstrap: ./-prefixed relative [bootstrap.repos] paths no longer display with a leading ./ component. (#11214 by @lilienblum)
  • http: invalid URLs now return an error instead of panicking. (#11160 by @Marukome0743)
  • settings: avoid a panic when a parent settings key is an inline table. (#11184 by @Marukome0743)
  • self-update: the updater's TLS backend now matches the feature it was built with, fixing failures when compiled with native-tls. (#10834 by @bltavares)
Deprecated
  • python: the legacy virtualenv tool option is deprecated in favor of the _.python.venv env directive. It now emits a warning and is scheduled for removal around 2027.7.0. (#11234 by @JamBalaya56562)
Documentation
  • python: clarify that uv_venv_auto requires a uv.lock file. (#11223 by @jdx)
  • Fix dead links in the contributing guide and the aqua-registry/pipx installation docs. (#11123, #11167 by @Bartok9)
New Contributors
  • @capnregex made their first contribution in #11229
  • @rabadin made their first contribution in #11202

Full Changelog: https://github.com/jdx/mise/compare/v2026.7.12...v2026.7.13

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.7.13 went
v2026.7.12

v2026.7.12: Safe mode, node-free npm, and a built-in OCI push client

Added 10
  • New global-only safe setting (MISE_SAFE=1) makes mise refuse or ignore anything that would let project config execute code or inject environment, including template exec()/read_file(), _.source, hooks, tasks, asdf plugin scripts, and plugin installs
  • mise lock --bump command advances fuzzy lockfile selectors (latest, lts, prefixes) to the newest matching remote versions without installing anything and without touching mise.toml
  • npm: backend no longer requires node or npm installed to resolve or install packages — version metadata is fetched over HTTP and installs run in-process via embedded aube package manager
  • Built-in OCI registry client for mise oci push that no longer requires skopeo or crane, with blob dedup, chunked uploads, retries, cross-repo mounts, and credential resolution
  • mise oci push now reuses unchanged tool layers from the previously pushed image or --cache-from reference, skipping the tar/gzip build entirely
  • mise oci push --update-index command points a tag at an OCI image index and upserts the current platform while preserving entries pushed by other architectures
Changed 3
  • OCI layer uploads now use 64 MiB chunks for large layers with transient failure retries and byte progress display
  • mise oci run --engine docker now streams the image into docker load instead of needing skopeo
  • Signature verification for Node.js and Swift now always runs when enabled instead of silently skipping when gpg is missing, opt out with gpg_verify = false
Fixed 1
  • mise lock, ls-remote, outdated, and upgrade no longer get capped to a single 3s no-retry attempt when prefer_offline is set — they now honor the configured fetch_remote_versions_timeout and retry budget
Removed 1
  • The --tool flag was removed from mise oci run

From mise

This release centers on running mise safely against untrusted config, shipping node-free npm: version resolution and installs, and replacing external tools (skopeo/crane, gpg) with built-in, dependency-free implementations. Along the way it fixes a prefer_offline timeout regression, several config/env correctness issues, and platform-specific problems on Windows and macOS.

Highlights
  • New MISE_SAFE=1 mode turns mise into an inert config reader so automation (CI, Renovate) can run mise lock --bump against untrusted branches without trust prompts or arbitrary code execution.
  • The npm: backend no longer needs node or npm installed to resolve or install packages — version metadata is fetched over HTTP and installs run in-process via the embedded aube package manager.
  • mise oci push gained a full built-in registry client: no more skopeo/crane, with blob dedup, chunked uploads, retries, cross-repo mounts, layer reuse from prior images, and multi-arch image indexes.
Added
  • Safe mode: a new global-only safe setting (MISE_SAFE=1) makes mise refuse or ignore anything that would let project config execute code or inject environment. Blocked (with errors): template exec()/read_file(), _.source, hooks, tasks, asdf plugin scripts, and plugin installs. Ignored: project [env], _.path, _.file, [shell_alias], and [settings]. HTTP-based version resolution, lockfile refresh/bump, and already-installed/embedded plugins keep working. Because a config loaded this way is inert, safe mode also skips the trust requirement. (#11146, #11151 by @jdx)

    MISE_SAFE=1 mise lock --bump --dry-run --json   # detect updates with zero code execution, no trust needed
    
  • mise lock --bump: advance fuzzy lockfile selectors (latest, lts, prefixes like "20") to the newest matching remote versions without installing anything and without touching mise.toml. Exact pins stay put. Pairs with --json and --dry-run for a CI job that opens lockfile-only PRs. (#11145 by @jdx)

    $ mise lock --bump --dry-run --json
    [{ "name": "node", "backend": "core:node", "old_versions": ["22.14.0"], "new_versions": ["22.15.0"] }]
    
  • Node-free npm: backend: mise ls-remote npm:* and latest resolution now query the npm registry directly over HTTP, and installs run in-process through the embedded aube package manager. node is only needed to run installed tools (and their lifecycle scripts), not to install them. User ~/.npmrc, scoped registries, auth, and minimum_release_age are honored. A new npm.shell_out setting (MISE_NPM_SHELL_OUT) routes both metadata and installs through the npm CLI for setups relying on npm-only config like cafile or client certs. (#11147, #11149 by @jdx)

  • Built-in OCI registry client: mise oci push no longer requires skopeo or crane. It uses an in-tree OCI Distribution client that uploads only blobs the registry is missing, resolves credentials the way docker/podman do (docker login/podman login is all the setup needed), and answers registry auth challenges so private base-image pulls via --from also work. mise oci run --engine docker now streams the image into docker load instead of needing skopeo. The --tool flag was removed. (#11132 by @jdx)

  • OCI push robustness: large layers upload in 64 MiB chunks, transient failures retry with mise's standard backoff, base layers are mounted cross-repo (?mount=) when they already live on the destination registry (zero bytes transferred), and pushes/pulls now show byte progress. A new oci.insecure_registries setting opts non-loopback registries into plain HTTP. (#11141 by @jdx)

  • OCI layer reuse: mise oci push reuses unchanged tool layers from the previously pushed image (or --cache-from REF), skipping the tar/gzip build entirely — reused tools don't even need to be installed locally. --no-cache forces a full rebuild. (#11142 by @jdx)

  • Multi-arch OCI images: mise oci push --update-index points a tag at an OCI image index and upserts the current platform while preserving entries pushed by other architectures, so one runner per arch can assemble a multi-arch tag. (#11144 by @jdx)

  • Built-in signature verification: Node.js and Swift download signatures are now verified in-process with the pure-Rust rPGP crate against the bundled keyrings, dropping the external gpg binary dependency. Note: previously, if gpg was missing and the setting was unset, verification was silently skipped; now verification always runs when enabled — opt out with gpg_verify = false. (#11148 by @jdx)

  • Relative bootstrap repo paths: [bootstrap.repos] destination keys can now be relative paths, resolved against the declaring project's root (with guards preventing escape outside the project tree), making a project's mise.toml portable across machines. (#11155 by @lilienblum)

Fixed
  • http: mise lock, ls-remote, outdated, and upgrade no longer get capped to a single 3s no-retry attempt when prefer_offline is set — they honor the configured fetch_remote_versions_timeout and retry budget again, fixing spurious timeouts. Interactive fast paths keep their bounded behavior. (#11190 by @jdx)
  • lock: unfiltered mise lock no longer prunes OS-restricted tool entries (e.g. os = ["macos"]) when run on a platform that doesn't target them, keeping shared lockfiles stable across platforms. (#11175 by @jdx)
  • env: values loaded from _.file env files now resolve references to variables defined in earlier files or [env] blocks instead of collapsing to empty, fixing flaky dotenv behavior. (#11158 by @Marukome0743)
  • env: [env] _.source now works on Windows by resolving a real POSIX bash (Git Bash / MSYS2, honoring MISE_BASH_PATH) instead of the WSL launcher or a missing bash.exe, and correctly filters MSYS runtime noise and converts prepended PATH entries back to Windows form. (#11097 by @JamBalaya56562)
  • config: trusted_config_paths (MISE_TRUSTED_CONFIG_PATHS) now overrides configs previously added to the ignore list, so a settings-trusted config is actually discovered and loaded. (#11152 by @JamBalaya56562)
  • config: env/vars array parsing is now consistent — accidental array forms for vars and task env/vars are rejected with clear errors, while the intentional [[env]] and directive-level arrays (_.source, _.file, _.path) remain supported. (#11060 by @risu729)
  • config: mise config set no longer panics when descending into a non-table value. (#11153 by @Marukome0743)
  • config: clearer warnings for unsupported semver ranges. (#11176 by @risu729)
  • hook-env: entering a directory with an untrusted config now prints a single concise warning (... is not trusted, run 'mise trust' to enable it) instead of the full error chain. Explicit commands still show the full trust error and prompt. (#11159 by @lilienblum)
  • activate: mise activate zsh no longer hangs non-interactive login shells under Rosetta — a v2026.7.11 regression where env-state snapshotting autoloaded the zsh/parameter module via dlopen. (#11188 by @jdx)
  • brew-cask: case-insensitive app bundle lookup (fixing casks like yaak) and correct resolution of preflight-generated wrapper scripts on the extract stage (fixing vlc). (#11164 by @donbeave)
  • brew: cask binaries can symlink into /usr/local on arm64. (#11174 by @jdx)
  • backend: qualified prerelease suffixes are now detected correctly. (#11179 by @risu729)
  • completions: avoid a network lookup during usage completion. (#11169 by @jdx)
  • link: clear a stale incomplete marker when linking a tool. (#11150 by @Marukome0743)
  • shim: unresolved Windows exe-shim dispatch (e.g. a project-scoped tool run outside the project) now shows the actionable "no version is set" guidance instead of an opaque "cannot find binary path". (#11189 by @jdx)
  • vfox: preserve inner quotes when a vfox Lua command dispatches through cmd.exe on Windows, fixing commands such as the Yarn 2+ install flow. (#11166 by @finalchild)
  • github/gitlab/forgejo: statically-linked linux-musl assets are now considered a fallback for Android/Termux when a package publishes no Android-specific asset, so tools like starship, bat, and hk can install there. (#10730 by @bltavares)
  • deps: avoid installing tools during dry runs, and enforce the experimental gate for task providers. (#11016, #11177 by @risu729)
Documentation
  • Document environment-variable backing for file-task arguments and flags, including CLI/env/default precedence. (#11165 by @zeitlinger)
Breaking Changes
  • mise oci push --tool has been removed. Use mise oci build -o ./img followed by skopeo copy if you need the old escape hatch. (#11132)
  • Node/Swift signature verification now always runs when enabled (external gpg is no longer required). If you relied on a missing gpg binary to skip verification, set gpg_verify = false explicitly. (#11148)
  • The unreleased npm.use_npm_view setting is replaced by npm.shell_out (MISE_NPM_SHELL_OUT). (#11149)
New Contributors
  • @donbeave made their first contribution in #11164
  • @lilienblum made their first contribution in #11159

Full Changelog: https://github.com/jdx/mise/compare/v2026.7.11...v2026.7.12

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View originalPermalink
How v2026.7.12 went
View all

Discussion

If you publish mise, you can claim this product by proving you administer its repository.