{"id":17237314,"url":"https://github.com/adsr/pwdrive","last_synced_at":"2025-10-29T04:06:03.439Z","repository":{"id":145935158,"uuid":"113629368","full_name":"adsr/pwdrive","owner":"adsr","description":"GnuPG+GDrive-based password vault","archived":false,"fork":false,"pushed_at":"2023-12-30T20:20:22.000Z","size":39,"stargazers_count":4,"open_issues_count":2,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-06T05:34:31.086Z","etag":null,"topics":["bash","gnupg","google","google-drive","google-drive-api","gpg","hacktoberfest","password","password-vault"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/adsr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2017-12-09T00:29:34.000Z","updated_at":"2022-07-31T21:55:17.000Z","dependencies_parsed_at":null,"dependency_job_id":"95a518d2-c27f-467f-8862-0f5840ae10f4","html_url":"https://github.com/adsr/pwdrive","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adsr%2Fpwdrive","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adsr%2Fpwdrive/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adsr%2Fpwdrive/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adsr%2Fpwdrive/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/adsr","download_url":"https://codeload.github.com/adsr/pwdrive/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240142740,"owners_count":19754633,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["bash","gnupg","google","google-drive","google-drive-api","gpg","hacktoberfest","password","password-vault"],"created_at":"2024-10-15T05:42:32.321Z","updated_at":"2025-10-29T04:05:58.422Z","avatar_url":"https://github.com/adsr.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pwdrive\n\npwdrive is a GnuPG and Google Drive-based password vault written in Bash.\nPasswords are stored as GnuPG-encrypted files on Google Drive.\n\n### Synopsis\n\n    $ pwdrive set aol       # Store encrypted secret\n    Enter secret:...\n    Enter secret again:...\n    $ pwdrive ls            # List entries\n    aol\n    $ pwdrive copy aol      # Fetch and decrypt secret onto clipboard\n    ...\n\n### Requirements\n\nYou need a working GPG setup: https://www.gnupg.org/gph/en/manual/c14.html\n\nIn addition to Bash, the following programs need to be in `PATH`:\n\n    gpg curl grep mktemp mkdir cat base64 sort ( nc | ncat )\n\nnetcat can be either the BSD or traditional version.\n\nThe `copy` command requires `xclip` by default, but can be customized via the\n`PWDRIVE_COPY_CMD` environment variable.\n\n### How it works\n\nFor the encryption half, passwords are encrypted via GnuPG in 2048-bit RSA by\ndefault. They are then base64-encoded and uploaded to Google Drive storage.\nAccess to Google Drive requires an OAuth token (granted by the end-user) which\nis stored at `~/.pwdrive/refresh_token` by default.\n\nFor the decryption half, again an OAuth token is required to download the\nencrypted password via the Google Drive API. The same private key used to\nencrypt the password is needed at decrypt time. If the key is password-protected\n(recommended) you need that as well. Note that there may be an agent running on\nyour system that remembers your GPG key passwords for some period of time.\n\nAll traffic to and from Google is transported over HTTPS.\n\nSo, as per usual, the main thing to keep safe is your GPG key.\n\nThe OAuth token in `~/.pwdrive` is regenerateable if it is lost or if it\nexpires. Simply delete it and pwdrive will prompt you to create another one. If\nthe token is stolen, an attacker will have access to encrypted password content\nwhich is very difficult to brute force without the GPG key.\n\n### Usage\n\n    Usage:\n        pwdrive \u003ccommand\u003e [argv]\n\n    Commands:\n        ls                    List all entries\n        ls \u003cstr\u003e              List all entries prefixed by str\n        set \u003centry\u003e           Set secret for entry via prompt\n        set \u003centry\u003e -         Set secret for entry from stdin\n        set \u003centry\u003e \u003cpass\u003e    Set secret for entry (not preferred)\n        get \u003centry\u003e           Print secret for entry on stdout\n        copy \u003centry\u003e          Copy secret to clipboard (via $PWDRIVE_COPY_CMD)\n        lget \u003cstr\u003e            Get entry matching str, or ls if multiple\n        lcopy \u003cstr\u003e           Copy entry matching str, or ls if multiple\n        grep \u003cstr\u003e            Print entries matching str\n        edit \u003centry\u003e          Edit secret for entry (via $EDITOR)\n        rm \u003centry\u003e            Remove entry\n        mv \u003cfrom\u003e \u003cto\u003e        Rename entry\n        token                 Print an access token\n        gen                   Generate some random passwords\n        help                  Show pwdrive usage\n\n    Environment:\n        EDITOR                Editor to use with edit (vim)\n        PWDRIVE_ACCESS_TOKEN  Use this access token instead of fetching one\n        PWDRIVE_HOME          Home dir of pwdrive (~/.pwdrive)\n        PWDRIVE_GPG_ARGS      Extra args for get/set (--no-options --default-recipient-self --quiet)\n        PWDRIVE_COPY_CMD      Copy command (xclip -sel c)\n        PWDRIVE_PORT          Port to listen on for OAuth callback (49871)\n        PWDRIVE_NO_AUTO_LSW   If non-empty, disable auto update of ~/.pwdrive/entries\n\n### Installing\n\nTo install to `/usr/local/bin`:\n\n    # make install\n\nTo install to a custom directory, supply `DESTDIR`, e.g.:\n\n    # DESTDIR=/usr/bin make install\n\n### Android\n\npwdrive is confirmed to work on Android 11 with\n[Termux](https://termux.com/) 0.117. Earlier versions may work as well.\n\n### Tip\n\nIn order to minimize dependencies, `grep -P` is used to extract JSON fields\nfrom the Google Drive API. Naturally this is not ideal. If you stick to\nascii-only for `entry` params, things should work.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadsr%2Fpwdrive","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadsr%2Fpwdrive","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadsr%2Fpwdrive/lists"}