Veil: your notes, redacted on your device before any cloud sees them.
Paste notes, a meeting transcript or an email thread. Veil finds and masks the sensitive parts on your own device, sends only the masked text to the cloud for the finished work (a summary, the decisions, the action items and a draft reply), and ends every run with a signed receipt. Then the raw text is wiped.
How it works
Intake. Paste text, or drop a .txt, .md or .eml file. Files are read as text in the page. Nothing is opened, run or fetched.
On your device, two layers run locally. The pattern layer runs in code: emails, phone numbers, links, account and card numbers (including numbers split by spaces), credentials after words like password or PIN, currency amounts, birth dates, and health details after a clinical cue. The model layer uses Firebase AI Logic in on-device-only mode to find the names, organisations, places, roles and health details that patterns cannot. It reads the raw text only on this device: if the browser has no on-device model, the call fails rather than sending anything. Both layers merge into one mask map, and the same entity always gets the same mask.
Policy gate. Names, organisations, places, emails, phones, links, amounts and birth dates may go to the cloud as masks. Account numbers, credentials and health details block the cloud pass by default, and Veil offers a summary written on the device instead. You can send the masked text anyway, per run, and the override is recorded on the receipt.
In the cloud. Only the masked text is sent, through Firebase AI Logic, protected by Firebase App Check. The page shows the exact request text under What the cloud received. The brief comes back with the masks carried through, and you can fill the originals back in on your device.
Receipt and wipe. An Ed25519 receipt is signed in the browser with a key that stays on the device: receipt id, SHA-256 of the masked text, mask counts by category, the sensitivity outcome, where each pass ran as reported by the SDK, and timestamps. The raw text, the mask map and the results are then cleared from the page. The receipt verifies in the page.
Canary mode
One click from the top of the page. Three seeded documents carry planted items with known positions. The on-device pass runs on them live and reports planted, caught and missed per category, the overall catch rate, and any extra masks. Every miss is listed. Canary mode never uses the cloud.
Measured result: on the hosted app in desktop Chrome, the pattern layer caught 20 of 44 planted items (45%), with no extra masks. Per document: 25%, 54% and 73%. The misses are the hard cases planted on purpose, including names that are also common words and a health detail with no clinical cue word.
Limits, stated plainly
Redaction is a filter, not a guarantee. The pattern layer finds shapes; the model layer finds what the model recognises. In our test browsers the on-device model was not available, so the model layer has not yet run on a real device and the measured result above is the pattern layer's alone. Where a browser provides an on-device model, Firebase AI Logic calls it in on-device-only mode, and raw text still never leaves the device. Veil reads pasted or dropped text only. It does not open attachments, execute files or fetch links.
Built with Firebase AI Logic, Firebase App Check and Firebase Hosting. All AI inference in the app goes through Firebase AI Logic.
Built With
- ed25519
- firebase
- firebase-ai-logic
- firebase-app-check
- firebase-hosting
- javascript
