{"id":51911729,"url":"https://github.com/screwys/pdrive-sync-rs","last_synced_at":"2026-07-27T05:30:40.137Z","repository":{"id":372751212,"uuid":"1309523122","full_name":"screwys/pdrive-sync-rs","owner":"screwys","description":"Simple proton-drive wrapper for synchronization ","archived":false,"fork":false,"pushed_at":"2026-07-23T04:52:25.000Z","size":68,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-23T06:09:22.415Z","etag":null,"topics":["protondrive","rust","sync"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/screwys.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2026-07-23T04:41:31.000Z","updated_at":"2026-07-23T04:57:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/screwys/pdrive-sync-rs","commit_stats":null,"previous_names":["screwys/pdrive-sync-rs"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/screwys/pdrive-sync-rs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/screwys%2Fpdrive-sync-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/screwys%2Fpdrive-sync-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/screwys%2Fpdrive-sync-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/screwys%2Fpdrive-sync-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/screwys","download_url":"https://codeload.github.com/screwys/pdrive-sync-rs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/screwys%2Fpdrive-sync-rs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35938859,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-27T02:00:06.776Z","response_time":101,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["protondrive","rust","sync"],"created_at":"2026-07-27T05:30:40.074Z","updated_at":"2026-07-27T05:30:40.133Z","avatar_url":"https://github.com/screwys.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pdrive-sync-rs\n\n`pdrive-sync-rs` is a simple and ligthweight way to orchestrate official CLI of proton-drive. It adds scheduled one-way and two-way folder sync layer, it is not another Proton client: it\ndoes not implement authentication, or store Proton credentials.\n\nIt supports local-to-remote push, remote-to-local pull, and two-way sync.\nDeletion is opt-in: `delete = \"trash\"` moves removed files to Proton Drive\nTrash or the local desktop Trash. It never empties either Trash.\n\n| Mode | Normal changes | `delete = \"trash\"` |\n| --- | --- | --- |\n| `push` | Local is authoritative; new and changed local files upload. | Local deletions move the matching remote files to Proton Drive Trash. |\n| `pull` | Proton Drive is authoritative; new and changed remote files download. | Remote deletions move the matching local files to the desktop Trash. |\n| `two-way` | A change on one side copies to the unchanged side. If both changed, `conflict` decides. | A deletion propagates only when the other side is unchanged; delete/change combinations are conflicts. |\n\nWith `delete = \"keep\"`, files missing from one side are copied back in\ntwo-way mode and left alone in one-way modes.\n\n## Install\n\nFirst install the [official Proton Drive CLI](https://proton.me/support/drive-cli)\nand log in with its own command:\n\n```sh\nproton-drive auth login\n```\n\n`proton-drive` must be on `PATH`, or `proton_drive_bin` must point to its\nexecutable. Then install the sync wrapper:\n\n```sh\ncurl -fsSL https://raw.githubusercontent.com/screwys/pdrive-sync-rs/main/install.sh | sh\npdrive-sync-rs setup\npdrive-sync-rs install\npdrive-sync-rs status\n```\n\nThe installer puts `pdrive-sync-rs` in `~/.local/bin`. `install` detects a\nsystemd, dinit, or OpenRC user service manager and creates\n`pdrive-sync.service`. Use `--interval 30m` to change the default one-hour\ninterval.\n\nsystemd uses a oneshot service and timer. dinit and OpenRC supervise the\nbuilt-in interval loop from `~/.config/dinit.d/pdrive-sync` or\n`~/.config/rc/init.d/pdrive-sync`. Force detection when needed:\n\n```sh\npdrive-sync-rs install --init dinit\npdrive-sync-rs status --init dinit\npdrive-sync-rs uninstall --init dinit\n```\n\nThe systemd unit also applies a soft `MemoryHigh=512M` cache-reclaim boundary.\ndinit can only join a cgroup created elsewhere, and OpenRC user services do not\ncreate cgroups, so the installer does not substitute an unsafe hard memory\nlimit for those managers.\n\n## Configuration\n\nThe default file is `~/.config/pdrive-sync/config.toml`:\n\n```toml\nproton_drive_bin = \"proton-drive\"\n\n[[sync]]\nname = \"documents\"\nmode = \"push\"\nlocal = \"/home/me/Documents\"\nremote = \"/my-files/Documents\"\ndelete = \"trash\"\n```\n\nAdd more `[[sync]]` entries as needed. Two-way conflicts default to `fail`,\nwhich plans every action first and changes nothing when a conflict exists.\n`local-wins` and `remote-wins` resolve them in the named direction.\n`ready_marker = \".sync-ready\"` can guard a removable source from being\nmistaken for an empty folder. See\n[`config.example.toml`](config.example.toml) for every operation.\n`exclude = [\"private/**\", \"*.tmp\"]` leaves matching paths untouched on both\nsides, including when deletion is enabled.\n\nRun selected entries with `pdrive-sync-rs sync documents photos`, or describe a\nsafe one-off sync with `--local`, `--remote`, `--mode`, and `--delete`.\n`pdrive-sync-rs config validate` checks the file.\n\n## Behavior\n\nThe first push inventories the remote tree and hashes local files. Later push\nruns use local checkpoints and compare Proton Drive's active-revision SHA-1\nbefore replacing anything, so unchanged files are not uploaded again. A failed\ntransfer is never checkpointed, and deletions run only after transfers\nsucceed.\n\nSymlinks and non-UTF-8 names are skipped or rejected rather than followed.\nEmpty directories are not reproduced. Pull and two-way modes inventory the\nremote tree on each run because the CLI does not expose the SDK event stream.\n\n## License\n\nLicensed under the GNU General Public License,\nversion 3 or any later version (`GPL-3.0-or-later`).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscrewys%2Fpdrive-sync-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscrewys%2Fpdrive-sync-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscrewys%2Fpdrive-sync-rs/lists"}