Command line and GUI interface to pass, the Unix password manager.
Go to file
Greg Pomerantz b4c2e19988 Android: fix OpenPGP service bind for modern Keychain.
Keychain 6.0.4 no longer exports the legacy
org.openintents.openpgp.api.OpenPgpService action, so the OpenPgpServiceConnection
from openpgp-api.jar bound nothing and every encrypt/decrypt died with a
NullPointerException in OpenPgpApi.executeApi.

Bind our own ServiceConnection against org.openintents.openpgp.IOpenPgpService
(falling back to the legacy action for older Keychain releases), and queue
API calls until the service is actually connected instead of racing the
async bind.

Also fix the //go:generate recipe: it built one jar containing both
PgpConnect and Permissions, which collides with Permissions.jar when gogio
dexes every *.jar in the repo root.
2026-08-26 18:11:10 -04:00
cmd Android: reliable build script; GUI: fix list not drawn until first tap. 2026-08-24 09:23:41 -04:00
scripts Android: reliable build script; GUI: fix list not drawn until first tap. 2026-08-24 09:23:41 -04:00
.gitignore Complete the Gio v0.10.2 GUI migration (working on Android). 2026-08-21 13:00:35 -04:00
go.mod Bump dependencies: gioui.org v0.10.2, fsnotify v1.8.0, go 1.24. 2026-08-21 12:59:51 -04:00
go.sum Bump dependencies: gioui.org v0.10.2, fsnotify v1.8.0, go 1.24. 2026-08-21 12:59:51 -04:00
impl_android.go Android: fix OpenPGP service bind for modern Keychain. 2026-08-26 18:11:10 -04:00
impl_darwin.go passgo package: modernize for go 1.24; reset store.Empty in GetStore. 2026-08-21 13:00:04 -04:00
impl_linux.go passgo package: modernize for go 1.24; reset store.Empty in GetStore. 2026-08-21 13:00:04 -04:00
impl_shared.go passgo package: modernize for go 1.24; reset store.Empty in GetStore. 2026-08-21 13:00:04 -04:00
jni_android.c Guard the JNI fragment registration against the null detach view. 2026-08-21 15:29:24 -04:00
jni_android.go passgo package: modernize for go 1.24; reset store.Empty in GetStore. 2026-08-21 13:00:04 -04:00
jni_android.h Android: launch the 'All files access' settings screen at startup. 2026-08-21 14:44:38 -04:00
main.go GUI: fix invisible text on Linux, tiny button hit-areas, missing labels. 2026-08-21 13:48:14 -04:00
openpgp-api.jar Start of Android implementation. 2019-11-20 11:52:19 -05:00
Permissions.jar Android: launch the 'All files access' settings screen at startup. 2026-08-21 14:44:38 -04:00
Permissions.java Android: launch the 'All files access' settings screen at startup. 2026-08-21 14:44:38 -04:00
PgpConnect.jar Android: fix OpenPGP service bind for modern Keychain. 2026-08-26 18:11:10 -04:00
PgpConnect.java Android: fix OpenPGP service bind for modern Keychain. 2026-08-26 18:11:10 -04:00
README.md Android: reliable build script; GUI: fix list not drawn until first tap. 2026-08-24 09:23:41 -04:00

passgo

This repository includes Go code to interact with pass, the Unix password manager. Library code is provided to open a password store, list saved passwords, and decrypt specified passwords. The library provides a simple passphrase input function, or, if gpg-agent is running (on MacOS), it will connect automatically to request your GPG passphrase. On Android, passgo connects to OpenKeychain. MacOS and Android users can also ask passgo to copy a password directly to the clipboard.

store := passgo.Store{}
// directory defaults to ~/.password-store, or set it manually here:
// store.Dir = "/home/me/.pw-store"
err := passgo.GetStore(&store)
if err != nil { ... }
passlist := store.List()
for _,x := range passlist {
	if x.Pathname == "myPass" {
		p, err := store.Decrypt(x.Pathname)
		if err == nil {
			passgo.Clip(p) // put on the clipboard
		} else {
			log.Fatal("Cannot decrypt ", x.Pathname)
		}
	}
}
/// or just do:
p, err := store.Decrypt("myPass")
...

Also included is a simple GUI front-end using Gio that works on MacOS and Android. See cmd/passgo-gui.

Building the Android APK

Use scripts/build.sh — do not build by hand:

./scripts/build.sh phone          # build + install on the phone
./scripts/build.sh phone --no-install
./scripts/build.sh emu            # emulator build (amd64)

It outputs cmd/passgo-gui/passgo-gui.apk (APKs are git-ignored and regenerated by the script). The script, in order:

  1. gogio -target android -targetsdk 34 (from ~/go/bin; packages the Go code plus the *.jar JNI classes found in cmd/passgo-gui/),
  2. apktool decode → inject MANAGE_EXTERNAL_STORAGE into the manifest (gogio's hardcoded permission table lacks it, and without it the system "All files access" toggle is grayed out on Android 11+) → apktool rebuild,
  3. sign with the debug keystore (~/.android/debug.keystore),
  4. adb install -r.

Prereqs: JDK, Go + gogio, Android SDK at ~/android-sdk (platform-tools + build-tools 35.0.0). apktool v3.0.3 is auto-downloaded to ~/android-sdk/tools/apktool.jar if missing. The script checks each prereq and says what is missing. The phone is reached via adb over the WireGuard address (see the global AGENTS.md).