jdx/mise · error

GitHub relay requires Linux or macOS

Error message

GitHub relay requires Linux or macOS

What it means

The `--github-relay` option for remote bootstrap is only implemented on Unix platforms. When a relay is configured and the binary was built for a non-Unix target (e.g. Windows), `cfg!(unix)` is false and mise refuses to proceed.

Solutions

  1. Run the bootstrap from a Linux or macOS host (e.g. WSL is not applicable since cfg!(unix) is still false in native Windows builds — use a real Unix shell/environment)
  2. Remove the GitHub relay options and let hosts access GitHub directly
  3. Build/run mise inside WSL2, where the Unix build supports the relay

Example fix

// before (Windows cmd)
mise bootstrap remote --host build@server --github-relay ... // errors
// after (WSL2/Linux)
mise bootstrap remote --host build@server --github-relay ...
Defensive patterns

Strategy: validation

Validate before calling

if process.platform === 'win32' && args.includes('--github-relay') { throw new Error('github-relay is unix-only') }

Prevention

When it happens

Trigger: Running `mise bootstrap remote --github-relay ...` (any option that yields relay.is_some()) on a Windows build.

Common situations: Windows developers driving remote Linux deployments via mise and requesting the GitHub relay tunnel, which the codebase only supports on Linux/macOS.

Understand the failure class

Background: "unsupported platform" / "not supported on this platform" errors: what they mean and how to fix them — this error's family across 47 libraries.

Related errors


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

Appendix: source

Thrown at src/cli/bootstrap.rs:3033

impl BootstrapRemote {
    async fn run(mut self) -> Result<()> {
        normalize_adopt_alias(&mut self.adopt, self.from_git.take());
        crate::ui::ctrlc::exit_on_ctrl_c(false);
        let relay = crate::github_relay::Scope::from_flags(
            self.github_relay_read_only,
            &self.github_relay_repo,
            self.github_relay_all_repos,
        )?;
        let relay = crate::github_relay::configure(
            relay,
            self.github_relay_log_requests,
            self.github_relay_no_log_requests,
            self.github_relay_log_format.as_deref(),
            self.github_relay_max_duration.as_deref(),
        )?;
        if relay.is_some() && !cfg!(unix) {
            bail!("GitHub relay requires Linux or macOS");
        }
        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() {

View on GitHub (pinned to 533346cc37)