{"id":29107665,"url":"https://github.com/bergbok/pdown","last_synced_at":"2026-02-02T06:34:53.542Z","repository":{"id":300823015,"uuid":"989715200","full_name":"Bergbok/pdown","owner":"Bergbok","description":"Command line Proton Drive file downloader","archived":false,"fork":false,"pushed_at":"2026-01-20T11:24:47.000Z","size":187,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-20T20:28:01.381Z","etag":null,"topics":["command-line","downloader","privacy","protondrive","unofficial"],"latest_commit_sha":null,"homepage":"https://npmjs.com/package/pdown","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Bergbok.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-24T17:13:37.000Z","updated_at":"2026-01-20T11:24:44.000Z","dependencies_parsed_at":"2025-06-23T20:11:11.682Z","dependency_job_id":"c152456c-753f-45e8-9003-92b6e12720f8","html_url":"https://github.com/Bergbok/pdown","commit_stats":null,"previous_names":["bergbok/pdown"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/Bergbok/pdown","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bergbok%2Fpdown","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bergbok%2Fpdown/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bergbok%2Fpdown/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bergbok%2Fpdown/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Bergbok","download_url":"https://codeload.github.com/Bergbok/pdown/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bergbok%2Fpdown/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29007222,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-02T04:25:24.522Z","status":"ssl_error","status_checked_at":"2026-02-02T04:24:51.069Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["command-line","downloader","privacy","protondrive","unofficial"],"created_at":"2025-06-29T05:07:21.911Z","updated_at":"2026-02-02T06:34:53.535Z","avatar_url":"https://github.com/Bergbok.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align='center'\u003e\n\t\u003ch1\u003epdown\u003c/h1\u003e\n\t\u003cp\u003e\u003cb\u003e\u003ca href='https://proton.me/drive'\u003eProton Drive\u003c/a\u003e file downloader\u003c/b\u003e\u003c/p\u003e\n\t\u003cimg src='https://i.imgur.com/PzHGN1J.png' width='80%'\u003e\n\t\u003cbr\u003e\n\t\u003cbr\u003e\n\u003c/div\u003e\n\n\u003cdiv align='center'\u003e\n\t\u003cpicture\u003e\n\t\t\u003ca href='https://proton.me/drive'\u003e\n\t\t\t\u003cimg src='https://img.shields.io/badge/proton-drive-purple?logo=protondrive\u0026color=6d4aff\u0026logoColor=d5a4ff\u0026labelColor=16141c\u0026style=flat'\u003e\n\t\t\u003c/a\u003e\n\t\u003c/picture\u003e\n\t\u003cpicture\u003e\n\t\t\u003ca href='https://github.com/Bergbok/pdown'\u003e\n\t\t\t\u003cimg src='https://img.shields.io/github/package-json/v/Bergbok/pdown?logo=refinedgithub\u0026color=6d4aff\u0026logoColor=d5a4ff\u0026labelColor=16141c\u0026style=flat\u0026label=github'\u003e\n\t\t\u003c/a\u003e\n\t\u003c/picture\u003e\n\t\u003cpicture\u003e\n\t\t\u003ca href='https://www.npmjs.com/package/pdown'\u003e\n\t\t\t\u003cimg src='https://img.shields.io/npm/v/pdown?logo=npm\u0026color=6d4aff\u0026logoColor=d5a4ff\u0026labelColor=16141c\u0026style=flat'\u003e\n\t\t\u003c/a\u003e\n\t\u003c/picture\u003e\n\t\u003cpicture\u003e\n\t\t\u003ca href='https://www.npmjs.com/package/pdown'\u003e\n\t\t\t\u003cimg src='https://img.shields.io/npm/d18m/pdown?logo=npm\u0026color=6d4aff\u0026logoColor=d5a4ff\u0026labelColor=16141c\u0026style=flat\u0026label=downloads%20(18%20months)'\u003e\n\t\t\u003c/a\u003e\n\t\u003c/picture\u003e\n\t\u003cpicture\u003e\n\t\t\u003ca href='https://github.com/Bergbok/pdown'\u003e\n\t\t\t\u003cimg src='https://img.shields.io/github/stars/Bergbok/pdown?logo=refinedgithub\u0026color=6d4aff\u0026logoColor=d5a4ff\u0026labelColor=16141c\u0026style=flat'\u003e\n\t\t\u003c/a\u003e\n\t\u003c/picture\u003e\n\t\u003cpicture\u003e\n\t\t\u003ca href='https://github.com/Bergbok/pdown/actions/workflows/test.yml'\u003e\n\t\t\t\u003cimg src='https://img.shields.io/github/actions/workflow/status/Bergbok/pdown/test.yml?logo=vitest\u0026color=6d4aff\u0026logoColor=d5a4ff\u0026labelColor=16141c\u0026style=flat\u0026label=tests'\u003e\n\t\t\u003c/a\u003e\n\t\u003c/picture\u003e\n\u003c/div\u003e\u003cbr\u003e\n\nUses browser automation via [Puppeteer](https://github.com/puppeteer/puppeteer).  \nWill be rewritten to use [Proton's Drive SDK](https://proton.me/blog/proton-drive-sdk-preview) once it's stable and has docs.\n\n### Installation\n\n```bash\n# recommended method\n# alias pdown to one of these\nnpx pdown\nbunx pdown\npnpx pdown\nyarn dlx pdown\n```\n\n```bash\n# alternative\t\t   # won't update automatically\nnpm add -g pdown   \t   # npm update -g pdown\nbun add -g pdown   \t   # bun update -g pdown\npnpm add -g pdown\t   # pnpm update -g pdown\nyarn global add pdown  # yarn global upgrade pdown\n# omit the global arguments when using via script\n```\n\n## Usage\n\n### via command-line\n\n```help\n$ pdown --help\nUsage: pdown [options] [command]\n\nCommands:\n  dl|download [options] \u003cURL/ID...\u003e  download Proton Drive shares\n  ls|list [options] \u003cURL/ID...\u003e      list files in Proton Drive shares\n  help [options] [command]           display help for command\n\nGlobal Options:\n  -c, --cookies \u003cFILE\u003e               path to a Netscape cookie file\n  -d, --debug                        show more informations and write log to ./pdown.log (env: DEBUG)\n  --json                             output results and logs as JSON\n  -p, --password \u003cPASSWORD\u003e          share password, if set (env: SHARE_PASSWORD)\n  --puppeteerOptions \u003cOPTIONS\u003e       options to pass to Puppeteer (JSON) - https://pptr.dev/api/puppeteer.launchoptions\n  -q, --quiet                        suppress all output except errors\n  --speed \u003cKBPS\u003e                     limit connection speed (in kilobytes per second)\n  -u, --user-agent \u003cUA\u003e              override default user agent (env: USER_AGENT)\n  --verbose                          same as --debug (env: DEBUG)\n  -V, --version                      output the version number\n  --help                             display help for command\n\ndl Options:\n  -o, --output \u003cPATH\u003e                set download folder path (default: current directory)\n  -h, --human-readable               print sizes like 1K 234M 2G instead of bytes\n  --si                               like --human-readable, but use powers of 1000 not 1024\n\nls Options:\n  -r, --recursive                    list files recursively in folders (default: false)\n  -h, --human-readable               print sizes like 1K 234M 2G instead of bytes\n  --si                               like --human-readable, but use powers of 1000 not 1024\n```\n\n```bash\n$ pdown ls KGER0RS624#LzmiMIuikOuj --recursive\nKGER0RS624#LzmiMIuikOuj - pdown\nPath                              Size      MIME Type\nexample.txt                       54B       text/plain\nsubfolder/example.jpeg            1048576B  image/jpeg\nsubfolder/subfolder-2/example.mp4 13631488B video/mp4\n\n$ pdown ls KGER0RS624#LzmiMIuikOuj --json | jq '.message | fromjson'\n[\n  {\n    \"url\": \"https://drive.proton.me/urls/KGER0RS624#LzmiMIuikOuj\",\n    \"files\": {\n      \"mimeType\": \"folder\",\n      \"name\": \"pdown\",\n      \"children\": [\n        {\n          \"mimeType\": \"folder\",\n          \"name\": \"subfolder\"\n        },\n        {\n          \"mimeType\": \"text/plain\",\n          \"name\": \"example.txt\",\n          \"size\": 54\n        }\n      ]\n    }\n  }\n]\n\n# download to custom location\n$ pdown YXNRS51SXM#lvWyeftvX7R7 -o ~/Downloads\n$ cat ~/Downloads/example.txt\n:)\n\n# download password protected share\n$ pdown Y5J2AT9QJ0#HjVxIlCjfd99 --password 'love' --quiet\n\n# download multiple shares concurrently using SI measurements - https://www.bipm.org/en/measurement-units/si-prefixes\n$ pdown KGER0RS624#LzmiMIuikOuj 65PCM21WW8#CxaogwECfsqg --si --speed 1500\npdown.zip            |████████████████████████▒░░░░░░|  81% | 12.39M /  15.29M | 1.50M/s\ncool video.mp4       |█▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░|   3% | 13.64M / 362.08M | 1.50M/s\n\n# run with visible GUI\n$ pdown YXNRS51SXM#lvWyeftvX7R7 --puppeteerOptions '{\"headless\": false}' --quiet\n\n# run with custom chromium binary, required on ARM64 (https://github.com/puppeteer/puppeteer/issues/7740)\n$ pdown YXNRS51SXM#lvWyeftvX7R7 --puppeteerOptions '{\"executablePath\": \"/usr/bin/chromium-browser\"}' --quiet\n```\n\n### via script\n\n```typescript\nimport PDown from 'pdown';\n\nconst pdown = new PDown({\n\tdownloadPath: process.cwd()\n});\n\npdown.on('downloadcomplete', ({ shareID }) =\u003e {\n\tconsole.log(`[${shareID}] Download complete`);\n});\n\nawait pdown.dl(new Set(['https://drive.proton.me/urls/65PCM21WW8#CxaogwECfsqg']));\n```\n\n## FAQ\n\n### I get a 'Permission Denied' error.\n\nFiles have to be shared publically and item password needs to be provided if set.\n\n\u003cdiv align='center'\u003e\n\t\u003cpicture\u003e\n\t\t\u003ca href='https://drive.proton.me/urls/65PCM21WW8#CxaogwECfsqg'\u003e\n\t\t\t\u003cimg src='https://i.imgur.com/1aPtn7l.png'\u003e\n\t\t\u003c/a\u003e\n\t\u003c/picture\u003e\n\u003c/div\u003e\n\n### I set the permission to 'Anyone with the link', but I still can't download.\n\nPlease [open an issue](https://github.com/Bergbok/pdown/issues/new/choose)!\n\n## Acknowledgements\n\nInspired by [gdown](https://github.com/wkentaro/gdown).  \nSpecial thanks to [cli-guidelines](https://github.com/cli-guidelines/cli-guidelines).\n\n\u003c!--\nif adding glob support:\n\nbun add is-glob @types/is-glob micromatch @types/micromatch\n\ncmd.addOption(new Option('--glob \u003cGLOB\u003e', `operate on matched files - ${terminalLink('Wikipedia', 'https://en.wikipedia.org/wiki/Glob_(programming)')}`));\n\nmicromatch(['a/b.js', 'a/c.md'], '*.js', {\n\tbasename: true,\n\tdot: true,\n});\n--\u003e\n\n\u003c!--\nhttps://drive.proton.me/urls/KGER0RS624#LzmiMIuikOuj # pdown\nhttps://drive.proton.me/urls/YXNRS51SXM#lvWyeftvX7R7 # example.txt\nhttps://drive.proton.me/urls/Y5J2AT9QJ0#HjVxIlCjfd99 # example.jpeg (pass = love)\n--\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbergbok%2Fpdown","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbergbok%2Fpdown","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbergbok%2Fpdown/lists"}