AI Business Invoice Extractor
Browser-based tool that turns stacks of invoice PDFs into structured Excel data using client-side OCR and LLM extraction — no server infrastructure needed.
Screens/Pages

Web landing page
Overview
Manually re-typing data from stacks of invoices is slow, error-prone work. The AI Invoice Extractor solves this: drop in up to 100 PDF invoices, and the app reads them right in your browser, extracts just the fields you care about using an LLM, and hands you back a ready-to-use Excel spreadsheet. Everything runs without a backend — raw invoices never leave the user's machine unless they explicitly opt into cloud storage.
Role
Designed and built the full application end-to-end: the browser-based OCR pipeline, the AWS Lambda AI extraction service behind API Gateway, and the Excel assembly and export flow.
What I built
- A drag-and-drop uploader that takes up to 100 PDFs at a time and automatically skips duplicates.
- Custom column selection so users decide exactly which fields to pull out of their invoices — invoice number, date, vendor, amount, anything.
- One-click extraction that turns a folder of PDFs into a single structured spreadsheet.
- Live progress tracking so users always know where their batch is, with clear error messages when something fails.
Technical approach
The key decision was local-first processing: OCR runs entirely in the browser, and only lightweight extracted text travels to AWS Lambda for LLM structuring — eliminating upload bottlenecks, cutting costs, and keeping sensitive documents on the user's device.
- Built with React 19, TypeScript, Vite, and Tailwind CSS for the interface.
- Tesseract.js and pdfjs-dist run OCR in a web worker, so PDF rendering never freezes the UI and files never leave the browser.
- AWS Lambda behind API Gateway calls an LLM to turn raw OCR text into structured rows, batched 20 invoices at a time to stay within Lambda's payload and timeout limits.
- A Rust-compiled WASM module decodes large base64 payloads roughly 10× faster than JavaScript during Excel export.
- Excel workbooks are assembled client-side with SheetJS from lightweight JSON responses instead of heavy file downloads.
- An optional S3 presigned-upload path exists for server-side processing and degrades gracefully with a warning banner when unconfigured.
- React Compiler provides automatic memoization to keep the interface responsive during long-running batches.
Challenges
Rethinking the architecture mid-build
The original design uploaded every PDF to S3 for server-side OCR and extraction, but with 40+ files the Lambda pipeline became painfully slow and expensive — so the whole flow was re-architected to run OCR locally first.
Working within serverless limits
Lambda's 6 MB payload cap and 30-second timeout made monolithic requests impossible; batching text into groups of 20 kept requests small and failures isolated to a single batch.
Keeping the UI responsive
OCR of large PDF batches is CPU-heavy, so rendering moved to a web worker and base64 decoding to WASM to avoid blocking the main thread.
Outcomes
- Deployed live on Vercel as a fully static app with zero backend infrastructure for core processing.
- Raw invoices never leave the browser unless the optional S3 path is explicitly enabled — privacy by default.
- Batch processing handles 100-file workloads reliably, with per-batch failure isolation and progress reporting.