Architecture#

This page describes the internal design of tabby-keepass-ssh and the reasoning behind its key implementation choices.

Authentication hook#

The plugin integrates with Tabby’s SSH stack by observing the keyboard-interactive authentication flow exposed by tabby-ssh. When a connection prompts for a password or a TOTP code, the plugin intercepts the prompt, looks up a matching KeePass entry, and submits the appropriate value automatically — without requiring the user to interact with the prompt.

Entry matching#

Entries are matched by comparing the SSH profile’s host and port against each entry’s URL field, which is expected to follow the ssh://hostname or ssh://hostname:port convention. When several entries resolve to the same URL, the plugin does not guess: it defers to Tabby’s built-in selector UI so the user can pick the correct entry for that connection.

Secure handling of the master password#

The KeePass master password is treated as sensitive material throughout its lifecycle:

  • It is stored in the OS-native secret store — macOS Keychain, libsecret on Linux, or Windows Credential Manager — never written to disk in plaintext.

  • It is only held in memory for the duration of a single database-open operation, then discarded.

  • Field values inside the decrypted database are wrapped in kdbxweb’s ProtectedValue type. ProtectedValue.getText() is called immediately before a value (password or TOTP secret) is used, and the plain string is not cached or retained afterwards.

Database format support#

The plugin reads both KDBX3 and KDBX4 database files. KDBX4 databases that use Argon2 as their key derivation function are supported through the hash-wasm library, which provides a WebAssembly implementation of Argon2 suitable for use inside Tabby’s Node.js/Electron runtime.

TOTP generation#

TOTP codes are generated locally from the secret stored in the entry. The plugin recognizes three possible field names for the secret (otp, TimeOtp-Secret-Base32, TOTP Seed) to stay compatible with KeePassXC, KeePass’s built-in TOTP support (2.47+), and the legacy KeePass TOTP plugin. See Usage for the exact field formats.

Live reload of the database file#

The plugin watches the configured .kdbx file with Node’s fs.watch. When the file changes on disk — for example after adding a new SSH entry in KeePass — the plugin’s in-memory cache is invalidated automatically, so the next connection attempt reads the updated database instead of a stale cached copy.