Invoice Sorter: a private expense tracker for freelancers that runs on a laptop A developer built Invoice Sorter, a command-line tool that reads a folder of PDF invoices and receipts and outputs a single expenses.csv with vendor, date, total, currency and category. The tool runs entirely on the user's laptop, using pdfplumber for text extraction and a locally served open-weight model (qwen2.5:3b via Ollama) in JSON mode at temperature 0, with Polars writing the CSV, so client financial data never leaves the machine and there is no per-document API cost. The model is swappable through the OLLAMA_MODEL environment variable and the output path is configurable with a --out flag. 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.