Case 02 · 2024 to now
220+ commits, a release every week, on both stores
A family food inventory app: scan a label or receipt, and expiry dates, ingredients and allergens land in a shared list. On both stores since 2024, with a release most weeks.





Results
- 220+Commits since launch
- 1–2Releases a week
- 2Stores, iOS and Android
- 2024Live since
What I did
- React Native (Expo) app
- Admin dashboard in React and Vite
- Fastify API on a single VM
- MariaDB with an offline SQLite mirror
- CLOVA OCR and ML Kit scanning
- Crash reporting, ads and subscriptions
Overview
Point the camera at a food label or a receipt. OCR reads it, a language model normalises the product name, category and ingredients, and the item joins the household's list with an expiry reminder. The list syncs across every family member's phone.
I built and run the whole thing alone: app, admin, server and releases. Since launch in 2024 the repository has passed 220 commits and ships to the App Store and Google Play once or twice a week.
Product and client names are withheld under NDA. The stack, the architecture and the figures shown are accurate.
Stack
- React Native (Expo)
- Fastify
- MariaDB
- SQLite
- CLOVA OCR
- ML Kit
- Firebase
- Sentry
- AdMob
- RevenueCat
- Oracle Cloud
Architecture
- React Native (Expo)
- Admin (React + Vite)
- Fastify
- MariaDB
- SQLite (offline)
- CLOVA OCR · ML Kit
- Firebase · Sentry
- AdMob · RevenueCat
Decisions that mattered
- 01
OCR first, model second
CLOVA OCR extracts the raw text; Claude only normalises names and categories. Keeping the model out of the reading step made results predictable and cheap.
- 02
Ingredients read against the people eating them
Each household member carries a list of ingredients to avoid. The scanned ingredient text is matched against it, including shared-facility lines, so the warning names the person rather than the allergen.
- 03
Offline is the default
Every write goes to SQLite on the phone first and syncs in the background, so scanning in a basement supermarket works.
- 04
Ads and subscriptions in one flow
Free households see AdMob; paid ones go through RevenueCat. Refunds and restores are handled server-side so the two never disagree.
- 05
A release most weeks
EAS builds, a generated changelog and Crashlytics on every release keep a one-person cadence sustainable.
More work
Have something to build?
Send me two paragraphs about it. I reply within 24 hours, Seoul time, with a price and a date.
Email me