Releases: jdx/mise
v2026.4.4: Tool Dependencies, .NET Runtimes, and Task Argument Forwarding
A feature-packed release that adds user-defined tool dependencies, .NET runtime-only installs, argument forwarding to task dependencies, and stronger supply-chain security for lockfiles -- along with a large batch of bug fixes across multiple backends and shells.
Highlights
- Declare tool dependencies in
mise.toml-- A newdependsfield lets you ensure one tool is fully installed before another starts, useful for tools with runtime dependencies on each other. - Pass arguments through task dependency chains -- Task dependencies can now reference the parent task's arguments using
{{usage.*}}templates, enabling parameterized build/deploy pipelines. - .NET runtime-only installs -- Install just the .NET runtime (or ASP.NET Core runtime) without the full SDK using the new
runtimetool option. - Stronger lockfile provenance verification --
mise locknow cryptographically verifies provenance for the current platform at lock time, and a newlocked_verify_provenancesetting enables re-verification at install time.
Added
-
User-specified tool dependencies -- Declare explicit installation dependencies between tools in
mise.tomlwith a newdependsfield, ensuring one tool is fully installed before another starts. #8776 by @cprecioso[tools] erlang = "27" elixir = { version = "1.18", depends = ["erlang"] }
-
.NET runtime-only installs -- Install .NET runtimes alongside or instead of SDKs using the
runtimetool option. Valid values:dotnet,aspnetcore,windowsdesktop. #8524 by @fragon10[tools] dotnet = ["9", { version = "8.0.14", runtime = "dotnet" }]
-
Task dependency argument forwarding -- Task dependencies can reference parent task arguments using
{{usage.*}}templates independs,depends_post, andwait_for. Arguments flow through entire dependency chains. #8893 by @jdx[tasks.build] usage = 'arg "<app>"' run = 'echo "building {{usage.app}}"' [tasks.deploy] usage = 'arg "<app>"' depends = [{ task = "build", args = ["{{usage.app}}"] }] run = 'echo "deploying {{usage.app}}"'
-
install_beforeenforced on transitive npm dependencies -- Theinstall_beforesupply-chain cutoff is now forwarded to transitive dependency resolution using each package manager's native mechanism (npm --before,bun --minimum-release-age,pnpm --config.minimumReleaseAge). #8851 by @risu729 -
locked_verify_provenancesetting -- New setting (also auto-enabled byMISE_PARANOID) that forces cryptographic provenance re-verification at install time even when the lockfile already has checksum and provenance data.mise locknow also performs full verification for the current platform at lock time. #8901 by @jdx -
tursoadded to the built-in registry -- Install the Turso CLI viamise use turso. #8884 by @kenn
Fixed
--env=VALUEand-E=VALUEflag parsing -- The equals-sign form of the environment flag (e.g.,mise --env=production) was silently ignored, causing fallback to the default environment. Both--env=VALUEand--env VALUEforms now work correctly. #8889 by @jdx- PEP 440
.devversions filtered in fuzzy matching -- Versions like2026.3.3.162408.dev0no longer incorrectly satisfy stable version requests. The version regex now matches.devin addition to-dev. #8849 by @richardthe3rd - Stale lockfile entries pruned during
mise lock <tool>-- Runningmise lock nodeafter a version change no longer leaves duplicate entries for the old and new versions. #8599 by @altendky - Spurious direnv warning suppressed -- The
failed to update DIRENV_DIFFwarning no longer appears when the direnv diff environment variable is empty. #8857 by @yaleman - Duplicate trust warning in zsh -- Entering an untrusted project directory in zsh no longer shows the
mise trustwarning twice. #8898 by @timothysparg - Plain
.tool-versionsno longer requires trust for task listing -- Files without Tera template syntax ({{,{%,{#) are skipped during the trust check inmise task ls. #8876 by @dportalesr - Tool options preserved with CLI version overrides --
filter_binsand other tool options are no longer lost when specifying a version via CLI (e.g.,mise bin-paths tool@version). #8888 by @jdx - Alias-specific options respected -- Tools configured with
tool_aliasnow correctly use the alias-specificasset_patternand other options instead of inheriting from the original tool. #8892 by @jdx - Precompiled Python uses lockfile URL -- Precompiled Python installs now honor the download URL recorded in
mise.lockinstead of always recomputing it, fixing reproducibility for locked installs. #8750 by @hehaoqian - Ruby build revisions in lockfiles -- Precompiled Ruby binaries from
jdx/rubynow support build revision tags (e.g.,3.3.11-1), preventing lockfile breakage when binaries are rebuilt with different checksums. #8900 by @jdx - Swift installs on unsupported Ubuntu versions -- Swift installs on Ubuntu versions newer than 24.04 now fall back to the 24.04 binary instead of 404ing. #8916 by @jdx
Changed
- Go settings renamed to
go.*namespace -- Allgo_*settings (e.g.,go_set_goroot) have been renamed to the nestedgo.*format (e.g.,go.set_goroot) for consistency with other language settings. The old names are preserved as deprecated aliases. #8598 by @jdbruijn
Breaking Changes
- Deprecated settings removed -- The following settings, deprecated for 18+ months, have been removed. If you are still using them, switch to their replacements: #8904 by @jdx
asdf-- usedisable_backendsinsteadvfox-- usedisable_backendsinsteadcargo_binstall-- usecargo.binstallinsteaddisable_default_shorthands-- usedisable_default_registryinsteadpipx_uvx-- usepipx.uvxinsteadpython_compile-- usepython.compileinsteadpython_default_packages_file-- usepython.default_packages_fileinsteadpython_patch_url-- usepython.patch_urlinsteadpython_patches_directory-- usepython.patches_directoryinsteadpython_precompiled_arch-- usepython.precompiled_archinsteadpython_precompiled_os-- usepython.precompiled_osinsteadpython_pyenv_repo-- usepython.pyenv_repoinsteadpython_venv_stdlib-- usepython.venv_stdlibinstead
New Contributors
- @cprecioso made their first contribution in #8776
- @fragon10 made their first contribution in #8524
- @dportalesr made their first contribution in #8876
- @timothysparg made their first contribution in #8898
- @hehaoqian made their first contribution in #8750
- @jdbruijn made their first contribution in #8598
- @yaleman made their first contribution in #8857
- @kenn made their first contribution in #8884
Full Changelog: v2026.4.3...v2026.4.4
v2026.4.3: Fix seccomp build on armv7
A small patch release that fixes a compile error preventing mise from building on 32-bit ARM (armv7) targets.
Fixed
- seccomp network filter build on armv7 -- The seccomp sandbox code that restricts network access during
mise execfailed to compile on armv7 targets. Thelibc::SYS_socketandlibc::SYS_socketpairconstants arei32on 32-bit platforms but the rule map expectsi64keys, causing a type mismatch. An explicitas i64cast fixes the build while remaining a no-op on 64-bit platforms. #8869 by @jdx
Full Changelog: v2026.4.2...v2026.4.3
v2026.4.2: Process sandboxing for exec and run
Note: This release's build failed so no binary assets were published. Use v2026.4.3 instead, which includes all changes from this release plus a build fix.
This release introduces experimental process sandboxing for mise exec and mise run, allowing you to restrict filesystem access, network access, and environment variables for executed processes.
Added
-
Process sandboxing for
mise xandmise run(experimental) -- A new lightweight sandboxing layer lets you lock down what processes spawned by mise can access. On Linux it uses Landlock for filesystem restrictions and seccomp-bpf for network filtering; on macOS it usessandbox-exec(Seatbelt) with generated profiles. Requiresexperimental = truein settings. #8845 by @jdx# Block all filesystem and network access mise x --deny-all -- node script.js # Block network only mise x --deny-net -- npm run build # Block writes except to ./dist mise x --allow-write=./dist -- npm run build
Task-level configuration is also supported:
[tasks.build] run = "npm run build" deny_net = true allow_write = ["./dist"]
Fixed
- Docs: correct
RUNTIME.osTypeandRUNTIME.archTypevalues -- Fixed inconsistent documentation for runtime template variables and simplified examples. #8785 by @esteve
Full Changelog: v2026.4.1...v2026.4.2
v2026.4.1: Per-tool install_before and musl detection fixes
This release adds per-tool install_before overrides for more granular control over version freshness, fixes musl/glibc detection in minimal Docker containers, and ensures the -q flag works correctly with mise prepare.
Added
-
Per-tool
install_beforeoption -- You can now setinstall_beforeon individual tools to override the global setting. This is useful when some tools need tighter freshness windows than others. Precedence is:--beforeCLI flag > per-toolinstall_before> globalinstall_beforesetting. #8842 by @sargunv-headway[settings] install_before = "7d" # default for all tools [tools.trivy] version = "latest" install_before = "1d" # trivy updates are time-sensitive, use a shorter window
-
Registry: dbt-fusion --
dbt-fusionis now available as a short name in the mise registry, backed byaqua:getdbt.com/dbt-fusion. #8837 by @ryan-pip
Fixed
-
Musl detection in minimal Docker containers -- A musl-compiled mise binary running in a minimal container (scratch, busybox, distroless) with no
/lib/ld-*files would incorrectly identify the platform as glibc, causing it to select the wrong lockfile entries or tool variants. When no dynamic linker is found at runtime, mise now falls back to the binary's compile-time target. Additionally, a newMISE_LIBCenvironment variable (muslorgnu) allows explicitly overriding the detection. #8825 by @davireisENV MISE_LIBC=musl RUN mise install
-
mise prepare -qnot suppressing output -- The-q(quiet) flag was not suppressing status messages inmise preparebecause they usedmiseprintln!()which bypasses the logging system. These messages now use standard logging macros that respect the quiet setting. #8792 by @Marukome0743 -
Wrong option in
mise preparedocs example -- Theansible-galaxyexample in the prepare documentation used-f(force) instead of-r(requirements file). #8839 by @rndmh3ro
New Contributors
- @Marukome0743 made their first contribution in #8792
- @sargunv-headway made their first contribution in #8842
- @Rohan5commit made their first contribution in #8844
- @ryan-pip made their first contribution in #8837
- @rndmh3ro made their first contribution in #8839
Full Changelog: v2026.4.0...v2026.4.1
v2026.4.0: Linked version fixes, monorepo task aliases, and Azure Developer CLI
This release fixes a panic when using mise link with aqua-backed tools, resolves bare task alias lookup in monorepo configurations, and handles a rustup check exit code that was incorrectly treated as an error.
Added
- Registry: azd (Azure Developer CLI) --
azdis now available as a short name in the mise registry, backed byaqua:Azure/azure-dev. Install withmise use -g azd@latest. #8828 by @rajeshkamal5050
Fixed
-
Panic with linked versions on aqua-backed tools -- Running
mise doctor,mise reshim, or any command that callslist_bin_pathson an aqua-backed tool with a linked version (created viamise link) would panic with aStripPrefixError. The root cause was that non-version link names like"brew"or"mylink"were passed to the aqua registry as version strings, where they unexpectedly matched semver constraints and produced absolute paths. Linked versions are now detected early and skip the aqua registry lookup entirely, returninginstall_path/bindirectly. #8801 by @nikobockerman -
mise outdatedfailing for Rust --rustup checkreturns exit code 100 when toolchain updates are available, which is normal behavior. Previously, mise treated this as a command failure, causingmise outdatedto report an error forcore:rust. The exit code is now handled correctly. #8832 by @shalk -
Bare task aliases not resolving in monorepo mode -- In a monorepo with
config_rootsconfigured, runningmise run prl(a bare alias) would fail with "no task //:prl found", even thoughmise run //:prlworked. The issue was thatexpand_colon_task_syntaxexpanded bare aliases to//:prl, but the task loader then skipped config root discovery entirely. Both bare and prefixed alias forms now resolve correctly, and tab completion also works for monorepo-prefixed aliases. #8819 by @nkakouros -
Task help not shown for metadata-only usage specs -- When a task script defined
#USAGE long_about,before_help,after_help, orexampleswithout anyargorflagdirectives,mise run task --helpwould show the generic "This task does not accept any arguments" message instead of the usage-based help with the detailed description. #8824 by @nkakouros
New Contributors
- @shalk made their first contribution in #8832
- @jedymatt made their first contribution in #8833
- @nikobockerman made their first contribution in #8801
- @rajeshkamal5050 made their first contribution in #8828
Full Changelog: v2026.3.18...v2026.4.0
v2026.3.18: Python provenance verification, Go sub-module fixes, and shim recursion guards
This release adds supply-chain security improvements for Python, fixes several shim recursion issues that could cause system hangs, and improves Go backend version resolution for deeply nested sub-modules.
Highlights
- Python provenance verification -- Precompiled Python binaries from
astral-sh/python-build-standalonecan now be verified using GitHub Artifact Attestations, with downgrade protection in lockfiles. - Shim recursion guards -- Two separate infinite-recursion bugs involving mise shims have been fixed, preventing fork bombs in devcontainer environments and when using
exec()templates with mise-managed tools. - Go sub-module support -- Deeply nested Go sub-modules that return no versions from
go list -versionsnow correctly install with@latestinstead of incorrectly resolving to a parent module's version.
Added
-
Python GitHub Artifact Attestations -- Precompiled Python binaries are now verified against GitHub Artifact Attestations from
astral-sh/python-build-standalone, following the same pattern already used for Ruby. A newpython.github_attestationssetting (env:MISE_PYTHON_GITHUB_ATTESTATIONS) overrides the globalgithub_attestationssetting for Python specifically. When enabled,mise lockrecordsprovenance = "github-attestations"in lockfile entries, andmise installverifies downloaded tarballs. If a lockfile records provenance but verification is disabled at install time, the install fails with a downgrade-attack error. #8820 by @malept# settings.toml or mise.toml [settings] [python] github_attestations = true # defaults to the global github_attestations value
-
Registry: svgo --
svgo(SVG Optimizer) is now available asnpm:svgo. #8817 by @3w36zj6
Fixed
-
Shim infinite recursion with system shims on PATH -- When tools are installed via
mise install --system(e.g. in Docker/devcontainer images), a second shims directory is created atMISE_SYSTEM_DATA_DIR/shims. If both the user and system shims directories were on PATH, invoking a shim for a tool not in any config file would hang indefinitely. The PATH fallback now skips both shims directories and rejects any binary that canonicalizes to the mise binary itself. #8816 by @andrewthauer -
Fork bomb from
exec()templates, credential commands, and git credentials -- Three subprocess-spawning code paths inherited mise shims in PATH. When the subprocess invoked a mise-managed tool (e.g.gh auth tokenin anexec()template orcredential_command), the shim re-entered mise, triggering the same subprocess again -- causing infinite recursion. Observed as load average >1800 on affected systems. A new sharedpath_env_without_shims()helper now strips the shims directory from PATH in all three call sites. #8802 by @antonioacg -
Go backend
--lockedmode -- The Go backend was missing asupports_lockfile_url() -> falseoverride, causingmise install --lockedto fail for any go-backend tool since their lockfile entries never contain download URLs. #8790 by @palootcenas-outreach -
Go deeply nested sub-module version resolution --
mise ls-remotefor deeply nested Go sub-modules (e.g.github.com/go-kratos/kratos/cmd/kratos/v2) would incorrectly resolve to the root module's versions. The version fetching logic now tries the exact tool path first and treats an empty version list as authoritative, falling back to@latestfor installation instead of using a parent module's version. Results are now cached per module path. #8823 by @roele -
Flutter version sorting -- Fixed version sorting in the Flutter registry entry by stripping the
-stablesuffix before sorting, and switched to per-platform URL templates. #8818 by @roele
New Contributors
- @antonioacg made their first contribution in #8802
- @palootcenas-outreach made their first contribution in #8790
Full Changelog: v2026.3.17...v2026.3.18
v2026.3.17: Shims always at the front of PATH
A small patch release with a single bug fix for mise activate --shims PATH ordering.
Fixed
- Shims always prepended in
--shimsmode -- When usingmise activate --shims, if the shims directory was already present inPATH(e.g. from a previous activation or a VS Code terminal re-sourcing the shell config), mise would skip the prepend and leave shims at their existing position. This meant system binaries earlier inPATHcould silently shadow mise-managed tools. Shims are now always moved to the front. For fish,MovePrependEnvis used to reorder without duplicating; for all other shells,PrependEnvis emitted unconditionally, accepting a harmless duplicate entry in exchange for guaranteed ordering. #8757 by @ctaintor
New Contributors
Full Changelog: v2026.3.16...v2026.3.17
v2026.3.16: Fix unnecessary GitHub API calls during locked installs
A small patch release that fixes mise install --locked making unnecessary GitHub Releases API calls even when the lockfile already contains pre-resolved URLs and checksums.
Fixed
mise install --lockedno longer makes unnecessary GitHub API calls -- The aqua backend's cosign verification path was unconditionally downloading checksum files via the GitHub Releases API, even when cosign was disabled in settings or the package had no cosign configuration. This causedmise install --lockedto fail in restricted network environments despite the lockfile having everything needed to install offline. The fix checkssettings.aqua.cosignand whether the package actually has cosign configured before attempting any download. #8753 by @jdx
Full Changelog: v2026.3.15...v2026.3.16
v2026.3.15: Custom credential command for GitHub tokens
This release adds a new github.credential_command setting that lets you plug any external secret manager into mise's GitHub token resolution, and adjusts its priority so it takes precedence over file-based token sources.
Added
-
github.credential_commandsetting for custom token retrieval -- You can now configure a shell command that mise runs to obtain a GitHub token, enabling integration with secret managers like 1Password, HashiCorp Vault, or any custom script. The command is executed viash -cand receives the hostname as$1, so it can return different tokens for github.com and GitHub Enterprise instances. Results are cached per host per session. #8746 by @jdx[settings.github] credential_command = "op read 'op://Private/GitHub Token/credential'"
This can also be set via the
MISE_GITHUB_CREDENTIAL_COMMANDenvironment variable.
Changed
-
credential_commandpriority raised above file-based sources -- Sincecredential_commandis an explicit user configuration, it now takes priority overgithub_tokens.tomland the gh CLI'shosts.yml. Previously it sat at the bottom of the resolution order alongsidegit credential fill. Thegit credential fillfallback remains as the lowest-priority option and is no longer blocked whencredential_commandis set but returns no token. #8748 by @jdxUpdated token priority for github.com:
# Source 1 MISE_GITHUB_TOKENenv var2 GITHUB_API_TOKENenv var3 GITHUB_TOKENenv var4 credential_command(if set) -- new5 github_tokens.toml(per-host)6 gh CLI token (from hosts.yml)7 git credential fill(if enabled)
Full Changelog: v2026.3.14...v2026.3.15
v2026.3.14: GitHub token management, macOS shim fix, and Python precompiled flavor fix
This release introduces a new mise github token command and expanded GitHub token resolution (including a config file and git credential helper support), fixes a shim detection regression that caused hangs on macOS, and corrects Python precompiled flavor handling for freethreaded builds.
Highlights
- New
mise github tokencommand andgithub_tokens.tomlconfig file for flexible, per-host GitHub token management - Reverted shim directory check that caused startup hangs on macOS
- Python lockfile generation now respects
precompiled_flavorwhen filtering out freethreaded builds
Added
-
mise github tokencommand and expanded token resolution -- Addsgithub_tokens.toml(~/.config/mise/github_tokens.toml) for storing per-host GitHub tokens that don't interfere with the gh CLI'shosts.yml. Also adds opt-ingit credential fillintegration as a last-resort fallback for environments where tokens live in system keyrings (macOS Keychain, Windows Credential Manager, devcontainers). The newmise github token [--unmask] [HOST]command shows which token mise would use and where it came from, making it easy to debug authentication issues. Enable git credential support withgithub.use_git_credentials = truein settings. #8742 by @jdxUpdated token priority:
# Source 1 MISE_GITHUB_ENTERPRISE_TOKENenv var (non-github.com only)2 MISE_GITHUB_TOKEN/GITHUB_API_TOKEN/GITHUB_TOKENenv vars3 github_tokens.toml(per-host) -- new4 gh CLI token (from hosts.yml)5 git credential fill(opt-in) -- new -
Registry: tart -- Added tart to the registry. Tart provides macOS and Linux VMs on Apple Silicon using Apple's Virtualization.framework. Install with
mise install tart. #8727 by @mnm364
Fixed
-
Shim detection reverted to fix macOS hangs -- A recent change (cfcb555) switched shim detection from checking the binary name to checking if
argv[0]exists in the shims directory. This caused mise to hang on startup for some users because the filesystem check could block on slow or network filesystems, and could also falsely detect mise itself as a shim. The simpler binary-name-based check has been restored. e1b8ca4 by @jdx -
Python precompiled flavor now correctly excludes freethreaded builds -- When any
precompiled_flavorwas specified (e.g.install_only_stripped), the freethreaded build exclusion was bypassed, causingmise lockto sometimes pick the freethreaded build incorrectly. Freethreaded builds are now only included when the requested flavor specifically includes "freethreaded". #8745 by @risu729 -
cargo install misedocs now use--locked-- The Cargo install command in the documentation has been updated tocargo install --locked mise, preventing build failures from dependency version mismatches. #8731 by @rtharston
New Contributors
- @rtharston made their first contribution in #8731
Full Changelog: v2026.3.13...v2026.3.14