DEV Community

Cover image for Tallyroll: A Restaurant Bill Sorter That Works Offline (Gemma + Ollama)
Dipti Choubey
Dipti Choubey

Posted on

Tallyroll: A Restaurant Bill Sorter That Works Offline (Gemma + Ollama)

Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle Submission 💸

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle

What I Built

Tallyroll turns a pile of paper bills into one clean spreadsheet. You drop in photos of a restaurant's supplier bills and receipts, and it reads each one, sorts it into a kitchen category (vegetables, meat, dairy, gas, rent and so on), and flags anything it is unsure about.

Restaurant owners spend hours at month end sorting a shoebox of bills for the accountant. Cloud tools mean uploading who they buy from and what they pay. With Tallyroll, the owner drops in the photos and gets a spreadsheet with date, vendor, category, total and tax, ready for the accountant.

Who would pay: small restaurants and cafes, [your pricing idea, e.g. a one-time setup fee].

Demo

Code

Tallyroll

A private bill sorter for small restaurants. Drop in photos of supplier bills and receipts. Gemma, an open-weight model running on your own computer through Ollama, reads each one, sorts it into a kitchen category, flags anything doubtful, and exports one spreadsheet for your accountant.

No cloud. No per-bill fee. No account. Works offline.

Tallyroll

Run it (Windows)

Full beginner guide: WINDOWS-GUIDE.txt. The short version:

  1. Install Python (tick "Add python.exe to PATH") and Ollama.
  2. Double-click setup-model.bat (downloads Gemma once).
  3. Double-click start.bat.

macOS / Linux: ollama pull gemma3:4b && python3 server.py

No packages to install. The server uses only the Python standard library; Pillow is used if present (straightens and shrinks phone photos).

How it works

browser (static/)  --raw image-->  server.py  --/api/chat + JSON schema-->  Ollama (Gemma, local)
                                      |
                                      +--> normalise: numbers, dates, currency, category, sanity checks
                                      +--> data/receipts.json + data/images/   (your computer only)
  • Structured output.…

How I Built It

  • Model: Gemma (open-weight, vision-capable), running locally through Ollama. It reads the bill photo directly, so there is no separate OCR step. I used [gemma3:4b or gemma4:e4b].
  • Backend: a small Python server with no packages to install. It sends the photo and a strict prompt to Gemma with a JSON schema, so the answer comes back in a fixed shape (vendor, date, total, tax, category, line items, confidence).
  • Clean-up layer: it fixes number and date formats and marks a bill "Check" when the date or total is missing, the items don't add up, the photo is blurry, or it looks like a duplicate. Unit tests for this run in GitHub Actions.
  • Frontend: one web page with a receipt-printer animation, a ledger with a side panel to correct any bill next to its photo, a category breakdown, and CSV export for Excel.
  • Demo mode: a built-in mode replays 8 made-up sample bills without a model, and tags them "demo".

I built this with AI assistance (Claude) and tested it on real bills on my own laptop.

Why Does Open Innovation Matter?

  • Privacy: a restaurant's bills show who they buy from and what they pay. They never leave the owner's computer.
  • Cost: there's no per-bill fee, so a small business pays only for electricity.
  • Offline: it works with no internet, and my demo is recorded with Wi-Fi off.
  • No lock-in: the model is one setting, so the owner can switch to a better Gemma later by changing one line.
  • Room to grow: because the weights are open, the model could later be fine-tuned on local suppliers' bills. I haven't done that yet.

My First User

I sat with Meena, who runs a 12-table family restaurant, and ran 14 of last month's real supplier bills through Tallyroll on my laptop while she watched.

  • Result: 11 bills were read correctly. 2 were flagged "Check" (one with a smudged date, one that looked like a duplicate). 1 had a wrong total that was not flagged. It took about 40 seconds per bill.
  • What she said: "I usually lose a whole Sunday on this. If I only have to fix three bills instead of typing fourteen, that's worth something."
  • What went wrong: the wrong total was on a crumpled butcher bill, where Gemma read an 8 as a 3. She spotted it only because the photo was right beside the numbers.
  • What she asked for next: a Hindi version of the screen, and a way to send the month's sheet straight to her accountant.
  • Would she pay? "Maybe, if it never mixes up numbers." She said ₹500 a month felt fair, but she'd want to try it for a month first.

Prize Categories

  • Best Use of Gemma

Top comments (0)