Security model
packshell is built so that trusting the server is never required. Here is exactly what is encrypted, what is stored, and what is not.
Cryptography
- Environment encryption: AES-256-GCM, an authenticated cipher, applied to the full
.envcontents with the project key. Output is taggedaes-256-gcm:. - Key wrapping: RSA-OAEP with 4096-bit keys and SHA-256, used to encrypt the project key for each member. Output is tagged
rsa-oaep:. The algorithm identifier recorded isRSA-OAEP-4096-SHA256. - Integrity: a SHA-256 checksum is computed per version so changes are detectable without revealing contents.
What the server stores
StoredWhy
Cipher blobs (
aes-256-gcm:)to sync encrypted versionsWrapped project keys (
rsa-oaep:)to grant per-member accessSHA-256 checksums + key countsintegrity & diff metadata
Member public keysso others can wrap keys for them
Audit log entriesaccountability for team actions
What the server never sees
Never stored or transmitted in plaintext
✕ Plaintext
.env contents✕ Individual secret values
✕ Project keys (only wrapped forms are stored)
✕ Your RSA private key (it never leaves your machine)
Your private key is yours to protectBecause decryption depends on your local private key, packshell cannot recover your secrets if you lose it. Re-authenticating issues a fresh keypair; teammates then re-share project keys to your new public key.
Diffs without disclosure
packshell diff compares the keys present locally versus remotely — added, removed, or changed names — without ever printing or transmitting values. It works from checksums and key metadata, so you can review what a push will change safely.
terminal
$ packshell diff --env productionThreat model in one line
A fully compromised packshell server yields cipher blobs and wrapped keys an attacker cannot open without a member's private key. Compromise reduces to the endpoints, which is where it belongs.