id = "copyparty"
name = "copyparty"
homepage = "https://github.com/9001/copyparty"
description = "Portable file server."
executables = ["copyparty", "copyparty-sfx.py"]
[dotfiles]
paths = ["[configHome]/copyparty/copyparty.conf"]
secret = []
[commands]
format = 1
label = "Start a file server"
description = "Start copyparty sharing one or more folders with accounts and file indexing. Hundreds of other options (FTP, TFTP, SMB, thumbnails, TLS) are left out."
quality = "ai-draft"
parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = false, short_bundles = false }
[[commands.source]]
id = "readme"
kind = "manual"
url = "https://github.com/9001/copyparty/blob/hovudstraum/README.md"
revision = "2026-10-27"
evidence = """
running copyparty without arguments (for example doubleclicking it on Windows) will give everyone read/write access to the current folder
* `-e2dsa` enables general file indexing
* `-e2ts` enables audio metadata indexing (needs either FFprobe or Mutagen)
* `-v /mnt/music:/music:r:rw,foo -a foo:bar` shares `/mnt/music` as `/music`, `r`eadable by anyone, and read-write for user `foo`, password `bar`
* `-a usr:pwd` adds account `usr` with password `pwd`
python copyparty-sfx.py -p 80,443
* `-e2d` enables file indexing on upload
* `-e2ds` also scans writable folders for new files on startup
* `-e2dsa` also scans all mounted volumes (including readonly ones)
"""
[[commands.field]]
id = "volumes"
label = "Volumes"
description = "SRC:DST:PERMS[,USER...], for example /mnt/music:/music:r:rw,foo. Leave empty to share the current folder with everyone."
type = "string"
option = ["-v"]
multiple = true
sources = ["readme"]
[[commands.field]]
id = "accounts"
label = "Accounts"
description = "USER:PASSWORD. The password ends up in shell history."
type = "string"
option = ["-a"]
multiple = true
sources = ["readme"]
[[commands.field]]
id = "ports"
label = "Ports"
description = "Comma-separated, for example 80,443."
type = "string"
option = ["-p"]
sources = ["readme"]
[[commands.field]]
id = "index_all"
label = "Index all volumes"
description = "Scan every mounted volume, read-only ones included, at startup (-e2dsa)."
type = "boolean"
option = ["-e2dsa"]
sources = ["readme"]
[[commands.field]]
id = "index_tags"
label = "Index audio tags"
description = "Needs FFprobe or Mutagen (-e2ts)."
type = "boolean"
option = ["-e2ts"]
sources = ["readme"]
[[commands.task]]
id = "share"
label = "Share a folder"
fields = ["volumes", "accounts", "ports"]
required = ["volumes"]
[[commands.task]]
id = "music"
label = "Music library with indexing"
fields = ["volumes", "accounts", "index_all", "index_tags"]
required = ["volumes"]
set = { index_all = [true], index_tags = [true] }
[[commands.group]]
id = "basic"
label = "Basic"
fields = ["volumes", "accounts", "ports"]
[[commands.group]]
id = "advanced"
label = "Advanced"
fields = ["index_all", "index_tags"]