Security

Mechanisms, not adjectives.

Every control on this page has a name you can look up and code you can read. No bank-grade, no military-grade — schemes, scopes, and blast radii.

Envelope encryption

One key per secret. One derivation per workspace.

Each secret is sealed with its own AES-GCM-256 data-encryption key. That DEK is wrapped by a workspace key derived via HKDF from a master key that never leaves Secrets Store. Compromising one ciphertext yields one ciphertext; compromising a workspace stops at the workspace boundary. Rotation is a re-wrap, not a re-encrypt of the world.

Blast radius

Assume a component pops. What does it yield?

componentan attacker getswhy it stops there
delivery worker (cdn)resolved configs and flags, zero secretsholds no key material — cannot decrypt by construction
edge KVthe same resolved values, secret ciphertextDEKs are never written to KV
api workermicroseconds of in-flight plaintextplaintext is never persisted and never logged
workspace DOciphertext plus revision historyDEKs stored wrapped; KEK derived on demand, never stored
Neon metadataArgon2id password hashes, API-key hashesno secret material lives in Postgres

This table is the threat model. If you can break a row, security@edgevault.io wants the details.

Authentication

Boring choices, on purpose.

Passwords

Argon2id, memory-hard. No homegrown crypto; @noble/hashes does the lifting.

Sessions

Opaque server-side tokens. Instantly revocable; nothing decodable in the client.

Service tokens

EdDSA JWTs verified against published JWKS. Workers verify without ever holding signing keys.

MFA

TOTP and passkeys (WebAuthn). Phishing-resistant where the client supports it.

Plane separation

The browser talks to one worker.

The console is the only origin a browser ever sees. It reaches the API, auth, and billing over service bindings inside Cloudflare's network — no CORS surface, no cross-site cookies, no tokens in localStorage. The delivery plane is a separate worker with environment-scoped keys and no code path to decryption.

Audit trail

Every change has an author and a reason.

Writes append to the workspace's ordered revision history, fan out to an audit queue, and land as NDJSON in R2 — an append-only warehouse you can export. The same trail powers "what changed and why" in the console.

Verify it

The code is the documentation.

The core is MIT-licensed. The envelope-encryption implementation is a readable package, not a black box, and CI fails any build that adds telemetry to core. Found a hole? security@edgevault.io — fixes get attributed.

Read the crypto package →

Read the code. Then decide.