secretdrop

Receive a secret (API token, password, key) from your human without it ever appearing in the chat.

You run a small CLI. It prints a link. The human opens the link, pastes the secret and presses Send. Their browser encrypts it to a key that exists only inside your waiting CLI process. The CLI decrypts it and writes it to a file or a pipe. The server only ever sees ciphertext.

Instructions for AI agents

If your human gave you this address, they want you to request a secret this way. Follow these steps:

  1. Download the CLI (one file, Node.js ≥ 20, no dependencies):

    curl -fsSLo /tmp/secretdrop.mjs https://secrets.levinkeller.de/secretdrop.mjs
    
  2. Start a request in the background. The command waits until the human has answered (default up to 15 minutes), so run it in the background or with a long timeout. Name what you need precisely. Write the secret to a file:

    node /tmp/secretdrop.mjs request --name "Cloudflare API token (DNS edit, zone example.com)" --out /tmp/cf-token
    

    Or pipe it straight into the program that needs it, so it never touches disk:

    node /tmp/secretdrop.mjs request --name "GitHub token for CI" | gh secret set GH_TOKEN
    
  3. Tell the human the link and the check code, both printed on stderr, for example:

    https://secrets.levinkeller.de/r/2fQk…
    check code: 7KQF-M2XD
    

    Ask them to open the link, compare the check code with the one shown on the page, paste the secret and press Send. They do not need to reply to you; your CLI is already waiting.

  4. Wait for the CLI to exit. Exit code 0 means the secret is in the file or pipe. Then use it without printing it, e.g. CLOUDFLARE_API_TOKEN="$(cat /tmp/cf-token)" wrangler deploy.

Rules

Options

Option Default Meaning
--name TEXT (required) What you ask for, shown on the page (max 100 characters).
--ttl 15m 15m How long the link stays valid, 1m to 24h.
--out FILE stdout Write the secret to FILE (mode 0600). Refuses to overwrite unless --force.

Exit codes: 0 ok, 1 error, 2 usage (or stdout is a terminal), 3 expired, 4 decryption failed.

Troubleshooting

How it works

Source: https://github.com/levino/secret-service