| Approach | Plaintext at call time | Agent holds the raw key? | Prompt-injection can leak it? | Enclave makes the API call? | Hardware TEE for the key in use? | Also does storage / rotation? | Setup | +
|---|---|---|---|---|---|---|---|
| .env / env vars | agent process memory | Yes | Yes β trivially | No | No | No | none |
| Password manager / keychain 1Password Β· Bitwarden Β· macOS Keychain | agent process, after autofill/read | Yes | Yes | No | No* | Yes | vault app |
| Secrets manager AWS / GCP Secrets Manager | agent process, after fetch | Yes | Yes | No | No | Yes | SDK + IAM |
| HashiCorp Vault | agent process, after fetch | Yes | Yes | No | No | Yes | server + policies |
| KMS / HSM AWS KMS Β· hardware key store | process (decrypt); key material stays for crypto | Partly | Partly β not for API keys | No | Yes | Yes | keys + IAM |
| π‘οΈ Blindfold proxy path | only inside the TDX enclave | No β never | No β the key isn't there | Yes | Yes (Intel TDX) | Complements a vault | npm i -g + signup |
* A keychain may hold its own master key in a secure element, but your API key is still decrypted into the app/process that uses it. Blindfold is the only row where the agent never holds the plaintext for its actual use.
+ +What is Blindfold β an app, a website, a network, or a skill?
blindfold β¦) plus a local proxy. Where the secret lives: an Intel TDX enclave on Terminal 3. What runs in the enclave: a RustβWASM contract that swaps the key in and makes the real API call. How an AI agent uses it: an optional Skill (Claude Code / OpenCode) that routes the agent through it. One line: a CLI + proxy that seals your key inside an Intel TDX enclave on Terminal 3; the contract swaps the key in and returns only the result, so the agent never holds the real key.What is Intel TDX / a TEE, in plain terms?
What's the difference between Terminal 3 and Intel TDX?
Is Blindfold production-ready? What's the status?
@fiscalmindset/blindfold, MIT), self-serve, and runs on Terminal 3's Intel TDX. The strongest guarantee is the proxy path, where the key never leaves the enclave. It's early and open source β see the honest limitations below.How does the swap actually happen (sentinel β real key)?
Authorization: Bearer __BLINDFOLD__. That request is forwarded into the enclave, where the contract's forward() reads the sealed key from the secrets map, replaces the __BLINDFOLD__ sentinel with the real key, applies the auth scheme, and makes the HTTPS call β all inside TDX-encrypted memory. Only the response comes back; the key never leaves.How does the agent send the placeholder to the proxy?
OPENAI_BASE_URL=http://127.0.0.1:8787/v1) and set the key to __BLINDFOLD__. The agent makes a normal API call with the sentinel; the proxy forwards it to the enclave. Your agent code doesn't change beyond those two env vars.What are the three ways to use a sealed key?
How does my coding agent know to use Blindfold?
blindfold skill install. It drops a rulebook into .claude/skills/ that tells the agent β when a secret is involved, route through Blindfold (proxy or release) instead of reading process.env. You just ask normally ("read my Google Sheet") and it uses the sealed key.What if my API isn't in the provider list?
blindfold grant --host your.api.com) and add a one-line provider entry with its host + auth scheme (bearer / basic / sigv4 / webhook). Or use the release path for non-HTTP tools.Can Blindfold β or you β see my key?
What actually stops a prompt injection?
__BLINDFOLD__. There's no real key in its memory or context to exfiltrate β convincing it to "print the key" prints the sentinel. The swap happens inside the enclave, after the request has already left the agent.Isn't the key still exposed via the release path?
What stops the agent from just calling release() itself?
T3N_API_KEY), which authenticates to Terminal 3. Keep that key out of the agent's reachable environment (terminal-side only). If the agent can't authenticate to T3, it can't release. Getting this right is the core of the release path's safety.How do I know the enclave is really running your code?
blindfold attest pins the RTMR3 code measurement and verifies the TDX quote, which chains to the Intel SGX root CA. You confirm the enclave is running your exact contract before trusting it β and Blindfold can auto-refuse an unverified enclave.How does the proxy know a request is from my real agent, not an attacker?
--auth) and a unix-domain-socket mode (--socket), so only your agent process can reach it β not another local process or a web page. Egress is also enforced server-side in Terminal 3 (a deny-by-default host allowlist), so it can't be bypassed from the client.How is this different from Vault / AWS Secrets Manager?
What are the honest limitations?
T3N_API_KEY) out of the agent's reach. It's early and open source. Attestation, per-session proxy auth, and the socket mode close the main gaps; the residual risk to manage is tenant-key reachability.Can I self-host the enclave?
Do you store anything?
~/.blindfold/sealed.jsonl) recording key names, byte-lengths, and tenant/map info β never values. Your tenant key sits in your OS keychain (or a 0600 config file). No plaintext secret is written to disk, and nothing is sent to the maintainer or any third party beyond Terminal 3 and the API you're actually calling.How does it compare to a password manager, KMS, or HSM?
How do I get started? What does "self-serve" mean?
npm i -g @fiscalmindset/blindfold && blindfold signup β signup mints a funded testnet tenant automatically (no manual token, no waiting on anyone). Then blindfold register --name your_key to seal, and blindfold proxy / blindfold use to use it. Self-serve means a stranger can go from install to working entirely on their own.What does a Terminal 3 token cost?
Which languages and stacks work?
Why Rust for the enclave contract?
wasm32-wasip2) and runs on Terminal 3's TDX runtime. Rust gives memory safety and a small, auditable, dependency-light binary β exactly what you want for the one piece of code that touches the plaintext key.Why a manual seal step instead of auto-sealing .env?
.env would silently ingest whatever's lying around β an explicit register (or --from-env) keeps you in control of exactly what gets sealed.
+