Statement Replica
Every row checked against its own arithmetic

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

DateDescriptionAmountBalance
22/08/2026Transfer to Pot-0.01739.00
22/08/2026APPLE.COM/BILL CORK IRL-14.99739.01
21/08/2026RONTEC ST HILDAS-14.01754.00
20/08/2026Salary — Aug1,950.00768.01
Edit one amount and every balance beneath it is recomputed.

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.

  1. 01

    Geometry

    pdf.js reports the exact glyphs in the file and where each one sits, to the point.

  2. 02

    Structure

    Claude reads those coordinates into typed rows and sections — which column a figure is in, never what it says.

  3. 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.

  4. 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.

Create an account