rpass is a native, cross-platform backend for password-store compatible
repositories.
It keeps the existing pass/password-store format:
~/.password-store/
example/login.gpg
.gpg-id
Decrypted entries keep the usual first-line password format:
password
username: alice
url: https://example.com
otpauth://totp/...
- Use password-store repositories from Windows, macOS, and Linux.
- Provide stable JSON output for launchers such as Raycast and Vicinae.
- Avoid Bash-specific behavior.
- Keep compatibility with existing
.gpgentries and.gpg-idfiles.
Prebuilt binaries and installers are available on the GitHub Releases page.
Install from crates.io with:
cargo install rpass-cliThe crates.io package is rpass-cli; the installed binary is rpass.
- Gpg4win or GnuPG 2.x.
rpassdetects common GnuPG install paths automatically.- You can also set
PASSWORD_STORE_GPGto a specificgpg.exe. - Git is optional and only required for
rpass git ...workflows.
- GnuPG 2.x from a package manager or installer.
gpgshould be available inPATH.- Git is optional and only required for
rpass git ...workflows.
- GnuPG 2.x from your distribution packages.
gpgshould be available inPATH.- Git is optional and only required for
rpass git ...workflows.
rpass resolves the store directory in this order:
--store-dir <PATH>PASSWORD_STORE_DIR~/.password-store
rpass can initialize, list, search, show, generate, insert, edit, remove,
move, and run Git commands for password-store entries using external GnuPG. It
also supports TOTP generation from otpauth:// lines.
Commands such as clipboard support are intentionally not implemented yet.
rpass -h # show help
rpass list # list entries
rpass search example # search entries
rpass show example/login # show an entry explicitly
rpass init alice@example.com # initialize .gpg-id recipients
rpass recipients # list .gpg-id recipients
rpass recipients add bob@example.com # add a .gpg-id recipient
rpass recipients remove bob@example.com # remove a .gpg-id recipient
rpass generate example/login # generate and save a 14-character password
rpass insert example/login # insert a password interactively
rpass edit example/login # edit or create an entry
rpass rm example/login # remove an entry
rpass mv example/login archive/login # move or rename an entry
rpass git status # run git inside the store
rpass git init # initialize store Git history
rpass otp example/login # generate an OTP code
rpass doctor # check local setupinit creates the store if needed and writes .gpg-id recipients. Use
--path <subfolder> or -p <subfolder> for directory-level recipients.
recipients lists or updates an existing .gpg-id without retyping the full
recipient set.
generate writes to the store by default. Use --dry-run to print a generated
password or passphrase without opening the store, requiring .gpg-id, or calling
GPG. Use --length <N> with --dry-run when no entry name is provided.
insert prompts for a password and confirmation when run in an interactive
terminal. Use --echo to show input, --multiline to read the full entry until
EOF, and --force to overwrite an existing entry. In multiline mode, the first
line is the password and additional lines are metadata.
rpass git <args...> passes arguments to Git using the password store as the
repository. rpass git init also stages the current store and creates the same
initial commit used by pass. When the store is a Git repository, write
commands automatically create matching commits. Use rpass git --json <args...>
for structured stdout, stderr, and exit code output.
Most read commands support --json for integrations. Commands that decrypt
entries also support --passphrase-stdin for non-interactive integrations:
printf 'gpg-passphrase\n' | rpass show example/login --json --passphrase-stdin
printf 'gpg-passphrase\n' | rpass otp example/login --json --passphrase-stdinRun rpass <command> --help for command-specific flags.
Commands that accept --json follow this contract:
- exit code
0: stdout contains one complete JSON value and stderr is empty; - non-zero exit code: stderr contains one JSON error object and stdout is empty.
Error responses use this shape:
{
"error": {
"code": "gpg_decrypt_failed",
"message": "gpg failed to decrypt entry: ..."
}
}Supported behavior:
- entries are addressed without the
.gpgsuffix; - decrypted first line is the password;
name: valuemetadata lines are preserved in JSON fields;otpauth://lines are used for TOTP generation;- unknown lines are preserved as
extra_lines; - store directory is resolved from
--store-dir,PASSWORD_STORE_DIR, then~/.password-store.
Known differences from pass:
- write support is limited to
generate,insert,edit,rm, andmv; - Git integration is explicit through
rpass git <args...>; - changing recipients with
initdoes not re-encrypt existing entries yet; - shell completion, clipboard, and QR code are not implemented;
- unsupported
passflags are rejected instead of ignored; - JSON output is an
rpassintegration contract, not part of the originalpassCLI.