This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle
What I Built
InvoiceMate AI is a small expense organizer for freelancers and tiny businesses. If you have a pile of invoices and receipts and your accountant keeps asking for a clean spreadsheet, this is for you.
You upload a PDF or a text file, or just paste the invoice text. A local AI model reads it and pulls out the vendor, date, amount, category and a short description. You check the result in an editable form, fix anything that is wrong, and save it. Everything then shows up on a dashboard with a running total, a table of saved expenses, a spend by category chart, and a CSV download you can hand to your accountant.
The people who would pay for something like this are the ones who do their own bookkeeping and dread it at tax time. Invoices also contain client names and amounts, and a lot of people are not comfortable sending those to a hosted AI service. This keeps everything on your own computer.
Demo
The app runs locally on your machine, so there is no hosted link to click. The README in the repo has screenshots of each step: pasting an invoice, the extracted details ready for review, and the expense dashboard.
The flow is simple. Paste an invoice, click extract, review the fields, save, and open the dashboard to see your totals and download the CSV.
Code
InvoiceMate AI
InvoiceMate AI helps freelancers and small businesses turn invoice or receipt text into editable expense records. Review the extracted vendor, date, amount category, and description, then view totals and export the records as CSV.
Why local AI?
Invoice text can contain client names, addresses, and transaction details.
InvoiceMate sends the text only to Ollama at localhost, not to a hosted AI
API. Once the model has been downloaded, inference can run without an internet
connection. You can swap the model in invoice_utils.py without changing the
expense review and export flow.
This is an early MVP, not a secure accounting system. Expenses are held only in Streamlit's current browser session; they are not saved to disk. Do not deploy this app to a server if your goal is to keep documents on your own computer. The current PDF reader supports selectable text, not scanned-image OCR. Always verify AI…
How I Built It
The interface is built with Streamlit. The AI part runs through Ollama using the open weight Qwen 2.5 3B model, so there is no API key and no hosted AI service involved. The app sends the invoice text to the model running on localhost and asks for structured fields back.
The rest is plain Python. pypdf reads text from PDF files, pandas handles the expense table, totals and CSV export, and requests talks to the local Ollama endpoint.
I kept a review step on purpose. A 3 billion parameter model is good enough to fill in most fields correctly, but it will sometimes get a date or a category wrong, so nothing is saved until a person has looked at it. The repo also has a small set of tests.
My first real run failed with a 404 from Ollama. I had pulled a different model than the one the app was asking for. Pulling the right one fixed it, and it reminded me to make the model requirement clear in the README.
Current limits, to be upfront about them: PDFs must contain selectable text because scanned images are not supported yet, and saved expenses only live in the browser session, so they are cleared when the session ends.
Why Does Open Innovation Matter?
For an app that handles financial documents, privacy is the whole point. Because the model is open weight and runs locally, the invoice text never leaves the computer. A closed API would have meant sending client names and amounts to someone else's server.
It also changes the cost. There is no charge per invoice, so a freelancer can process as many documents as they like without a bill growing in the background. And since Ollama serves models through the same local endpoint, trying a different model mostly comes down to changing the model name.
Top comments (0)