id = "copyparty" name = "copyparty" homepage = "https://github.com/9001/copyparty" description = "Portable file server." executables = ["copyparty", "copyparty-sfx.py"] [dotfiles] # https://github.com/9001/copyparty — the project documents the per-user # default as ~/.config/copyparty/copyparty.conf (alongside /etc/copyparty/). # The config language can also contain account/password directives, but the # upstream docs do not define stable key shapes for a secret_paths rule; keep # this limitation explicit rather than inventing one. 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"]