The PDF is parsed in your browser
PDF text extraction, table reconstruction, date-format inference (ISO and European decimals) and total validation all happen on your machine, inside a dedicated worker. There is no parsing endpoint — because there is no server in the loop. The engine is compiled from Rust to WebAssembly; that is an implementation detail, not a product you have to think about.
On-device AI merchant cleaning
Banks write description fields like they are being paid per character. Cleaning is a button, not a background job: hit AI Simplify and Chrome’s built-in language model (Gemini Nano, Chrome 138+) rewrites the batch on your machine — no API key, no per-row cost, no statement text sent anywhere. Descriptions that are already concise are returned untouched rather than mangled. It also fills in categories for rows the rule engine couldn’t call confidently.
Two honest caveats. Chrome downloads the Gemini Nano model
once (~2–4 GB) the first time you use it — after that it is fully offline. And the
model needs a desktop with 22 GB of free disk plus a GPU above 4 GB VRAM (or 16 GB RAM
and 4 CPU cores). On machines that don’t qualify, AI Simplify stays
unavailable; parsing, reconciliation, storage and export are unaffected.
Your ledger lives on your device
Statements and transactions are stored locally, in a database file that never leaves the browser. No cloud database is ever created for your ledger. Clear it and it is gone everywhere at once — because it only ever existed in one place.
CSV export, your chart of accounts
Export a flat CSV — Date, Description, Amount, Balance, Account — with your own account names in the Account column. Bring your own chart of accounts and your own rules; the built-in library is a starting point, not a cage. Your data leaves as a file you can open in a text editor, not as a format you have to log back in to read.
Mercury, Wise, Payoneer and four more
Mercury, Wise, Payoneer, Shopify Balance, Lili, Lloyds, Majority. Each bank-statement layout is hand-tuned and validated before it is trusted. Depth over breadth is a deliberate constraint, not a limitation we are hiding.
Learns from your corrections
Every confirmation and correction is remembered locally. The more you use it, the sharper it gets on your spending — and that knowledge accumulates on your disk, not in a vendor’s training set.
Every row says who decided it
Categorisation is a six-tier cascade, and the tier that fired is printed right on the row — as a badge you can hover to see exactly which rule reached the verdict. Hit the top tier and it is remembered forever; miss every tier and the row stays visibly unclassified rather than being quietly filed somewhere plausible.
Only the first two tiers arrive without a review flag. Everything lower waits for your eyes, so you always know how much to trust a line item. It is the same principle as reconciliation: a tool that hides its uncertainty is not accurate, it is just quiet.
144 vendor mappings ship in the box. Corrections are blocked from training on fingerprints with no identifying power — POS PURCHASE will never teach it that “POS” means groceries.
1 Rule — you corrected it before
↓
2 Cache — AI already settled it
↓
3 Bayes — local word statistics
↓
4 AI — on-device model asked
↓
5 Fallback — 144-entry matrix
↓
6 Default — left for you to decide
Reconciled against the statement’s own numbers
A parser that quietly drops three rows is worse than no parser at all — you find out next April. So every parse is checked against the totals your bank printed on the statement: opening balance, closing balance, income and expense. Match, and you get a green Reconciled. Miss, and you get a red Not reconciled plus the exact difference — before you confirm a thing.
income
expected 4,820.00 / parsed 4,820.00
✓
expense
expected 2,150.35 / parsed 2,150.35
✓
net
opening + net = closing
✓
All arithmetic runs in integer cents. No floating-point drift, ever.
AI suggests. You decide.
On-device AI never writes straight into your books. Every AI-suggested category lands flagged for review and waits for your confirmation, row by row — and if the model isn’t confident enough, its answer is thrown away rather than guessed at. The uncertain rows queue up behind a pending-review count you can see at a glance.
Turn on-device AI off entirely in Settings. Parsing, reconciliation, storage and export do not depend on it.
Every export leaves a local receipt
Each CSV you export is logged locally — timestamp, row count and a verification hash of the file contents. If you ever need to show which numbers went into your books and when, the answer is already on your disk, not something you have to request from a vendor.
Export history lives in the same local database as the rest of your ledger. It is exactly as private.
Hit an unknown layout? Send it — redacted first.
The long tail of bank formats is real, so we built a one-click feedback channel. And we built it so you never have to trust us: before a statement PDF leaves your browser it is rebuilt from scratch on your device. Every text fragment is classified — account and card numbers, account holder names, customer IDs, SSN, tax ID, IBAN, phone, date of birth, address — and the sensitive ones are simply never written into the new file. A black block labelled REDACTED takes their place, at the same coordinates on the same page.
This matters more than it sounds. A black rectangle drawn over live text is not redaction; the text is still there and any extractor recovers it. Our output has no such text to recover — the sensitive characters are dropped before the file is written, not covered up afterwards. Everything else — dates, descriptions, amounts, balances — is rewritten at its original position and font size, so the file keeps a real text layer and we can replay our own parser on exactly what you sent us. You can preview the redacted file before you send it, and redaction is on by default.
Each surviving fragment is written back at its original page coordinates, font size and rotation, so the file you send extracts the same rows your original would. Across our test bank of statements the extracted line text matches the source character for character, except where the bank used icon-font glyphs that the rebuilt file cannot represent. That is the whole point: your feedback has to be replayable, not merely readable. Rebuilding works on PDFs: a screenshot or other image you attach instead is sent as it is, so read the preview before you confirm.
- Auto-redact enabled by default — you have to opt out, not opt in
- Rebuilt, not overlaid: sensitive text never enters the file, so there is nothing to recover under the mask
- Text layer preserved, so we reproduce your layout instead of guessing from a screenshot
- Preview the redacted PDF before anything is uploaded
- We adapt your bank’s layout and ship it back to you
1 Pick the statement PDF
↓
2 Redacted locally, in your browser
↓
3 You preview what will be sent
↓
4 We adapt the layout for you