Skip to main content
← Everything it does

Control and records

Everything here works today

Who 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.

The documents page, with files filed against the company and against one person.
Encrypted at rest and served only as downloads. Archived rather than deleted, because retention outlasts the reason somebody wanted a file gone.
The account page showing the picture, theme control, sign-in methods and a data download.
Your account, as opposed to a company’s settings. Disconnecting a sign-in method is refused when it is your only way in.

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.

  • 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.

    Works today

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.