Churupo
A personal and family finance app: you log an expense in seconds, see your month at a glance and share the household's spending. I designed and built it on my own in Flutter, and it's now live on Google Play.
- Role
- Everything: product, design, development and publishing
- Platforms
- Android with Flutter, plus a web version
- Status
- On Google Play since October 30, 2026, version 1.0.6
- Countries
- Chile, Argentina, Colombia, Ecuador and Venezuela, in Spanish
What it is
Churupo starts from a simple idea: if logging an expense takes effort, nobody logs it. So logging takes seconds: you type the way you talk, scan the receipt or confirm your bank’s notification. From that, the app builds your month, your cards and your family’s spending.
About 30,000 lines of Dart, Cloud Functions in TypeScript and over 200 automated tests, including 29 for the security rules.
Logging in seconds
Three ways to log, and in every one the phone does most of the work.
Typing
You type “sushi 12 lucas tarjeta” and the phone works out the amount, category and account with its own rules, offline: “lucas” means thousands, “un palo” means a million and “ayer” means yesterday. The category comes from what you logged before, and AI is only offered if something is missing.
Scanning
The receipt is read with ML Kit OCR on the phone itself. Before the text goes to the AI, the phone hides national ID numbers, account and card numbers, phone numbers and emails. The image never leaves the phone.
Confirming a bank notification
A native Kotlin service reads the notifications from your banking apps and proposes the movement. Nothing is saved until you confirm it, and Churupo’s own reminder shows no amounts because it can appear on the lock screen.
Screens
Captures of the app with a sample family, never with real data. The app is in Spanish.
Architecture
Clean Architecture per feature, with get_it for dependencies and errors as Either. The AI key lives only on the server.
- FlutterThe screens, with Material 3
- BLoCEach screen's state
- Use casesBalances, installments, billing cycles and budgets
- RepositoriesOne shared listener per collection
- Cloud FirestoreData with an offline cache and tested rules
- Cloud FunctionsThe AI, the monthly quota and account deletion
- ML KitReceipt OCR, on the phone
Decisions
The AI key stays out of the app
The first version called the AI from the phone, with the key inside the APK. An audit flagged it, and the call now goes through a Cloud Function: the key lives in Secret Manager, and the function requires a session, a verified email and App Check.
Rules first, AI as a fallback
What you type is understood by rules on the phone, and AI only steps in if the amount or the category is missing. That makes logging instant, offline-friendly and nearly free.
A limit to measure demand
There are 20 free AI uses a month, counted on the server in a transaction, and a reading that fails gives the use back. The limit is not about cost: it measures how many people would want Churupo Plus before building it.
Bank notifications stay on the phone
They are read and stored on the phone. Only the movement you confirm reaches the servers.
Families that cannot see each other
Firestore rules forbid listing groups or invites: you join only with the exact code, and the owner can remove someone but never add them. 29 tests on the emulator guard those rules.
One app for several countries
Country and currency live in the profile, not in separate builds of the app. Each account has its own currency, and balances are shown per currency, never as a total in pesos that does not exist.
Firestore is paid once
Every screen used to read the whole history with its own query. Now one listener per collection serves them all: Firestore bills the result once, and then only what changes.
What it is built with
- App
- Flutter, Dart, BLoC, go_router, get_it, dartz and fl_chart
- Cloud
- Firebase Auth, Cloud Firestore, Cloud Functions in TypeScript, App Check, Crashlytics and Analytics
- Capture
- ML Kit for OCR, Claude Haiku behind a Cloud Function and a native Kotlin notification listener
- Quality
- 181 app tests, 29 Firestore rules tests on the emulator and 8 function tests
Contact
To talk about a project, an opportunity or something you saw here.





