Security

At-rest encryption

Sensitive secrets in the database are encrypted with AES-256-GCM (via Plug.Crypto.MessageEncryptor) using a key derived from the TOKEN_ENCRYPTION_KEY environment variable:

Each encryption call uses a fresh random IV. The HMAC tag is verified on decryption — tampered ciphertexts return :error instead of a valid plaintext.

Webhook authenticity

A custom RawBodyReader plug (lib/cursor_automation_web/plugs/raw_body_reader.ex) captures the unparsed bytes for the two webhook paths so signature checks see the exact bytes Stripe/GitHub signed.

Retention

GDPR-ish basics

We are happy to answer data-export and right-to-be-forgotten requests at privacy@cursor-automation.com. All data is single-region and never sold.

← All docs