ML-KEM-768 + X25519 · Quantum-safe from day one

Zero-knowledge secretsfor AI coding agents.

Store encrypted secrets. Inject them into subprocesses.
Claude Code, Cursor, Copilot — the AI never sees the values.

$brew install opaquevault-brew/tap/ov
Built on
AES-256-GCM/Argon2id/ML-KEM-768/MCP Protocol/NIST FIPS 203
Built for developers using
Built by Hunter Lemperle — veteran, solutions engineer, one-person studio·GitHub·Open beta — be an early user
// The problem

23.8Msecrets leaked on GitHub in 2024 — up 25% year over year. Repos using AI coding assistants leaked at a rate 40% higher than those without.

Your AI coding assistant needs database credentials, API keys, and tokens to run tests, deploy code, and call services. But every secret you paste into Claude Code or Cursor lives in the model's context window, flows through Anthropic's API, and may be logged anywhere along the way.

Existing secret managers weren't built for AI agents. OpaqueVault was.

Source: GitGuardian State of Secrets Sprawl 2025

// Free. No account required.

Find out what's
already leaked.

Run ov scan in any repo. No signup. No telemetry. It walks your git-tracked files and surfaces secrets you may not know are there — AWS keys, Stripe tokens, private keys, connection strings, high-entropy blobs.

$ov scan .
ov scan .
Scanning 1,847 files...
FILE LINE TYPE SEV
scripts/deploy.sh31aws-access-keyCRITICAL
config/database.yml14postgres-urlHIGH
.env.backup3stripe-keyHIGH
3 secrets found. Store them safely:
$ ov scan . --fix
// One vault, every project

Stop prefixing secrets.
Use namespaces.

Every project has a DATABASE_URL. OpaqueVault scopes secrets by app and environment — so they never collide and you never needMYSAAS_PROD_DATABASE_URL again.

// Before — flat namespace
DATABASE_URLcollision ✗
DATABASE_URLcollision ✗
MYSAAS_PROD_STRIPE_KEYmanual prefix
SIDE_PROJECT_OPENAI_KEYmanual prefix
// After — app / env / name
my-saas / production
DATABASE_URLprod DB
STRIPE_SECRET_KEYlive key
my-saas / staging
DATABASE_URLstaging DB
side-project / dev
DATABASE_URLlocal DB
OPENAI_API_KEY
// Zero-config context via .ov.yaml
# .ov.yaml — commit this file, it has no secrets
app: my-saas
env: staging

Drop this in your repo root. Every ov command and ov mcp serve picks up the context automatically.

ov secret list
App: my-saas Environment: staging
NAME UPDATED
DATABASE_URL 2026-04-10
STRIPE_SECRET_KEY 2026-04-10
// How it works

The two-process model.

Decryption happens locally on your machine. The cloud stores only ciphertext.

🤖
Claude Code
AI assistant
never sees plaintext
MCP / stdio
ov mcp serve
local bridge + interceptor
  • Decrypts locally
  • Holds a scoped keyring in memory
  • Injects env vars
  • Intercepts leaked secrets
HTTPS + PQC
🔒
api.opaquevault.com
blob store only
  • Stores ciphertext only
  • No decrypt endpoint
  • No master password
01

.ov.yaml sets the context

A two-line file in your repo root — app: my-saas, env: staging — tells ov mcp serve which project and environment to operate in. No flags. No ambient ambiguity.

02

Claude calls vault_run

Claude Code calls the MCP tool with a command and secret names. The bridge already knows which app and environment to pull from — Claude never needs to specify them.

03

Bridge decrypts and injects

ov mcp serve fetches the encrypted blob for that app + environment, decrypts locally with your KEK, and spawns the subprocess with the secret as an env var. The value is zeroed from memory after use.

04

Claude sees only exit code

The MCP response contains the exit code and injection metadata — stdout and stderr are structurally omitted, and the plaintext secret value is never in the response. Ever.

// In practice

One command.
Zero exposure.

Store secrets with the CLI. Reference them from Claude Code. Your AI agent runs commands with full access — and zero visibility.

No .env files on disk
No secrets in chat context
Scoped per app + environment
No decrypt endpoint on the server
Audit log for every access
store a secret
# .ov.yaml: app: my-saas, env: production
$ ov secret set DATABASE_URL
Enter value (hidden):
Encrypted. my-saas/production/DATABASE_URL created.
claude code session
ClaudeI'll run the database migrations using vault_run.
vault_run("go run ./cmd/migrate", ["DATABASE_URL"])
exit_code: 0
secrets_injected: ["DATABASE_URL"]
# stdout went to your terminal — not to Claude.
# DATABASE_URL never appeared. Not once.
// The encryption stack

Quantum-safe.
From day one.

Not a roadmap item. Not a v2 feature. Every secret stored today is protected against harvest-now-decrypt-later attacks.

Master Password
↓ Argon2id (time=1, mem=64MB, threads=4)
KEK — Key Encryption Key (32 bytes)
Never leaves your machine. Zeroized after each unlock; on-disk caching is opt-in and double-wrapped.
↓ AES-256-GCM + random nonce per operation
DEK — per-secret Data Encryption Key
32 random bytes. Zeroed after use.
↓ AES-256-GCM + random nonce per operation
Ciphertext — all the server ever sees
Stored at api.opaquevault.com. Useless without the KEK.

ML-KEM-768 + X25519 Hybrid

Transport uses a hybrid post-quantum KEM: X25519 for classical security + ML-KEM-768 (NIST FIPS 203) for quantum resistance. If either is broken, the other protects you. Zero X25519-only fallback. No downgrades.

TLS 1.3 X25519MLKEM768 · Pure Go · No CGO
// Features

Everything. Nothing extra.

MCP-native

8 MCP tools.
Zero plaintext leaks.

vault_run, vault_list_secrets, vault_secret_exists, and 5 more. Designed so AI agents can do their job without ever seeing secret values.

vault_runvault_list_secretsvault_secret_existsvault_create_secretvault_status
🔑

Zero-knowledge

The server stores ciphertext only. No decrypt endpoint. No key escrow. A compromised server exposes nothing.

⌨️

Single binary CLI

ov includes mcp serve. One install. No version skew.

brew install opaquevault-brew/tap/ov
🖥️

Desktop Lite for macOS

Unlock, lock and browse from the menu bar. Names and metadata only — it spawns the same signed ov you already have and opens no sockets of its own.Desktop Lite docs →

get.opaquevault.com/desktop
Defense in depth

Output never comes back.

vault_run doesn't return the subprocess's stdout or stderr — they are never read into the response at all. Behind that, the interceptor scans every result the MCP tools do return and drops any that carries a secret pattern.

tool resultAKIAIOSFODNN7EXAMPLE
blocked · result dropped · Claude receives an error
📋

Audit log

Every read, write, and delete. Secret references stored as HMAC hashes. The log proves access without revealing names.

Post-quantum

Harvest-now-decrypt-later proof.

ML-KEM-768 on transport means adversaries capturing your encrypted traffic today cannot decrypt it when quantum computers arrive.

📁

Multi-app namespacing

my-saas / staging / DATABASE_URL. Secrets scoped by app and environment. No more manual prefixes. Drop a .ov.yaml in your repo — context is automatic.

🔄

CI/CD ready

Scoped API keys. Read-only CI tokens. One credential in GitHub secrets, all your real secrets behind zero-knowledge encryption.

// Setup in 5 minutes

From install to
zero-knowledge.

Install, create an app, drop a .ov.yaml in your repo root, and connect to Claude Code. Every MCP tool call is automatically scoped to the right project — no flags needed. Prefer a menu bar?Desktop Lite unlocks the same agent on macOS.

01
Install
brew install opaquevault-brew/tap/ov
ov auth login
02
Create an app + commit .ov.yaml
ov app create my-saas
ov env create production --app my-saas
echo "app: my-saas\nenv: production" > .ov.yaml
03
Store secrets
ov secret set DATABASE_URL
ov secret set OPENAI_API_KEY
04
Add to Claude Code MCP config
{
  "mcpServers": {
    "opaquevault": {
      "command": "ov",
      "args": ["mcp", "serve"]
    }
  }
}
Done. Ask Claude to run anything.

Secrets inject as env vars. Claude never sees values.

// How we compare

Built differently.
From the start.

Zero-knowledge, MCP-native, quantum-safe — and the only one that namespaces secrets by app and environment out of the box.

FeatureOpaqueVaultInfisicalDopplerHashiCorp Vault
Zero-knowledge
Claude never sees plaintext
Quantum-safe (ML-KEM-768)
MCP server for coding agents
Value-safe MCP tools (no tool returns a secret)
PriceFree / $5/moFree + paid tiers$6/mo+Self-hosted

Infisical and Doppler's MCP integrations return secret values in tool responses, placing them in the model's context window. OpaqueVault structurally prevents this via the two-process model — no tool can return a value. Full breakdown (including a fair note on 1Password, which matches OpaqueVault on this axis) on the compare page.

// Pricing

Simple pricing.
Free to start.

Free
$0 /mo
  • 10 secrets
  • 1 app
  • All 8 MCP tools
  • MCP context interceptor
  • ov scan (always free)
Get started free

Full pricing details →

// FAQ

Questions, answered.

Can an AI coding agent read my secrets with OpaqueVault?

Not on any normal path. Secret values are never placed in the AI's context, your chat history, logs, or .env files. The agent calls the vault_run MCP tool, which injects secrets as environment variables into the subprocess it runs and returns only the exit code and injection metadata — subprocess output goes to your terminal or the agent log, not back to the model — so the model orchestrates the command without the plaintext entering its context. A process you deliberately hand a secret to can of course still use it; OpaqueVault's job is to keep values off the AI's normal and accidental paths, which is where leaks actually happen.

Is OpaqueVault zero-knowledge? Can the server decrypt my secrets?

Never. The server stores only ciphertext. Your Key Encryption Key (KEK) is derived from your master password with Argon2id and never leaves your machine. There is no decrypt endpoint and no key escrow — OpaqueVault staff cannot read your secrets, even if subpoenaed.

Does OpaqueVault work with Claude Code, Cursor, and Copilot?

Yes. OpaqueVault is MCP-native. ov mcp serve is a local bridge that any Model Context Protocol client connects to — Claude Code, Cursor, GitHub Copilot, Windsurf, and others. One binary, any client.

Is OpaqueVault quantum-safe?

Yes. Transport uses an ML-KEM-768 + X25519 hybrid, which resists “harvest-now, decrypt-later” attacks — where an adversary stores your encrypted traffic today to break it with a future quantum computer. Secrets at rest are sealed with AES-256-GCM.

How is this different from a .env file or a normal secrets manager?

A .env file leaves plaintext on disk where any tool — including your AI agent — can read it. Traditional managers still hand the value to whatever asks. OpaqueVault injects secrets only into the subprocess that needs them, at run time, and never exposes the value to the AI model. The vault is zero-knowledge, so even the server cannot read them.

Is there a free version?

Yes. The vault is free to start — 10 secrets, all 8 MCP tools, and the context interceptor included. And ov scan, the local secret scanner, is free forever with no account required.

Your AI agent.
Your secrets stay secret.

Zero-knowledge. Quantum-safe. MCP-native.
Free to start. No credit card required.