{"record":{"id":"2fcb943567b4318c","repo":"spacedriveapp/spacedrive","slug":"no-cloud-volumes-found-add-a-cloud-volume-first-w","errorCode":null,"errorMessage":"No cloud volumes found. Add a cloud volume first with:\n  sd volume add-cloud","messagePattern":"No cloud volumes found\\. Add a cloud volume first with:\n  sd volume add-cloud","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"apps/cli/src/domains/location/mod.rs","lineNumber":174,"sourceCode":"\t\t}\n\t\tif !path_buf.is_dir() {\n\t\t\tanyhow::bail!(\"Path must be a directory: {}\", path_buf.display());\n\t\t}\n\n\t\tSdPath::local(path_buf)\n\t} else {\n\t\t// Cloud storage\n\t\tuse sd_core::ops::volumes::list::VolumeListQueryInput;\n\n\t\tlet volumes: sd_core::ops::volumes::list::VolumeListOutput = execute_query!(\n\t\t\tctx,\n\t\t\tVolumeListQueryInput {\n\t\t\t\tfilter: sd_core::ops::volumes::VolumeFilter::TrackedOnly\n\t\t\t}\n\t\t);\n\n\t\tif volumes.volumes.is_empty() {\n\t\t\tanyhow::bail!(\n\t\t\t\t\"No cloud volumes found. Add a cloud volume first with:\\n  sd volume add-cloud\"\n\t\t\t);\n\t\t}\n\n\t\t// Present volume choices (showing service-based URIs)\n\t\tlet volume_choices: Vec<String> = volumes\n\t\t\t.volumes\n\t\t\t.iter()\n\t\t\t.map(|v| {\n\t\t\t\tformat!(\n\t\t\t\t\t\"{} ({}) - {}\",\n\t\t\t\t\tv.name,\n\t\t\t\t\tv.mount_point.display(), // Show mount point like \"s3://bucket\"\n\t\t\t\t\tv.volume_type\n\t\t\t\t)\n\t\t\t})\n\t\t\t.collect();\n","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/spacedriveapp/spacedrive/blob/6dfeccf2113039e35f2ce735f945e70dc3e4ea45/apps/cli/src/domains/location/mod.rs#L156-L192","documentation":"Thrown by the interactive location-add flow when the user picks 'Cloud storage' and the volume list query (VolumeListQueryInput { filter: VolumeFilter::TrackedOnly }) returns an empty volumes array. Without at least one tracked cloud volume there is nothing to hang the cloud location on, so the wizard aborts and names the command that creates one.","triggerScenarios":"Choosing 'Cloud storage' in 'sd location add' before any cloud volume has been added; the daemon's volume registry has zero tracked volumes.","commonSituations":"Fresh setup where the user thinks location-add can create the bucket/login itself; cloud credentials were added but the volume was never tracked; dev daemon with a wiped state directory.","solutions":["Run 'sd volume add-cloud' to register a cloud volume (e.g. an S3 bucket)","Re-run 'sd location add', choose Cloud storage, then select the volume","If the volume exists but isn't tracked, check the daemon's volume list and tracking state"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"let volumes: VolumeListOutput = execute_query!(\n    ctx,\n    VolumeListQueryInput { filter: sd_core::ops::volumes::VolumeFilter::TrackedOnly }\n);\nif volumes.volumes.is_empty() {\n    eprintln!(\"Run 'sd volume add-cloud' before adding a cloud location\");\n    return Ok(());\n}","typeGuard":"fn has_tracked_cloud_volumes(out: &VolumeListOutput) -> bool {\n    !out.volumes.is_empty()\n}","tryCatchPattern":null,"preventionTips":["Add the cloud volume ('sd volume add-cloud') as the first step of any cloud-location workflow","Pre-flight the volume list before prompting the user for 'Cloud storage'","Remember TrackedOnly filter - credentials alone without a tracked volume will still be empty"],"tags":["cli","location","volumes","cloud"],"backgroundTag":null,"analyzedSha":"6dfeccf2113039e35f2ce735f945e70dc3e4ea45","analyzedAt":"2026-08-16T11:26:17.074Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}