An exact, editable copy of your bank statement.
Upload a PDF and get the same document back — editable. Change a transaction and every running balance, total and closing figure moves with it. Print it and the page lines up with the original.
- 0.0pt
- column drift vs. the source
- 1,480
- rows reconciled on import
- Integer
- pence, never floating point
Hassan Pasha
Personal Account
£739.00
Closing balance
| Date | Description | Amount | Balance |
|---|---|---|---|
| 22/08/2026 | Transfer to Pot | -0.01 | 739.00 |
| 22/08/2026 | APPLE.COM/BILL CORK IRL | -14.99 | 739.01 |
| 21/08/2026 | RONTEC ST HILDAS | -14.01 | 754.00 |
| 20/08/2026 | Salary — Aug | 1,950.00 | 768.01 |
The digits come from the file. The structure comes from the model.
Claude is never asked to read a number off a picture, or to total anything. It transcribes amounts exactly as printed and decides which column they are in; the arithmetic is done once, in one place, in integer pence.
- 01
Geometry
pdf.js reports the exact glyphs in the file and where each one sits, to the point.
- 02
Structure
Claude reads those coordinates into typed rows and sections — which column a figure is in, never what it says.
- 03
Reconcile
Every balance must equal the one below it plus that row's amount. A misread digit breaks the chain at exactly one row.
- 04
Repair
Only the pages that failed are read again, and the import refuses a parse it cannot reconcile.
A statement proves it was read correctly.
A bank statement is one long arithmetic chain: every balance is the balance below it plus that row's amount. So a misread digit cannot hide — it breaks the chain at exactly one row.
“1,480 of 1,480 rows reconcile” is far stronger evidence than anything a model can say about its own confidence. If the chain does not close, the import shows you precisely which rows did not add up rather than quietly accepting them.
rows are newest-first, so balance[i] = balance[i+1] + amount[i] totalOutgoings = Σ amount < 0 totalDeposits = Σ amount > 0 closing = opening + deposits + outgoings totalBalance = closing + Σ pots + cashback
One edit ripples through every later balance and three summary figures — and that ripple lives in a single pure function.
Import your first statement.
Drop in a PDF and it opens for editing once the balances check out.