Security

Built for the data HR systems actually hold

OpenHR was designed with data isolation, granular access, and verifiable audit history as defaults — not premium add-ons.

Multi-tenant isolation

Every employee, leave request, attendance record, and audit row is scoped to a company id. The application code refuses to query without that scope, and every server action resolves the caller's company before it touches the database.

Role-based access control

OpenHR ships with 30+ granular permissions covering view, edit, approve, and admin actions across every module. Permissions are checked at the server action layer (not just the UI) so a compromised browser session cannot bypass them.

Audit logging

Sensitive employee changes — role updates, salary edits, document uploads, leave approvals, biometric mappings — are written to an immutable audit table with actor, action, before, and after states. Audit rows are company-scoped like everything else.

Encryption at rest for sensitive credentials

Biometric device API keys are encrypted with AES-256-GCM before they touch the database. The encryption key is environment-supplied, not embedded in the codebase.

Authentication and 2FA

Authentication runs on NextAuth.js v5 with hardened credentials and Google OAuth providers. Two-factor authentication is available via TOTP or email verification.

Self-hostable

OpenHR is designed to be deployed on your own infrastructure. Your data never leaves your servers and you control the upgrade cadence.

This page is a current snapshot of platform-level controls. For specific certification questions (SOC 2, ISO 27001, GDPR DPA), please contact support — formal attestations may be in progress and we will not claim them here until they're complete.