Skip to main content

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:

Encryption metadata

_vibe_encryption.json:
KDF parameters follow the OWASP interactive profile: m=65536 (64 MiB), t=3, p=4. A fresh random 32-byte salt and 12-byte nonce are generated on every encryption call.

CLI usage

Host app behaviour

  1. On open, the host detects _vibe_encryption.json and shows a password prompt
  2. The package is decrypted in memory — plaintext bytes are never written to disk
  3. On every auto-save and explicit save, the package is re-encrypted with the same password and a fresh random nonce
  4. 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

Combination with signing

Encrypted packages can be signed. The signature covers the encrypted payload, not the plaintext. The verification flow decrypts first, then checks file digests on the inner package.