Unseenkey
v0.1.5 · open source · Windows, macOS, Linux

Your AI uses your API keys. It never sees them.

Unseenkey keeps your keys in an encrypted vault on your own machine and gives Claude Code, Cursor, your scripts and the people you hire a handle instead. A handle works only through Unseenkey, within rules you set, and every call is logged.

A leaked handle costs you nothing. A leaked key costs you until you notice.

0providers built in
0 msp99 broker overhead
0tests on every push
0 bytesof telemetry, ever

Keys leak faster than ever, and AI tools speed it up.

GitGuardian scanned every public GitHub commit made in 2025. Every one of these leaks started as a real key in a file, a chat or a config. A handle in the same place is worthless.

28.65M new secrets leaked on public GitHub in 2025, up 34% in a year.
2× Commits made with Claude Code leaked secrets at 3.2%, against 1.5% for all commits. AI writes the key wherever the code needs it.
24,008 secrets found in MCP config files. 2,117 of them still worked.
64% of the keys leaked in 2022 still worked in January 2026. Rotation rarely happens.

Source: GitGuardian, The State of Secrets Sprawl 2026.

Two minutes with Claude Code

Add the key once. From then on every tool gets a handle, and the broker does the rest.

Paste a key and Unseenkey works out the provider, locks the key to that provider's websites and sends one read-only request to check that it works. 65 providers are built in, among them OpenAI, Anthropic, Stripe, AWS, GitHub, Google, Supabase, ElevenLabs and DeepSeek, plus any other host. The daemon starts itself, listens on loopback only, and locks when you walk away.

PowerShell

How it works

The key never leaves the vault except inside a request the rules allowed. Watch an allowed call go through, and a forbidden one stop at the broker.

Your SDK, agent or contractor holds only a handle ANTHROPIC_API_KEY=usk_h_7Qx… useless in a chat, a repo, a log, or on anyone else's machine Claude Code · Cursor · boto3 · curl · a hired developer Unseenkey broker 127.0.0.1 only · vault encrypted at rest 1 handle → secret, decrypted per request 2 rules: host · path · rate · expiry · approval 3 audit entry before the first byte leaves 4 real key injected into the outgoing request 5 response scrubbed of the real key refused → nothing is sent, and it is logged The provider api.anthropic.com sees a normal request with the real key Anthropic · OpenAI · Stripe · AWS · GitHub Google · Supabase · 65 providers + any host handle The key never leaves the vault except inside a request the rules allowed. Every call is in a hash-chained log.

You stay in charge, in plain words.

Risky calls wait for you. Everything else just works. And an AI tool on your machine cannot say yes on your behalf.

Approval needed0:45

Claude Code wants to use your Stripe key to send a request to

POST api.stripe.com/v1/refunds

Refunds move money out, so it asks you first.

Your answer is confirmed with Windows Hello or your password

  • Claude Code used openai: sent api.openai.com/v1/chat/completions · OK
  • “contractor” was stopped from using stripe-live: the rules for this access do not allow it
  • Check nothing was changed: the activity log is intact

How careful should it be?

One setting decides what AI tools may do with a key on their own.

RelaxedAnything goes. Deleting things and moving money out (refunds, payouts, transfers) ask you first.
Balanced defaultCalling a model or taking a payment just works. Deletes, money out, and key, billing or account changes ask you first.
StrictEach provider's cautious default, such as Stripe read-only. Best for keys you share.
New in 0.1.5: revealing a key, approving a request or widening access needs your password or Windows Hello. Any program on your machine can read the session token, but that token alone can no longer do any of these.

Three ways a key leaks. One fix.

Every SDK, .env file and AI agent asks for the raw key. Once it exists in plaintext it gets pasted, committed, logged, or handed to someone.

Today

Your AI agent

Claude Code, Claude Desktop, Cursor and Windsurf call APIs through the broker. The key is never in the context window, a transcript or the agent's memory. One click in the app, or usk mcp install claude-code.

Today

Your own scripts and repos

"Protect a project" moves the real keys out of a folder's .env into the vault and leaves handles behind. Commit it, screenshot it, paste it: nothing happens. Caps and canaries catch what slips through.

Next

The developer you hire

Grant a freelancer or agency the use of a key with rules, an expiry and a signed log, through a broker they don't control. Revoke in one click. Join the waitlist.

What a handle can do

Each handle carries its own rules, explained in plain English and enforced before anything leaves your machine.

Paste and done

A key's shape tells Unseenkey which of 65 providers it belongs to. Allowed websites fill in, and one read-only request checks that it works.

Rules per handle

Presets per provider: stripe:payments takes payments and refuses refunds and payouts. Paths, methods, time windows, expiry, approvals.

Hard caps

--cap 500/day: the 501st request is refused before it leaves the machine. Projects get a daily limit across all their keys.

Canaries

--canary makes a handle that never works. Plant it in .env.example; any use means someone has your files, and the vault locks.

Live approvals

Sensitive calls wait for you: allow once, always allow, or don't allow. Confirmed with Windows Hello or your password.

Projects

Keys grouped by the app that uses them. AI tools working in a project's folder see only that project's keys.

Incident responses

A burst of refused requests throttles, pauses, asks you, or locks the vault. Your choice per handle; one click to resume.

Camouflage handles

Handles shaped like the provider's own keys (sk-proj-usk-…) for SDKs that check formats. Every format carries the usk marker.

AWS and OAuth2

boto3, the AWS CLI and the JS SDK sign with a placeholder; the broker re-signs with the real key. Refresh tokens stay in the vault.

Tamper-evident log

Every call, allowed or refused, written before the response returns. A hash chain plus a keyed head catches edits, gaps and deleted entries.

Activity in plain words

"Claude Code used openai · OK". Grouped by day, with filters and search. Click any entry for the technical record.

Desktop app

Projects, keys, agent access, approvals and activity. Windows Hello, locks when idle (5 minutes to 4 hours), on sleep and screen lock. Signed auto-updates.

Why not just…

Most people already handle keys one of these ways. Here is what each one leaves open.

A .env file A secrets managerDoppler, Infisical, 1Password CLI, Vault Your own proxy Unseenkey
Your AI tool never sees the real keyNoNo, it is injected into the processYesYes
Works offline, no accountYesUsually needs an account or a serverYesYes
Rules per call: host, path, methodNoNoIf you build themYes, presets for 65 providers
Asks you before risky callsNoAt most for reading a secret, not per callIf you build itYes, confirmed with Windows Hello
Removes the key from responsesNoNoIf you build itYes, streamed and compressed too
Spending limitsNoNoIf you build themPer handle and per project
Tamper-evident log of every callNoLogs secret reads, not API callsIf you build itYes
AWS signing and OAuth refreshThe key sits in the fileThe key reaches the SDKIf you build themDone inside the broker

Already use a vault? Keep it.

A vault stores keys; Unseenkey stops them reaching the agent. They work together. Importers for 1Password, Bitwarden and the OS keychain are on the roadmap.

Built your own proxy?

So have others: Infisical Agent Vault, fnox and OneCLI share the core idea, which tells us the problem is real. Unseenkey focuses on the person who owns the key: a desktop app with approvals, AWS re-signing, OAuth refresh, canary keys, a log that catches deleted entries, and next, lending a key to someone you hire.

Which one would leak?

Paste a key or a handle. This runs in your browser; nothing is sent anywhere, and this page has no analytics. Still: don't paste your real keys into web pages, use the samples.

What a policy says

Every preset renders to plain English, exactly what usk policy explain prints. Pick a provider and a policy.

    Security, and what it does not do

    Everything here is in the open: the code, the threat model and the disclosure policy.

    Encrypted vault

    Argon2id (256 MiB) and XChaCha20-Poly1305. Keys locked in memory and wiped on lock. A 24-word recovery phrase; no escrow, no support-desk recovery.

    Owner confirmation

    Revealing a key, approving a request or widening access needs your password or Windows Hello, not just a token any program could read.

    Fail closed

    Each key is locked to its provider's hosts. Browser-origin requests, unmatched requests and anything the broker cannot classify are refused.

    Scrubbing

    The real key is removed from responses, including gzip, brotli and deflate replies, and from logs and error messages. A handle never reaches the provider.

    Erased, not just deleted

    Replacing or deleting a key purges every old version from the vault file, so an old copy of the file cannot give it back.

    Signed releases

    Every archive has a Sigstore signature and an SBOM; desktop updates are signed. Every CI action is pinned to an exact commit.

    What it does not do. It is alpha software and not yet externally audited, so use it with keys you can rotate. It stops accidental leaks and limits what misuse can do. A program running as you on an unlocked machine can still use keys within the rules, but it cannot take the key away or approve its own requests. It is not a sandbox; for a hostile agent you also want one.

    Install

    Free and open source. No account, no telemetry, nothing leaves your machine.

    # Windows
    scoop bucket add unseenkey https://github.com/Bhagyesh97/scoop-unseenkey
    scoop install usk
    
    # macOS and Linux
    brew install Bhagyesh97/unseenkey/usk
    
    # from source (Rust 1.85+)
    cargo install --locked --git https://github.com/Bhagyesh97/unseenkey usk

    Installers for Windows (MSI, EXE), macOS (DMG) and Linux (deb, rpm, AppImage), and CLI archives for every platform. The installers are not yet code-signed, so Windows SmartScreen and macOS Gatekeeper warn on first launch.

    Six releases in nine days

    Built in the open since 30 September. Full changelog.

    1. 0.1.5Security fixes from a full code review: owner confirmation, compressed replies scrubbed, old values erased.
    2. 0.1.465 providers, keys recognised and tested on paste, the "how careful" setting, activity in plain words.
    3. 0.1.3Replace a key without breaking what uses it; a refused key says how to fix it.
    4. 0.1.2Projects: protect a folder in one step, a daily limit per project.
    5. 0.1.1The log catches deleted entries, limits survive a restart, the desktop app's design.
    6. 0.1.0First public release.

    Hiring a developer? Never hand over your keys.

    Delegation is the next thing we build: a client grants a developer or agency the use of a Stripe, AWS or OpenAI key with rules, an expiry and a signed log, through a broker the developer does not control. If you have handed a key to a contractor, or been handed one, we would like to talk to you before we build it.

    Questions

    Is it free?

    Yes. The local app, the CLI and every feature on this page are free and open source under Apache-2.0. The hosted part that is coming next, for sharing keys with people you hire, will be paid. If Unseenkey is useful to you, sponsoring it on GitHub pays for a first external security audit.

    Does it work with my tools?

    Claude Code, Claude Desktop, Cursor and Windsurf connect in one click. Any SDK that lets you set its API address works, which covers OpenAI, Anthropic, Stripe, AWS and most others. Tools that cannot change their address can use usk run, which is weaker: that one process sees the key, but its output is scrubbed and logged.

    Does it slow requests down?

    It adds one hop inside your own machine. Measured on a Windows laptop against a local mock server: 0.4 ms at the median and 1.9 ms at p99.

    What if I forget my password?

    When you create the vault you get 24 recovery words, shown once. Write them down. There is no other way back in, by design.

    Can I use it on servers or in CI?

    Not yet. Today it is built for your own machine: development and AI tools.

    Why should I trust it with my keys?

    Your keys never leave your machine. There is no server, no account and no analytics. The code, the threat model and the release signatures are public. It has not had an external audit yet, so start with keys you can rotate.