Control and records
Everything here works todayWho did what, when, and what it looked like before they did it.
Who can see what, and can I prove what happened?
Ten roles and forty-nine permissions, and the distinctions are the ones payroll actually needs. Seeing who works here, seeing what they are paid, seeing their Social Security number and seeing where their pay is sent are four separate permissions, because they are held by four different sets of people. A manager has the first and none of the others.
Permissions are not applied by hiding buttons. Where the roster cannot show pay, the pay is not fetched from the database at all — not fetched and hidden — so there is no payload to leak into a log, a cache, or a props blob sent to the browser.
Every company’s data is isolated by a wrapper that makes it impossible to write a query without an organisation predicate, and a record belonging to another company returns "not found" rather than "forbidden", because a denial would confirm it exists.
Sensitive values are encrypted with a per-record key and bound to the record they belong to, so bytes moved into a different row fail to open rather than decrypting into somebody else’s file. Social Security numbers are stored sealed; the last four digits are a separate column so a screen can show enough to recognise somebody without ever unsealing the number.
In the product: Your company → Settings, and Your account
What it looks like
Photographed from the running application, not drawn. Every name and figure in them is invented.


What works today
- Ten roles and forty-nine permissions, checked on the server every request
- Tenant isolation enforced structurally, not by convention
- Data you may not see not being fetched, rather than fetched and hidden
- Social Security numbers sealed, with only the last four ever shown
- Documents encrypted and bound to their own record
- An append-only audit trail the application cannot delete from
- A download of your own account data
What does not, and why
A readable audit log in the interface
The events are recorded; the screen to read them is not built.
Two-factor authentication
The schema exists. The enrolment flow does not.
Single sign-on
A SAML or OIDC integration.
Every line in this area
The same catalogue the pricing table is built from, filtered to this area. One list, one set of markers, everywhere.
- Works today
Roles and permissions
A bookkeeper who can see payroll but not approve it; a manager who only sees their own team.
- Works today
Password again before anything moves money
So a borrowed open laptop is not enough to pay somebody or change where pay goes.
- Works today
Documents, encrypted and kept
Handbooks, contracts and forms, filed against the company or one person. Encrypted at rest, served only as downloads, and archived rather than deleted.
- Works today
Append-only audit trail
Who changed what, when, and from where. It cannot be quietly edited afterwards.
- Works today
Double-entry ledger underneath
Balance enforced by the database rather than by the code writing to it, in whole cents throughout.
- Works today
Several companies under one account
Switch between them without signing out, with nothing shared across the boundary.
Read the markers, not the length of the list
Anything marked planned or being built is not working today and is not charged for. Moving money needs a licensed partner and filing needs a status granted by each tax authority — neither is a matter of writing more code, and neither is claimed here.
