01 / Context
Staff across the organisation worked with long documents every day: reading them, translating them, pulling out tables, rewriting sections. Most of it was manual and slow. The goal was one internal workspace where these jobs took seconds.
02 / What I built
Fourteen document and language tools in four families, each owned end to end, from the React interface to the Python API.
- Document understanding: OCR conversion, table extraction, image extraction, document comparison and document translation.
- Chat with documents: file chat and text reasoning.
- Language tools: translation, generation, content polish, transcription and narration.
- Visual generation: icon generation and word clouds.
03 / The platform
Every feature follows the same path: upload, parse and OCR, an LLM step, validation, then the result in the interface. Uploads return straight away and Azure Service Bus workers do the heavy work, so the APIs stayed under 200 ms. Building that path once meant each new feature was mostly its prompt and its validation rules.
04 / Chatting with a document
Long documents don’t fit in a model’s context window.
- Documents are split into chunks, and only the chunks relevant to each question are sent to the model.
- Answers point back to the page they came from, so people can check them.
- When the answer isn’t in the document, the assistant says so instead of guessing.
05 / Extracting tables
OCR alone breaks on real-world tables: merged headers, tables spanning pages, faint scans.
- Azure’s table extraction first, then an LLM repair step for merged headers and rows split across pages.
- Every result is validated before it is shown: row and column counts, and unexpected empty cells.
06 / Hard parts
The work that took the most care:
- Accepting large, image-heavy files without timeouts or memory spikes.
- Keeping the interface responsive while long OCR and model jobs ran in the background.
- Checking LLM output before trusting it, instead of assuming it was right.
- Handling documents that mix several languages.
07 / Outcome
Fourteen features shipped on one shared platform, with background workers that cut failed jobs by 60%.
- The frontend was migrated from JavaScript to TypeScript, with shared typed contracts between the interface and the API.
- The interface was redesigned from Figma into production components.
- Details are generalised to respect confidentiality; diagrams are redrawn and no real documents are shown.