Cyber2Tech

From a pile of invoicesto a searchable archive.

Product
Doksan9
Type
Our own product
Stack
C# / .NET · React Native · görsel-dil modeli
Briefly

Invoices, waybills, weighbridge slips and fuel receipts each carry completely different fields; all of them had to be typed into the books by hand. We built Doksan9 as a system that reads a photographed document, pulls out its fields, and puts every result up for approval.

Problem
Manual entry across document types
Solution
Vision-language model + human review
01Problem

Three document types, one manual entry desk.

An invoice, a waybill and a weighbridge slip are all part of the same business, but their fields have nothing in common — one wants an amount and VAT, another a plate number and a description of the goods, another a tare and net weight. All of them landed in the same books, typed in by hand.

02Constraints

Three constraints shaped the design.

K1

Formats vary widely

Invoices, waybills, weighbridge slips and fuel receipts; every one has its own fields, and every vendor's template differs. A template-bound reader wouldn't hold up.

K2

The model can be wrong

A vision-language model doesn't always read correctly, so nothing is ever saved automatically. Every result goes to a person first; a document only reaches the books once it has been checked and approved.

K3

The document carries personal data

Invoices carry a name, address, tax number and vehicle plate; that data leaves as an image, sent straight to a cloud vision-language model for field extraction.

03 — Approach

The machine reads; the person approves.

The user photographs a document with the phone or picks one from the gallery; the image is queued. A multimodal vision-language model reads the fields directly out of the image — there's no separate text-recognition step. Every result lands in a pending-approval state; the user reviews the fields, and only once they're approved does the document get saved and filed.

  1. 01Incoming documentcamera · gallery
  2. 02Queueasync processing
  3. 03Vision-language modelimage → fields
  4. 04Extracted fieldsschema per document type
  5. 05Human reviewfix · approve
  6. 06Archive + searchsaved after approval
invoice-pending-approval.jsonrepresentative · derived from the real DTO field names
{
  "total": "1845.60",
  "date": "14/03/2026",
  "vat": "307.60",
  "description": "ABC Market"
}
What we tried and left behind

The first version read documents with Azure OpenAI's GPT-4 Vision. We later moved to Google's Gemini 2.0 Flash; the document flow and the approval step stayed the same, only the model reading the image changed.

04Screens

Correcting has to be faster than typing.

Document on the left, the model's extracted fields on the right; the person corrects and approves.
A searchable list of approved documents.
05What we learned

What we're carrying into the next project.

  1. 01Keeping the model call in one place let us switch providers without touching the rest of the app.
  2. 02For a fragile field like a date, falling back silently to today's date and leaving the fix to the user beat crashing the app.
Next case
Kurjet