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
- Check network egress to api.github.com (curl -s https://api.github.com/repos/windmill-labs/windmill/releases/latest) from the server host.
- If rate-limited, wait or configure an authenticated/proxied HTTP client for HTTP_CLIENT.
- Treat this as non-fatal — the feature is informational; disable/ignore the update check on air-gapped installs.
- 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
- Allow egress to api.github.com on self-hosted installs
- Expect rate limits on shared IPs; don't treat this as fatal
- Disable or ignore the update check on air-gapped deployments
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
- Skipping latest-version check: ${e instanceof Error ? e.mess
- Cannot fetch latest CLI version on npmjs to check if up-to-d
- ApiError with mapped HTTP status message (e.g. "Not Found",
- Generic Error: status: ${errorStatus}; status text: ${errorS
- Dependency generation failed: ${queueResponse.status} ${queu
AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03).
Data as JSON: /api/errors/d3c679bb51405544.
Report an issue: GitHub.