Command line and GUI interface to pass, the Unix password manager.
Go to file
Greg Pomerantz 45c1c34982 Android: bind the IOpenPgpService2 service; declare <queries> in manifest.
The v1 action (org.openintents.openpgp.IOpenPgpService) resolves in
Keychain 6.0.4 but its binder does not implement the IOpenPgpService2
AIDL descriptor that OpenPgpApi calls through, so every call died with
SecurityException: Binder invocation to an incorrect interface. Bind
the IOpenPgpService2 service first (v1 and the very old
api.OpenPgpService actions remain as fallbacks).

Android 11+ package visibility also hid Keychain's services entirely:
resolveService/bindService found nothing from the app even with
MANAGE_EXTERNAL_STORAGE granted, so the build now injects a <queries>
element (package + intent) into the decoded manifest.
2026-08-26 20:47:13 -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: bind the IOpenPgpService2 service; declare <queries> in manifest. 2026-08-26 20:47:13 -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: bind the IOpenPgpService2 service; declare <queries> in manifest. 2026-08-26 20:47:13 -04:00
PgpConnect.java Android: bind the IOpenPgpService2 service; declare <queries> in manifest. 2026-08-26 20:47:13 -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).