website/docs/user-guide/secrets/command.md
Resolve credentials by running your own helper command at startup — any secret store with a CLI works: keepassxc-cli, secret-tool (GNOME Keyring), pass, gpg, Vaultwarden's CLI, or a script that cats a tmpfs env file. The helper prints KEY=VALUE lines on stdout; Hermes applies them through the same orchestrator as Bitwarden and 1Password, so you can enable any combination of sources simultaneously.
config.yaml (never in .env — the command is configuration, .env holds values)..env loads, Hermes runs the helper ONCE via /bin/sh -c and parses its stdout as a dotenv blob..env/shell win unless override_existing: true; mapped sources beat this bulk source on contested vars; first claim wins.secrets:
command:
enabled: true
command: "cat /run/user/1000/hermes-secrets.env"
# or any vault CLI that dumps KEY=VALUE lines:
# command: "pass show hermes/env"
# command: "secret-tool lookup service hermes-env"
| Key | Default | What it does |
|---|---|---|
enabled | false | Master switch. |
command | "" | Helper run via /bin/sh -c; must print KEY=VALUE lines on stdout. |
helper_timeout_seconds | 3 | Hard timeout for one helper run. Deliberately tight — the helper must be fast and NON-interactive (no unlock prompts, no touch/PIN). |
override_existing | false | Helper values overwrite .env/shell values. Off by default (unlike Bitwarden/1Password) since a local helper is not a central rotation authority. |
.env file you control./bin/sh). On Windows the source reports itself unconfigured and startup continues.Startup is never blocked. Errors print one line plus a → remediation hint:
| Symptom | Cause | Fix |
|---|---|---|
secrets.command.command is empty | Enabled without a command | Set secrets.command.command in config.yaml |
helper command failed | Non-zero exit, timeout, spawn failure | Run the helper manually in a shell to see its real error (Hermes discards its stderr on purpose) |
helper output was not a KEY=VALUE map | Helper printed a bare value or garbage | Make the helper emit dotenv-shaped lines |
The command source is the escape hatch for vaults without a bundled integration. If you find yourself wrapping a complex CLI dance in a long script, consider a proper secret-source plugin instead — plugins get caching, provenance labels, and typed config.