windmill-labs/windmill · warning

Error reading latest released version

Error message

Error reading latest released version

What it means

The `is_up_to_date` version check fetches the latest Windmill release from the GitHub API and extracts `tag_name`/body fields; when the response lacks those fields (or shape changes), it returns this error. It means the release metadata could not be parsed, usually after an HTTP failure that already logged `Impossible to reach api.github` context.

Source

Thrown at backend/windmill-api/src/lib.rs:1233

        #[cfg(feature = "mcp")]
        if let Some(mcp_cancellation_token) = mcp_cancellation_token {
            mcp_cancellation_token.cancel();
            tracing::info!("MCP server shutdown");
        }
    });

    server.await?;
    #[cfg(feature = "agent_worker_server")]
    for (i, bg_processor) in agent_workers_bg_processor.into_iter().enumerate() {
        tracing::info!("server off. shutting down agent worker bg processor {i}");
        bg_processor.await?;
        tracing::info!("agent worker bg processor {i} shut down");
    }
    Ok(())
}

async fn is_up_to_date() -> Result<String, AppError> {
    let error_reading_version = || anyhow::anyhow!("Error reading latest released version");
    let version = HTTP_CLIENT
        .get("https://api.github.com/repos/windmill-labs/windmill/releases/latest")
        .timeout(Duration::from_secs(10))
        .send()
        .await
        .context("Impossible to reach api.github")?
        .json::<serde_json::Value>()
        .await?
        .get("tag_name")
        .ok_or_else(error_reading_version)?
        .as_str()
        .ok_or_else(error_reading_version)?
        .to_string();
    let release = GIT_VERSION
        .split('-')
        .next()
        .ok_or_else(error_reading_version)?
        .to_string();

View on GitHub (pinned to e474e8803c)

Solutions

  1. Check network egress to api.github.com (curl -s https://api.github.com/repos/windmill-labs/windmill/releases/latest) from the server host.
  2. If rate-limited, wait or configure an authenticated/proxied HTTP client for HTTP_CLIENT.
  3. Treat this as non-fatal — the feature is informational; disable/ignore the update check on air-gapped installs.
  4. Retry the request; the failure is often transient.
Defensive patterns

Strategy: try-catch

Try / catch

try {
  const latest = await getVersionCheck();
} catch (e) {
  // unreachable github / rate limited: skip update check, server keeps running
  tracing::warn!("update check skipped: {e}");
}

Prevention

When it happens

Trigger: Hitting the server's version/update-check endpoint (backend/windmill-api/src/lib.rs:1233) when api.github.com is unreachable, rate-limited (403 with no JSON tag_name), or the GitHub releases response shape changed.

Common situations: Air-gapped or firewalled deployments with no access to api.github.com; GitHub API rate limiting from shared IPs; proxy/TLS interception stripping the response; transient GitHub outages.

Related errors


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/d3c679bb51405544. Report an issue: GitHub.