Document extraction · audited by code
Verifiable Extraction — pick a report, watch code catch the error
Messy financial PDF → clean structured data, parsed in your browser → and the math is re-checked by code, not guessed by a model.
The hard part of AI document work isn't pulling text out — it's being sure it's right. So the model only reads and classifies; tested code does every calculation.
- 4public reports
- 3tie-out checks
- 100%in your browser
- 0uploads, ever
1 · Pick a report
Each is a public record published by the Ohio Auditor of State — not affiliated with any client. Different townships, different counties, and different column structures (3, 4, even 5 fund columns) — the same code reads and verifies them all.
2 · The source page — rendered live in your browser
The report you pick above is rendered right here with pdf.js — each figure read with its position on the page, so the table below is provably grounded in the real document.
Every report is rendered and verified entirely in your browser — nothing is uploaded. No server, no network call. That privacy is the point.
Loading the bundled Allen Township sample…
3 · The extraction (every figure is editable)
Every line item the model pulled from the statement, with the page it came from. The model's job ends here — it reads and classifies, it never does the arithmetic. Click any number and change it — the checks below recompute instantly.
| Line item | General | Special Revenue | Combined Total | Source Page |
|---|
4 · The verification (live, in your browser)
These three tie-out checks are a JavaScript port of the repo's
validate.py. They run on the data above — right now, on this page, with no
server call:
- FOOT — receipt and disbursement line items sum to their reported totals, in each column.
- ARTICULATE — net change = receipts − disbursements; ending balance = beginning + net change.
- CROSSFOOT — the Combined Total column equals the sum of the fund-type columns, every row.
25 checks run · 0 exceptions.
5 · Watch it catch the error
Edit any cell yourself, or click below to inject one realistic mistake — a single transposed digit in a disbursement line item of the currently selected report, computed from its own figures (not a canned number). The same checks re-run instantly. Reset to restore the clean statement.
When the figure is wrong, the live checks above flip to red and name the exact failing check and offending cell — the wrong number cannot pass.
One transposed digit, caught automatically — before it ever reaches a human.
6 · Model alone vs. verified pipeline
Model alone
≈ 249,000
An LLM guesses the disbursements total. Plausible. Unchecked. Off by hundreds — and nothing flags it.
Verified pipeline
249,222
Code sums the line items from the source page and ties it out. FOOT, CROSSFOOT, ARTICULATE all pass — or it tells you exactly what failed.
The model proposes. Tested code decides.
Bring this discipline to your documents
I build this for messy documents in any domain — finance, legal, healthcare, insurance, government.
ethanhaas.dev · github.com/ethan-haas · ethanzhaas@gmail.com · obbbatracker.com