{"record":{"id":"d3c679bb51405544","repo":"windmill-labs/windmill","slug":"error-reading-latest-released-version","errorCode":null,"errorMessage":"Error reading latest released version","messagePattern":"Error reading latest released version","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"backend/windmill-api/src/lib.rs","lineNumber":1233,"sourceCode":"        #[cfg(feature = \"mcp\")]\n        if let Some(mcp_cancellation_token) = mcp_cancellation_token {\n            mcp_cancellation_token.cancel();\n            tracing::info!(\"MCP server shutdown\");\n        }\n    });\n\n    server.await?;\n    #[cfg(feature = \"agent_worker_server\")]\n    for (i, bg_processor) in agent_workers_bg_processor.into_iter().enumerate() {\n        tracing::info!(\"server off. shutting down agent worker bg processor {i}\");\n        bg_processor.await?;\n        tracing::info!(\"agent worker bg processor {i} shut down\");\n    }\n    Ok(())\n}\n\nasync fn is_up_to_date() -> Result<String, AppError> {\n    let error_reading_version = || anyhow::anyhow!(\"Error reading latest released version\");\n    let version = HTTP_CLIENT\n        .get(\"https://api.github.com/repos/windmill-labs/windmill/releases/latest\")\n        .timeout(Duration::from_secs(10))\n        .send()\n        .await\n        .context(\"Impossible to reach api.github\")?\n        .json::<serde_json::Value>()\n        .await?\n        .get(\"tag_name\")\n        .ok_or_else(error_reading_version)?\n        .as_str()\n        .ok_or_else(error_reading_version)?\n        .to_string();\n    let release = GIT_VERSION\n        .split('-')\n        .next()\n        .ok_or_else(error_reading_version)?\n        .to_string();","sourceCodeStart":1215,"sourceCodeEnd":1251,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/backend/windmill-api/src/lib.rs#L1215-L1251","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  const latest = await getVersionCheck();\n} catch (e) {\n  // unreachable github / rate limited: skip update check, server keeps running\n  tracing::warn!(\"update check skipped: {e}\");\n}","preventionTips":["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"],"tags":["network","github-api","version-check","rate-limit"],"backgroundTag":"github-api-unreachable","analyzedSha":"e474e8803ce2ff5c2df09a58dab51d45f5c922ca","analyzedAt":"2026-09-03T12:38:19.024Z","contentChangedAt":"2026-09-03T12:38:19.024Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}