Security
Kardu is built for compliance professionals. Security is structural, not an afterthought — every architecture decision enforces it.
EU data residency
100% of compliance data stays in the European Union. Application servers run on Vercel Frankfurt (fra1). Database and file storage run on Supabase EU (Frankfurt). No user data is ever processed outside the EU.
Encryption
All data is encrypted in transit using TLS 1.3. Data at rest is encrypted using AES-256 by Supabase. Evidence files are stored in private Supabase Storage buckets, accessible only via time-limited signed URLs (5-minute TTL).
Data isolation
Every database table that contains tenant data enforces Row Level Security (RLS) at the database level. The tenant ID is always extracted from the authenticated JWT claim — never from the request body. Cross-tenant data access is structurally impossible.
Access control
Three-role RBAC model: org:admin, org:contributor, org:viewer. Every API route validates the JWT role before executing any business logic. Multi-factor authentication (TOTP) is available for all users with hashed backup codes.
Audit logging
An immutable audit trail records all significant actions: logins, control changes, evidence uploads, billing events, and user management. Tenant data is INSERT-only — no tenant can modify or delete audit records. A platform-level retention job automatically archives records older than 24 months and permanently purges them after 5 years (GDPR Art. 5(1)(e)).
Rate limiting
Login attempts are rate-limited to 5 per IP per 15 minutes. Registration is limited to 3 per IP per hour. Limits are enforced via Upstash Redis (EU region) at the edge, before any application code runs.
Infrastructure summary
| Component | Provider | Region |
|---|---|---|
| Application hosting | Vercel | EU Frankfurt (fra1) |
| Database | Supabase PostgreSQL | EU Frankfurt |
| File storage | Supabase Storage | EU Frankfurt |
| Authentication | Supabase Auth | EU Frankfurt |
| Rate limiting | Upstash Redis | EU |
| Transactional email | Brevo | EU (GDPR DPA) |
| Payments | Stripe | Global (payment data only) |
Vulnerability disclosure
If you discover a security vulnerability in Kardu, please report it responsibly to security@kardu.eu. We will acknowledge receipt within 48 hours and keep you updated as we address the issue. Please do not disclose vulnerabilities publicly until we have had a reasonable opportunity to investigate and remediate.
GDPR & data protection
Kardu processes personal data under the GDPR as both a controller (account data) and processor (compliance content). A full Data Processing Agreement is available. For data protection enquiries: privacy@kardu.eu.