# We built LedgerQuarry: snap receipts on your phone, read them with AI on your own PC

> LedgerQuarry is a free desktop dashboard plus a phone app that pairs over Tailscale. Receipts are read by a local AI model through Ollama, so your spending never leaves your machine.

By Wayne Hewitt, 21 Oct 2026. Source: https://repoquarry.dev/blog/ledgerquarry-private-receipt-tracker

**LedgerQuarry tracks your spending from receipt photos. You snap a receipt on your phone, an AI model on your own PC reads the shop, date, total and tax, and a dashboard shows where the month went.** It is free, MIT-licensed and on [GitHub](https://github.com/Obiwayne/LedgerQuarry), with a Windows installer on the [releases page](https://github.com/Obiwayne/LedgerQuarry/releases).

No receipt photo goes to a cloud service. The phone reaches your PC through Tailscale, a private network only your own devices can join. The reading happens in [Ollama](https://repoquarry.dev/projects/ollama), on your graphics card or processor.

## Why build it

Expense apps that read receipts charge a monthly fee and keep your photos on their servers. Each one is a record of where you shop, what you eat and when. RepoQuarry already had a [Receipt scanner build](https://repoquarry.dev/builds/receipt-scanner) that does the job with Nextcloud, Activepieces, Ollama and Bigcapital. That works well, but it means running four servers.

LedgerQuarry is the same idea as one Windows app you install in a minute.

## What you get

On the PC, a dashboard:

- this month's spending against last month
- a six-month trend
- spending by category, with your budget marked on each bar
- budgets with on track, close and over states, each with an icon and a word as well as a colour
- top shops, recent receipts and the tax you paid

![The LedgerQuarry dashboard with six months of sample data](https://raw.githubusercontent.com/Obiwayne/LedgerQuarry/main/docs/blog/desktop-dashboard.webp)

On the phone, an app with a big camera button. Snap a receipt and it uploads, shows "Reading…", then fills in about three seconds later with the shop, total and category. Anything the model could not read is marked "needs a check" with the reason, rather than guessed. With no signal, the photo waits on the phone and sends when it can reach your PC again.

![The phone app after reading a bakery receipt](https://raw.githubusercontent.com/Obiwayne/LedgerQuarry/main/docs/blog/phone-read.webp)

## How the phone connects

1. Install Tailscale on the PC and the phone, signed in to the same account.
2. In LedgerQuarry, press **Turn on private HTTPS link**. That runs `tailscale serve`, which gives the app an address like `https://your-pc.your-tailnet.ts.net` that only your devices can open.
3. Press **Show pairing code** and scan it with the phone's camera.

The code works once and expires after 10 minutes. The phone gets its own key, and the PC stores only a fingerprint of it. Remove the phone on the PC and it is locked out on its next request. The app never listens on your home network or the internet, only on the PC itself and its Tailscale address.

![Pairing a phone with a one-time QR code](https://raw.githubusercontent.com/Obiwayne/LedgerQuarry/main/docs/blog/desktop-connect.webp)

The phone side is a web app you add to the home screen, so one version covers Android and iPhone with no app store. A native Android app is possible later.

## What we used from RepoQuarry

| From the catalogue | Job in LedgerQuarry |
|---|---|
| [Ollama](https://repoquarry.dev/projects/ollama) | Runs the vision model that reads receipts. The default. |
| [Jan](https://repoquarry.dev/projects/jan) | Works instead of Ollama, through its OpenAI-style server. LM Studio does too. |
| [Receipt scanner build](https://repoquarry.dev/builds/receipt-scanner) | The blueprint we turned into one app. We have submitted LedgerQuarry as a shared build under it. |
| Bigcapital, GnuCash, Invoice Ninja | We looked at bundling one as the ledger and chose a CSV export instead, so your data goes into whichever you use. |

The default model is Qwen2.5-VL 7B. LedgerQuarry downloads it for you from Settings, about 6 GB once. It runs best with 8 GB or more of graphics memory and still works on a processor, more slowly.

## How we built it

The desktop app is Rust and [Tauri 2](https://tauri.app). Inside it runs a small web server built with axum. Both the desktop window and the phones load the same app from it, styled for a wide screen or a phone. Receipts, budgets and paired phones live in one SQLite file, with the photos beside it.

When a photo arrives, the server saves it and hands it to the model in the background, one at a time. Ollama gets a strict JSON schema, so the answer comes back as data rather than prose. The parser copes with `1,234.56` and `1.234,56`, rejects dates that are not printed on the receipt, and stores money as whole pence or cents, so totals never drift.

We tested it three ways:

- **12 Rust unit tests** covering totals, parsing, budgets, paired devices, sample data and CSV safety.
- **An end-to-end API test.** It starts a real server with a stand-in Ollama, pairs a phone and checks that a used code is refused and that a phone cannot change settings. It then uploads a photo, waits for the reading, checks the dashboard totals, edits the receipt, exports CSV, and confirms a removed phone is locked out.
- **A Playwright browser test.** It drives the desktop dashboard and a Pixel 7 phone through pairing, snapping a receipt photo and seeing it read, with zero page errors allowed.

The browser test and its screenshots found six layout bugs, all fixed before release. One was a tick icon that rendered at full card size.

The full build log, including what we chose not to do, is in [BUILD_LOG.md](https://github.com/Obiwayne/LedgerQuarry/blob/main/BUILD_LOG.md).

## What it does not do yet

- **WhatsApp.** Receiving receipts over WhatsApp needs either Meta's paid Business API with a public web address, which breaks the private design, or an unofficial WhatsApp Web bridge, which is against WhatsApp's terms and gets numbers banned. The phone app does the same job without either.
- **Bank feeds or shared household budgets.** One person, receipts only, for now.
- **Code signing.** Windows SmartScreen warns on first run. Choose "More info", then "Run anyway", or build it from source with the steps in the README.

## Try it

- Download: [github.com/Obiwayne/LedgerQuarry/releases](https://github.com/Obiwayne/LedgerQuarry/releases)
- Source, docs and build log: [github.com/Obiwayne/LedgerQuarry](https://github.com/Obiwayne/LedgerQuarry)
- The build it grew from: [repoquarry.dev/builds/receipt-scanner](https://repoquarry.dev/builds/receipt-scanner)

No receipts to hand? Press "Try sample data" on the dashboard and explore six months of made-up spending first.

## Projects in this post

- [Ollama](https://repoquarry.dev/projects/ollama): Ollama is a runner, not a full chat app: it downloads open models and serves them through a CLI chat and a local API that front-ends like Open WebUI, LibreChat and LobeHub connect to. Installers exist for macOS 14+, Windows 10 22H2+ and Linux, plus a Docker image. The runner is MIT, but each model has its own licence, so check the model page before commercial use. Local use is free and unlimited; optional paid Ollama Cloud plans (Pro $20/month) run cloud models. Models can be tens to hundreds of GB on disk. (https://repoquarry.dev/projects/ollama.md)
- [Jan](https://repoquarry.dev/projects/jan): Jan is a desktop chat app (Tauri, bundled llama.cpp engine) that downloads open models such as Llama, Gemma, Qwen and gpt-oss from Hugging Face and runs them offline, or connects to OpenAI, Anthropic, Mistral and Groq. It also serves a local OpenAI-compatible API on port 1337. Installers for Windows, macOS and Linux. Code is Apache-2.0; it ships no weights, so each model's licence matters. The README suggests 8GB RAM for 3B models, 16GB for 7B and 32GB for 13B on macOS. (https://repoquarry.dev/projects/jan.md)
