docs/dev-tools/backends/vfox.md
::: tip Vfox is the recommended plugin system for mise. It provides cross-platform support, built-in modules, and a modern hook-based architecture. :::
Vfox plugins may be used in mise to install tools.
PreInstall hook returns an attestation table, mise verifies it during install and records the result in mise.lock, protecting against downgrade attacks on subsequent installs. Backend plugins do not currently support attestationThe code for this is inside the mise repository at ./src/backend/vfox.rs.
No extra system packages are required to run the vfox backend. Vfox Lua code is executed by the interpreter built into mise.
The following installs the latest version of cmake and sets it as the active version on PATH:
$ mise use -g vfox:version-fox/vfox-cmake
$ cmake --version
cmake version 3.21.3
The version will be set in ~/.config/mise/config.toml with the following format:
[tools]
"vfox:version-fox/vfox-cmake" = "latest"
On Windows, mise uses vfox plugins by default. If you'd like to use plugins by default even on Linux/macOS, set the following settings:
mise settings add disable_backends asdf
Now you can list available plugins with mise registry:
$ mise registry | grep vfox:
clang vfox:mise-plugins/vfox-clang
cmake vfox:mise-plugins/vfox-cmake
crystal vfox:mise-plugins/vfox-crystal
dart vfox:mise-plugins/vfox-dart
dotnet vfox:mise-plugins/vfox-dotnet
etcd aqua:etcd-io/etcd vfox:mise-plugins/vfox-etcd
flutter vfox:mise-plugins/vfox-flutter
gradle aqua:gradle/gradle vfox:mise-plugins/vfox-gradle
groovy vfox:mise-plugins/vfox-groovy
kotlin vfox:mise-plugins/vfox-kotlin
maven aqua:apache/maven vfox:mise-plugins/vfox-maven
php vfox:mise-plugins/vfox-php
scala vfox:mise-plugins/vfox-scala
terraform aqua:hashicorp/terraform vfox:mise-plugins/vfox-terraform
And they will be installed when running commands such as mise use -g cmake without needing to
specify vfox:cmake.
In addition to the standard vfox plugins, mise supports modern plugins that can manage multiple tools using the plugin:tool format. These plugins are perfect for:
# Install a plugin
mise plugin install my-plugin https://github.com/username/my-plugin
# Use the plugin:tool format
mise install my-plugin:[email protected]
mise use my-plugin:some-tool@latest
# Install a plugin from a zip file over HTTPS
mise plugin install <plugin-name> <zip-url>
# Example: Installing a plugin from a zip file
mise plugin install vfox-cmake https://github.com/mise-plugins/vfox-cmake/archive/refs/heads/main.zip
For more information, see:
The vfox backend honors mise's url_replacements setting for both
tool artifact downloads and requests made through the plugin's built-in Lua HTTP module. This
includes http.get, http.head, http.download_file, and their try_* variants.
After applying URL replacements, vfox also uses mise's netrc
setting to add HTTP Basic authentication for the destination host. An explicit Authorization
header supplied by a plugin takes precedence when the request stays on the same origin.
The following tool-options are available for the vfox backend—these
go in [tools] in mise.toml.
Traditional vfox PreInstall and PostInstall hooks receive custom options in the structured
ctx.options table. Scalar values use mise's existing string representation, while arrays and
tables remain structured:
[tools]
"vfox:example/plugin" = { version = "1.0.0", bundled = false, channels = ["stable", "beta"] }
function PLUGIN:PreInstall(ctx)
local bundled = ctx.options.bundled == "false"
local channels = ctx.options.channels
-- ...
end
Existing plugins can continue reading custom options from their hook environment with the
MISE_TOOL_OPTS__ prefix. Those variables are available only while mise runs the plugin hook and
are not exported to the user's shell. New plugins should use ctx.options.
install_envSet environment variables for commands that a vfox plugin starts with cmd.exec
during install hooks. vfox's built-in Lua HTTP, archive, and JSON helpers do not
use these variables directly.
[tools]
"vfox:version-fox/vfox-cmake" = { version = "latest", install_env = { HTTPS_PROXY = "http://proxy.example" } }