Skip to content

Security

Every control, and where it is enforced.

Putting your patients' files into software the clinic does not own is a decision that needs detail, not reassurance. This page lists what protects your clinic's data, where each control is enforced inside the system, and then says what the system cannot protect on your behalf.

Access
By role, narrowed by the owner
Separation
At the database, not the screen
The register
Who changed what, and when
Attachments
In a private store, not behind a link

The controls

Six controls that decide who sees what

Not general promises: each control has one place it is enforced, written beside it. Show it to any developer who knows databases and they will know exactly what it means.

No screen before signing in

Every screen inside the system sits behind an authenticated account. There is no share link that opens a patient's file for whoever holds it, and no internal page that reads without signing in. The session is kept in a cookie no script in the browser can read, and every request is checked before it reaches any data.

Enforced atSupabase Auth + request middleware, httpOnly cookie

Permission by role, narrowed by the owner

Four roles: clinic owner, doctor, assistant, and the platform's own administrator. Each has a list of named permissions — who edits a visit, who sees stock, who reads the audit register — and the owner can take a permission away from a role but cannot grant one above that role's own ceiling. Revoking a staff member's access takes effect the moment it is done.

Enforced atROLE_PERMISSION_MATRIX

One clinic's data separated at the database

The separation is not a condition in the screen that can be forgotten; it is a policy on the table itself. A query that does not name the clinic does not return another clinic's rows — it returns nothing. And if you run more than one branch, moving between them is itself a named permission.

Enforced atPostgreSQL row-level security policies

A register that says who changed what

Adding a patient, editing a visit, issuing a prescription, a stock movement, an expense, a change to the clinic's staff or to the subscription: each writes a line carrying who did it, which record it touched, and the value before and after. The clinic owner reads that register on the audit screen inside the system.

Enforced ataudit_logs table · Audit screen

Patient attachments in a private store

Scans, lab results and proof-of-payment images are held in a store that is not public: none of them opens from a direct link or by guessing an address, and only someone on the staff of the clinic that owns the file can read it. The one public thing is the clinic's logo, because it is printed on the clinic's own documents.

Enforced atPrivate Supabase Storage buckets (public = false)

Following a support ticket without an account

The ticket page opens with a number and a code, and needs no account. The code is stored hashed, so nobody — including us — can retrieve it or send it on, and the session it opens ends after twenty-four hours. The page is also kept out of search results.

Enforced atHashed code · signed 24-hour session

What the AI may do

The AI prepares a draft; the person responsible accepts it

The booking assistant and the clinic assistant are optional, each added as a line on the subscription. Their limits are written into the system, not promised on a marketing page.

It proposes; it does not commit

The assistant prepares a suggested time or a tidied note and shows it as a draft. Nothing enters a patient's file or the appointment book until the person responsible has read it and accepted it themselves.

Its use is bounded by role and subscription

Using the assistant is a doctor's permission, not something everyone who opens the system has. Consumption counts against the subscription's limit and is recorded, so you can see how much was used and where it stops.

The clinical decision is not the software's

No diagnosis, no choice of drug or dose, no treatment decision. Those belong to the treating doctor, whose name is the one printed on the prescription and whose responsibility it remains.

What stays with the clinic

Three things the system cannot protect for you

Everything above protects the data from outside and from other roles. What is left sits inside the clinic, and we say it plainly because leaving it out would imply protection that does not exist.

Whoever you invite sees what their role sees

The invitation is the most important security decision in your hands: after it, the account sees everything its role allows. Review the clinic's staff list from time to time, and revoke access for anyone who has left on the day they leave, not a month later.

One account per person, and lock the front desk

A shared account at reception defeats the register and the permissions at once: everything done is attributed to one person, and everyone sees whatever the most privileged of them can see. Give each person their own account, and lock the screen when leaving it.

Do not copy a patient's file into a support message

To follow up a problem, the booking or request number and the name of the screen are enough. Do not put a full medical history or a lab image into a support message: it is not needed, and the file's place is inside the system.

Found a hole, or something that does not look right?

Tell us from the support page, and write exactly what you did, what you expected to happen, and what actually happened. Your ticket reaches the same team that writes the system, and the reply comes in that same conversation. Please do not test what you found against another clinic's data, and do not publish it before we have fixed it.