Landry Bodjona
LB-03

Invoice Reader

Turns supplier invoices and receipts, from photos or PDFs, into checked accounting entries.

Open the evaluation board
Phase 2Flask · async · Size M

What a visitor does Uploads an invoice, fixes a field, exports entries

Problem

Bookkeeping still means retyping invoices. OCR alone misreads totals and can’t tell line items from footers.

Try it live

Pick a sample, such as a clean PDF, a crumpled photo, a handwritten receipt or a euro invoice with VAT, or upload your own. Each field lights up on the document with its confidence. Fix a field, then export CSV or JSON.

Proves

Vision models with typed output, and validation that keeps arithmetic away from the model.

  • Vision
  • Structured output

Signal chain

  1. OCR words + boxes
  2. screen for injection
  3. extract to schema
  4. validate and reconcile
  5. repair once
  6. map to boxes
  7. check duplicates
  8. journal entry
  9. export

Stack

Flask + an asyncio pipeline · OpenAI-compatible client to the gateway · Pydantic v2 structured output · RapidOCR (ONNX) in a locked-down process · Cloudflare R2 · Vue viewer

Engineering highlights

  • The pipeline is async because every step waits on I/O: the model, storage and the OCR worker. Two documents in flight overlap, and a test proves it under the production server.
  • Deterministic checks own the math. Line items must sum to the subtotal and VAT must match its rate, or the document goes back for one targeted repair. A document that still fails is returned with its failing check, never fixed silently.
  • Duplicate invoices are caught by vendor, number and content hash before export.
Table 1. Operating limits
Operating limitValue
Documents per visitor per day10
File limit4 MB, 5 pages
Files kept1 h
Model calls per document (est.)2–5

Status The evaluation board for this part is open. It starts on curated samples, and your own text runs live within your daily allowance. Open the evaluation board