Node v0.1.0-alpha.7 — exec enterprise + deploy + OS keychain
Pre-releaseOperator ergonomics + hardened key storage. No wire-format changes — files sealed by 0.1.0-alpha.{4,5,6} decrypt cleanly on 0.1.0-alpha.7.
Three new operator features
1. sealed-env exec now handles enterprise mode
When the file is enterprise, exec mints the unseal token IN MEMORY (prompting for TOTP if not provided via --totp), uses it to decrypt, and injects only the resulting plaintext env vars into the child process. Master/signing/TOTP/token are stripped from the child's environment.
sealed-env exec --file .env.sealed --deploy-id $(git rev-parse HEAD) \
-- docker compose up -d --build status2. sealed-env deploy [-- <command>]
Production deploy wrapper. Auto-detects deploy_id from git rev-parse HEAD, refuses to run with a dirty tree (uncommitted changes wouldn't be in the build), optionally polls a health URL after.
sealed-env deploy \
--health-url http://127.0.0.1:8090/actuator/health \
-- docker compose up -d --build statusReplaces the standard hand-rolled 130-line deploy.sh with one command.
3. sealed-env keychain push/pull/status/clear
OS-native encrypted storage for SEALED_ENV_* secrets. Cross-platform via shell-out, no native deps:
- Windows: DPAPI (per-user encrypted blob)
- macOS:
securityCLI (system Keychain) - Linux:
secret-tool(libsecret / GNOME Keyring / KWallet)
After keychain push, the auto-loader prefers the keychain over .env.local. Status prints SHA-256 fingerprints per entry (no values), safe for logs.
sealed-env keychain push # move .env.local → keychain
rm .env.local # plaintext copy gone
sealed-env doctor .env.sealed
# (loaded 3 SEALED_ENV_* vars from OS keychain)
# ✓ All checks passedPlus
sealed-env unseal --token-onlyfor clean shell-script use- Auto-load source string in stderr hint (keychain vs file)
- Fixed init.ts inline-comment bug
- Refactored token mint into
utils/token.ts
Architecture: host-side decrypt
This release enables an opinionated security upgrade: the operator's machine does the full unseal, and only plaintext env vars reach the container. Master keys never touch the deploy host (when paired with DOCKER_HOST=ssh://...). The Spring Boot starter still works for fleets that prefer container-side decrypt.
Full changelog: CHANGELOG.md