Data handling
This is the product's thesis rather than its documentation. Every claim here is enforced by code, and each one is written so that you can check it yourself.
Local by default
The extraction path performs zero external network calls with document content, and works with the network disconnected after the model download.
No retention
Documents are processed in memory and never written to disk. There is no document store to breach because there is no document store.
Minimise what leaves
Where an external call is unavoidable, the payload is the smallest viable projection of the data: numbers and a hash, or redacted text on an explicitly confirmed route.
State the caveats
Where a provider's terms work against the user, the product says so instead of hiding it. The hosted route controls which endpoints are eligible; it does not control what every intermediary does.
Privacy
There is no document store to breach
Most claims about privacy are promises. This one is checkable: uploaded documents are processed in memory and dropped. There is no upload directory, no retention policy and nothing to delete later, because nothing was kept.
| Data | Destination | When |
|---|---|---|
| Invoice image or PDF | Nowhere | Held in memory for the duration of extraction, never written to disk |
| Extracted text | Nowhere | Goes to Ollama on your machine and stays there |
| OCR output | Nowhere | tesseract.js runs in your tab |
| Corrections | Your disk | Local by default; Atlas only if you explicitly opt in |
| TabPFN feature row | Prior Labs (EU) | Numbers plus a hashed client id, and only when you press Predict |
| Sentry spans | Sentry | Model, token counts, latency, stage names. No text, no names, no amounts |
How to verify it in about a minute
- Pull the model:
ollama pull gemma3:4b - Open the upload screen and watch the runtime banner turn local
- Open DevTools, Network, and drop one invoice
- Every request goes to 127.0.0.1. There is no other host
- Disconnect the network and do it again — still works
The hosted path, and its limits
Where an external call is unavoidable, the payload is the smallest viable projection of the data. Redaction before send is best-effort obfuscation, not anonymisation, and this page does not claim otherwise.
- Client names and account-number-like digit runs stripped on device
data_collection: "deny"restricts which endpoints are eligible- No compliant endpoint means the request fails, not that it degrades
- This controls which endpoints qualify, not what every intermediary does. It is meaningfully better than an unconstrained call and categorically different from local.
Verification checklist
These were all confirmed before the challenge submission. They are listed so that you can run them yourself rather than take the word of the person who wrote the app.
- Every build artifact greps clean for OPENROUTER_API_KEY, TABPFN_API_KEY and MONGODB_URI
- DevTools network panel during local extraction shows only 127.0.0.1
- Disconnecting the network after the model download does not break local extraction
- Sentry transactions contain no document text, client names or amounts
- No uploaded file is written to disk or into an upload directory
- Atlas sync is off on a fresh load
- Atlas collections contain no image or raw-text fields
Deliberately absent
- No accounts, no login, no per-user identity
- No payment collection
- No analytics on document content
- No error reporting that attaches file contents
- No cloud persistence by default
- No document storage of any kind
MongoDB Atlas is used only if you explicitly opt in, and only to store extracted fields. It is not connected by default, and the app behaves identically when it is unreachable. Atlas free clusters also pause after 30 days of inactivity, which is irrelevant for a challenge demo but is worth knowing before relying on one.