spacedriveapp/spacedrive · error · anyhow::Error
Could not find sd-daemon binary for platform: {}
Error message
Could not find sd-daemon binary for platform: {} What it means
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.
Source
Thrown at apps/cli/src/domains/update/mod.rs:78
// Determine platform
let platform = get_platform_string();
println!();
println!("Platform: {}", platform);
// Find matching assets
let sd_asset = latest_release
.assets
.iter()
.find(|a| a.name.contains(&platform) && a.name.contains("sd"))
.ok_or_else(|| anyhow::anyhow!("Could not find sd binary for platform: {}", platform))?;
let daemon_asset = latest_release
.assets
.iter()
.find(|a| a.name.contains(&platform) && a.name.contains("sd-daemon"))
.ok_or_else(|| {
anyhow::anyhow!("Could not find sd-daemon binary for platform: {}", platform)
})?;
println!("Downloading updates...");
// Download binaries
let sd_data = download_file(&sd_asset.browser_download_url, sd_asset.size).await?;
let daemon_data = download_file(&daemon_asset.browser_download_url, daemon_asset.size).await?;
// Get current binary paths
let current_exe = std::env::current_exe()?;
let bin_dir = current_exe
.parent()
.ok_or_else(|| anyhow::anyhow!("Could not determine binary directory"))?;
let sd_path = bin_dir.join("sd");
let daemon_path = bin_dir.join("sd-daemon");
println!();View on GitHub (pinned to 6dfeccf211)
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
Defensive patterns
Strategy: fallback
Validate before calling
#!/usr/bin/env bash
platform=$(uname -m)-$(uname -s | tr '[:upper:]' '[:lower:]')
curl -s "https://api.github.com/repos/spacedrive/spacedrive/releases/latest" \
| jq -e --arg p "$platform" '.assets[]?.name | contains($p) and contains("sd-daemon")' >/dev/null \
|| { echo "No sd-daemon asset for $platform"; exit 2; } Try / catch
let Some(daemon_asset) = latest_release.assets.iter().find(|a| a.name.contains(&platform) && a.name.contains("sd-daemon")) else {
eprintln!("No sd-daemon for {}. Available: {:?}", platform, asset_names);
return Ok(()); // skip update rather than half-update the CLI only
}; Prevention
- 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
When it happens
Trigger: 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.
Common situations: Incomplete CI release matrices; asset naming changes that only affected daemon artifacts.
Related errors
- Could not find sd binary for platform: {}
- Could not determine binary directory
- Invalid sort option: {}. Valid options are: name, modified,
- Failed to build action: {}
- Operation aborted by user
AI-assisted analysis of spacedriveapp/spacedrive@6dfeccf211 (2026-08-16).
Data as JSON: /api/errors/bcc68e82ecb85b13.
Report an issue: GitHub.