DeckPass is a Decky Plugin to access passwords directly in SteamOS gaming mode. Internally it uses KeePassXC.
- Opens any existing KDBX database file
- Access and paste credentials into games
- Create, edit and remove entries
- Create new databases directly
- Open KeePassXC Application via shortcut
- You can install the Plugin in the following ways:
- Download the plugin from the Decky Plugin Store
- Install the plugin from the releases page
- Build the plugin yourself
- Open DeckPass in the Steam Quick Access Menu
- Follow the Setup Guide displayed in the plugin menu
- If installing the KeePassXC Flatpak via the button fails you have the following options:
- Install the KeePassXC Flatpak manually via the Discover Store
- Or run the following command
flatpak install --user flathub org.keepassxc.KeePassXC
- When using Big Picture mode in Desktop mode, credential pasting does only work within the Steam interface, but not within games
- Due to a limitation of KeePass, entries which have the same name within the same folder are not being displayed
- DeckPass is creating an interactive KeePass CLI process internally and therefore does not manage or store any credentials itself persistently
- The KeePass CLI stays active as long as either the CLI itself closes it, or the user closes it via UI
- DeckPass uses the following methods to reduce attack surface
- When creating the KeePass CLI process, direct parent to child process communication via pipes is used to communicate between Python backend (parent) and KeePass CLI process (child)
- After opening a database, the frontend receives a security token which is required for KeePass command execution for the backend
- The security token is stored in a scoped variable of the JavaScript module of the plugin
- This reduces the possibility that a process achieves to perform calls directly to the Python backend
- If there is a malicious program or Decky plugin installed it might be able to interact with the running KeePass CLI process under certain conditions
- The detailed communication flow can be seen below
The flow of communication between DeckPass and KeePassXC works in the following way:
- Python backend checks if the KeePassXC Flatpak contains
keepassxc-cliby calling the program once - If condition (1) applies, the database can be opened via a password
- The password will be entered into an input element and then sent in plain text to the Python backend
- The Python backend starts
keepassxc-clivia the KeePassXC Flatpak as subprocess with the open command and the database file - When the CLI asks for the database password, it will be sent to the CLI by writing to stdin
- After step (5) the database password will not be used at all anymore and also not stored anywhere in the DeckPass frontend or Python backend
- Python backend generates a short term token using
secrets.token_urlsafe(32), stores it in memory and returns it to the frontend - Frontend stores the token in a variable of the JavaScript module of the plugin
- Python Backend keeps the CLI process open until either KeePassXC decides to close it or it was explicitly closed by the user via the frontend
- The flow for command exchange works like this:
- Frontend resolves the short term token it got from database opening
- Frontend makes a BE call including the token to request data
- E.g. Receiving credentials in clear text for an entry
- Backend compares the incoming token with the token in memory using
hmac.compare_digest - Backend sends the respective command to the open KeePass CLI process
- Backend waits for the response of the CLI and returns it to the frontend
- Frontend displays the response
- Credential showcase in DeckPass
- Python Backend requests clear text credentials from KeePassXC CLI
- Frontend displays credentials
- Credentials are only stored in memory as long as the credentials are displayed
- Credential pasting to other applications
- Python Backend requests clear text credentials from KeePassXC CLI
- Frontend closes the Quick Access Menu
- Frontend simulates Keyboard Input for the current application by calling
SteamClient.Input.ControllerKeyboardSendText(credential)for each character of the credential
To properly build and deploy the plugin manually please refer to this guide: https://magicpods.app/blog/post-11/
- Release workflow taken from https://github.com/aarron-lee/SimpleDeckyTDP/blob/main/.github/workflows/release.yml
- Steam Shortcut assets under
./assets/shortcutare taken from https://www.steamgriddb.com/ - SDH-QuickLaunch by Fisch03 - The general approach to adding Steam shortcuts and custom artwork was inspired by https://github.com/Fisch03/SDH-QuickLaunch



