Security Practices

Toothprint · Version 1.2 · Updated September 12, 2026 · Español

This page describes how the Services are protected. It is referenced by the DPA as the technical and organisational measures we commit to.

A note on how to read it. Toothprint is built by one person today. A security page written for a fifty-person company — on-call rotations, background checks, quarterly tabletop exercises — would be easy to write and false. What follows is what runs. Where a measure is not in place, it says so, and that is more useful to you than a list you cannot verify.

1. Who is responsible for what

We are responsible for the platform: the application code, the backend configuration, the security rules, the subprocessors, the build and release path.

You are responsible for your devices, your network, your credentials, who you let into your practice, and the lawful basis for what you upload. See the Acceptable Use Policy and the DPA.

2. What the system is made of

3. Getting in

4. Isolation between practices

Every patient, appointment and session carries the identifier of the practice that owns it. Rules compare that identifier against the practice of the account asking. There is no pooling of data between practices anywhere in the application layer.

This was verified end to end on 11 September 2026 with real accounts: a member of one practice reading their own patient succeeded; the same read from an account in a different practice was refused with a 403.

5. Encryption

6. File links, and why they are credentials

Files in Cloud Storage are reachable by a download link that carries a token. That token is a credential: anyone holding the link can fetch the file, and the storage rules do not apply to it. This is how Firebase is designed, and it is worth you knowing it, because it changes what "a link to a scan" means: forwarding one is handing over the file, not a reference to it.

What we do about it:

7. Backups and history

This section used to say that point-in-time recovery was enabled and that backups expire within 12 months. Neither statement was verified, and a security page is exactly the wrong place to write something you have not checked. What is actually true:

8. Logs

What the platform logs by default, and what it does not, because the difference matters:

We do not routinely read Customer Data. Where an investigation requires it, the access is deliberate, and since 12 September it is logged.

9. Building and shipping

10. Reporting a problem

Write to hola@toothprint.ai with "security" in the subject. We answer within one business day. If you want to encrypt, say so in the first message and we will send a key. We will not threaten anyone who reports a vulnerability in good faith.

11. Incidents

We notify you of a personal data breach within 72 hours of becoming aware, under Section 8 of the DPA, and we tell you what we know at the time rather than waiting for a complete picture. There is one person on this rota today and that person is reachable by email.

12. What is not in place yet

We would rather list these than let their absence be inferred:

Not in place Status
Enforced multi-factor authentication for professional accounts Planned
Point-in-time recovery and a restorable backup Not configured
Independent penetration test Not done
SOC 2 / ISO 27001 Not started; neither is realistic before the entity exists
Customer-managed encryption keys Not available
De-identification of scans before they leave the practice Designed, not implemented. Today scans are uploaded as captured
A Business Associate Agreement covering the full chain Not held, which is why HIPAA Covered Entities are not accepted
24/7 on-call No

Updated September 12, 2026 · Version 1.2

Version 1.1, amended 12 September 2026. Version 1.0 was published on 11 September and contained statements that a review against the running system showed to be wrong. They are corrected here rather than quietly edited, because a published document that changes without saying so is worth less than one that admits it changed: a page that said no third party ran AI inference on patient material, while a patient-photo feature was sending faces to a generative model; a security page that claimed point-in-time recovery and 12-month backups that were never configured; a deletion promise that gave one timeline for three destinations that do not run at the same speed; and a three-year destruction promise with no machinery behind it.

Version 1.2, amended September 12, 2026. The analytics export to BigQuery stopped carrying the raw sessions collection — which holds patient identifiers and download links inside it, and a download link is a credential — and now carries a derived collection with nothing identifiable in it. The history already exported is kept separately, pseudonymised. This is written down because version 1.1 described the previous export, and describing it wrongly after fixing it would be version 1.0's mistake in reverse.