Skip to content

Releases: jdx/mise

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

Choose a tag to compare

@mise-en-dev mise-en-dev released this 26 Aug 01:16
Immutable release. Only release title and notes can be modified.
v2026.8.14
2a3ea19

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

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

Choose a tag to compare

@mise-en-dev mise-en-dev released this 25 Aug 22:28
Immutable release. Only release title and notes can be modified.
v2026.8.13

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

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

Choose a tag to compare

@mise-en-dev mise-en-dev released this 24 Aug 08:33
Immutable release. Only release title and notes can be modified.
v2026.8.12
8f5a303

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

Full Changelog: 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.

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

Choose a tag to compare

@mise-en-dev mise-en-dev released this 23 Aug 16:46
Immutable release. Only release title and notes can be modified.
v2026.8.11
5e7e301

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

Registry

Performance

Read more

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

Choose a tag to compare

@mise-en-dev mise-en-dev released this 20 Aug 17:05
Immutable release. Only release title and notes can be modified.
v2026.8.10
c2a0cb9

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

Full Changelog: 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.

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

Choose a tag to compare

@mise-en-dev mise-en-dev released this 19 Aug 21:19
Immutable release. Only release title and notes can be modified.
v2026.8.9
d9a2743

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_* var...
Read more

v2026.8.8: Restore ARMv7 release builds

Choose a tag to compare

@mise-en-dev mise-en-dev released this 17 Aug 17:53
Immutable release. Only release title and notes can be modified.
v2026.8.8
c454c6f

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

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

Choose a tag to compare

@jdx jdx released this 17 Aug 17:57
Immutable release. Only release title and notes can be modified.
v2026.8.7
9dcfcaa

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

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

Choose a tag to compare

@mise-en-dev mise-en-dev released this 14 Aug 22:33
Immutable release. Only release title and notes can be modified.
v2026.8.6
71212d4

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

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

Read more

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

Choose a tag to compare

@mise-en-dev mise-en-dev released this 12 Aug 12:01
Immutable release. Only release title and notes can be modified.
v2026.8.5
a51a56b

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

Registry

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