I built a receipt sorter that never uploads a receipt
Description and use
Receiptsort automatically sorts and classifies electronic receipts locally, preserving privacy and reducing cloud costs.
Problem
Freelancers need to manually sort a folder of receipts and invoices before accounting, which is tedious and risky for privacy.
Outcome
Receiptsort automates receipt organization locally, preserving privacy, reducing cost, and enabling schema‑constrained extraction with validation.
Workflow
- Point receiptsort at a folder of receipts
- The vision model extracts vendor, date, invoice number, currency, subtotal, tax, total and category
- Each file is copied to YYYY‑MM/Category/ with a name like 2026‑09‑03_Figma_12.00.png
- A ledger.csv row is added for each receipt
- Files with missing data, mismatched totals, or duplicates are moved to _needs_review/
- Files are tracked by SHA‑256 so re‑running only processes new ones
Evidence
Point it at a folder of receipts and invoices. A vision model extracts vendor, date, invoice number, currency, subtotal, tax, total and category.
Anything uncertain goes to _needs_review/ instead of being filed with a guess: a missing vendor, date or total; subtotal + tax that doesn't match the total; the same vendor, date and total as an earlier receipt.
Files are tracked by SHA-256, so re-running on the same folder only processes new ones.
The model runs locally through Ollama (default qwen2.5vl:7b), so nothing is uploaded and it works offline.
Ollama accepts a JSON schema in the format field, which constrains the model's reply.
- Record date: 2026-10-17T18:40:58.569Z