{"record":{"id":"bcc68e82ecb85b13","repo":"spacedriveapp/spacedrive","slug":"could-not-find-sd-daemon-binary-for-platform","errorCode":null,"errorMessage":"Could not find sd-daemon binary for platform: {}","messagePattern":"Could not find sd-daemon binary for platform: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"apps/cli/src/domains/update/mod.rs","lineNumber":78,"sourceCode":"\n\t// Determine platform\n\tlet platform = get_platform_string();\n\tprintln!();\n\tprintln!(\"Platform: {}\", platform);\n\n\t// Find matching assets\n\tlet sd_asset = latest_release\n\t\t.assets\n\t\t.iter()\n\t\t.find(|a| a.name.contains(&platform) && a.name.contains(\"sd\"))\n\t\t.ok_or_else(|| anyhow::anyhow!(\"Could not find sd binary for platform: {}\", platform))?;\n\n\tlet daemon_asset = latest_release\n\t\t.assets\n\t\t.iter()\n\t\t.find(|a| a.name.contains(&platform) && a.name.contains(\"sd-daemon\"))\n\t\t.ok_or_else(|| {\n\t\t\tanyhow::anyhow!(\"Could not find sd-daemon binary for platform: {}\", platform)\n\t\t})?;\n\n\tprintln!(\"Downloading updates...\");\n\n\t// Download binaries\n\tlet sd_data = download_file(&sd_asset.browser_download_url, sd_asset.size).await?;\n\tlet daemon_data = download_file(&daemon_asset.browser_download_url, daemon_asset.size).await?;\n\n\t// Get current binary paths\n\tlet current_exe = std::env::current_exe()?;\n\tlet bin_dir = current_exe\n\t\t.parent()\n\t\t.ok_or_else(|| anyhow::anyhow!(\"Could not determine binary directory\"))?;\n\n\tlet sd_path = bin_dir.join(\"sd\");\n\tlet daemon_path = bin_dir.join(\"sd-daemon\");\n\n\tprintln!();","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/spacedriveapp/spacedrive/blob/6dfeccf2113039e35f2ce735f945e70dc3e4ea45/apps/cli/src/domains/update/mod.rs#L60-L96","documentation":"Companion check to the sd asset lookup: the updater needs a release asset whose name contains both the platform string and 'sd-daemon'. The CLI binary was found but the daemon binary was not, so a partial update would brick the install and the updater refuses.","triggerScenarios":"A release that shipped the CLI artifact but omitted or renamed the sd-daemon artifact for your platform; platform string matching the sd asset but not the daemon's naming.","commonSituations":"Incomplete CI release matrices; asset naming changes that only affected daemon artifacts.","solutions":["Check the release page for an sd-daemon asset matching your platform string","Download the daemon artifact manually and place it beside the sd binary","Fall back to building both binaries from source at the matching tag"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"#!/usr/bin/env bash\nplatform=$(uname -m)-$(uname -s | tr '[:upper:]' '[:lower:]')\ncurl -s \"https://api.github.com/repos/spacedrive/spacedrive/releases/latest\" \\\n  | jq -e --arg p \"$platform\" '.assets[]?.name | contains($p) and contains(\"sd-daemon\")' >/dev/null \\\n  || { echo \"No sd-daemon asset for $platform\"; exit 2; }","typeGuard":null,"tryCatchPattern":"let Some(daemon_asset) = latest_release.assets.iter().find(|a| a.name.contains(&platform) && a.name.contains(\"sd-daemon\")) else {\n    eprintln!(\"No sd-daemon for {}. Available: {:?}\", platform, asset_names);\n    return Ok(()); // skip update rather than half-update the CLI only\n};","preventionTips":["Only run the update when BOTH assets are present; never let the CLI update without the daemon","Match on more precise asset suffixes than bare 'contains' to avoid false positives","Keep CI release checks asserting every supported platform has both artifacts"],"tags":["cli","update","release","distribution"],"backgroundTag":null,"analyzedSha":"6dfeccf2113039e35f2ce735f945e70dc3e4ea45","analyzedAt":"2026-08-16T11:26:17.074Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}