devchallenge #hf26challenge
This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle
What I Built
Local Expense Sorter takes a bank statement CSV and categorizes each transaction (Food & Drinks, Supplies, Rent, Client Income, and so on) using a small open-weight model running on the user's own laptop. It then shows monthly spend charts and exports an Excel workbook or CSV for an accountant.
It's for freelancers and small shop owners who spend hours sorting bank and UPI statements by hand. Most tools that do this upload financial data to the cloud. This one doesn't. When a user corrects a category, that correction is saved and used as an example for future imports.
Demo
No hosted link. Here's the dashboard after importing a sample statement:
To try it, follow the setup steps in the README and upload the sample CSV included there.
Code
https://github.com/sanjana-jha-001/expense-sorter
How I Built It
- Model: Qwen2.5 3B (open weights), run locally through Ollama
- Storage: SQLite, a local file. Duplicate transactions are detected with a hash, so re-importing a statement is safe.
-
Interface: Streamlit and pandas, bound to
127.0.0.1so only the same machine can reach it
Categorization runs in order of precedence. A saved correction for a merchant is used first, with no model call. Repeat merchants in the same batch reuse the earlier result. Only new merchants go to the model, and the 20 most recent corrections are included in the prompt as examples.
Why Does Open Innovation Matter?
-
Privacy: Bank statements show client names and family spending. With a local model, nothing leaves the laptop. The README shows how to run the app with
--network noneto verify this. - Cost: Per-transaction API fees would eat the margin on a small paid tool. Local inference costs only electricity.
- Control: I can swap models, edit the prompt, or change categories without asking a vendor.
The trade-off is accuracy. A 3B model is less accurate than a large cloud model on messy bank descriptions, so the review screen is part of the design, and every correction improves later imports.

Top comments (0)