jdx/mise · error
backend is disabled by disable_backends
Error message
backend {backend_type} is disabled by disable_backends What it means
mise's `disable_backends` setting lets users opt out of entire backend types for security or policy reasons. ensure_backend_enabled checks this allowlist/denylist before any backend work and bails if the requested backend type is disabled, so disabled backends can never be reached even indirectly.
Solutions
- Remove the backend from disable_backends in settings (mise.toml [settings] or settings.toml)
- Use an alternative backend for the tool that is not disabled
- Check MISE_DISABLE_BACKENDS environment variable for an override you forgot about
Example fix
// before (mise.toml) [settings] disable_backends = ["npm"] // after [settings] disable_backends = []
Defensive patterns
Strategy: validation
Validate before calling
// bash: fail fast if a required backend is disabled
for b in $REQUIRED_BACKENDS; do
mise settings get disable_backends | grep -q "\"$b\"" && { echo "backend $b disabled"; exit 1; } || true
done Prevention
- Document required backends in project README/mise.toml comments
- Check MISE_DISABLE_BACKENDS and settings.toml when onboarding to a machine
- Keep policy-level disable_backends in a managed settings file and list exemptions explicitly
When it happens
Trigger: Installing or executing a tool whose backend type (e.g. `npm`, `vfox`, `http`) appears in `disable_backends` in settings — via mise.toml [settings], ~/.config/mise/settings.toml, or MISE_DISABLE_BACKENDS.
Common situations: Corporate policy disabling vfox/asdf backends; user disabled `cargo` backends but a project mise.toml references a cargo tool; typo'd setting accidentally disabling a needed backend.
Related errors
- a parent directory is now a symlink; left untouched
- app Info.plist must be a regular file
- asdf plugin ' ' exists but ' ' is not available or the…
- backend does not support version_order
- brew-cask: app target
AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17).
Data as JSON: /api/errors/a0c229dfdb9a3238.
Report an issue: GitHub.
Appendix: source
Thrown at src/backend/mod.rs:610
if let Some(current) = tools.as_ref() {
let mut tools_ = current.deref().clone();
tools_.remove(short);
*tools = Some(Arc::new(tools_));
}
}
pub(crate) fn is_disabled_backend_type(backend_type: &BackendType) -> bool {
if *backend_type == BackendType::Pipx {
return is_disabled_backend_name("pypi") || is_disabled_backend_name("pipx");
}
backend_type
.disable_key()
.is_some_and(is_disabled_backend_name)
}
pub(crate) fn ensure_backend_enabled(backend_type: &BackendType) -> Result<()> {
if is_disabled_backend_type(backend_type) {
bail!("backend {backend_type} is disabled by disable_backends");
}
Ok(())
}
fn is_disabled_backend_name(backend: &str) -> bool {
Settings::get()
.disable_backends
.iter()
.any(|disabled| disabled == backend)
}
pub(crate) fn arg_to_backend(ba: BackendArg) -> Option<ABackend> {
match ba.backend_type() {
BackendType::Core => {
CORE_PLUGINS
.get(&ba.short)
.or_else(|| {
// this can happen if something like "corenode" is aliased to "core:node"View on GitHub (pinned to 533346cc37)