v2.0.0 — Global secrets
Vaulted 2.0.0 — Global secrets
Set a credential once, reach it from any project — without giving up safe-by-default injection.
Global secrets
vaulted set KEY -gstores a secret in a vault-level global namespace, reachable from any directory — novaulted.tomlneeded.get/list/rm/rotate/envstake the same-g/--globalflag.- One
vaulted rotate --globalrotates every global: no more duplicating the same API key into N projects and rotating N places. - Globals live in a reserved project with its own wrapped AES-256-GCM key, reusing the existing crypto, rotation, and audit machinery unchanged (additive schema migration v2; existing vaults upgrade in place on first open).
Safe-by-default injection
-
vaulted runinjects zero globals by default. A project opts in via itsvaulted.toml:[globals] inject = "all" # or: keys = ["OPENAI_API_KEY"]
-
A project secret always shadows a global of the same name; shadowed globals are never decrypted and never claimed in the audit trail.
vaulted listshows a SOURCE column with explicitglobal (shadowed)rows whenever globals apply. -
--with-global KEYforce-injects one global (loud error if it can't be injected);--no-globalssuppresses all for one run. -
The reserved namespace is not addressable as a project: both the CLI and MCP reject
id = "global"/projectId: "global", so neither a checked-invaulted.tomlnor a prompt-injected agent can bypass the opt-in.
MCP
list-secretsacceptsglobal: true(names only, as always — the read path stays structurally decrypt-free).run-with-secretshonors the project's[globals]opt-in and deliberately has no agent-facing globals argument.
TUI
- The global namespace appears as a pinned, marked entry in the sidebar; browse, reveal, and edit globals like any project.
Design doc: docs/rfcs/0002-global-secrets.md
Install (macOS arm64 / Linux):
curl -fsSL https://raw.githubusercontent.com/woosal1337/vaulted/main/scripts/install.sh | sh