↳ the whole pitch, in one diagram
Three boxes. One rule. Every key lives with you.
Read left-to-right. The cryptographic boundary is between box 2 and box 3 — once data crosses it, it is unreadable without a key the server has never seen.
box 1 — you
Your machine
- · passphrase
- · private key (wrapped)
- · repo keys (in memory)
- · plaintext source
✓ can read everything
encrypt
box 2 — the wire
Ciphertext in flight
9a4f c2b8 7e01 d3aa f681
02bc 4a91 7d2e 88c5 1f0a
b73c 9d6e 4271 a05b f8d4
02bc 4a91 7d2e 88c5 1f0a
b73c 9d6e 4271 a05b f8d4
TLS + aes-256-gcm
store
box 3 — siphr.dev
The server
- · public keys
- · encrypted object blobs
- · wrapped repo keys
- · refs (commit oids)
✗ can't read source · can't unwrap keys · can't decrypt commits
↳ side by side
Same git. Different threat model.
we'll be honest about the tradeoffs. lost-passphrase recovery is the price of “we can't read it either.”
01
Per-repo keys
Every repo gets its own random 256-bit AES key. The repo key is wrapped to each collaborator's public key. We never hold a master.
aes-256-gcm · fresh nonce per object
02
Keys live with you
Generated in your browser at signup. Passphrase-wrapped locally with PBKDF2-SHA256 at 600k iterations. We see your public key, never your private one.
p-256 ecdh · pbkdf2-sha256 · 600k
03
Verify, don't trust
Open source. Reproducible build. Public-key transparency log. Every claim on this page is checkable from the command line in <2 minutes.
↳ /transparency