Keys stay in BlindKey. Machines get a pass.
BlindKey holds your Cloudflare and Hetzner keys. When you or an agent start a deploy, your phone asks you to approve it. The run gets a pass that ends with the command, and BlindKey makes each API call with the real key. No machine ever holds one.
You sign in with Google. We keep your name and email to write when there’s room for your org. By continuing you agree to the Terms and Privacy Policy.


One deploy, start to finish.
Only BlindKey ever sends a real key, and only to the provider. A machine gets a pass that works only through BlindKey, for one run, and ends with the command.
The machine asks
blind run acme deploysends the command and commit, never a key.Your phone approves
Check that the code matches the terminal, then approve with your passkey.
The run gets a pass
A token that only works through BlindKey and ends when the command exits.
BlindKey makes the call
Each API call is checked against the run’s rule, then sent with the real key.
What the agent sees.
One binary, blind. Put it in front of the deploy command you already have. What the run may touch is set in BlindKey, so editing the repo can’t widen it, and no command prints a secret.
~/code/acme main $ just deploy blind asking for "Acme deploy" machine work-laptop (Claude Code) commit 3f9c2ab feat: pricing page · pushed · clean command wrangler deploy code QX4-7KM Waiting for approval on your phone · gives up at 14:12 or open https://blindkey.sh/approve/acme/r-7m2k9q4x8c3v ✓ approved on iPhone at 14:02 · grant ends with this command, 15 min at most → wrangler deploy Uploaded acme-web (2.14 sec) Deployed acme-web triggers (0.62 sec) blind grant ended · 41 calls forwarded · 0 blocked
# Deploy through BlindKey. You approve each run on your phone.
deploy:
blind run acme deploy -- wrangler deploy{
"scripts": {
"deploy": "blind run acme deploy -- wrangler deploy"
}
}What you see.
Approvals reach your home screen as notifications. Each one says what is asking and what the run may touch.


- A passkey for every approval. Face ID or Touch ID. Being signed in isn’t enough.
- The same code as the terminal. If the codes differ, deny.
- The exact command and commit. Whether the tree is clean, and what the run may use.
- No answer, no run. Every request expires. Nothing runs until you say yes.
Every grant, while it runs.
See what each run holds right now, how many calls it made and how it ended. End one early from here, your phone or the terminal.


Each key says what it guarantees.
Add or replace a key with your passkey. Cloudflare and Hetzner keys never leave BlindKey. Other secrets reach the command as env vars, and the approval names each one. You see fingerprints, never secrets.


Some calls never go through.
Each run says what it may touch. A call outside that is refused, and the grant ends.
Calls outside the rule
Acme’s deploy may only touch acme.example. Anything else is refused, and you’re told.
BlindKey itself
No grant can reach BlindKey, and no approval can change that.
New keys
A grant can’t create API tokens or add account members, so it can’t make itself a key.
Everything, at once
Lock everything ends every grant and blocks new runs until you unlock.
~/code/acme main $ just deploy … ✓ approved on iPhone at 13:40 · grant ends with this command, 15 min at most → terraform apply -auto-approve │ Error: That zone isn’t in this rule. Acme deploy may only │ touch acme.example. (10000) ✗ command exited with code 1 blind grant was closed after a blocked call · 4 calls forwarded · 1 blocked
Your whole team, one org.
Invite your people by email and give each a role. Everyone signs in with Google and approves with their own passkey, and the activity names who did what.
Roles that mean something
Owners, admins, members and viewers. A viewer reads, a member approves.
Approvals by the right people
Members approve on their own phones, or only the approvers a run names.
One vault per org
Each org’s keys sit apart from every other org’s, with backups of their own.
A recovery key of your own
Only your org’s recovery key opens its backups. BlindKey keeps no copy it could open.
When something goes wrong.
Keys are encrypted at rest and backed up every night. Only your org’s recovery key opens a backup.
Your laptop dies
Sign in on the new one, run
blind loginand approve it. Nothing is lost.Your phone is lost
Approve from your laptop. Your passkey syncs, so nothing is lost.
You suspect a leak
Press Lock everything and every grant ends at once. Then replace the keys involved.
BlindKey is down
Deploys wait. In an emergency, your org’s recovery key opens last night’s backup.
Agents deploy. They never hold a key.
Claude Code and other agents run blind like you do. Your phone shows which agent asked, and from which machine. Without an answer, nothing runs.
~/code/notes $ npm run deploy blind asking for "Notes deploy" machine build-server (nightly agent) command wrangler deploy code 5NF-2QA Waiting for approval on your phone · gives up at 10:10 ✗ not approved within 10 minutes. Nothing ran.
~ $ blind keys show acme CLOUDFLARE_API_TOKEN blind: CLOUDFLARE_API_TOKEN in acme is secret, so blind never prints it. Only public values print. BlindKey makes the calls; the value never leaves. ~ $ blind keys ls Acme · acme NAME TYPE FINGERPRINT LAST USED CLOUDFLARE_API_TOKEN cloudflare c90e…5b71 today 14:03 HCLOUD_TOKEN hetzner 1f6a…e803 today 14:03 STRIPE_SECRET_KEY other 5d02…b7c4 today 14:03 Notes · notes NAME TYPE FINGERPRINT LAST USED CLOUDFLARE_API_TOKEN cloudflare 9a3b…d214 yesterday 4 keys. Add or replace one at https://blindkey.sh/apps
You’re signed inJoin the waitlist
Activity, grants, machines and each app’s keys and runs are in the dashboard.New orgs come in by invite for now. Sign in with Google to join the list, and we’ll email you a link to make yours when there’s room.
You sign in with Google. We keep your name and email to write when there’s room for your org. By continuing you agree to the Terms and Privacy Policy.