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
- 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)
- Remove the GitHub relay options and let hosts access GitHub directly
- 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
- Run remote bootstrap from a Linux/macOS host
- Feature-detect OS before adding --github-relay flags in scripts
- Document relay limitations for Windows-based teammates
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
- managed system files are only supported on Unix
- only available on unix
- bootstrap users and groups are only supported on Linux
- brew import is not supported on windows
- OCI system package layers with symlinks require a unix host
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)