When I started building StatementDecoder, I thought the difficult part would be reading bank statements.
It wasn't.
Reading them turned out to be relatively easy.
The difficult part was knowing when the output was wrong.
Like most people building with LLMs, my first version was straightforward. Feed the statement to the model and ask for structured JSON. For a while it felt almost magical. It handled tables I'd never written parsers for. It coped with different layouts. It even did a decent job on scanned PDFs.






