What BafGo is built on, how video data is stored and deleted, and what happens with authentication. Written for IT sign-off — no marketing fluff.
/api/* to Express (port 3001); serves static files directly.bcrypt (cost factor 10) before storage. Plain-text passwords are never written to the database.
HttpOnly cookie — not accessible to JavaScript. 30-day expiry. JWT_SECRET must be set as an env var in production; the server refuses to start if it is missing or set to the dev default.
nanoid strings (URL-safe random). Only the SHA-256 hash is stored in the database — the raw token is never persisted.
crypto.timingSafeEqual to prevent timing-based enumeration attacks.
expires_at timestamp. Deletion of the video file and response record is intended to occur at or after that date.
page_events table) store a SHA-256 hash of the visitor's IP address. No raw IP addresses are persisted.
Strict-Transport-Security (HSTS, 1-year, includeSubDomains) is set in production.
X-Frame-Options: DENY — page cannot be embedded in an iframe.
X-Content-Type-Options: nosniff — prevents MIME-type sniffing.
Content-Security-Policy is set on all responses. frame-ancestors 'none' is enforced.
express-rate-limit. Specific thresholds are available on request to IT teams.
CORS_ORIGIN env var in production. The server refuses to start without it.
page_events table in our own database.
npm install --omit=dev).
JWT_SECRET, DB_PASSWORD, CORS_ORIGIN) are required in production — the server process exits immediately on startup if any are missing.
We'll answer specific questions directly — no sales call required.