si vault encrypts local .env files and manages per repo/env key material via local keyring state.
Design goals:
- dotenv-first workflow
- encrypted values committed to
safe - deterministic key names:
SI_VAULT_PUBLIC_KEY(stored in.envfile)- private key material resolved from local SI vault keyring only (no env key material overrides)
Architecture boundary:
- SI Vault cryptography is local and file/keyring based.
- Fort is the only API wrapper for policy/auth over SI Vault operations.
- SI Vault owns cryptography and
.envciphertext format only. - Fort owns remote API authn/authz and policy enforcement only.
- SI Vault does not implement remote policy/auth decisions.
- Fort does not implement independent secret persistence or crypto key generation.
- Runtime agents should consume secrets through Fort; SI Vault CLI remains the local maintenance/admin tool.
- Inside SI runtime workers, local
si vaultsecret commands are blocked by default and must usesi fort.
si fortwraps the nativefortbinary and keeps runtime auth file-based.si codex spawn ...andsi codex shell ...provision or reuse a profile-scoped Fort session under~/.si/codex/profiles/<profile>/fort/.- Host bootstrap/admin auth for provisioning uses the bootstrap token files at
~/.si/fort/bootstrap/admin.tokenand~/.si/fort/bootstrap/admin.refresh.token. - Runtime worker sessions use profile-local file-backed token paths for the short-lived access token and rotating refresh token.
- Wrapper behavior:
- prefers the Fort session under
CODEX_HOME/fort/whenCODEX_HOMEis set by a managed Codex profile runtime - does not accept caller-supplied
FORT_TOKEN_PATH/FORT_REFRESH_TOKEN_PATHas a normalsi fortruntime fallback - does not fall back to the active Codex profile outside a managed
si codex spawn/si codex shellruntime - fails loudly for runtime secret commands (
get,set,list,batch-get,run) when no usable runtime session exists or runtime refresh fails - uses bootstrap/admin auth only for explicit provisioning and admin commands (
agent ...,auth issue|login|list|revoke,auth session open) - runtime refresh is owned by the profile-scoped Fort refresher
- refuses to rotate a Codex profile
refresh.tokeninto a different output path; profile refresh tokens must be refreshed in place - passes explicit token-file auth to native
fortwhen default files are available (no bearer token argv injection) - rejects deprecated token-value env vars (
FORT_TOKEN,FORT_REFRESH_TOKEN) - strips legacy token env entries from child process env if present
- prefers the Fort session under
- Operational guidance:
- keep
~/.si/fort/bootstrap/*for break-glass recovery only - keep routine Fort access in
~/.si/codex/profiles/<profile>/fort/access.tokenandrefresh.token - invoke routine Fort commands through
si codex shell <profile> -- si fort ...when outside that profile runtime - Codex profile provisioning explicitly requests a
30drefresh-session TTL; Fort's general default may be shorter for non-Codex sessions
- keep
- For flags that belong to native
fortglobal options, pass through after--:si fort -- --host https://fort.aureuma.ai doctor
- Secrets live in local
.envfiles (encrypted values). SI_VAULT_PUBLIC_KEYis inserted at file top when missing.- Encrypted values use prefix
encrypted:si-vault:. - Legacy
encrypted:payloads are accepted for backward compatibility. - Key material is scoped by
repo/envand stored in local keyring file:- default:
~/.si/vault/si-vault-keyring.json - override:
SI_VAULT_KEYRING_FILE
- default:
- This SI Vault keyring is a local JSON state file, not the OS keychain/secret-service store.
- A single canonical keypair is enforced across all keyring scopes to prevent key sprawl.
- Legacy identity/private-key env variables are ignored with warnings.
Generate or load keypair for current repo/env:
si vault keypair --env devEncrypt .env:
si vault encrypt --env-file .env --env devDecrypt to stdout:
si vault decrypt --env-file .env --env devDecrypt in place:
si vault decrypt --env-file .env --env dev --inplaceRestore last encrypted state:
si vault restore --env-file .envRun commands with decrypted env at runtime:
si vault run --env-file .env --env dev -- cargo run --bin serverFor SI runtime workers:
- Use
si fort ...for secret access. - Direct local
si vaultsecret commands are blocked in worker sessions.
si vault encryptdoes not re-encrypt already-encrypted values by default.- Use
--reencryptto rotate ciphertext. --reencryptdecrypts first, then encrypts plaintext again.
Install hook:
si vault hooks installThe hook runs si vault check --staged --all and blocks commits if plaintext values are found in .env* files.
It resolves si in this order: SI_BIN, a repo-local ./si, then si on PATH.
si vault keypair/si vault keygensi vault statussi vault checksi vault hooks <install|status|uninstall>si vault encryptsi vault decryptsi vault restoresi vault setsi vault unsetsi vault getsi vault list/si vault lssi vault run