Files

2.6 KiB

AGENTS.md — decky-vaultwarden

What this is

Decky Loader plugin for Steam Deck. Provides a Bitwarden/Vaultwarden password manager client in the Decky quick access panel.

Two-language architecture:

  • Python backend (main.py, bitwarden_client.py, crypto.py, clipboard.py, totp.py) — crypto, API calls, vault decryption. Loaded by Decky Loader.
  • TypeScript/React frontend (src/) — UI rendered in Decky panel. Calls Python backend via Decky's call() API.

Build commands

Command What it does
npm run build Rollup compiles TS to dist/, then packages everything (dist + Python files + py_modules/ + plugin.json) into out/Vaultwarden.zip
npm run watch Rollup watch mode (frontend only)
npm run typecheck tsc --noEmit — type checking, no emit
npm run bundle-deps Downloads Python wheels into py_modules/ (see below)

No test, lint, or formatter commands exist. No CI workflows.

Python dependency bundling

py_modules/ contains pre-compiled manylinux wheels (x86_64) for Python 3.11. These are checked into git.

To regenerate: npm run bundle-deps (runs scripts/bundle-deps.sh). Downloads wheels from PyPI and extracts them into py_modules/.

The bundled packages include: aiohttp, cryptography, argon2, pyotp, cffi, and transitive deps.

Key entrypoints

  • Plugin entry (Python): main.py — Plugin class. All methods here are callable from frontend via call().
  • Plugin entry (TS): src/index.tsx — definePlugin(). Renders VaultwardenPlugin component.
  • API bridge: src/api/backend.ts — VaultApi class wraps all call() invocations to Python.
  • State management: src/hooks/useVault.ts — manages vault state machine (logged_out → loading → unlocked, etc).

Build output

out/Vaultwarden.zip is the installable Decky plugin. Created by npm run build. Contains:

  • dist/ (compiled frontend JS)
  • All Python files
  • py_modules/ (bundled deps)
  • plugin.json, defaults/settings.json

Gotchas

  • No node_modules rebuild needed for Python changes. The Python files are copied as-is into the zip.
  • py_modules/ is checked into git with pre-compiled wheels. If you modify Python deps in requirements.txt, re-run npm run bundle-deps and commit the updated py_modules/.
  • Clipboard has two paths: Python clipboard.py (xclip/xsel with auto-clear) and frontend navigator.clipboard. They serve different purposes — don't confuse them.
  • Target platform: x86_64 Linux (Steam Deck). Python wheels are platform-specific.
  • src/utils/ exists but is empty.