Overview
.vibeapp packages can be password-protected. Encryption prevents anyone without the password from inspecting the manifest, assets, or seed data.
Encryption is implemented as an outer wrapper — the inner package structure is preserved intact. After decryption, the result is a normal .vibeapp archive.
Encrypted package structure
An encrypted.vibeapp is a ZIP containing exactly two entries:
| Entry | Contents |
|---|---|
_vibe_encryption.json | KDF and cipher metadata |
_vibe_encrypted_payload | AES-256-GCM ciphertext (16-byte GCM tag appended) |
Encryption metadata
_vibe_encryption.json:
CLI usage
Host app behaviour
- On open, the host detects
_vibe_encryption.jsonand shows a password prompt - The package is decrypted in memory — plaintext bytes are never written to disk
- On every auto-save and explicit save, the package is re-encrypted with the same password and a fresh random nonce
- The password is held in memory for the document session and cleared on close
Security properties
- Wrong password or corrupted ciphertext → decryption fails with a clear error; the app is never opened
- Each encryption call produces unique ciphertext (fresh salt + nonce) — repeated saves are not linkable
- Encryption is independent of signing — a package can be encrypted and signed
