OTPClient is a secure and easy-to-use desktop client for TOTP and HOTP one-time passwords, built with GTK4 and libadwaita. Features:
The tray menu was empty on every desktop except KDE Plasma, and has been since the tray was rewritten: right-clicking the icon opened a blank rectangle on GNOME, Cinnamon, MATE, Xfce and Waybar alike. That is fixed. OTPClient can now also start minimized to the tray and start at login. Alongside those, a round of fixes for things that never worked inside the Flatpak sandbox: webcam QR scanning (which was in fact broken everywhere), the search provider's clipboard copy and its notification, database locking for databases picked from outside the sandbox, and the command line failing whenever the GUI happened to be running.
otpclient --start-minimized. It needs minimize-to-tray and a real system tray, and is ignored with the window shown normally when either is missing. The database is deliberately left locked, so the first time you bring the window up it asks for the password (#471)otpclient-cli failed with "Application does not handle command line arguments" whenever the GUI was running, because both registered the same application id and the CLI became a remote of the GUI. This mattered rarely before and would have become permanent with start-at-loginBug-fix release. Minimize-to-tray did not work in the Flatpak: the switch was greyed out as if the desktop had no system tray, and granting the missing permission by hand still produced no icon. The sandbox refuses the process-derived bus name the tray asks to own, so the tray now registers with the tray host under its unique connection name instead, which needs no permission and works in any sandbox. The Flatpak was also missing the permissions Auto-Lock needs, so locking on screen lock silently did nothing; that is fixed in the Flathub packaging, though locking on suspend stays unavailable there.
Minimize-to-tray is now offered in default builds. It had been an opt-in build flag because turning it on could strand the application: on a desktop with no system tray, closing the window hid it anyway and left OTPClient running invisibly, holding a decrypted database, with no icon to bring it back. The app now confirms a tray host is really there before it will hide to one, and restores the window if the tray goes away. The feature itself is still off by default in Settings.
Bug-fix release. Auto-Lock was effectively unusable: on any profile that enabled it without changing the timeout, the database re-locked about five seconds after every unlock, and the unlock prompt could not be dismissed and quit the whole application when closed, leaving Settings unreachable. The timeout now defaults to five minutes, and the unlock prompt is dismissable and returns to a locked screen instead of quitting.
Bug-fix release. A database stored on a filesystem that does not implement POSIX file locks, most notably the Flatpak XDG document-portal path (/run/user/UID/doc/) that the file chooser hands back, could not be opened or created and failed with "Failed to acquire database lock: Function not implemented"; the lock file added in 5.1.4 is now treated as best-effort. This release also stops the secure-memory pool from reserving the whole locked-memory budget, which had left the GTK password entry unable to lock its own buffer on every unlock.
Bug-fix release. Following the anonymous-token fix in 5.1.3, a database containing a token with an out-of-range digit count still refused to open, again locking users out of every other token. The load-time validator was stricter than the OTP engine and the app's own UI; the accepted ranges now match the engine (digits 4 to 10, period 1 to 120 seconds). Any token the engine still cannot use is set aside so the rest of the database opens, and is preserved for repair rather than dropped.
Bug-fix release. Following 5.1.1, which restored issuer-only tokens, a database containing a token with neither an account name nor an issuer still refused to open, and a single such token blocked every other token from loading. These anonymous tokens, common in databases created before 5.1.0 added load-time validation, now load with a synthesized placeholder label instead of being rejected.
Bug-fix release. Screen and session locking, and locking on system suspend, now honor the Auto-Lock setting the same way the inactivity timer already did, so with Auto-Lock off the database is no longer locked on every screen lock. The mutual exclusivity between Auto-Lock and the Secret Service integration is restored.
Bug-fix release. Databases containing a token with an issuer but no account name (for example some ProtonMail or Steam entries) failed to open on 5.1.0 with "Could not open database: Token has a missing label", locking users out of the entire database. Such tokens are valid again.
Feature and hardening release. Webcam QR scanning now runs on a worker thread so the UI no longer freezes while the camera warms up or while frames are decoded. You can quit the app while the database is locked. The database file format is bumped to v3 with a portable big-endian header; v1 and v2 databases are still read transparently and upgraded on next save. Locking now wipes the decrypted database and master key from memory, and the app also locks automatically when the system suspends. Search-provider results use single-use, time-bounded capability tokens instead of predictable indices. Plus a broad security and correctness pass across the core, GUI, importers, and CLI, a reworked Google Authenticator migration importer, memory-leak fixes, and a new test suite with ASan/UBSan CI.
Bug-fix release in the 5.0.x line. Headline fix is an unlock-loop affecting users who upgraded from 4.x: with the correct password, the unlock dialog would re-prompt forever until the app was restarted. Also restores auto-unlock via the system keyring for upgraders, fixes the Backup/Restore buttons on distros shipping libadwaita 1.5 (Ubuntu 24.04, Pop!_OS 24.04, Linux Mint 22.3), and several smaller GUI fixes.
Bug-fix release in the 5.0.x line. Headline fix is a hardening of the auto-lock flow: dismissing the unlock dialog (Esc, X, or click-outside) previously left the token list visible and interactive, so a single click would still copy an OTP - and "Show QR" would render the secret as a scannable image. The unlock dialog is now non-dismissable and a dedicated locked page hides the token list across every code path. Also recovers gracefully on systems where the registered Secret Service provider is broken (e.g. KDE Plasma with KWallet disabled): the setting is pre-flighted before being enabled and auto-disabled on runtime failure, instead of looping every launch.
Small bug-fix release in the 5.0.x line. The headline fix is a Flatpak-only data-loss-prevention hotfix: the GSettings schema XML was installed but never compiled into gschemas.compiled, so the schema lookup failed at runtime and every GSettings write was a silent no-op. As a result, the sidebar appeared empty on each launch (db-list never persisted) and preference changes did not stick. Existing databases were never lost - the .enc files remained on disk and the last-used path was still being written to otpclient.cfg via the GKeyFile fallback. On first launch after upgrading to 5.0.4, the v4 migration path rebuilds the sidebar from that fallback automatically. Non-Flatpak builds are unaffected by the schema fix.
Small bug-fix release in the 5.0.x line. Fixes a startup crash on systems where the XDG portal cannot auto-report a color scheme (typically XFCE) and the user has the dark-theme GSetting enabled. The dark-theme preference was being applied before AdwApplication's startup chain ran, so adw_style_manager_get_default() reached into an uninitialized GDK display and aborted.
Restores the "Scan QR from Clipboard" workflow that existed in 4.5.0 and was dropped in the GTK4 rewrite. Reads an image directly from the clipboard via the GTK4 clipboard API and feeds it into the existing zbar pipeline, sidestepping the file-roundtrip needed for browser-copied or screenshot-captured QR codes.
Bug-fix release for 5.0.0. Importing a QR code into a database that already contained tokens left the previously-imported entries duplicated in the array; the duplicates also caused delete and group actions to appear to target the wrong row. Existing 5.0.0 databases that were corrupted by repeated QR imports can be cleaned up by removing the duplicate entries.
OTPClient 5.0.0 - first stable release of the GTK4 / libadwaita rewrite, with multi-database support, token grouping, an opt-in trigger keyword for the desktop search provider, and a sweeping crypto and import-path hardening pass. Existing v2 databases unlock and migrate automatically.
OTPClient 5.0.0-beta3 - Hide-by-default OTPs, unified backup flow, and fresh-install polish
OTPClient 5.0.0-beta2 - Hardening, performance, and quality-of-life improvements
OTPClient 5.0.0-alpha2 - Multi-database support, UI improvements, and bug fixes
OTPClient 5.0.0-alpha1 brings a new UI
OTPClient 4.4.1 includes the following fixes:
OTPClient 4.4.0 includes the following improvements and fixes:
OTPClient 4.3.1 includes the following improvements and fixes:
OTPClient 4.3.0 includes the following improvements and fixes:
OTPClient 4.2.0 the followin improvements:
OTPClient 4.1.1 the following improvements:
OTPClient 4.1.0 the following improvements:
OTPClient 4.0.2 brings an important fix:
OTPClient 4.0.1 brings a small fix:
OTPClient 4.0.0 brings the following changes:
OTPClient 3.7.0 brings the following changes:
OTPClient 3.6.0 brings a new feature and internal improvements:
OTPClient 3.5.2 brings some small improvements:
OTPClient 3.5.1 brings a small improvement and some code clean-up:
OTPClient 3.5.0 brings some new features and improvements:
OTPClient 3.4.1 brings a single fix::
OTPClient 3.4.0 brings the following changes:
OTPClient 3.3.0 brings the following changes:
OTPClient 3.2.1 fixes a couple of issues.
OTPClient 3.2.0 fixes a couple of issues.
OTPClient 3.1.9 brings a couple of fixes:
OTPClient 3.1.8 brings a single fix
OTPClient 3.1.7 brings many fixes
OTPClient 3.1.6 fixes a security issue.
OTPClient 3.1.5 fixes an issue when dealing with symlink
OTPClient 3.1.4 brings some fixes
OTPClient 3.1.3 brings some fixes
OTPClient 3.1.2 brings compatibility with newer cotp.
OTPClient 3.1.1 brings lots of small under-the-hood changes:
OTPClient 3.1.0 the following feature and fixes:
OTPClient 3.0.0 brings some exciting news:
OTPClient 2.6.4 fixes an import issue
OTPClient 2.6.3 fixes an issue when setting the migration flag
OTPClient 2.6.2 add an upgrade message
OTPClient 2.6.1 some fixes and a new feature
OTPClient 2.6.0 brings lots of new features
OTPClient 2.5.1
OTPClient 2.5.0 brings load of new features
OTPClient 2.4.9.1 fix a regression
OTPClient 2.4.9 fix an import issue
OTPClient 2.4.8 brings a couple of fixes
OTPClient 2.4.7 implements some small code optimization
OTPClient 2.4.6 fixes some small issues
OTPClient 2.4.4 disabled a broken feature
OTPClient 2.4.3 contains some small fixes
OTPClient 2.4.2 contains a small fix to andOTP handling
OTPClient 2.4.1 bring a new feature to the CLI
OTPClient 2.3.2 brings a small fix and a new icon
OTPClient 2.3.1 brings a security fix
OTPClient 2.3.0 brings support for a new provider
OTPClient 2.2.1 fixes a long standing bug
OTPClient 2.2.0 brings support for FreeOTP+
OTPClient 2.1.0 brings some minor enhancements to the UX
OTPClient 2.0.1 is a minor release that brings some fixes
OTPClient 2.0.0 is a major release that brings tons of new features
OTPClient 1.5.1 brings some small flatpak related fixes
OTPClient 1.5.0
OTPClient 1.4.1 brings some fixes to the flatpak version.
OTPClient 1.4.0 brings full support to andOTP.
OTPClient 1.3.1 brings some fixes to bugs that were introduced with the previous version.
OTPClient 1.3.0 brings a lot of new features and fixes.
OTPClient 1.2.2 brings some small fixes.
OTPClient 1.2.2 brings some minor fixes.
OTPClient 1.2.2 brings some minor fixes.