Skip to content

Releases: jdx/mise

v2026.5.1: Aqua cosign and a reshim rescue

05 May 21:13
Immutable release. Only release title and notes can be modified.
v2026.5.1
db0ce93

Choose a tag to compare

A small follow-up to v2026.5.0 that lands top-level cosign verification for the aqua backend, fixes a mise reshim failure caused by stale latest install directories, and tightens schema validation.

Added

  • (backend) The aqua backend now honors top-level cosign metadata when verifying packages, covering both checksum and artifact flows and reusing the existing native sigstore path. Lockfiles record top-level cosign provenance, with new e2e and lockfile regression coverage (#9111) by @risu729.
  • (registry) Added wasm-tools via aqua:bytecodealliance/wasm-tools for working with the WebAssembly Component Model (#9596) by @2xdevv.

Fixed

  • (shim) mise reshim no longer aborts with failed to rebuild shims: no versions found for <tool> when an install directory literally named latest (or any other non-resolvable name) is left on disk. Toolset::list_installed_versions already reads concrete version directory names, so it now constructs ToolVersion directly instead of calling .resolve() (no network), and per-tool ToolRequest::new failures are warned-and-skipped instead of aborting the entire rebuild (#9599) by @jdx. Repro:

    mkdir -p ~/.mise/installs/buck2/latest/bin
    touch ~/.mise/installs/buck2/latest/bin/buck2
    mise reshim   # previously failed; now succeeds
  • (schema) All files under schema/ are now validated against draft/2020-12 in strict mode. Hand-written schemas and the BoolOrString renderer in schema.ts use oneOf instead of union type arrays so AJV's strictTypes no longer rejects them; the bogus --strict-schema flag is replaced with --strict-types=true --strict-tuples=true (#9594) by @risu729.

  • (registry) elixir-ls re-enables symlink_bins so the move to the aqua backend stops exposing internal binaries that aren't meant to be called directly (#9592) by @AlternateRT.

Changed

  • (registry) rebar now installs from the GitHub backend (erlang/rebar3) since rebar3 is just an escript; the asdf plugin fallback is removed. Versions before rebar 3 are no longer supported, and the installed executable remains rebar3 to match upstream docs (#9576) by @risu729.
  • (registry) bashly drops the asdf:mise-plugins/mise-bashly fallback and the redundant explicit ruby dependency, since the gem backend already pulls in Ruby (#9578) by @risu729.
  • (release) Restored the "Sponsor mise" block on every successful GitHub release. It had been accidentally scoped to the communique-failure fallback in #9395, so normal releases since v2026.4.22 lost it (#9580) by @jdx.

Documentation

  • (dev-tools) Clarified that vfox metadata depends runs install hooks for the listed dependency tools (#9573) by @risu729.
  • (plugins) Removed outdated registry submission guidance from the plugins docs (#9577) by @risu729.

Aqua Registry Updates

New packages:

Updated:

Full Changelog: v2026.5.0...v2026.5.1

💚 Sponsor mise

mise is built by @jdx under en.dev — an independent studio making developer tooling (mise, aube, and more). Development is funded by sponsors.

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

v2026.5.0: Conda graduates, smarter prereleases, and Windows POSIX tasks

03 May 19:07
Immutable release. Only release title and notes can be modified.
v2026.5.0
23de722

Choose a tag to compare

Added

  • (conda) Graduated the conda backend out of experimental (#9544) by @jdx.
  • (deps) Added dart and flutter deps providers backed by pubspec.yaml / pubspec.lock (#9505) by @tjarvstrand.
  • (task) sources entries can now be prefixed with ! to exclude paths, and a new sources_exclude field is supported; exclusions apply to freshness checks, task_source_files, and mise watch (#9496) by @jlarmstrongiv.
  • (vfox) Added stat to the Lua file module so plugins can read file metadata (#9497) by @esteve.
  • (registry) Added neo4j (#9525), rustfs (#9530), expert (#9498), systemctl-tui (#9521), codon (#9538), yr (#9542), betterleaks (#9541), git-filter-repo (#9550), umoci (#9555), google-java-format (#9488), an aqua backend for elixir-ls (#9557), and enabled shellcheck on Windows (#9487).

Fixed

  • (backend) Stamp prerelease metadata via regex for backends that don't expose it upstream (#9500) by @jdx.
  • (backend) Treat -nightly, -canary, -experimental, -insider, -edge as prereleases (#9523) by @jdx.
  • (backend) Scope PEP 440 prerelease detection to Python backends (#9558) by @jdx.
  • (backend) Honor dotnet.package_flags = "prerelease" and --prerelease for dotnet (#9551) by @jdx.
  • (backend) Suppress repeated No versions found warnings for backends that support unresolved latest (#9548) by @jdx.
  • (install) Don't warn for configured tools when version is passed via CLI (#9522) by @jdx.
  • (install) Refresh latest before installing missing tools (#9545) by @jdx.
  • (install) Don't cache nonexistent install paths (#9553) by @jdx.
  • (lockfile) Don't propagate ad-hoc CLI overrides into the project lockfile (#9562) by @jdx.
  • (plugin) Detect plugin types after cloning (#9540) by @risu729.
  • (task) Convert PATH to MSYS Unix form when spawning POSIX shells on Windows (#9547) by @JamBalaya56562.
  • (cargo) Apply install_env during cargo install (#9502) by @c22.
  • (github) Skip attestations on non-default api_url (#9486) by @jdx.
  • (github) Retry IP allow list errors without auth (#9506) by @risu729.
  • (http) Update versions host tracking endpoint (#9527) by @jdx.
  • (release) Pass --no-git-checks to aube publish (#9483) by @jdx.
  • (copr) Drop epel-9 chroots since rust >= 1.91 is unavailable (#9484) by @jdx.

Changed

  • (registry) Deny inline backend options in registry tool entries (#9565) by @risu729.
  • (registry) Update entry for checkmake (#9504) by @eread.

Deprecated

  • shorthands_file setting / MISE_SHORTHANDS_FILE is deprecated; warning starts in 2026.6.0, removal planned for 2026.12.0. Use [plugins] instead (#9534) by @risu729.

Documentation

  • Document ghtkn as a GitHub credential_command (#9546) by @jdx.
  • Clarify registry backend acceptance policy (#9543, 7bbeebe) by @jdx.
  • Update mise watch docs to pitchfork.en.dev (#9536) by @risu729.
  • Use bash in exec example for variable echoing (#9567) by @kuboon.

💚 Sponsor mise

mise is built by @jdx under en.dev — an independent studio making developer tooling (mise, aube, and more). Development is funded by sponsors.

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

v2026.4.28: Remote tasks pinned by commit SHA

30 Apr 11:33
Immutable release. Only release title and notes can be modified.
v2026.4.28
5478adb

Choose a tag to compare

A small patch release: remote tasks pinned to a commit SHA no longer panic, and the Fedora COPR packaging pipeline picks up Dockerfile fixes again.

Fixed

  • (task) Remote tasks referenced by commit SHA (a git:: source with ?ref=<40-char hex>) no longer crash mise with we map by name only and have no object-id in refspec from gix (#9473) by @jdx. gix-refspec parses any 40- or 64-char hex string as an ObjectId refspec, but gix::clone::fetch::util::find_custom_refname only handles name-based matches and expect()s on the result, so passing a bare SHA to prepare_clone.with_ref_name() triggered a hard process panic on every cache miss. Git::clone now detects SHA-shaped refs via a looks_like_sha heuristic, skips both the with_ref_name() and git clone -b paths (neither accepts bare SHAs), drops --depth 1 since shallow clones may not contain the requested object, and checks out the SHA after the clone via the existing CLI-backed update. Named branches and tags continue to use the existing fast paths. Closes #9472.

  • (copr) The copr-publish workflow no longer pins a stale ghcr.io/jdx/mise:copr image digest, and docker.yml now rebuilds the :copr image whenever packaging/copr/Dockerfile changes on main (#9451) by @bestagi. Previously the workflow kept hitting ModuleNotFoundError: No module named 'rich' even after #9421 switched copr-cli to dnf install, because the hardcoded digest still pointed at the old pip-installed image.

New Contributors

Full Changelog: v2026.4.27...v2026.4.28

v2026.4.27: npm install args, smarter watch, and a macOS shim recursion fix

29 Apr 17:23
Immutable release. Only release title and notes can be modified.
v2026.4.27
0e5f946

Choose a tag to compare

A focused release: more control over how npm-backed tools get installed, smarter mise watch that follows task dependencies, and a fix for a nasty macOS shim recursion that could lock up a shell during mise up --bump.

Added

  • (backend) New npm_args, pnpm_args, bun_args, and aube_args tool options on the npm backend (#9109) by @risu729. Each one is forwarded to the matching package manager when it's the active settings.npm.package_manager, mirroring the pipx backend's style. The args are also recorded in the lockfile and at install time:

    [tools]
    "npm:npm" = { version = "latest", aube_args = "--reporter append-only" }
    "npm:tiny" = { version = "latest", pnpm_args = "--loglevel=warn" }
  • (env) External vfox environment plugins now get ctx.config_root in their MiseEnv / MisePath hooks (#9465) by @hisaac. This matches what built-in directives like _.file already see, so plugins (e.g. mise-xcode) can resolve user-supplied relative paths against the project root regardless of the shell's cwd. watch_files returned from a plugin are now also absolutized against config_root instead of current_dir().

  • (task) mise watch now follows the task graph and watches the sources of each chosen task's dependencies as well as its own (#9437) by @43081j. Pass --skip-deps (or set skip_deps) to restore the previous "task sources only" behavior. Explicit --glob overrides still win.

  • (release) scripts/gen-aqua-changelog.sh now diffs the previous tag's registry.yaml against the current one and emits New Packages / Updated Packages sections in the release PR, instead of dumping the aqua-registry release tags rolled into the release (#9471) by @jdx. This restores the pre-#9043 behavior for the merged-registry world.

Fixed

  • (backend) When _list_remote_versions returned an empty list (invalid module path, throttling, etc.) the empty result was cached as if it were authoritative, poisoning both the on-disk cache file and the in-memory OnceCell for up to an hour (#9444) by @c22. The cache is now cleared in both places when the list comes back empty, so the next call re-fetches.

  • (shims) Fixed an infinite shim recursion on macOS reported in #9462 where mise up --bump against npm packages would loop mise -> npm shim -> mise -> npm shim -> ... and sometimes crash the session (#9468) by @jdx. The trigger was a case-mismatched $HOME in PATH (/Users/Olfway/... vs. /Users/olfway/...) — the shims-stripping in Backend::dependency_env compared byte-equal, so on case-insensitive APFS/HFS+ volumes it was a no-op and npm re-resolved to the mise shim. A new file::paths_eq does case-insensitive compares on macOS/Windows and byte-equal on Linux, and is now used everywhere mise asks "is this PATH entry the shims directory?" — including path_env_without_shims, which_no_shims, PathEnv partitioning, cli::exec program resolution, and the doctor's shims_on_path check (which had been silently reporting no for affected users).

  • (task) Under deny_env = true on Linux, every env var was being stripped from the child process — including the PATH / HOME / USER / SHELL / TERM / LANG that filter_env and the docs say should pass through (#9467) by @jdx, fixing #9466. apply_sandbox() was calling Command::env_clear() after the task executor populated explicit envs via .envs(filtered_env), wiping both. The Linux branch now snapshots the explicit envs before clearing and re-applies them; macOS already did this. A new path_test task in e2e/sandbox/test_sandbox_task guards against regressions.

New Contributors

Full Changelog: v2026.4.26...v2026.4.27

v2026.4.25: Sharper task tooling and lockfile fixes

28 Apr 12:35
Immutable release. Only release title and notes can be modified.
v2026.4.25
edbe1ca

Choose a tag to compare

A patch release focused on smoothing rough edges in tasks (sandbox path resolution, dependency templates, a new --name-only listing) and fixing a handful of upgrade/ls-remote pitfalls.

Added

  • (task) New --name-only flag on mise tasks ls (and mise tasks) prints one task name per line — no headers, no padding, no description column (#9435) by @jdx. It composes with --all, --global/--local, --hidden, --sort/--sort-order, and uses a broken-pipe-tolerant writer so dropping it into fzf Just Works:

    mise run "$(mise tasks ls --name-only --all | fzf)"

    Conflicts with --json, --extended, and --usage.

Fixed

  • (task) Dependency templates can now branch on usage values inside Tera statement tags, not just output expressions, and boolean/array flags are passed through with their real types instead of stringified (#9424) by @jdx. So this finally does what it looks like:

    [tasks.lint]
    usage = 'flag "--run-post" default=#false'
    depends_post = ['''
        {%- if usage.run_post -%}
            postlint:**
        {%- else -%}
            noop
        {%- endif -%}
    ''']
    run = 'echo "lint ran"'
  • (task) Tasks that define usage with subcommands but no top-level args/flags now correctly populate usage.cmd for dependency templates, fixing a regression from #9424 where the early-return path skipped subcommand handling (#9431) by @jdx. The fix also de-duplicates make_usage_ctx between the script parser and the dep renderer so they can't drift again.

  • (task) Sandbox allow_read / allow_write paths declared on a task are now resolved against the task's effective working directory rather than the shell's pwd (#9428) by @jdx. Previously, dir = "../bar" plus allow_read = ["."] opened up the caller's directory while the task itself ran in bar/ and got blocked. CLI overrides like mise run --allow-read=… still resolve against shell cwd. Closes #9423.

  • (lockfile) mise upgrade now updates the global lockfile (~/.config/mise/mise.lock) when bumping a fuzzy version such as latest (#9442) by @jdx. The grouping pass was excluding global config files entirely, and fuzzy requests could re-resolve through the stale lockfile entry mid-update. Newly installed versions are now overlaid before lockfiles are rewritten, so a global dummy = "latest" upgrading from 1.0.0 to 2.0.0 actually pins 2.0.0.

  • (aqua) When list_releases_including_prereleases returned an empty list (paginated/cached edge case, throttling, or a repo that genuinely has no releases), aqua fell back to list_tags and pulled in every git tag in the repo (#9443) by @jdx. For monorepos that tag sub-crates, that meant ripgrep's grep-regex-0.1.1 and friends ended up in the shared mise-versions snapshot, so ripgrep = "latest" resolved to a tag with no matching release asset and 404'd on install. Empty release lists now propagate as empty version lists; packages that legitimately use tags as their version source still opt in via version_source = "github_tag". The remote_versions cache filename is also reverted to remote_versions.msgpack.z to avoid needlessly invalidating existing caches — VersionInfo already deserializes forward-compatibly. (Server-side mise-versions snapshots will need to be regenerated with this fix.)

  • (ls-remote) mise ls-remote --json no longer emits "rolling":false,"prerelease":false on every entry (#9439) by @jdx. Dummy output is now [{"version":"1.0.0"},{"version":"1.1.0"},{"version":"2.0.0"}]. Backends that legitimately set either flag (rust nightly/beta/stable, github/aqua pre-releases) still emit the field; cached entries written by older builds continue to deserialize.

  • (docs) The docs site no longer flickers between light/dark themes on initial load (#9427) by @vhespanha. VitePress's anti-flicker inline script is now marked data-cfasync="false" so Cloudflare's Rocket Loader stops deferring it. Fixes #9393.

  • (Dockerfile) copr-cli is now installed via dnf instead of pip, fixing ModuleNotFoundError: No module named 'rich' in the publish-copr workflow (#9421) by @bestagi.

New Contributors

Full Changelog: v2026.4.24...v2026.4.25

v2026.4.24: Resilient downloads and global pre-release opt-in

27 Apr 11:38
Immutable release. Only release title and notes can be modified.
v2026.4.24
40b63b2

Choose a tag to compare

A small release that hardens HTTP downloads against flaky networks and adds a global way to surface pre-release versions, plus refreshed intro messaging.

Added

  • (ls-remote) New global prereleases setting (MISE_PRERELEASES=1) and a --prerelease flag for mise ls-remote (#9415) by @jdx. Acts as prerelease = true applied to every tool, so GitHub releases flagged prerelease: true show up in ls-remote, latest resolves against the full list, and fuzzy queries like 1.2 can match pre-release tags. Currently honored by the github: and aqua: backends; draft releases are still excluded.

    mise ls-remote github:cli/cli --prerelease
    # or, persistently:
    export MISE_PRERELEASES=1

Fixed

  • (http) HTTP requests now retry transient failures with a jittered backoff schedule (~200ms / 1s / 4s / 15s, then capped at 15s) and the default http_retries is bumped from 0 to 3 (#9414) by @jdx. Retries fire on 5xx, 408, 429, and network-layer errors (connect refused, timeout, mid-stream body drops); deterministic 4xx responses like 404 fail fast without retry. Downloads wrap the full request + body so a chunk failure mid-stream restarts from byte 0 instead of failing the install. Each retry logs a warn! immediately so flaky infrastructure surfaces in real time, and the same logic now powers vfox plugin downloads (which honor MISE_HTTP_RETRIES too). Set MISE_HTTP_RETRIES=0 to opt out. The httphttps fallback now only triggers on connection-level errors, not on HTTP status errors.

  • (release) scripts/publish-s3.sh now purges the mise.en.dev Cloudflare zone (alongside jdx.dev and mise.run) after each S3 publish (#9416) by @jdx. Because install.sh is uploaded with immutable cache-control, missing the purge could leave one zone serving the previous release's install.sh next to a new release's install.sh.minisig.

Documentation

  • Refreshed the project tagline and intro across the README, docs site, landing page, man page, snapcraft/RPM/DEB/npm packaging metadata, and CLI help text to "Dev tools, env vars, and tasks in one CLI" with a clearer "what is it?" pitch focused on what mise does rather than what it replaces (#9418) by @jdx.
  • The docs site's GitHub star count is now prefixed with a ★ glyph for clarity (#9417) by @jdx.

Full Changelog: v2026.4.23...v2026.4.24

v2026.4.23: Pre-releases, libc preference, and a Node musl fix

26 Apr 21:38
Immutable release. Only release title and notes can be modified.
v2026.4.23
9225550

Choose a tag to compare

A patch release that adds a global libc preference and pre-release opt-in for github:/aqua: backends, alongside fixes for Node musl downloads, read-only system installs, and mise prune network hangs.

Added

  • (backend) Per-tool prerelease = true opt-in for the github: and aqua: backends (#9329) by @jakedgy. When set, GitHub releases flagged prerelease: true show up in mise ls-remote, latest resolves against the full list including pre-releases, and fuzzy queries like 1.2 can match pre-release tags. Default behavior is unchanged; draft releases are still excluded.

    [tools]
    "github:myorg/mytool" = { version = "latest", prerelease = true }
    "aqua:owner/tool"     = { version = "latest", prerelease = true }
  • (backend) Global libc setting for selecting Linux precompiled binary variants (#9404) by @jdx. Accepts musl, glibc, or gnu and threads through Platform::current()/PlatformTarget so generic GitHub asset matching, aqua registry replacements (e.g. unknown-linux-gnuunknown-linux-musl), Bun, Python precompiled builds, Node, and vfox envType all honor the preference.

    export MISE_LIBC=musl

Fixed

  • (install) Stop rewriting healthy runtime symlinks (#9410) by @jdx. The rebuild path was unconditionally remove_all + recreating every latest -> X.Y.Z symlink, which became a hard failure under the common Docker pattern where root populates /usr/local/share/mise/installs/ at build time and a non-root user runs mise install at runtime. Healthy symlinks now take a no-op path; the read-only system dir is no longer touched. If a write is genuinely required and can't happen, the install fails loudly instead of silently leaving a stale latest.

  • (node) Route musl tarball URLs to unofficial-builds.nodejs.org (#9409) by @jdx. After #9404 Node started appending -musl to filenames but kept routing through nodejs.org/dist/ (which doesn't host them), causing 404s and lockfiles where the URL had a -musl suffix while the checksum was still pinned to the glibc tarball. The tarball URL and matching SHASUMS256.txt now come from the same host, and a custom node.mirror_url still passes through unchanged. Lockfile merging is also hardened to drop stale checksum/size/url_api when URLs disagree.

  • (prune) Skip remote version resolution for tracked configs (#9406) by @jdx. mise prune was hitting npm, the Go proxy, and the GitHub API to resolve tracked-config tool versions, which could hang on slow or failing registries. Since prune only protects installed versions from deletion, an offline flag is now threaded through ResolveOptions for prune. mise upgrade is unchanged and still queries fresh remote data. Closes #9405.

  • (backend) Allow unresolved latest opt-in (#9401) by @jdx. latest now falls back to an unresolved selector only when a backend's unfiltered remote version list is empty and the backend opts in via unresolved_latest_version(). pipx opts in for git-backed requests; backends that require concrete versions continue to fail rather than create literal latest/ installs. If minimum_release_age filters all candidates out, mise still reports no matching version.

  • (schema) Allow array values in tool additionalProperties (#9400) by @JP-Ellis. Configs like rust = { version = "1.77", components = ["rustfmt", "clippy"] } are no longer flagged as invalid by linters such as tombi.

Registry

New Contributors

Full Changelog: v2026.4.22...v2026.4.23

v2026.4.22: Repaired latest resolution and clearer deps output

25 Apr 18:38
Immutable release. Only release title and notes can be modified.
v2026.4.22
798ca8d

Choose a tag to compare

A focused patch release that repairs two @latest regressions, gives mise deps clearer per-provider output labels, and renames the install_before setting to minimum_release_age to match the wider ecosystem.

Highlights

  • @latest resolution is fixed for Go modules that only publish pseudo-versions, and stale installs/<tool>/latest/ directories are now repaired automatically.
  • The install_before setting has been renamed to minimum_release_age; the old name keeps working as a deprecated alias.
  • mise deps output is now labeled by provider (e.g. [deps.codegen]) instead of repeating the raw command.
  • Fedora 44 and Rawhide are now supported in the COPR build.

Fixed

  • (backend) Two separate @latest issues are repaired in #9383 by @jdx:

    • Go modules that enumerate zero versions now resolve @latest via go list -m -json <module>@latest, so modules that only publish pseudo-versions still install a concrete version.
    • Stale real installs/<tool>/latest/ directories are now repaired generically by the runtime symlink migration. The migration reruns under a new marker and refreshes only install_state after rewriting directories, so the current process picks up the repaired layout without rebuilding the backend map (which previously broke config aliases). Numeric partial-version dirs such as installs/<tool>/25/ are left alone, and real direct-URL latest installs (e.g. UBI URL installs) are preserved when there is no concrete version to replace them with.
  • (task) mise deps output is now labeled with a stable [deps.<provider>] prefix on stdout/stderr (and in the progress message) instead of using the raw run command as the prefix, making repeated output from commands like pip install -r requirements.txt much easier to follow. mise deps add/remove continues to run unprefixed. (#9385) by @jdx

Changed

  • (config) The install_before setting and per-tool option have been renamed to minimum_release_age, matching pnpm's terminology. The old install_before name is preserved as a hidden, deprecated alias — global settings are migrated at load time, per-tool options resolve through the new key, and the JSON schema marks the old name as deprecated. Precedence is unchanged: --before > per-tool > global. (#9384) by @jdx

Added

  • (copr) Fedora 44 and Rawhide are now supported by the COPR build script. (#9391) by @bestagi

Documentation

  • The docs site nav now displays the current release version (read from Cargo.toml at build time), linking to the GitHub releases page. The build emits a warning if the version cannot be parsed instead of silently falling back. (#9388, #9389) by @jdx

Aqua Registry

Updated aqua-registry from v4.498.0 to v4.499.0.

Sponsor mise

mise is built by @jdx under en.dev — an independent studio making developer tooling (mise, aube, and more). Development is funded by sponsors. If mise saves you or your team time, please consider sponsoring at en.dev.

Full Changelog: v2026.4.21...v2026.4.22

v2026.4.21: untrust command and prune lockfile fixes

25 Apr 18:55
@jdx jdx
Immutable release. Only release title and notes can be modified.
v2026.4.21
8c92adb

Choose a tag to compare

A patch release that adds a new mise untrust command, teaches mise prune to skip tools tracked in lockfiles, and tightens GitHub asset auto-detection.

Note

This release was tagged but the publish job failed before assets were uploaded. v2026.4.22 ships the same fixes alongside additional changes — install that release instead. These notes are preserved here for the changelog.

Highlights

  • New mise untrust command revokes trust on a config file.
  • mise prune now respects tracked lockfiles and no longer removes tools listed in them.
  • GitHub asset auto-detection prefers the shortest asset name as a tiebreaker, avoiding spurious matches on longer-named variants.
  • New --security flag on mise registry includes security info in JSON output.

Added

  • (registry) --security flag on mise registry includes security info in JSON output. (#9364) by @jdx
  • (trust) New mise untrust command. (#9370) by @jdx

Fixed

  • (config) Resolved backend opts are now limited to aliases. (#9315) by @risu729
  • (github) Asset auto-detection prefers the shortest asset name as a tiebreaker. (#9361) by @jdx
  • (java) Newer Zulu versions are detected correctly — they use a different directory structure than older releases. (#9365) by @roele
  • (prune) mise prune now respects tracked lockfiles. (#9373) by @jdx
  • (task) Tool installation is skipped for missing naked tasks instead of failing the run. (#9374) by @jdx

Documentation

  • The docs site dismissible banner stacks its message and link on mobile. (#9362) by @jdx
  • Ruby compile message updated. (#9338) by @fladson

Registry

New Contributors

Sponsor mise

mise is built by @jdx under en.dev — an independent studio making developer tooling (mise, aube, and more). Development is funded by sponsors. If mise saves you or your team time, please consider sponsoring at en.dev.

Full Changelog: v2026.4.20...v2026.4.21

v2026.4.20: Lockfile cleanup and path: fixes

24 Apr 11:50
Immutable release. Only release title and notes can be modified.
v2026.4.20
7046e7d

Choose a tag to compare

A focused patch release that cleans up two long-standing lockfile and path-resolution bugs, makes GitHub attestation verification tolerant of regex-based aqua registry URLs, and reworks how the aqua registry is baked into mise.

Highlights

  • mise lock tool@latest now writes a concrete version and heals lockfiles already poisoned with version = "latest".
  • path: tool versions with relative paths resolve correctly against the config root.
  • Aqua registry is now baked from the upstream merged registry.yaml, pinned by tag.
  • GitHub artifact attestation works for registry entries that use regex URLs.

Fixed

  • (config) Relative path: tool versions are now resolved at parse time against the config's root directory (or CWD for CLI args), with ~/ expansion and leading ./ stripped. Previously, a value like path:./packages/logr was joined with installs_path at install time and produced a bogus directory such as ~/.local/share/mise/installs/logr/./packages/logr. (#9320) by @jdx

  • (lock) mise lock handling of @latest has been overhauled (#9321 by @jdx):

    • mise lock tool@latest now resolves latest to the newest installed version instead of writing the literal string "latest" into the lockfile.
    • mise lock no longer produces duplicate [[tools.<name>]] entries when the config uses tool = "latest".
    • Lockfiles already poisoned with version = "latest" are cleaned up in a single mise lock run.
  • GitHub artifact attestation verification now works when the aqua registry entry uses a regex in the workflow URL, unblocking installs such as aqua:updatecli/updatecli. (#9327) by @monotek

Changed

  • (aqua) The baked aqua registry source has been swapped for the upstream merged registry.yaml, pinned by tag via crates/aqua-registry/aqua-registry/metadata.json. The build script generates a canonical package-id map plus an alias lookup table, so runtime lookups only parse the selected package YAML. The pinned tag is now visible in mise doctor. (#9043) by @risu729

Added

  • New registry entry: grafana-kubernetes-plugin. (#9300) by @monotek

Documentation

  • A dismissible announcement banner has been added to the docs site, driven by a remote JSON config. Link schemes are restricted to http/https, dismissals persist per-id in localStorage, and the banner height is kept in sync with --vp-layout-top-height via a ResizeObserver. The expires field is respected so banners automatically hide after a given date. (#9326, #9330, #9334) by @jdx

Aqua Registry

Updated aqua-registry from v4.492.0 to v4.498.0, which includes:

Sponsor mise

mise is built by @jdx under en.dev — an independent studio making developer tooling (mise, aube, and more). Development is funded by sponsors.

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

Full Changelog: v2026.4.19...v2026.4.20