passwd.page

The secure
secret handoff
for humans
and agents

Your agents need secrets. Pasting them into prompts gets them logged. Hardcoding them is worse. passwd.page is the zero-knowledge handoff — encrypted on your device, self-destructing, open source.

No signup · No app · No subscription · Free & open source

your secret
ciphertext
9hT2kLpXw4RnB7vZqJ3m
server stores opaque noise
you keep #kG7xR2mN8pQv key never leaves your device

Six reasons to try it again.

📱 QR code on every link

Shared from laptop, opening on your phone? Scan. Done. No 64-character URL typing.

📎 Files, not just passwords

Drag & drop any file up to 1 MB. SSH keys, .env files, certs. Encrypted in your browser before it leaves.

🔐 Optional passphrase

Second factor for the paranoid. PBKDF2-hardened, never sent to the server. Even if the link leaks, the secret doesn't.

🏷️ Typed secrets

Tell the receiving agent it's an api_key vs a postgres_url. Eight types. Schema hints for the agent era.

⏱️ Five-minute TTLs

For when your agent needs a token right now and never again. Also 15m, 1h, 24h, 7d, 30d.

🐳 Self-host in 60 seconds

docker compose up -d. Or drop the systemd unit. See SELF_HOSTING.md.

Secrets are everywhere.
Secure handoff is nowhere.

Pasting API keys into an LLM session

Logged, stored, potentially trained on. Your secret is now someone else's data.

Slacking a .env file to a teammate

Plaintext, forever searchable, accessible to every admin and compliance tool.

Hardcoding secrets in agent configs

Plaintext on disk. One git add . away from being public.

Giving agents full vault access

Over-privileged. Your agent can read every secret, not just the one it needs.

Three steps. Zero knowledge.

1

Encrypted on your device

AES-256-GCM encryption runs in your browser, your CLI, or your agent. The encryption key never touches our servers.

2

We only store noise

Our server stores encrypted gibberish. The decryption key lives in the URL fragment — never sent to us per the HTTP spec. Even if we get breached, your secrets are safe.

3

Read once, gone forever

The moment the recipient retrieves the secret, it's destroyed on the server. No copies, no backups, no traces.

URL structure
passwd.page/s/{id}#{key}
              ^^^^^^    ^^^^^
          server sees  server NEVER sees

Every direction. Every principal.

Human → Human

Share a database password with your teammate. They open the link, see it once, it's gone. No more "check Slack from 3 months ago."

Human → Agent

Create a link via browser or CLI. Tell your agent "use the credentials at this URL." The agent retrieves and decrypts at runtime — the secret never enters the prompt.

Agent → Human

Your agent runs share_file on a generated credential — encrypts it without ever reading it into context. You get a self-destructing link.

Agent → Agent

One service hands a short-lived token to another. Encrypted, ephemeral, zero trust. The way machine-to-machine should work.

Three ways to share a secret.

Browser

The simplest way. No install.

1. Go to passwd.page/share

2. Paste a secret or drop a file

3. Pick TTL, optional passphrase

4. Copy link or scan the QR

CLI

For your terminal and scripts.

# Install
brew install davidfeldi/tap/passwd-page

# Share a typed secret, 5 min TTL
passwd-page create "sk_live_..." --type api_key --ttl 5m
# https://passwd.page/s/a3f8#kG7...

# Retrieve it
passwd-page get "https://passwd.page/s/a3f8#kG7..."
# sk_live_...

# From a file (1 MB max)
passwd-page create --file .env --type env_file

AI Agent

MCP tool server. The agent never sees the secret.

// claude code settings.json
{
  "mcpServers": {
    "passwd": {
      "command": "passwd-mcp"
    }
  }
}

share_secret — hand the agent a plaintext value, get back a link.
share_file — "Encrypt my .env" → agent reads the path, never the contents.
retrieve_secret — agent fetches + decrypts at runtime. Returns the type so it knows the schema.

Built different.

Truly zero knowledge

Not "trust us" zero knowledge. Mathematically impossible for us to read your secrets. Open source — verify it yourself.

Single binary. Self-hostable.

One Go binary, embeds the entire frontend. docker run passwd-page and you own your infrastructure. No external dependencies.

Built for automation

CLI pipes, MCP tools, REST API. Every interface your workflow needs. echo $SECRET | passwd create

Nothing to remember

No accounts. No master passwords. No subscription. Share a secret, get a link, done. The way it should be.

One-time secret links, explained.

How do I share a password securely?

Paste it, get a link, send the link. passwd.page encrypts the password in your browser with AES-256-GCM and hands you a one-time secret link. The decryption key lives only in the URL fragment and is never sent to the server. The recipient opens it once and the secret self-destructs.

What is a one-time secret link?

A URL that reveals a shared secret a single time, then burns after reading. No copies in Slack, no plaintext in email, nothing left to leak from chat history. Perfect for ephemeral secret sharing — temporary passwords, API keys, database URLs.

Is it really zero-knowledge?

Yes. Encryption runs on your device and the key never reaches our servers. We only store opaque ciphertext, so we are mathematically unable to read your secrets — even under subpoena or breach. It's open source, so you can verify it yourself.

Can AI agents share secrets with it?

Yes. An MCP tool server (share_secret, share_file, retrieve_secret), a CLI, and a REST API let agents hand off short-lived credentials without ever pasting them into a prompt.

How is this different from emailing a password?

Email and chat keep secrets in plaintext forever, searchable and accessible to admins and compliance tools. passwd.page secrets are end-to-end encrypted, expire on a timer (5 minutes to 30 days), and can self-destruct on first read.

Stop pasting secrets
into chat windows.

Your agents deserve better. Your teammates deserve better.