Security
How a family health record is protected — written control by control, with an honest label on each one saying whether it runs today or is still ahead of us.
Last updated
How we think about it
A health record is not an ordinary database row. If it leaks, you cannot change it the way you change a password, and the harm is not financial — it is personal. So the protections here are built into the structure of the system rather than added as a layer on top, and we are explicit about what is finished.
Every control on this page carries one of three labels:
Why we publish the gaps
A trust page that lists only strengths is not a trust page. TruHealth is a product under construction, and pretending otherwise would be the first thing you should not trust about us. The What we have not done yet section is as much a part of this page as the rest.
Where your records live
Region-pinned accounts
Live todayEvery account belongs to a region — Canada or the United States — recorded when it is created, not guessed from your address or your browser. The region travels with the account through the whole system, and the background jobs that process a Canadian account's records run on Canadian workers.
This is what lets us say a Canadian family's records are meant to stay in Canada, rather than hoping they do.
Canadian and US hosting regions
Planned before launchThe software honours the region rule today. Placing those regions in specific Canadian and US data centres — choosing the provider, signing the agreements that let a health product use them, and deploying there — is work we do at launch, and it is not finished.
Until this page says otherwise, treat data residency as designed for and enforced in the code, not yet proven in production.
Keeping one account away from another
Row-level security in the database
Live todayThe usual way to keep customers apart is for application code to remember to add “where account = mine” to every query. One forgotten clause and someone sees a stranger's records.
We push that rule down into PostgreSQL instead. Row-level security is turned on and forced — it applies even to the account the application connects as — and the account context is set per transaction. A query that forgets the rule returns nothing rather than returning someone else's data.
Who is allowed to open a record
Access comes from a live relationship or consent
Live todayBeing the person who created a record does not make you the person allowed to read it. Access flows only from a current relationship — you are the subject, their guardian, or their caregiver — or from a consent that has not been withdrawn.
This closes a real hole we studied in an older system, where “who typed this in” was treated as “who may read this”, so a parent who had lost custody kept access to a child's record indefinitely.
Checked in one step, every time
Live todayOn every route that touches health information, the permission check and the read happen in a single database query. There is no gap between asking “may they?” and doing it in which the answer could change.
Every route is private by default: an unauthenticated request is refused, and an automated test walks the whole API to confirm no route was accidentally left open.
Access can be revoked, and revocation sticks
Live todayEnd a guardianship, revoke a caregiver's consent, or suspend someone's membership, and the access stops immediately. A suspended member cannot authorise anything — there is a single gate for that, with a test guarding it.
Relationships are ended, never deleted: the row survives with the date and the reason, because “who could see this in March, and why did that stop” is a question an audit has to be able to answer. The database itself refuses to delete these rows.
Corrections, not overwrites
Health records are append-only
Live todayA reading is never edited in place. Correcting one writes a new entry that supersedes the old one, and the chain is kept. You see the corrected value; the history stays intact underneath.
This matters clinically as well as legally. “This blood pressure was recorded as 180 and corrected to 140 an hour later” is a different fact from “this blood pressure was 140”, and a record that quietly overwrites cannot tell the difference.
Every access is logged
An audit log the application cannot rewrite
Live todayAccess to and changes of health information are written to an audit log, along with sign-ins, sign-outs, invitations and account changes. The database withholds UPDATE and DELETE on that log from the application, so the application can add to the audit trail and cannot tidy it up afterwards.
Errors carry a stable code and a request identifier, so a problem can be traced end to end. Passwords and session tokens are never written to logs.
Exports logged as disclosures
Being builtExporting a grid of records is a disclosure of health information, so every completed export writes an audit row saying who exported what and how many rows, and download links are time-limited. This is landing alongside the saved-views and export work and is not finished yet.
Encryption
In transit and at rest
Planned before launchEncrypted connections everywhere, and encryption at rest on the managed database, cache and file storage, are part of how we will deploy. They depend on the production hosting that is still being set up, so we are not going to describe them as done.
Backups with a tested restore, secrets held in a secrets manager rather than configuration files, and a credential rotation policy belong to the same piece of work.
Sign-in and sessions
Real authentication, identities in our own database
Live todaySign-in is real: passwords of at least 12 characters, sessions that can be revoked, and identities stored in our own database rather than handed to a third-party identity provider — which is also what keeps them inside your region.
Two-factor authentication
Live todayTime-based one-time-password enrolment and single-use recovery codes are available. Two-factor sign-in is required for owners, administrators, clinicians and assistants, and remains optional for members. Consent changes and exports are registered as step-up actions in the central authentication policy.
What we have not done yet
As of the date at the top of this page, the following are not in place. We are listing them because you deserve to know before you decide to trust us with a health record.
- Production hosting in Canadian and US regions, with the agreements a health product needs, and confirmed encryption at rest — being set up.
- Backups with a tested restore in each region — part of the same deployment work.
- An independent penetration test — planned before our first institutional pilot. None has been carried out.
- Field-level masking of the most sensitive values, and a break-glass procedure for emergency access — designed, not built.
- Written policies for breach notification, retention and access requests — being drafted.
- Safety alerting — recording and escalating dangerous readings is planned work, not a live feature. Nobody at TruHealth is watching your readings. See the emergencies section of the Terms.
What we do not claim
No certifications, no audits, no badges
TruHealth holds no security certification and has had no independent security audit. We have not completed SOC 2 or ISO 27001, and we have not been assessed by anyone.
There is also no such thing as being “HIPAA certified”. HIPAA is a law you comply with, not a badge anyone can award. When you see a product claiming that certificate, it does not exist.
What we can say is what this page says: which controls are written into the system today, and which are not. We will update this page as things change rather than let it drift.
Our aim is to meet HIPAA in the United States and PIPEDA in Canada, along with the provincial health information laws that apply where our customers are — Ontario's PHIPA, Alberta's HIA, and Quebec's Law 25. Aiming at a law is not the same as having been assessed against it, and we will not blur the two.
Reporting a security problem
If you find a vulnerability, please tell us before you tell anyone else. Email <SECURITY CONTACT EMAIL> with enough detail to reproduce it. We will acknowledge you within <RESPONSE TIME>, keep you updated while we fix it, and credit you if you would like us to.
Please do not access, change or keep anyone else's data while testing, and do not run anything that could degrade the service for other people. We will not pursue researchers who follow that.
For privacy questions rather than security ones, see the Privacy Policy.