Projects

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.

Architecture

Clean Architecture per feature, with get_it for dependencies and errors as Either. The AI key lives only on the server.

  1. FlutterThe screens, with Material 3
  2. BLoCEach screen's state
  3. Use casesBalances, installments, billing cycles and budgets
  4. 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

  1. 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.

  2. 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.

  3. 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.

  4. Bank notifications stay on the phone

    They are read and stored on the phone. Only the movement you confirm reaches the servers.

  5. 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.

  6. 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.

  7. 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

See the other projects

Contact

To talk about a project, an opportunity or something you saw here.