← All case studies
Case Study 03 AI · Indie · Mobile

GroceryTrack

An AI receipt scanner I designed, built, and shipped — a working web MVP in a single day, the iOS app in the App Store about 1.5 months later, and the Android app on Google Play after that.

Point your camera at a grocery receipt and get clean, categorized spending insights instantly. No manual entry, no per-store templates — just a multimodal LLM doing the work an OCR pipeline used to take months to build.

Role
Solo — design, build & ship
Platforms
iOS · Android (Flutter) · Web (Next.js)
Timeline
Web Mar 14 · iOS Apr 30 · Android Oct 10, 2026
Stack
Flutter · SwiftUI · Next.js · Firebase · Gemini
Stage
Live · web, App Store & Google Play · native iOS v2 in beta
1 day
from annoyed at receipts
to a live web MVP
1,245
receipts & 12,376 items
parsed in under 7 months
$92K
grocery spend tracked
at a $74 average basket
270
registered users — incl. an
unplanned Canadian base
01 — Context

Scratching my own itch.

On March 13, 2026 I got annoyed enough at my grocery receipts to do something about it. On March 14, the first web version of GroceryTrack was live. I wanted answers to embarrassingly simple questions: how much do I actually spend on groceries each month? Is Costco really cheaper for the things I buy? Did egg prices go up, or does it just feel that way?

Budgeting apps can't answer these. They see a single line — COSTCO $187.43 — and stop. The interesting data lives inside the receipt: the items, quantities, and unit prices. For years the only way to get it was manual entry into a spreadsheet, which I tried and abandoned twice.

02 — The unlock

OCR finally works — because it stopped being OCR.

Receipt digitization isn't new, but traditional OCR pipelines were brittle. Every store formats receipts differently, thermal paper fades, and items are abbreviated past recognition — ORG BNLS SKNLS CKN BRST, anyone? Building per-store templates was the old approach, and it never scaled.

Multimodal LLMs changed the economics overnight. A model that can read and reason about a crumpled receipt photo — inferring that string is organic boneless skinless chicken breast and filing it under poultry — turns a months-long parsing project into a well-crafted prompt. That was the unlock that made a one-day MVP possible.

03 — Market

A personal itch that sits on a trillion-dollar market.

Groceries are the largest recurring household expense — over $1T spent in the U.S. each year — and the least visible at the item level. Budgets track the trip (COSTCO $187.43), never the cart. Three forces make now the moment: grocery is moving online fast, emailed receipts are already the default, and modern models finally read messy receipts line by line, accurately and at near-zero cost.

$1.06T
global online grocery
market, 2026 · +10.5% CAGR
157.5M
Americans buying
groceries online · +7.3% YoY
$2.0→9.1B
digital receipts market,
2025 → 2035
16.3%
digital receipts CAGR,
2025–35 · up from 7.5%

Grocery is moving online

E-grocery is now 20.5% of U.S. grocery sales, up from ~15% — and climbing every quarter.

Receipts went digital

Emailed receipts are the default. The data exists — it's just trapped in inboxes and PDFs.

AI makes it reliable

Modern models read messy, varied receipts line by line — accurately, instantly, at near-zero cost.

04 — Approach

One prompt, one image in, structured JSON out.

GroceryTrack sends the receipt photo directly to Gemini's multimodal API — no separate OCR step, no text-extraction pipeline, no per-store templates. One image in; store name, date, line items with quantities and prices, and item categories out, as validated JSON.

The entire "parsing engine" that would have taken months to build in 2020 is a model call plus careful prompting and output validation. The rest of the app — capture, storage, analytics, auth — is conventional, fast, and boring on purpose, so the one novel part could ship the same day.

05 — Architecture

How the pieces fit.

Flutter on iOS and Android for fast prototyping, a Next.js web app, Firebase as the backend, Gemini as the parsing engine, and an MCP server so AI assistants can read the data directly.

In October I rewrote the iOS app natively in SwiftUI. v2 is in beta and ships as an update to the same App Store app, with the same database, API and analytics, so nothing changes for the backend. Android stays on Flutter.

GroceryTrack — system architecturecapture → engine → store → access
Clients
iOS AppFlutter → SwiftUI v2
Android AppFlutter
WebNext.js
Camera capturereceipt photo
▼
Gemini multimodal · parsing engine
image → store, date, line items, quantities, prices, categories · prompt + JSON validation
▼
Backend — Firebase
Authaccounts
Firestorereceipts & items
Storagephotos
Functionsorchestration
Analyticsinsights
▼
Access & integrations
MCP ServerAI assistants
Nutrition dataper item
Store catalogmajor chains
98%
Line-item extraction accuracy

Across 63 receipts and 792 line items from 12 users, just 17 items needed correcting. The engine is excellent at the unit level — header fields like date and merchant are the weak spot, 4–5× more error-prone, and the focus to close.

96.4% all editable fields95.5% extraction success
Line-item extraction17 of 792 items corrected
97.9%
Total / price field5 of 63 receipts corrected
92.1%
Date field6 of 63 receipts · 2nd-worst field
90.5%
Merchant field6 of 63 receipts corrected
90.5%
06 — What I shipped

The capabilities that made it real.

Scan & extract

Snap a receipt and AI pulls every item and price in seconds — no manual entry, no per-store setup.

Spending insights

Track household grocery spend by store, category, and time — the picture bank statements never give you.

Nutrition + stores

Nutrition facts on what you buy, across all the major chains it already recognizes.

MCP server

An MCP endpoint so AI assistants can read your grocery data directly and answer questions about it.

07 — Demo

See it in action.

Full walkthroughs recorded on real devices — scanning a receipt, reviewing the extracted items, and exploring the spending insights. The iOS demo is v2, the native SwiftUI app; the Android demo is the Flutter app from Google Play.

GroceryTrack v2 on iPhone, iPad, iPhone Duo, Mac and Apple Watch
v2, the native SwiftUI app, now in beta: one app on iPhone, iPad, iPhone Duo, Mac and Apple Watch
iOS · v2, SwiftUI
Android

The data, animated.

Short visualizations built from GroceryTrack's own usage data — how the product grew, what got scanned, and where the users turned up.

Milestones
Receipts and spend
Scanner growth
Users on the map
08 — Results

What 1,245 receipts taught me.

idea → web MVP
1 day
Web MVP designed, built, and live in a single day.
Mar 14 → Oct 8, 2026
1,245
receipts and 12,376 items parsed for 144 people who scanned.
$73.93 average basket
$92K
total grocery spend tracked and categorized.
unplanned
A cluster of Canadian users I never set out to reach — now 12% of all receipts.
The hard part used to be the parser. In the LLM era, the hard part is everything around it — and the whole thing fits in a day.
— Reflection on building GroceryTrack
09 — Reflection

Building in the LLM era.

What surprised me wasn't the technology — it was how much the center of gravity moved. The thing that would once have been a multi-month engineering project (the parser) became a prompt. The thing I assumed would be easy (distribution, retention, the unexpected Canadians) became where the real learning was.

The lesson I keep: when a model collapses the hard technical core of a product to near-zero, the leverage shifts to taste, speed, and listening to real users. Ship the boring 90% well, let the model do the magic 10%, and pay attention to who actually shows up.

Seven months in, I rewrote the iOS app in SwiftUI in about a day with an agent. The native build is less than half the size, builds 3x faster in CI and runs on 4 dependencies instead of 43. It changed my mind about cross-platform frameworks: Native or Hybrid?

For where the product stands now, read the founder update: Seven Months of GroceryTrack

Next case study

Phoenix — a static blog reborn AI-native.

Read Phoenix →