docs/dev-tools/backends/aqua.md
Aqua tools may be used natively in mise. aqua is the ideal backend to use for new tools since they don't require plugins, they work on windows, they offer security features in addition to checksums. aqua installs also show more progress bars, which is nice.
You do not need to separately install aqua. The aqua CLI is not used in mise at all. What is used is
the aqua registry that gets compiled into the mise binary on release.
Here's an example package entry: aqua:hashicorp/terraform.
mise has a reimplementation of aqua that knows how to work with these files to install tools.
As of this writing, aqua is relatively new to mise and because a lot of tools are being converted from asdf to aqua, there may be some configuration in aqua tools that need to be tightened up. I put some common issues below and would strongly recommend contributing changes back to the aqua registry if you notice problems. The maintainer is super responsive and great to work with.
If all else fails, you can disable aqua entirely with MISE_DISABLE_BACKENDS=aqua.
Currently aqua tools don't support setting environment variables or doing more than simply downloading binaries though (and I'm not sure this functionality would ever get added), so some tools will likely always require plugins like asdf/vfox.
The code for this is inside the mise repository at ./src/backend/aqua.rs.
The following installs the latest version of ripgrep and sets it as the active version on PATH:
$ mise use -g aqua:BurntSushi/ripgrep
$ rg --version
ripgrep 14.1.1
The version will be set in ~/.config/mise/config.toml with the following format:
[tools]
"aqua:BurntSushi/ripgrep" = "latest"
Some tools will default to use aqua if they're specified in registry/
to use the aqua backend. To see these tools, run mise registry | grep aqua:.
symlink_binsSome tools bundle extra executables that you may not want exposed on PATH. For example, aws-cli bundles
Python, which can conflict with your intended Python version.
Setting symlink_bins = true creates a filtered .mise-bins directory and exposes only the binaries mise
intends to expose for that Aqua package, instead of every discovered executable from the install.
[tools]
aws-cli = { version = "latest", symlink_bins = true }
When enabled:
files field, only those binaries are exposed (e.g., aws and aws_completer for aws-cli).mise-bins subdirectory is created with symlinks to the exposed binariesaws-cli, are not added to PATHvarsSome aqua registry entries define template variables (for example <span v-pre>{{.Vars.channel}}</span>).
Set them via tool options using either top-level keys or a nested vars table:
[tools]
"aqua:flutter/flutter" = { version = "3.32.8", channel = "stable" }
"aqua:scenarigo/scenarigo" = { version = "0.21.0", vars = { go_version = "1.24" } }
Vars with defaults are filled automatically. Vars marked as required in the aqua registry must be set unless the registry also provides a default.
prereleaseBy default, releases flagged prerelease: true on GitHub are excluded from mise ls-remote and from latest resolution. Set prerelease = true to include them:
[tools]
"aqua:owner/tool" = { version = "latest", prerelease = true }
When set, pre-release tags (e.g. v1.0.0-rc1, v0.1.2-dev.86) appear in mise ls-remote, latest resolves against the full list including pre-releases, and fuzzy version queries match pre-release tags. Has no effect when a package uses the github_tag version source (git tags don't carry a prerelease flag). Draft releases are always excluded. See the github backend docs for more detail.
Aqua backend supports multiple security verification methods to ensure the integrity and authenticity of downloaded tools. mise provides native Rust implementation for all verification methods, eliminating the need for external CLI tools like cosign, slsa-verifier, or gh.
GitHub Artifact Attestations provide cryptographic proof that artifacts were built by specific GitHub Actions workflows. mise verifies these attestations natively to ensure the authenticity and integrity of downloaded tools.
Requirements:
github_artifact_attestations configuration in the aqua registry for attestations to be verifiedConfiguration:
# Enable/disable GitHub artifact attestations verification (default: true)
export MISE_AQUA_GITHUB_ATTESTATIONS=true
Registry Configuration Example:
packages:
- type: github_release
repo_owner: cli
repo_name: cli
github_artifact_attestations:
signer_workflow: cli/cli/.github/workflows/deployment.yml
mise natively verifies Cosign signatures without requiring the cosign CLI tool to be installed.
Configuration:
# Enable/disable Cosign verification (default: true)
export MISE_AQUA_COSIGN=true
# Pass extra arguments to the verification process
export MISE_AQUA_COSIGN_EXTRA_ARGS="--key /path/to/key.pub"
mise natively verifies SLSA (Supply-chain Levels for Software Artifacts) provenance without requiring the slsa-verifier CLI tool.
Configuration:
# Enable/disable SLSA verification (default: true)
export MISE_AQUA_SLSA=true
Aqua also supports:
During tool installation, mise will:
Example output during installation:
✓ Downloaded cli/cli v2.50.0
✓ GitHub artifact attestations verified
✓ Tool installed successfully
If verification fails:
MISE_DEBUG=1 to see detailed verification logsCommon issues:
To disable all verification temporarily:
export MISE_AQUA_GITHUB_ATTESTATIONS=false
export MISE_AQUA_COSIGN=false
export MISE_AQUA_SLSA=false
export MISE_AQUA_MINISIGN=false
Here's some common issues I've seen when working with aqua tools.
The aqua registry defines supported envs for each tool of the os/arch. I've noticed some of these are simply missing os/arch combos that are in fact supported—possibly because it was added after the registry was created for that tool.
The fix is simple, just edit the supported_envs section of registry.yaml for the tool in question.
version_filter instead of version_prefixThis is a weird one that causes weird issues in mise. In general in mise we like versions like
1.2.3 with no decoration like v1.2.3 or cli-v1.2.3. This consistency not only makes mise.toml
cleaner but, it also helps make things like mise up function right because it's able to parse it as
semver without dealing with a bunch of edge-cases.
Really if you notice aqua tools are giving you versions that aren't simple triplets, it's worth fixing.
One common thing I've seen is registries using a version_filter expression like Version startsWith "Version startsWith "atlascli/"".
This ultimately causes the version to be atlascli/1.2.3 which is not what we want. The fix is to use
version_prefix instead of version_filter and just put the prefix in the version_prefix field.
In this example, it would be atlascli/. mise will automatically strip this out and add it back in,
which it can't do with version_filter.