EnrollPilot doesn't bolt security on as an afterthought. Encryption, access control, audit logging, and tenant isolation are in the architecture from day one — and we can prove every claim on this page.
How we protect your data
Every claim below is backed by specific implementation details. Click "View technical details" on any section to see the proof.
AES-256-GCM encrypts sensitive fields at the application layer. TLS 1.2+ protects every byte in transit. HSTS is enforced for two years.
sslmode=require. All S3 presigned URLs use HTTPS. Real-time channels use WSS.
TOTP-based two-factor authentication, bcrypt password hashing with 12 salt rounds, automatic account lockout, and sliding-window rate limiting.
Role-based access with 23 granular permission keys, 11 layered auth guards, and a 3-tier permission cascade. Every server action is protected.
requireAuth → requireStaff → requireStaffRole → requireAdmin. 247 server action files import and enforce these guards.document:download.mustChangePassword blocks all mutations until resolved.
Every query, every file, every real-time channel is scoped to your organization. 60+ database models enforce tenant boundaries. Your data never leaks.
orgId column. Every WHERE clause includes orgId from the authenticated session — 129+ occurrences across 60 source files.activeOrgId always comes from the DB-backed session and is validated against the user's membership list. The client cookie value is never trusted directly.{env}/{orgId}/{category}/{entityId}/{uuid}-{filename}. Nine distinct path namespaces for different document types.org:{orgId}:conversation:{id}). SSE notification delivery double-checks orgId match before sending. Cross-org enrollment creation verifies Membership records.
220+ audit event types across 12 categories. Every write automatically strips PII. Retention policies enforce data lifecycle from creation to deletion.
sanitizeAuditMeta() which strips 13+ field types: names, NPIs, emails, phones, DOBs, SSNs, addresses, filenames, URLs, and free text. Violations trigger SECURITY: console warnings.UNSAFE_logRequestBody()) throws on any call to prevent accidental request body logging.***-**-XXXX, DOB to **/**/YYYY. Unknown fields default to hidden (allowlist approach).
Vercel Pro with strict security headers and CSP. Neon PostgreSQL with SOC 2 Type II compliance. AWS S3 with versioning, lifecycle policies, and all public access blocked.
default-src 'self', frame-ancestors 'none', base-uri 'self', form-action 'self'. Script and connect sources are strictly whitelisted.dangerouslySetInnerHTML, each with a security justification. Custom HTML sanitizer (255 lines) with 50+ allowed tag whitelist, URI scheme blocking, CSS expression blocking, null byte stripping, and 38+ test cases.Password hashes, SSNs, internal object keys, and PII are stripped at the DTO layer before any data touches the frontend. Portal-facing DTOs enforce stricter field exclusion than staff-facing ones.
Compliance Posture
EnrollPilot's security controls are designed around the specific requirements of credentialing organizations handling sensitive provider and patient-adjacent data.
All data encrypted at rest (AES-256) and in transit (TLS 1.2+). Role-based access controls enforce minimum necessary access. PII sanitized from logs. Demographic change tracking with immutable snapshots.
Our database provider (Neon PostgreSQL) maintains SOC 2 Type II compliance. Compute and edge infrastructure runs on Vercel Pro. Document storage on AWS S3 with encryption, versioning, and lifecycle policies.
34 cron jobs enforce retention policies automatically. Expired sessions purged hourly. AI-generated content purged at 90 days. Orphaned files cleaned within 24 hours. No manual intervention needed.