{"id":18402441,"url":"https://github.com/filosottile/passage","last_synced_at":"2025-05-16T03:04:40.699Z","repository":{"id":40122005,"uuid":"398438761","full_name":"FiloSottile/passage","owner":"FiloSottile","description":"A fork of password-store (https://www.passwordstore.org) that uses age (https://age-encryption.org) as backend.","archived":false,"fork":false,"pushed_at":"2024-08-30T19:58:21.000Z","size":423,"stargazers_count":904,"open_issues_count":22,"forks_count":42,"subscribers_count":25,"default_branch":"main","last_synced_at":"2025-05-06T00:38:54.077Z","etag":null,"topics":["age-encryption","password-store"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FiloSottile.png","metadata":{"files":{"readme":"README","changelog":null,"contributing":null,"funding":null,"license":"COPYING","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},"funding":{"custom":"https://filippo.io/maintenance#funding"}},"created_at":"2021-08-21T01:27:23.000Z","updated_at":"2025-05-03T12:07:30.000Z","dependencies_parsed_at":"2024-01-15T20:47:10.676Z","dependency_job_id":"227e25e7-5442-461d-b64b-846679d99d5d","html_url":"https://github.com/FiloSottile/passage","commit_stats":{"total_commits":525,"total_committers":108,"mean_commits":4.861111111111111,"dds":"0.38476190476190475","last_synced_commit":"4e4c5ae14be91833791d45608f50868175c1490f"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FiloSottile%2Fpassage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FiloSottile%2Fpassage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FiloSottile%2Fpassage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FiloSottile%2Fpassage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FiloSottile","download_url":"https://codeload.github.com/FiloSottile/passage/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254459088,"owners_count":22074605,"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":["age-encryption","password-store"],"created_at":"2024-11-06T02:42:29.360Z","updated_at":"2025-05-16T03:04:35.688Z","avatar_url":"https://github.com/FiloSottile.png","language":"Shell","funding_links":["https://filippo.io/maintenance#funding"],"categories":[],"sub_categories":[],"readme":"passage\n=======\n\npassage is a fork of password-store (https://www.passwordstore.org) that uses\nage (https://age-encryption.org) as a backend instead of GnuPG.\n\nDifferences from pass\n---------------------\n\nThe password store is at $HOME/.passage/store by default.\n\nFor decryption, the age identities at $HOME/.passage/identities are used with\nthe -i age CLI option.\n\nFor encryption, the nearest .age-recipients file (that is, the one in the same\ndirectory as the secret, or in the closest parent) is used with the -R age CLI\noption. If no .age-recipients files are found, the identities file is used with\nthe -i option.\n\nExtensions are searched at $HOME/.passage/extensions. password-store extensions\nthat wish to be compatible with passage can switch on the PASSAGE variable.\n\nThe init command is not currently available, and moving or copying a secret\nalways re-encrypts it.\n\nExample: simple set up\n----------------------\n\nIn this setup, the key is simply saved on disk, which can be useful if the\npassword store is synced to a location less trusted than the local disk.\n\n    age-keygen \u003e\u003e $HOME/.passage/identities\n\nExample: set up with a password-protected key\n---------------------------------------------\n\nThis setup allows using the identity file password as the primary password\nto unlock the store.\n\n    KEY=\"$(age-keygen)\"\n    echo \"$KEY\" | age -p -a \u003e\u003e $HOME/.passage/identities\n    echo \"$KEY\" | age-keygen -y \u003e\u003e $HOME/.passage/store/.age-recipients\n\nExample: set up with age-plugin-yubikey\n---------------------------------------\n\nThis setup requires age v1.1.0, or rage (https://github.com/str4d/rage), and\nthe PIV plugin age-plugin-yubikey (https://github.com/str4d/age-plugin-yubikey).\n\nIt's recommended to add more YubiKeys and/or age keys to the .age-recipients\nfile as recovery options, in case this YubiKey is lost.\n\n    age-plugin-yubikey # run interactive setup\n    age-plugin-yubikey --identity \u003e\u003e $HOME/.passage/identities\n    age-plugin-yubikey --list \u003e\u003e $HOME/.passage/store/.age-recipients\n\nIntegrating with fzf\n--------------------\n\nThe following script can be invoked with any (or no) passage flags, and\nspawns a fuzzy search dialog using fzf (https://github.com/junegunn/fzf)\nfor selecting the secret.\n\n    #! /usr/bin/env bash\n    set -eou pipefail\n    PREFIX=\"${PASSAGE_DIR:-$HOME/.passage/store}\"\n    FZF_DEFAULT_OPTS=\"\"\n    name=\"$(find \"$PREFIX\" -type f -name '*.age' | \\\n      sed -e \"s|$PREFIX/||\" -e 's|\\.age$||' | \\\n      fzf --height 40% --reverse --no-multi)\"\n    passage \"${@}\" \"$name\"\n\nMigrating from pass\n-------------------\n\n    #! /usr/bin/env bash\n    set -eou pipefail\n    cd \"${PASSWORD_STORE_DIR:-$HOME/.password-store}\"\n    while read -r -d \"\" passfile; do\n      name=\"${passfile#./}\"; name=\"${name%.gpg}\"\n      [[ -f \"${PASSAGE_DIR:-$HOME/.passage/store}/$name.age\" ]] \u0026\u0026 continue\n      pass \"$name\" | passage insert -m \"$name\" || { passage rm \"$name\"; break; }\n    done \u003c \u003c(find . -path '*/.git' -prune -o -iname '*.gpg' -print0)\n\nEnvironment variables\n---------------------\n\n  PASSAGE_DIR               Password store location\n\n  PASSAGE_IDENTITIES_FILE   Identities file location\n\n  PASSAGE_AGE               age binary (tested with age and rage)\n\n  PASSAGE_RECIPIENTS_FILE   Override recipients for encryption operations\n                            Passed to age with -R\n\n  PASSAGE_RECIPIENTS        Override recipients for encryption operations\n                            Space separated, each passed to age with -r\n\nAll other environment variables from password-store are respected, such as\nPASSWORD_STORE_CLIP_TIME and PASSWORD_STORE_GENERATED_LENGTH.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffilosottile%2Fpassage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffilosottile%2Fpassage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffilosottile%2Fpassage/lists"}