Halo

Privacy, in plain words

Halo runs in your browser. Faces, photos and face fingerprints stay on your phone. There is no account, no analytics and no server that holds your people. This page says exactly what is kept and what can leave, and a test in the code fails if the app ever drifts from it.

What is kept, where, and for how long

The people you add
Name, your note, the line it whispers, cue notes, where you met, whether they’re a child or “never whisper”, when and how they agreed, 3 to 8 face fingerprints (128 numbers each, from the photos you take) and one small picture (160 by 160 pixels). In this browser’s IndexedDB on your phone, encrypted with AES-GCM using a key the browser creates and won’t let any code read out. Kept until you delete that person or everything; nothing is deleted on a timer. After a year, Halo reminds you to ask them again.
Today’s list, practice, the privacy ledger, wrong-match reports
In the same encrypted store, until you clear them or delete everything.
Settings
Voice, volume, theme, quiet hours and similar, in the browser’s local storage. No names, notes or faces. If you set a passcode, only a salted hash of it is kept, never the code.
The app itself
Code, fonts, face models and WebAssembly, cached by a service worker so Halo works offline. No personal data is in that cache.
In memory only
Camera frames and the fingerprints of faces in view are compared with your list and dropped straight away; they’re never written down. “Who was that?” keeps the last five whispers until you close Halo.
Photos
Not kept. A photo is turned into a fingerprint and thrown away; only the small picture for your list remains.

What leaves your phone

By default, nothing about your people. The page’s Content Security Policy allows connections only to its own address (connect-src 'self'), and the only requests are for the app’s own files.

Enhanced mode is off unless you turn it on, and asks first. Then, and only while you’re online, Halo sends these requests to its own server at the same address, and lists each one under “What has left this phone” in the app:

The server runs Cloudflare Workers AI models, keeps nothing, and logs no request content. Its code also has a /api/transcribe route for short voice notes, which this version of the app doesn’t call.

Dictation is optional. If you tap the microphone, your browser’s own speech recognition may send the audio to the browser maker (Google, in Chrome) to turn it into text. Typing stays on the phone.

Links you choose to send, a consent question, an answer, or a helper’s card, carry text inside the link after the #, which browsers never send to a server. Whatever app you send the link with can read that text. Links never contain photos or face fingerprints.

Backups are a file locked with a passphrase you choose. Where you keep it is up to you.

The website host sees ordinary request logs, as for any website: your IP address, the time, and which file was asked for. Never your people.

What is never sent

Whose consent it is

The consent belongs to the person you add. Halo asks them to read the exact line it will whisper and agree on your phone, or answer by link on theirs. It records when and how they agreed, but it can’t check that it was really them. They can change their mind at any time: remove them in one tap, and their fingerprints, note and picture are gone from your phone. If you add a child, ask a parent or carer first; Halo will only ever suggest “Could be” for a child.

Deleting

Locking

You can lock Halo with a passcode or your phone’s own screen lock (fingerprint or face, through the browser). The lock stops someone who picks up your unlocked phone from opening Halo. It doesn’t add a second layer of encryption: your data is already encrypted with the browser’s key, and a person with full access to your unlocked phone and its developer tools could still reach the browser’s storage.

This page describes the app as it is in this repository. If the code changes what leaves the phone, a test (tests/unit/privacy-drift.test.ts) fails until this page is changed too.