Two-factor authentication
Standard time-based one-time passwords, enrolled by scanning a QR code into any authenticator app. The challenge expires after five minutes and locks after five failed attempts.
Everything below already exists in the software. None of it is an add-on, a paid tier, or something that arrives in a later version.
Three independent gates, each one optional, each one enforced on the server rather than in the browser.
Standard time-based one-time passwords, enrolled by scanning a QR code into any authenticator app. The challenge expires after five minutes and locks after five failed attempts.
A user can mark their own machine as trusted and skip the second factor on it, without weakening the requirement anywhere else.
Switched on per user, a new browser must be approved by an administrator before that person can sign in from it at all. Approvals can be revoked later.
Sign-ins raise an email to a nominated mailbox, so an unexpected session is noticed the same day rather than at the next audit.
Thirty minutes idle and the session ends, enforced at both ends, with a keep-alive heartbeat so active work is never interrupted mid-form.
Not three tiers of user. Five independent rights on each module, for each role, plus the tabs inside it.
Show in menu, view, add, edit and delete are set separately. A role can be allowed to create purchase orders and never to delete one, and the menu can be hidden without the data being reachable underneath.
Within a module a role can otherwise see, specific tabs are hideable — so an HR role reaches employees and attendance but not advances and loans.
The nine seeded roles are a starting point. Create your own with its own name, tag and colour; only the super administrator role is locked from editing.
The interface hides what a role cannot use, and every request is independently authorised on the server before it runs. The browser is never the thing enforcing access.
One nominated role — chosen by you, not hardcoded — may edit an already-approved quotation, invoice or purchase order. Everyone else raises an edit request instead.
Changes are recorded, deletions are reversible, and secrets are not sitting in the database in the clear.
Actions are written with the user, the module, the record, the old values and the new values, and the originating IP address — surfaced as a searchable activity report.
Login and logout with IP, browser, duration, and whether the session ended manually, timed out, or was forced.
Deleting hides a record and stamps who did it. An administrator can restore it intact or purge it permanently; ordinary users never see deleted rows at all.
Mailbox passwords, Google credentials and authenticator seeds are stored encrypted, not as readable text.
Attachments are size-capped and checked by inspecting the file itself, not by trusting its extension, and sensitive upload directories are blocked from direct web access.
One company, one database, your server. There is no shared tenancy and no vendor cloud in the path.
Each deployment is one company on its own database. Your records are not co-located with anyone else’s, because the system has no concept of another tenant.
It installs on hosting you control. Commercial terms, customer data and employee records stay inside your own boundary.
Email goes out over your own SMTP, and the in-app client reads your own IMAP. No third-party sending service sits between you and your correspondents.
A strict content security policy, framing and MIME-sniffing protections, and a restrictive permissions policy ship with the application rather than being left to the host.
Database access uses prepared statements with emulation off, across the whole application — not selectively where someone remembered.
A role is not a tier. For every module you decide separately whether it shows in the menu and whether that role may view, add, edit or delete — and inside a module you can hide individual tabs. So an HR role can open employees and attendance and never see advances and loans.
These nine roles ship configured out of the box. Everything past them is yours to define.
Reasonable. It runs on your own server, so they can review the deployment, the access model and the audit trail before a single record goes in.