Passwords done properly
Hashed with argon2id at 64 MiB of memory. At least 12 characters, checked against a list of common and breached passwords, and no forced rotation. Five failed attempts lock the account for a while.
Security & trust
An HR system holds the most sensitive records a business keeps. Here is exactly how PeoplePilotOS protects them: what is isolated, what is encrypted, who can see what, and what gets written down when they do.
01 · Tenant isolation
Many HR platforms keep every customer in one shared set of tables and rely on a filter in each query to keep them apart. PeoplePilotOS does not. When your organization is set up, it gets its own PostgreSQL database and its own login role, and that role can reach your database and nothing else. There is no table anywhere holding two customers' rows, so no query, whether a bug or an attack, can return your data next to someone else's.
02 · Identity and access
Hashed with argon2id at 64 MiB of memory. At least 12 characters, checked against a list of common and breached passwords, and no forced rotation. Five failed attempts lock the account for a while.
Authenticator-app codes (TOTP) with one-time backup codes. Anyone holding a sensitive permission must enrol, and an administrator can require it for everyone.
Sign in through your own identity provider over OpenID Connect. The provider's client secret is stored encrypted.
Fine-grained permissions grouped into roles, each limited to a scope: self, team, department, location, legal entity, business unit, cost centre or the whole organization. An explicit deny always wins.
Access tokens are EdDSA-signed and last 15 minutes. Refresh tokens are single-use and stored only as a hash; replaying an old one revokes the whole session. Sign-out and revocation take effect on the next request.
Permissions are not baked into the token. They are worked out on every request, so taking a role away from someone takes effect immediately, not when their token expires.
Every permission is graded. Viewing compensation, opening a restricted case and destructive actions such as changing roles all need an MFA verification from the last 15 minutes. If yours is older, PeoplePilotOS asks for a code before going ahead, even mid-session.
03 · Data protection
Disk encryption protects a stolen disk. It does not protect a stolen backup or a database dump, which read as plain text. So the fields that matter most are encrypted by the application itself with AES-256-GCM before they are stored. GCM is authenticated: a tampered value fails to decrypt instead of quietly changing.
A report column marked as personal data is replaced with [redacted] for anyone without the
permission to read it. The on-screen run and the export use the same code, so an export can't reveal more than
the screen. A masked export is logged as such.
The AI assistant strips email addresses, PAN, IFSC codes, Aadhaar-shaped and other long numbers, and phone numbers out of what is sent before any external model call, and puts them back in the answer on our side.
04 · Audit and accountability
Every change in your organization writes an audit row (who, what, before and after, the reason, the IP address and a request id) inside the same database transaction as the change. If that row cannot be written, the whole change rolls back. An unattributed change does not exist.
Bank account changed · Arjun M.
Role granted · Payroll Manager → Rohan K.
Compensation viewed · Ananya R.
Report exported · Headcount by location
These tables are append-only at the database level: a trigger rejects any update or delete, so even someone holding the application's own credential cannot rewrite history.
Support access to your organization is managed under Settings → Support access. You can grant access, approve or deny our requests and revoke a grant at any time, see how each grant was used, and see every emergency session ever opened against your organization. Each of those actions is written to your own audit trail.
05 · Backups and recovery
Because each organization is its own database, it is backed up and restored on its own. A restore touches your database and nobody else's. We don't just take backups; we restore them and check the result.
06 · Application security
At startup the API checks that every route declares the permission it needs. A route that forgets will stop the server from starting at all, so it can never reach production.
Request bodies, queries and parameters are checked against schemas, and unknown fields are rejected rather than silently dropped. Database access goes through parameterised queries.
Standard security headers on every response. The refresh cookie is httpOnly and SameSite=Strict. Error responses carry a request id, never stack traces, and logs redact passwords, tokens and identifiers.
Account lockout stops guessing against one account. Rate limits stop an attacker spreading attempts across thousands.
| Endpoint | Limit |
|---|---|
| Sign-in | 10 per minute per IP address |
| Password reset | 3 per hour |
| MFA verification | 10 per 5 minutes |
| Single sign-on | 30 per minute |
| Failed passwords | 5, then the account locks |
The API's integration tests run against real PostgreSQL, provisioning disposable organizations with their own databases, because a mock would happily agree that two databases can't see each other while proving nothing.
Accessibility is held to the same standard: the product's colour tokens are checked against WCAG 2.1 AA contrast ratios in both light and dark themes.
07 · Privacy
Following the consent model of India's DPDP Act 2023, optional processing such as background verification, biometric attendance or health data for benefits is asked for one purpose at a time, with versioned wording, and can be withdrawn.
Self-service shows people their own record. Changes to controlled fields like a bank account go through a change request that is approved and audited.
Personal identifiers are replaced with placeholders before any external model call and restored only in the reply you read.
Personal data about your people stays in your organization's database. The shared sign-in directory keeps only an email address and which organization it belongs to.
Found something? We want to hear about it. Email us with the steps to reproduce, what you believe the impact is, and how we can reach you. Please don't access, change or keep data that isn't yours while testing, and give us a chance to fix the issue before telling anyone else.
Ready when you are
See PeoplePilotOS with your own policies, payroll rules and org structure, in a 30-minute walkthrough.