Statement Deskledger intake
Stays on this machine

How this works

The five steps

Inbox — put statements in and look at them. Nothing is read yet. Categories — the chart of accounts the classifier is allowed to choose from. Review — only the lines a person has to decide about, each beside the document it came from. Reconciliation — the arithmetic behind every verdict. Export — the workbook, its exceptions sheet, and the log of what happened.

What it does

Reads statements and activity exports from several institutions — text PDFs, scanned PDFs, phone photos and Excel exports — pulls out the transactions, checks the arithmetic against the document's own balances, classifies each line against your chart of accounts, and writes an Excel workbook with the exceptions separated out.

Where it runs

There is no server side. You can confirm that with the browser's network panel: after the page loads, nothing is requested.

What is synthetic

Every statement in the sample set is generated for this demo, including the account holder, the institutions and the merchants. No real account, person or transaction is represented. The 10 documents deliberately differ in layout, date format, column naming, currency and quality, and one carries an error on purpose.

What is limited, honestly

About this demo

Load the sample statements and this fills in.

The same pipeline, locally

The container runs the identical extraction, reconciliation, classification and export code against a folder, with native OCR (tesseract, pdftoppm) instead of WebAssembly:

docker compose run --rm desk --batch /inbox --out /out