{"record":{"id":"f1079ccdc132444f","repo":"zed-industries/zed","slug":"failed-to-fetch-release","errorCode":null,"errorMessage":"failed to fetch release: {:?}","messagePattern":"failed to fetch release: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/auto_update/src/auto_update.rs","lineNumber":691,"sourceCode":"        let url = http_client.build_zed_cloud_url_with_query(\n            &path,\n            AssetQuery {\n                os,\n                arch,\n                asset,\n                metrics_id: metrics_id.as_deref(),\n                system_id: system_id.as_deref(),\n                is_staff,\n            },\n        )?;\n\n        let mut response = http_client\n            .get(url.as_str(), Default::default(), true)\n            .await?;\n        let mut body = Vec::new();\n        response.body_mut().read_to_end(&mut body).await?;\n\n        anyhow::ensure!(\n            response.status().is_success(),\n            \"failed to fetch release: {:?}\",\n            String::from_utf8_lossy(&body),\n        );\n\n        serde_json::from_slice(body.as_slice()).with_context(|| {\n            format!(\n                \"error deserializing release {:?}\",\n                String::from_utf8_lossy(&body),\n            )\n        })\n    }\n\n    async fn update(this: Entity<Self>, cx: &mut AsyncApp) -> Result<()> {\n        let (client, installed_version, previous_status, release_channel) =\n            this.read_with(cx, |this, cx| {\n                (\n                    this.client.http_client(),","sourceCodeStart":673,"sourceCodeEnd":709,"githubUrl":"https://github.com/zed-industries/zed/blob/bc538def4545534201bbfcac4e95ac34ea6501b6/crates/auto_update/src/auto_update.rs#L673-L709","documentation":"Zed's auto-updater fetched release metadata over HTTP and the response status was not 2xx; the message embeds the raw response body, which usually names the real cause (404 for a missing channel build, 403 from a proxy, 5xx during an outage).","triggerScenarios":"http_client.get(url) for the release endpoint completes with a non-success status while checking for updates on any channel, so the ensure! on response.status().is_success() fails before the JSON is parsed.","commonSituations":"Corporate proxies or captive portals injecting error pages; nightly/preview channel assets yanked or not yet published; zed.dev incidents; a custom ZED_UPDATE_URL / UPDATE_URL override pointing at a wrong endpoint.","solutions":["Retry after a few minutes - most release-fetch failures are transient.","curl -i the release URL (e.g. https://zed.dev/api/releases/stable/latest) to see the exact status and body.","Verify the release channel (stable/preview/nightly) exists for your platform and commit.","Remove or fix custom update-URL environment overrides."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// pre-flight before the update check\nlet probe = http_client.head(\"https://zed.dev/api/releases/stable/latest\").await;\nif probe.is_err() {\n    // defer the update check until the network is reachable\n}","typeGuard":null,"tryCatchPattern":"wrap the update check in retry-with-backoff; match errors containing \"failed to fetch release\" and retry up to N times before reporting; treat 5xx as transient and 4xx as terminal.","preventionTips":["Pin a valid release channel in settings","Do not override update URLs unless you control the endpoint","Retry update checks after network transitions instead of failing once"],"tags":["network","http","auto-update","release"],"backgroundTag":null,"analyzedSha":"bc538def4545534201bbfcac4e95ac34ea6501b6","analyzedAt":"2026-08-16T07:30:46.435Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}