# Invoice Sorter: a private expense tracker for freelancers that runs on a laptop

> Source: <https://dev.to/krish007code/invoice-sorter-a-private-expense-tracker-for-freelancers-that-runs-on-a-laptop-2eoj>
> Published: 2026-10-15 10:45:06+00:00

*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle](https://dev.to/challenges/hacktoberfest-week2-2026-10-12)*

**Invoice Sorter** is a small command-line tool for freelancers. You point it at a folder of PDF invoices and receipts, and it writes one clean `expenses.csv` with vendor, date, total, currency and category.

The people who would pay for it are freelancers, consultants and small studios who lose a weekend at tax time retyping receipts into a spreadsheet. Their invoices contain client names and amounts, so many of them don't want to upload those to a cloud service. Invoice Sorter does the whole job on their own laptop, so the data never leaves it.

Terminal recording (8 sample invoices in, `expenses.csv` out, about 45 seconds, all local): [https://asciinema.org/a/CWEnTFK4dQxtn78a](https://asciinema.org/a/CWEnTFK4dQxtn78a)

Freelancers and solo consultants who would pay for a lightweight bookkeeping helper can use this local invoice sorter to turn text-based PDF invoices and receipts into a tidy expense CSV, without hand-copying vendors, dates, totals, currencies, and categories. It saves time on repetitive expense entry while keeping client and financial documents on their own laptop.

Documents are read locally and sent only to your local Ollama instance, so client data never leaves your laptop. After downloading a model, processing works offline and has zero per-document API cost. The model is swappable through an environment variable, so you can use the open-weight model that works best for your machine without vendor lock-in. Extraction uses an LLM for extraction, rules as a safety net for common category keywords.

```
uv sync
ollama pull qwen2.5:3b
uv run make_samples.py
uv
```

…`qwen2.5:3b`, an open-weight model, served locally by `pdfplumber` pulls the text out of each PDF. The model returns structured JSON (vendor, date, total, currency, category) in JSON mode at temperature 0. Polars writes the CSV.`OLLAMA_MODEL` environment variable and the output file from a `--out` flag, so trying Llama or Phi is a one-line change.
