Secrets, sealed before they leave your machine.

One encrypted source of truth for every env var, on every machine, in every environment your team ships to and develops on.

$ curl -fsSL https://itsasecret.dev/install.sh | sh
Plaintext stays local
Your keys. Your machine.

We store your secrets.
We can’t read them.

Every value is encrypted on your machine before it syncs, with a key derived from your master password. Our database only has ciphertext we cannot open. The keys exist in exactly one place: with you and the teammates you invite.

your machine
STRIPE_SECRET_KEYsk_live_4eC39HqLyjWD…
DATABASE_URLpostgres://app:s3cr3t@…
WEBHOOK_SIGNING_SECRETwhsec_8f3b1c9a2d4e…
the master key lives here - derived from your password, it never leaves
our database
STRIPE_SECRET_KEY
DATABASE_URL
WEBHOOK_SIGNING_SECRET
no keys on our side - we couldn’t read these if we tried

Everything env vars need. Nothing else.

Encrypted end to end

Encrypted on your machine, in the CLI or the browser. We never see plaintext.

Environment-aware

production, staging, preview-pr-42. Fork any environment and it diverges freely.

One command sync

shh secret set to sync. shh pull into .env or your shell.

Built for teams

Invite people by email, give them read or write per environment. Remove them and their wrapped key dies with them.

Your master password never leaves your machine.

01argon2id

Your master key is derived on-device from your password. The server stores a separate login hash that cannot recover it.

02envelope encryption

Each value is wrapped by an org key that only your master key unwraps. One secret, one envelope.

03ciphertext at rest

The server stores encrypted blobs and re-encrypts them with an ephemeral session key for transport. No plaintext, at rest or in flight.

04inviting teammates

An invite is an email link, never a shared password. When the new member logs in, the org key is wrapped under their own master key - each member holds their own sealed copy, and removing a member removes theirs.

At home in every shell.

$ shh load

Load a directory's secrets into your current shell.

$ shh pull --shell

bash, zsh, fish, nushell, PowerShell. Native syntax from $SHELL.

$ direnv allow

eval "$(shh pull --shell)" in .envrc. Secrets load when you cd in.

$ shh completion

Tab-complete every command and flag.

Stop pasting .env files into Slack.