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

  1. Remove the backend from disable_backends in settings (mise.toml [settings] or settings.toml)
  2. Use an alternative backend for the tool that is not disabled
  3. 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

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


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)