{"slug": "receipt-sorter-a-private-offline-bookkeeping-helper-for-freelancers-powered-by-5", "title": "Receipt Sorter: a private, offline bookkeeping helper for freelancers, powered by Qwen2.5-VL", "summary": "A developer built receipt-sorter, an open-source command-line tool that uses a local Qwen2.5-VL vision model via Ollama to rename receipt and invoice files, generate an accountant-ready receipts.csv, and produce per-category summaries without sending client financial documents to a cloud service. Testing on seven synthetic receipts, the model correctly extracted vendor, date, total, currency and category from five, including tilted photos and German comma-decimal formats, but confidently misread a deliberately blurry receipt, returning 2026-09-17 and 375.0 from an image that actually read 1?/09/2026 and 3?5.00. The developer added safeguards that flag unparseable or mismatched quotes and route uncertain results to a needs_review folder, plus an optional --verify mode that reads each document twice.", "body_md": "*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle](https://dev.to/challenges/hacktoberfest-week2-2026-10-12)*\n\n**receipt-sorter** is a command-line tool that turns a messy folder of receipts and invoices (PDFs and phone photos) into something an accountant can use. It renames each file (`2026-10-14_Brew-Bean-Cafe_441.0.png`), writes an accountant-ready `receipts.csv` (date, vendor, total, tax, currency, category), and produces a `summary.md` with totals per category.\n\n**Who would pay for it:** freelancers, consultants and tiny agencies who dread tax season and handle other people's financial documents. Their problem is twofold: the sorting is tedious, and they don't want client invoices and bank details uploaded to a third-party cloud. A tool that runs entirely on their own laptop solves both.\n\nDrop a folder of receipts and invoices (PDFs and phone photos) in, get back renamed files\nan accountant-ready `receipts.csv`, and a category summary. A local open-weight vision model\ndoes the reading, so **client invoices and bank details never leave your laptop**.\n\n```\nsorted_output/\n  sorted/          2026-03-04_Figma_15.0.pdf ...   (confident results)\n  needs_review/    anything unreadable, low-confidence or possibly duplicated\n  receipts.csv     date, vendor, total, tax, currency, category, notes ...\n  summary.md       totals per currency and category + a review list\n```\n\nOriginals are copied, never moved or modified.\n\n```\n# 1. Install Ollama (https://ollama.com) and pull an open vision model\nollama pull qwen2.5vl:7b        # ~6 GB; use gemma3:4b or qwen2.5vl:3b on smaller machines\n\n# 2. Install deps\npip install -r requirements.txt\n\n# 3. Run\npython -m sorter ~/Documents/receipts -o ~/Documents/receipts_sorted\npython -m sorter ./receipts --model gemma3:4b --dry-run   # preview, writes nothing\n```\n\nAdd `--verify` to read every document twice (second pass at a different…\n\n`₹1,234.50` and `1.234,50` are normalised, dates are converted to ISO, tax greater than total is flagged, and unknown categories are caught. Anything uncertain goes to a `needs_review/` folder rather than being silently accepted. Exact duplicates are skipped by SHA-256 without spending any inference.`categories.json` holds your own categories and vendor rules (which always override the model), and `examples.json` holds corrected examples used as few-shot guidance. `--model` swaps in any Ollama vision model.\nI generated seven fake receipts to test with: a café bill in INR, a SaaS invoice in USD, a tilted Uber photo, a German hardware-store receipt with comma decimals, an internet bill, a deliberately unreadable one, and an exact duplicate. On my first run, the model got the first five right: vendor, date, total, currency and category, including the tilted photos and the German number format. The duplicate was skipped.\n\nThe deliberately blurry receipt **slipped through**. The real image read `1?/09/2026` and `3?5.00`, but the model confidently returned `2026-09-17` and `375.0`, with no warning. For a bookkeeping tool, a quiet wrong number is worse than a flagged one.\n\nI added two safeguards:\n\n`?`, an unparseable quote, or a quote that disagrees with the extracted value gets flagged.`--verify` mode:\n**Performance:** [YOUR LAPTOP: RAM, CPU/GPU] processed the 7 documents in about [X] minutes without `--verify` and [Y] minutes with it.\n\n`localhost` (Ollama). Client invoices never leave the laptop, which is something a cloud API can't honestly promise.", "url": "https://wpnews.pro/news/receipt-sorter-a-private-offline-bookkeeping-helper-for-freelancers-powered-by-5", "canonical_source": "https://dev.to/harshaa/receipt-sorter-a-private-offline-bookkeeping-helper-for-freelancers-powered-by-qwen25-vl-19jf", "published_at": "2026-10-17 11:55:59+00:00", "updated_at": "2026-10-17 12:04:14.670520+00:00", "lang": "en", "topics": ["ai-tools", "computer-vision", "large-language-models", "ai-products"], "entities": ["Qwen2.5-VL", "Ollama", "receipt-sorter", "Gemma 3"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/receipt-sorter-a-private-offline-bookkeeping-helper-for-freelancers-powered-by-5", "markdown": "https://wpnews.pro/news/receipt-sorter-a-private-offline-bookkeeping-helper-for-freelancers-powered-by-5.md", "text": "https://wpnews.pro/news/receipt-sorter-a-private-offline-bookkeeping-helper-for-freelancers-powered-by-5.txt", "jsonld": "https://wpnews.pro/news/receipt-sorter-a-private-offline-bookkeeping-helper-for-freelancers-powered-by-5.jsonld"}}