Deploy keys

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.

BlindKey’s Activity page: an Acme deploy requested from work-laptop by Claude Code, approved on iPhone and finished, and earlier a call outside Acme’s rule, blocked.BlindKey’s Activity page: an Acme deploy requested from work-laptop by Claude Code, approved on iPhone and finished, and earlier a call outside Acme’s rule, blocked.
How a run works

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.

  1. The machine asks

    blind run acme deploy sends the command and commit, never a key.

  2. Your phone approves

    Check that the code matches the terminal, then approve with your passkey.

  3. The run gets a pass

    A token that only works through BlindKey and ends when the command exits.

  4. BlindKey makes the call

    Each API call is checked against the run’s rule, then sent with the real key.

Terminal

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"
  }
}
Phone

What you see.

Approvals reach your home screen as notifications. Each one says what is asking and what the run may touch.

The approval page on a phone: Deploy Acme?, code QX4-7KM, from work-laptop with Claude Code, the commit, the command, what it can use, that the command can read STRIPE_SECRET_KEY, and Approve with passkey.The approval page on a phone: Deploy Acme?, code QX4-7KM, from work-laptop with Claude Code, the commit, the command, what it can use, that the command can read STRIPE_SECRET_KEY, and Approve with passkey.
  • 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.
Grants

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.

The Grants page: one Acme deploy running with 23 calls and an End grant button, one closed after a blocked call, and a Notes deploy from build-server that finished.The Grants page: one Acme deploy running with 23 calls and an End grant button, one closed after a blocked call, and a Notes deploy from build-server that finished.
Keys

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.

Acme’s Keys tab: CLOUDFLARE_API_TOKEN and HCLOUD_TOKEN, which BlindKey calls with so their values never leave, and STRIPE_SECRET_KEY, given to the command, with fingerprints, checks and last use. No values anywhere.Acme’s Keys tab: CLOUDFLARE_API_TOKEN and HCLOUD_TOKEN, which BlindKey calls with so their values never leave, and STRIPE_SECRET_KEY, given to the command, with fingerprints, checks and last use. No values anywhere.
Refusals

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
Teams

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.

Recovery

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 login and 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

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.