SatchelDownload

How Satchel keeps a secret.

Every choice on this page is in the source code and in the design notes that come with it. Here is the short version, including what Satchel cannot protect you from.

One key, two ways in.

When you create a vault, Satchel makes a random 256-bit vault key. That key encrypts everything. Your master password and Touch ID never encrypt items themselves; each one only unlocks a copy of the vault key.

Your Mac
Master passwordStretched by Argon2id: 256 MiB of memory, 3 passes
Touch IDA Secure Enclave key that cannot leave this Mac
Vault key256 random bits
LoginsAPI keysDatabasesNotesSSH keys

So changing your password, or turning Touch ID on, rewraps one small key and re-encrypts nothing. Your password is never stored, not even in the Keychain.

Each item sealed on its own.

Every item is a separate file with a short header and two sealed boxes. Search reads the first box; the second is opened only when you look at or copy a secret.

HeaderItem id, version and save time, bound to both boxes
Overview boxTitle, username, website, tags
Secret boxPassword, key, one-time-code seed, notes

Both boxes use XChaCha20-Poly1305 from libsodium, with a fresh random 192-bit nonce each time an item is saved. The header is authenticated together with the boxes, so it can't be moved onto another item without the change being caught.

Nothing old comes back.

Next to the items sits a manifest: the list of every item and its version, with a counter that only goes up, signed with a key derived from your vault key. If a file disappears, is edited, or is swapped for an older one, the manifest no longer agrees.

When a sync host serves a vault older than the one your Mac last saw, from a restored backup or a host that misbehaves, Satchel stops and tells you. It never quietly brings back a password you changed.

What your sync host sees.

Gets

  • The vault header, holding the password-wrapped vault key
  • The sealed manifest
  • One sealed file per item, named by a random id, with its version and the time it last changed

Never gets

  • Your master password or the vault key
  • Titles, usernames or the sites you use
  • The token or keys Satchel uses to reach it; those live inside the vault

Two Macs can save at the same moment. Satchel writes only if the file is still the version it read, and before using a WebDAV or S3 server it checks that the server really refuses a stale write. A server that doesn't would let two Macs overwrite each other, so Satchel won't use it.

In the browser.

  • A page gets only logins saved for its own site, matched by registrable domain with the Public Suffix List.
  • Only the page you see is filled, never a frame embedded inside it.
  • Nothing is filled without your click or shortcut, and forms are never submitted.
  • When you copy a password from the toolbar panel, Satchel copies it. The secret never passes through the extension.
  • The Mac app checks the site again itself before it hands over a login. The extension's word is not enough.

Around your Mac.

  • Copied secrets are marked concealed, so clipboard managers skip them, and the clipboard is cleared after a delay.
  • Satchel's windows are left out of screenshots, recordings and screen sharing unless you allow them.
  • The vault locks after idle time, on sleep and when the screen locks. Locking wipes the keys from memory.

Updates you can check.

Every release is signed with an Ed25519 key. Your copy of Satchel carries the public half and installs an update only if the signature matches, downloaded only from the project's GitHub releases. An update never opens or changes your vault.

What Satchel can't protect.

A vault is honest about its edges. Here is who is kept out, and who isn't.

Kept outSomeone takes your Mac while it is off or Satchel is locked

They find sealed files and a key that needs your password or your finger on this Mac.

Kept outYour sync host leaks or is broken into

They get sealed files. No titles, no usernames, no list of the sites you use.

Kept outA sync host serves an old copy of your vault

Satchel notices the older manifest and stops syncing with an error.

Kept outA look-alike site asks for your Google password

Its domain does not match, so the extension offers nothing.

Not coveredMalware running as you while Satchel is unlocked

It can read what you can read. No password manager survives this. A short auto-lock keeps the window small.

Not coveredA short master password

Argon2id makes each guess slow and memory-hungry; only a long passphrase makes guessing hopeless.

Not coveredA forgotten master password

There is no reset and no back door. Write the passphrase down and keep it somewhere safe.

Found a problem?

Please report it privately through a GitHub security advisory, not a public issue. You'll get a reply as soon as possible, and credit in the release notes if you'd like it.