Security
Security at DayOneFlow
DayOneFlow holds job offers, salaries and new hires' personal documents. This page sets out, plainly, how the product protects them today, and what isn't in place yet.
Isolation on every request
Each organization's data is checked on the server, request by request.
Argon2id passwords
Verified email, rate-limited sign-in, sessions re-checked every time.
256-bit candidate links
Stored only as hashes, expiring, revocable, one working link per hire.
Append-only audit trail
The database refuses changes to audit events and sent offers.
Where DayOneFlow is today
On this page
Tenant isolation
Each customer organization is a separate tenant. The application enforces the separation on the server, for every request.
- Every record that belongs to an organization carries that organization's identifier, and database constraints keep related records within the same organization.
- On every request the server checks who you are and that you have an active membership in the organization you're asking about, then looks records up only within that organization. The organization in the address bar is never treated as proof of access.
- A record from another organization looks exactly like one that doesn't exist: the answer is “not found”, and nothing is changed.
- An automated cross-tenant test suite tries to reach every kind of organization-owned record from a second organization, including by calling server actions directly.
Roles and relationships
Four fixed roles, plus a relationship check: a role on its own never opens a person's record.
- Organization admin, HR, manager and member, each mapped to a fixed set of permissions. There is no permission editor to misconfigure.
- Managers see only the new hires they manage, and without personal contact details, preboarding details, documents or offers. Members see only the tasks assigned to them.
- Salaries are visible only to people who manage offers, and to the candidate on their own personal page.
- Every action checks its own permission on the server. A hidden button is never the protection.
- Disabling or removing a member takes effect on their next request. Their open tasks become visible, unassigned work for HR instead of disappearing.
Sign-in and sessions
For HR, managers and colleagues who sign in to the app.
- Sign in with an email address and password, or with Google where Google sign-in is enabled. No Google access tokens are stored.
- An email address must be verified before it can be used to sign in with a password.
- Passwords need at least 12 characters and are hashed with Argon2id. The password itself is never stored, so no one at DayOneFlow can see it.
- Sign-in, registration and password reset are rate-limited, and they never reveal whether an email address is registered.
- Sessions expire after at most 12 hours without activity and are re-checked against the database on every request. Resetting a password or disabling an account ends all of that person's sessions at once.
- Session cookies are encrypted, HttpOnly, SameSite and, over HTTPS, Secure.
Candidate personal links
Candidates and new hires don't need an account. They use a personal link that is hard to guess and easy to withdraw.
- Each link contains 256 bits of randomness and is stored only as a hash, so even a copy of our database would not reveal a working link.
- A link is bound to one organization and one new hire. It cannot be used to see anyone else's record.
- Links expire. Each new hire has one working link: issuing a new one replaces the old one. HR can revoke a link at any time, and it closes when the record closes.
- Guessing is blocked: after 20 unknown links from one address within 15 minutes, further attempts from that address are refused.
- Links are masked in our web server logs, never sent to other sites as a referrer, and personal pages are kept out of search engines.
Encryption in transit and browser protections
- Served over HTTPS only (TLS 1.2 or 1.3), with HSTS so browsers refuse plain HTTP.
- A strict Content-Security-Policy with a fresh nonce for every page: only our own scripts run, and no third-party scripts are loaded.
- Pages cannot be embedded in other sites, which prevents clickjacking.
- Protection against cross-site request forgery on sign-in and on every action that changes data.
- Emails are handed to our email provider over an encrypted connection (STARTTLS is required).
Files and documents
- Uploads are limited to PDF, PNG and JPEG, decided from the file's content rather than its name. PDFs containing scripts or embedded files are refused, and each file can be at most 10 MB.
- Every upload is scanned for viruses with ClamAV, whose signatures update automatically, before it is stored. Infected files are refused, and if the scanner cannot give an answer the upload is refused rather than stored unchecked.
- Files are stored privately, outside anything the web server publishes, under generated names. A storage location can never be used as a link.
- Every download passes an authorization check and is sent as an attachment, with headers that stop the browser from running it.
- HR checks every document a new hire uploads — accepted, or a new copy asked for — and only HR and admins can open documents. Signature images for letters are checked and scanned the same way; verification checks record a status, never what a check found.
- Offer letters are generated from a frozen copy of the offer as it was sent, never from data that could change later.
Audit trail and evidence
So you can always answer who did what, and when.
- Important actions are recorded in the same database transaction as the change itself: offers sent and decided, membership and role changes, personal links issued and revoked, uploads and removals, probation decisions and exports.
- The database refuses any change to, or deletion of, an audit event.
- Sent offer versions, candidates' decisions, status history and probation decisions cannot be edited afterwards. The database enforces this too.
- A candidate's acceptance is bound to the exact offer version and to the version of the acceptance wording they saw.
- HR and admins can review the trail for the whole organization and for each new hire.
Personal data and logging
- We collect the minimum: no bank, payroll, tax or government-ID fields, and date of birth only if your organization turns it on.
- Logs never contain passwords, tokens, personal links or salaries. As a safety net, fields named like secrets or email addresses are redacted automatically.
- Emails and in-app notifications contain no salaries.
- Reports and CSV exports leave out free text, contact details and salaries, and every export is recorded in the audit trail.
- No analytics, advertising or tracking tools, and only the cookies needed to sign in.
- Error messages never show internal details, and a record from another organization is never confirmed to exist.
Backups and recovery
The backup and restore tooling is built and a restore has been tested. Running it on the production server, with an off-server copy, is part of the pilot go-live.
- A daily backup of the database and stored files, with checksums.
- A copy encrypted with GPG before it leaves the server. The key that decrypts it is kept off the server.
- Copies on the server are kept for about six months: 7 daily, 4 weekly and 6 monthly.
- Restoring has been tested in a drill: an encrypted off-server copy was restored, and every row count and file checksum was verified. A drill on the production server is part of the go-live.
- A database backup is taken before every update that changes the database, and every update is health-checked and rolled back automatically if it fails.
Hosting and operations
DayOneFlow runs on a single server at [hosting provider] in [hosting location]: the web application, a background worker and a PostgreSQL database.
- The database accepts only local connections. The firewall allows only SSH and web traffic, SSH logins use keys only, the application runs as an unprivileged user and security updates are applied automatically.
- Only named operators can reach the server and database, each with a personal SSH key.
- No one at DayOneFlow can sign in as one of your users: there is no impersonation feature. Our operations screen shows only account information (organizations, user accounts, counts), never your new hires' records, documents, offers or bank details; if we suspend your account or change your trial, your audit trail shows it.
- Checks every five minutes cover the application, database, background worker, backups and disk space, and alert the operators when something changes.
- Secrets live only in the server's protected configuration, never in the code.
Who else processes data for us is listed on the Subprocessors page.
Current limitations
What isn't in place yet. We would rather you hear it from us.
- No multi-factor authentication for password accounts yet. If you sign in with Google, your Google account's own protections, such as 2-Step Verification, apply.
- No single sign-on (SAML) and no automated user provisioning (SCIM).
- One server in one location, with no standby. If it fails, DayOneFlow is unavailable until it is restored, and each update shows a maintenance page for a few seconds.
- Backups are daily, so up to 24 hours of changes could be lost in a disaster. There is no point-in-time recovery yet.
- No encryption at rest by the application: the database, files and backups on the server are protected by access controls and file permissions. Disk encryption at the hosting provider: [to be confirmed].
- Signing out does not revoke a copied session cookie, which stays valid for up to 12 hours. Resetting the password or disabling the account ends every session at once.
- Personal links are bearer links: whoever holds one can use it until it expires, is replaced or is revoked.
- Operators' direct access to the server is not recorded in your organization's audit trail.
- No third-party certification such as SOC 2 or ISO 27001. See Compliance.
Responsible disclosure
If you believe you have found a security vulnerability in DayOneFlow, please tell us privately first.
Step 1: Email us the details
Write to security@dayoneflow.com with what you found, the steps to reproduce it, the pages or features affected and the impact you expect. Please leave out other people's personal data.Step 2: Test only what is yours
Use your own accounts and your own organization. Never access, change or delete other people's data; if you come across any, stop and tell us.Step 3: Keep it safe for everyone
No denial-of-service, spam or social-engineering tests, and nothing aimed at candidates, new hires or customers.Step 4: Give us time to fix it
Allow us a reasonable time to fix the issue before you disclose it publicly. We will work with you to understand it and resolve it.
Evaluating DayOneFlow?
We answer written security questionnaires, and the Data Processing Agreement sets out these measures as commitments, with the subprocessors and retention schedule.
- System StatusA live check of the web application and its database, run when you open the page.Open System Status
- ComplianceHow DayOneFlow supports your data-protection obligations, and the certifications we don't hold.Open Compliance
- SubprocessorsThe third parties that process personal data to run the service, what they receive and where.Open Subprocessors
- Privacy PolicyWhat personal data the software holds, why, for how long, and your rights.Open Privacy Policy
Run your next hire through DayOneFlow
Every feature free for 60 days, for your whole team. Sign up with Google in a minute, or look around the live demo first.
60 days free · every feature · no credit card