documents · text + vision
Order Form Extraction
input — scanned form
output — extracted records, verbatim
real pipeline output. the form is the repo's synthetic sample, degraded to match the scans the system actually got — which forces the vision path, second-pass verification and all. run it yourself: app/extraction.py
What it does
A small member-based collective took orders on paper — hundreds of low-quality scans a week, retyped by hand. This system reads the scans automatically: hybrid text-and-vision extraction on Claude, 240+ OCR product-code variants standardized into a clean catalog, 5,800+ line items in a searchable database, and a dashboard for fulfillment and business insight. Customer data is anonymized non-reversibly before anything leaves the building.
How it works
scanned PDF ──▶ embedded text rich enough?
│ │
yes ▼ no ▼
claude: text render page hi-DPI
extraction claude vision extraction
│ │
│ second-pass vision check
│ on name + address
│ │
└───────┬────────┘
▼
standardize codes · dedupe line items
▼
chromadb ──▶ dashboard · search · analytics The fields most expensive to get wrong — customer name, shipping address — get a focused second look against the image before anything is written. Python · ChromaDB · Streamlit.
What broke + what I changed
The vision path's verification step would occasionally return JSON that didn't parse — fine in testing, fatal in a batch run. The fix wasn't a better prompt; it was switching to structured outputs so the model can't return anything but the schema.