github jdx/mise v2026.4.23
v2026.4.23: Pre-releases, libc preference, and a Node musl fix

6 hours ago

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

Don't miss a new mise release

NewReleases is sending notifications on new releases.