Ovillo Download
How it works · Privacy and security

How it works

Privacy and security

This page sets out Ovillo's privacy in detail: the encryption, what stays on your Mac, exactly what can leave when you use the assistant, how much of the personal detail the scrubber catches, and what the app cannot protect you from. It is for anyone deciding whether to trust it with a family's papers.

Encryption

Your passphrase never leaves the page. From it, the page derives a key and uses it to encrypt everything before it is saved.

The local server holds only ciphertext. It checks the shape of an envelope but cannot read it, and never receives a passphrase or a key. See Architecture for the layout on disk.

Important. There is no password recovery. Nobody, including the people who make Ovillo, can open a vault without its passphrase. If you lose it, the record is lost. Keep an encrypted backup somewhere safe, and keep the passphrase somewhere other than the same computer.

What never leaves your Mac

With no assistant connected, your documents, record, search index and every model run on the Mac, and nothing is sent anywhere. The one exception is the update check below, which carries no record data. Always, whatever you connect:

There is no Ovillo account and no analytics, and no crash reporter is built in. Reading and search work offline.

The update check

The Mac app checks github.com/BraedenBDev/ovillo-releases for a newer version when it starts, and every six hours while it is open. GitHub learns the app version and your computer's IP address. Nothing from your record is sent. It runs whether or not a vault is unlocked and whether or not an assistant is connected. A downloaded update installs only when it carries the same Developer ID signature as the running app, so a swapped file cannot install unsigned code. The record is not touched by an update.

The assistant path

If you connect an assistant (The assistant), the page sends it text. The path is fixed:

  1. Every request goes through one function, agentStep in the page. Nothing else may reach a provider.
  2. Find names. The local name model, and Apple's name tagger when the helper is ready, look for people written without a title and teach the scrubber.
  3. Scrub. scrubMessages replaces names, phone numbers, emails, street addresses, birth dates and labelled ID numbers with placeholders such as [PATIENT] or [PERSON-1]. The same person gets the same placeholder throughout a session. The table of who is which lives only in memory.
  4. Send. The page hands the scrubbed conversation to the local server, which forwards it to OpenAI (Sign in with ChatGPT) or to the HTTPS address of your own key. Provider tokens and keys arrive with each request and are not stored by the server.
  5. Restore. The reply and any tool inputs are turned back into the real details on your Mac.

The provider sees the scrubbed text in plain form, under your own account. If you use OpenRouter, it passes the text to the company that makes the model you picked. Each request is recorded in the app, so you can see exactly what was last sent.

Dates of results, lab values, doses, medicines and facility names are deliberately not replaced, because the assistant needs them. Held names and birth dates are sent coded, and every rendering of a known birth date (such as 2/3/2018, 2 March 2018 or 2 de marzo de 2018) is coded by value.

A line from a record next to the same line after personal details are replaced with placeholders.
A record line, and what is sent in its place.

Original files

Important. Scrubbing works on text. A file's bytes cannot be scrubbed, so an original file is sent only when you allow it, one document at a time.

The details:

If a file must never leave, do not connect an assistant, or turn it off while that person's record is open.

How well scrubbing works

Not completely. The scrubber is tested by hand against MEDDOCAN, a set of made-up Spanish clinical cases (Zenodo 4279323, CC-BY-4.0). The measurement used the first 250 test cases and 5,661 marked-up details, on 8 November 2026. A detail counts as covered when it no longer appears in the scrubbed text.

Kind of detailCoveredRecall
Patient name498 of 50299.2%
Clinician name501 of 501100.0%
Patient ID (DNI, NHC and similar)269 of 28395.1%
Email248 of 24999.6%
Phone number25 of 2696.2%
Street325 of 41378.7%
Dates247 of 61140.4%
Hospital15 of 13011.5%
Territory (places)40 of 9564.2%
Patient age0 of 5180.0%
All kinds together2,641 of 5,66146.7%

How to read it:

A name with no title can slip through when the name model could not run, and the privacy panel says so for that session. So think of scrubbing as lowering what the provider learns, not as a promise that no personal detail gets through.

Prompt injection

A document is written by other people, so it may contain text meant to steer the assistant ("approve everything"). Ovillo's defences are layered:

Risks that remain

Reporting a security issue

Write to possible@almostimpossible.agency. Say what you found and how to reproduce it. Please do not attach real patient documents or send your passphrase; a description or a made-up example is enough. A screenshot of the app helps.