id = "storj-uplink"
name = "Storj Uplink CLI"
homepage = "https://storj.dev/dcs/api/uplink-cli"
description = "A command-line application for uploading and managing objects and buckets"
executables = ["uplink"]
[dotfiles]
paths = [
"[configHome]/storj/uplink/config.yaml",
"[appData]/Storj/Uplink/config.yaml",
"%APPDATA%/Storj/Uplink/config.yaml",
]
secret = [
"[configHome]/storj/uplink/access.json",
"[appData]/Storj/Uplink/access.json",
"%APPDATA%/Storj/Uplink/access.json",
]
[commands]
format = 1
label = "Storj uplink"
description = "Copy files to and from Storj buckets with uplink cp. Other subcommands (ls, rm, mb, share, access) are not covered."
quality = "ai-draft"
parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = true, short_bundles = false }
[[commands.subcommand]]
path = ["cp"]
label = "Copy files and objects"
description = "Upload, download or server-side copy. Use sj://bucket/key for Storj locations; wildcards are not supported and only one source is allowed."
[[commands.subcommand.source]]
id = "docs"
kind = "manual"
url = "https://docs.storj.io/dcs/api/uplink-cli/cp-command"
revision = "2026-10-27"
evidence = """
uplink cp [flags] SOURCE DESTINATION
--access string the serialized access, or name of the access to use
-r, --recursive Perform a recursive copy
-t, --transfers int Controls how many uploads/downloads to perform in parallel (default 1)
--dry-run Print what operations would happen but don't execute them
--progress Show a progress bar when possible (default true)
-p, --parallelism int Controls how many parallel chunks to upload/download from a file (default 1)
--expires relative_date Schedule removal after this time (e.g. '+2h', 'now', '2020-01-02T15:04:05Z0700')
uplink cp cheesecake.jpg sj://cakes
uplink cp sj://cakes/cheesecake.jpg ~/Downloads/
"""
[[commands.subcommand.field]]
id = "source"
label = "Source"
description = "Local path or sj://bucket/key."
type = "string"
position = 0
min = 1
sources = ["docs"]
[[commands.subcommand.field]]
id = "destination"
label = "Destination"
description = "Local path or sj://bucket/key."
type = "string"
position = 1
min = 1
sources = ["docs"]
[[commands.subcommand.field]]
id = "recursive"
label = "Recursive"
type = "boolean"
option = ["--recursive", "-r"]
sources = ["docs"]
[[commands.subcommand.field]]
id = "dry_run"
label = "Dry run"
type = "boolean"
option = ["--dry-run"]
sources = ["docs"]
[[commands.subcommand.field]]
id = "access"
label = "Access name or grant"
description = "A serialized access grant is a secret and ends up in shell history."
type = "string"
option = ["--access"]
sources = ["docs"]
[[commands.subcommand.field]]
id = "transfers"
label = "Parallel transfers"
type = "integer"
option = ["--transfers", "-t"]
sources = ["docs"]
[[commands.subcommand.field]]
id = "parallelism"
label = "Parallel chunks per file"
type = "integer"
option = ["--parallelism", "-p"]
sources = ["docs"]
[[commands.subcommand.field]]
id = "expires"
label = "Expire after"
description = "Relative time such as +2h, or an ISO 8601 date."
type = "string"
option = ["--expires"]
sources = ["docs"]
[[commands.subcommand.task]]
id = "upload"
label = "Upload"
fields = ["source", "destination", "recursive", "expires"]
required = ["source", "destination"]
[[commands.subcommand.task]]
id = "download"
label = "Download"
fields = ["source", "destination", "recursive", "parallelism"]
required = ["source", "destination"]
[[commands.subcommand.task]]
id = "preview"
label = "Dry run"
fields = ["source", "destination", "recursive", "dry_run"]
required = ["source", "destination", "dry_run"]
set = { dry_run = [true] }
[[commands.subcommand.group]]
id = "basic"
label = "Basic"
fields = ["source", "destination", "recursive", "dry_run"]
[[commands.subcommand.group]]
id = "advanced"
label = "Advanced"
fields = ["access", "transfers", "parallelism", "expires"]