Combined GNU Pass password manager and TOTP authenticator for GNOME Shell.
Browse your password store and copy TOTP codes from a single panel indicator with tabbed navigation. Also includes standalone CLI and GUI tools for viewing TOTP codes outside GNOME Shell.
- Tabbed UI with segmented control — switch between Passwords and TOTP
- Password browser — navigate your
~/.password-storedirectory tree, click to copy - TOTP codes — async generation via
oathtool, 30-second auto-refresh, click to copy - Fuzzy search with Levenshtein distance matching and 300ms debounce
- Fully async — no UI blocking, loading spinners while data fetches
- Clipboard auto-clear — configurable timeout (default 45 seconds)
- Keyboard shortcut —
Super+Wto open (configurable) - Preferences UI — default tab, clipboard timeout, TOTP entry name, store path
In addition to the GNOME Shell extension, passmate includes standalone tools for viewing TOTP codes:
Prints all TOTP codes in a formatted table with service, username, current code, next code, and time remaining.
./totpLive-updating terminal UI with automatic refresh every 30 seconds. Codes update in place.
./ctotpGraphical TOTP viewer with click-to-copy. Uses PyGTK4.
./gtotpSynchronizes TOTP secrets from an Authy export into your GNU Pass totp/all entry. Merges new entries while preserving existing ones, using secret comparison to avoid duplicates.
AUTHY_EXPORT_PASSWORD=yourpass ./syncsudo ln -s $PWD/totp /usr/local/bin/totp
sudo ln -s $PWD/ctotp /usr/local/bin/ctotp
sudo ln -s $PWD/gtotp /usr/local/bin/gtotp
sudo ln -s $PWD/sync /usr/local/bin/totp-syncThis project replaces and combines two earlier projects, which are now archived:
- authy-gnupass-totp — TOTP code viewer (archived)
- pass-gnome-extension — Password store browser (archived)
| Dependency | Required for | Install (Fedora) | Install (Ubuntu/Debian) |
|---|---|---|---|
| GNU Pass | All | dnf install pass |
apt install pass |
| oathtool | TOTP generation | dnf install oathtool |
apt install oathtool |
| Python 3 | ctotp, gtotp |
dnf install python3 |
apt install python3 |
| Python curses | ctotp |
included with Python 3 | apt install python3-curses |
| PyGObject + GTK4 | gtotp |
dnf install python3-gobject gtk4 |
apt install python3-gi gir1.2-gtk-4.0 |
| GNOME Shell 46+ | Extension | included with GNOME | included with GNOME |
| Go toolchain | sync (Authy migration) |
dnf install golang |
apt install golang |
| authy-export | sync (Authy migration) |
go install github.com/alexzorin/authy/...@latest |
same |
sudo dnf install pass oathtool python3 python3-gobject gtk4sudo apt install pass oathtool python3 python3-gi gir1.2-gtk-4.0# Linting
sudo dnf install ShellCheck # or: apt install shellcheck
pip install pylint # Python linting
npm install # JS linting (eslint, stylelint, jest)TOTP secrets stored in a GNU Pass entry (default totp/all) as otpauth:// URIs.
git clone https://github.com/dmzoneill/passmate.git
cd passmate
make installThen restart GNOME Shell:
- X11:
Alt+F2, typer, Enter - Wayland: Log out and log back in
Enable via GNOME Extensions app or:
gnome-extensions enable passmate@dmzoneill.commake dev # Symlink + launch devkit session for testing
make dev-no-ext # Launch devkit without extensions (baseline)
make install # Copy to ~/.local/share/gnome-shell/extensions/
make uninstall # Remove extension
make schemas # Compile GSettings schemas
make lint # Run eslint
make clean # Remove compiled schemasOpen preferences via the gear icon in the extension popup, or:
gnome-extensions prefs passmate@dmzoneill.com| Setting | Default | Description |
|---|---|---|
| Default tab | Passwords | Which tab opens first |
| Clipboard timeout | 45s | Auto-clear clipboard (0 = disabled) |
| TOTP pass entry | totp/all |
Pass entry containing otpauth:// URIs |
| Password store path | (empty) | Custom path (falls back to $PASSWORD_STORE_DIR or ~/.password-store) |
| Keybinding | Super+W |
Keyboard shortcut to open menu |
Store your TOTP secrets in a GNU Pass entry (default totp/all):
otpauth://totp/GitHub:username?secret=BASE32SECRET&digits=6
otpauth://totp/Google:user@gmail.com?secret=BASE32SECRET&digits=6
otpauth://totp/AWS:account-id?secret=BASE32SECRET&digits=8
make test # Run all test suites (bash + python)Individual test suites are in tests/.
Apache License 2.0 — see LICENSE.


