jdx/mise · error

no remote targets configured; pass --host [user@]host or…

Error message

no remote targets configured; pass --host [user@]host or add [bootstrap.remote.hosts]

What it means

Remote bootstrap needs at least one target. If the selection map is empty and the configured inventory from [bootstrap.remote.hosts] is empty, there is nothing to bootstrap — mise explains how to supply hosts.

Solutions

  1. Add hosts to config: [bootstrap.remote.hosts] in mise.toml
  2. Or pass --host [user@]host on the command line
  3. Verify you're in the right project/config scope (config excludes may hide hosts)

Example fix

# before: no config
# after (mise.toml)
[bootstrap.remote.hosts]
web1 = "deploy@web1.example.com"
Defensive patterns

Strategy: validation

Validate before calling

if (!hasHostsConfig && !flags.host && !flags.tag && !flags.all) { throw new Error('no remote targets selected') }

Prevention

When it happens

Trigger: Running `mise bootstrap remote` with no --host, no --tag, no --all, and no hosts defined under [bootstrap.remote.hosts] in config.

Common situations: Fresh setup where bootstrap.remote.hosts was never added to mise.toml; running on a machine whose config excludes define no hosts.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/34c0a7f4727fcd8c. Report an issue: GitHub.

Appendix: source

Thrown at src/cli/bootstrap.rs:3052

        }
        if self.connect_timeout == 0 {
            bail!("--connect-timeout must be greater than zero");
        }
        let config = Config::get().await?;
        let config_excludes = system::remote::excludes_from_config(&config);
        let inventory = system::remote::hosts_from_config(&config, &config_excludes)?;
        let mut selected = select_remote_inventory(&inventory, &self.targets, self.all, &self.tag)?;
        let ad_hoc_source = self.source.clone().unwrap_or(std::env::current_dir()?);
        for destination in &self.host {
            let host =
                system::remote::ad_hoc_host(destination, ad_hoc_source.clone(), &config_excludes)?;
            if selected.insert(host.name.clone(), host).is_some() {
                bail!("remote target '{destination}' was selected more than once");
            }
        }
        if selected.is_empty() {
            if inventory.is_empty() {
                bail!(
                    "no remote targets configured; pass --host [user@]host or add [bootstrap.remote.hosts]"
                );
            }
            bail!(
                "select a remote target by name, --tag, or --all (configured: {})",
                inventory.keys().cloned().collect::<Vec<_>>().join(", ")
            );
        }

        let overrides = system::remote::RemoteOverrides {
            from_git: self.adopt.is_some(),
            source: self.source,
            mise_env: self.remote_env,
            copy_links: self.copy_links,
            copy_link: self.copy_link,
            port: self.port,
            identity_file: self.identity_file,
            exclude: self.exclude,

View on GitHub (pinned to 533346cc37)