Sotto

Stop Slacking your .env files.

Sotto syncs secrets across your team with end-to-end encryption. Values are encrypted on your machine before they leave it and decrypted only on your teammates’ machines. The server stores ciphertext it cannot read.

curl -fsSL https://raw.githubusercontent.com/getsotto/sotto/main/install.sh | sh

Signed binaries for macOS and Linux. The installer verifies the checksum, and the Sigstore signature when cosign is installed. Prefer to read it first? Or grab a tarball from releases.

$ sotto init
  Save your Emergency Kit - these cannot be recovered:
    Secret Key:   SK1-9FKQ-XXXX-XXXX-XXXX
initialised `acme-api` (dev)

$ sotto set DATABASE_URL
Value:
set DATABASE_URL (acme-api/dev)

$ sotto run -- npm start
ready on http://localhost:3000

$ sotto push
pushed acme-api/dev - revision 1

$ sotto share DATABASE_URL
share link (acme-api/dev) - burns after 1 view(s):
https://getsotto.co.uk/s/9fK2xQ#k=Vq3TzEjm…

$ 

How it works

  1. Encrypt locally. Your vault key is derived on your machine from your master password and secret key. Neither is ever sent anywhere.
  2. Sync ciphertext. The server stores and versions encrypted blobs. It never receives a plaintext value or a usable key, so there is nothing on it worth stealing.
  3. Decrypt on your devices. One Rust crypto core runs everywhere: the CLI natively, the browser through WebAssembly, with golden vectors in CI proving both produce identical bytes.

Teams work the same way: sharing an environment grants its key to a member (an X25519 sealed box), so access is cryptographic, not a permission bit on the server. Removing a member rotates the keys.

Should you trust this?

Not blindly. Sotto is pre-1.0 and has not had a third-party cryptographic audit yet. You should know that before putting anything important in it. Here is what you can verify yourself, today:

  • A published threat model with explicit non-goals.
  • One shared crypto core: the CLI and the browser client run the same Rust code, held to byte-for-byte golden vectors in CI.
  • Sigstore-signed releases with a documented verification procedure.
  • Telemetry is four anonymous fields, opt-out, and pinned by a unit test so it cannot quietly grow.
  • Apache-2.0, and self-hostable from one docker-compose.

Honest guidance: use it for your team’s development and staging secrets today. Keep the production crown jewels where they are until the audit.

Pricing

Free

£0

  • Personal projects: unlimited, free forever
  • Organisations with up to 3 members and 1 shared project
  • One-time, burn-after-reading share links
  • Every new org starts a 14-day Team trial

Team

£15 / month per organisation

  • Unlimited members
  • Unlimited shared projects
  • Audit log
  • Flat: the price doesn’t scale with team size

Or run it yourself: the server is self-hostable and Apache-2.0. Self-hosting has no tiers.

Open source

Apache-2.0. One repo, one crypto core. Star it if Sotto saved you from pasting a .env into Slack; pick a good first issue if you want to help.

Star on GitHubGood first issuesContributing

Get started

sotto init                   # create your identity; SAVE the Emergency Kit
sotto set DATABASE_URL       # hidden prompt; encrypted before it touches disk
sotto import .env            # optional: pull in an existing file, still encrypted locally
sotto run -- npm start       # inject secrets into any command
sotto login && sotto push    # optional: sync ciphertext via getsotto.co.uk
sotto share DATABASE_URL     # one-time link for a single secret

Sotto works fully offline until you sotto login. Sync is a feature, not a requirement. The web vault at this address decrypts in your browser, with keys that never leave your devices.