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.

Where each kind of data goes, and when
DataDestinationWhen
Invoice image or PDFNowhereHeld in memory for the duration of extraction, never written to disk
Extracted textNowhereGoes to Ollama on your machine and stays there
OCR outputNowheretesseract.js runs in your tab
CorrectionsYour diskLocal by default; Atlas only if you explicitly opt in
TabPFN feature rowPrior Labs (EU)Numbers plus a hashed client id, and only when you press Predict
Sentry spansSentryModel, token counts, latency, stage names. No text, no names, no amounts

How to verify it in about a minute

  1. Pull the model: ollama pull gemma3:4b
  2. Open the upload screen and watch the runtime banner turn local
  3. Open DevTools, Network, and drop one invoice
  4. Every request goes to 127.0.0.1. There is no other host
  5. 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.