All projects

You paste an API key into a chat so the agent can use it — and now it's sitting in a transcript file forever.

Secrets Vault icon
Secrets Vault
Available now · macOS 14+ · Apple Silicon

Your agent can use the key without ever seeing the value.

A local macOS vault encrypts secrets at rest and hands them to CLIs and agents by reference over a loopback API — the value itself never enters their context.

macOS 14+ (Apple Silicon) · private beta · loopback-only, no cloud

Secrets Vault unlocked — the secrets list with search and a detail pane showing a "use in Claude Code" reference card. The secret ID is visible; the value itself never appears in the UI or in any API response an agent receives.
01Create the vault

One master password, derived into a key that never touches disk

The master password runs through PBKDF2-SHA256 at 600,000 iterations to derive a 32-byte AES key. The password itself is never stored — only a verification hash — and the derived key lives in memory only, zeroed on lock or after 30 minutes idle. Touch ID enrollment is optional on top.

First-run setup — Create Your Vault. The master password derives the encryption key; only a verification hash is persisted.
02The vault, unlocked

Secrets you can list and search — values you never see rendered

Every secret is encrypted at rest with AES-256-GCM in a local SQLite database. The unlocked list shows name, category, and a reference card for using it in Claude Code — never the plaintext value, not in the UI and not in any API response an agent receives.

Secrets Vault unlocked — secrets list with search and a detail pane showing the inject reference card, with the value itself never displayed.
03Agent-safe access

The model asks for a secret and gets a lookup ID, never the value

The CLI, SDK, and the Claude Code / Codex MCP plugin all read metadata only — ID, name, last-used timestamp. When an agent needs a value in a file, it calls inject, which writes the value straight to a path-validated .env file on disk. The value never enters the agent's context window and never appears in a transcript.

04Loopback only

No outbound network entitlement — it physically cannot phone home

The HTTP API binds to 127.0.0.1:4100 with loopback-only acceptance, and the sandboxed app carries the loopback-server entitlement only, not the outbound-client one. Every value access flows decrypt → audit-log → return, and the audit table never stores the value itself — only the operation, ID, and timestamp.

  • No outbound network entitlement — the sandboxed app cannot reach the internet, full stop
  • No telemetry, no update checks, no cloud account, no sync
  • Secret values never appear in error messages, logs, or agent-facing API responses — only IDs and metadata
  • The derived encryption key never touches disk — memory only, zeroed on lock
Can I download it today?

Not publicly yet — the repo and the signed build are still private while the app finishes security hardening. The build is a native Apple Silicon macOS app. Request early access and I'll follow up when it opens.

How does an agent use a secret without seeing it?

The MCP and CLI endpoints return metadata only — ID, name, last-used timestamp. When a value needs to land in a file, inject writes it directly to a path-validated .env file; the model that asked for it never receives the value in its context.

Does it need an internet connection?

No — it's local-first by design. The API binds to 127.0.0.1 only, and the sandboxed app has no outbound-network entitlement, so it cannot reach the internet even if it tried.

Has this had a security audit?

Not a full third-party audit yet. It ships signed with an Apple Development certificate (not yet notarized), with loopback-only binding, origin checks, path-validated file injection, and an append-only audit log as the hardening in place so far.

From the maker

Every agent I used eventually wanted a secret — an API key, an OAuth token, a signing cert — and the only options on offer were bad: a plaintext .env file that gets committed by accident, a system keychain most agent frameworks never bother authorizing against, or pasting the value straight into the chat, which is what actually happens most often and leaves it sitting in a transcript file forever.

Secrets Vault is the vault I wanted instead: local, encrypted, and built so an agent can use a value without ever receiving it. Unlock with Touch ID or a master password, and the CLI, SDK, and MCP plugin all read the same loopback API — metadata on request, values only ever written straight into a file you chose. It’s still working through security hardening before I open it up publicly, but it’s the app I already run every one of my own keys through.

macOS 14+ (Apple Silicon) · private beta · loopback-only, no cloud