DiegoBarrionuevo
← Selected workOwn productIn development

Say what you spent; the app understands.

Text, voice or a photo of the receipt; the AI proposes, you confirm.

Design and development2026
Expo SDK 56React Native 0.85TypeScriptDrizzle · SQLiteCloudflare WorkersOpenAI
Capture

A message goes in; a movement comes out.

You write the way you talk: “gasté 18 mil en nafta con la Visa Galicia” (spent 18 grand on fuel with the Visa Galicia). You can also send a voice note or photograph the receipt. The model returns JSON under a strict schema: type, amount, description, payment method, card, and whether the movement touches an account balance or not.

Whatever is missing gets flagged, never invented: if the message does not say the currency, the movement lands in Pending with that field in amber. And nothing saves itself. The AI proposes, you confirm: that is the rule the whole product is built around.

3
channels: text, voice, photo
1
human confirmation per movement
30
Rioplatense phrases in the eval corpus
0.9
pass threshold for the corpus
Available money

Real available money, not the account balance.

The big number on the home screen is not the bank balance. It is what you can actually spend: real balance minus what is reserved, minus savings, minus investments. Accounts, cards, installments, debts, reserves, savings goals and investments live in the same ledger, and the subtraction happens in the domain, never on screen.

Reserve more than you have and the available figure goes negative, and the app says so: Over-committed · Review. It is never clamped to zero, because a reassuring zero hides exactly what you need to see.

4
terms: real balance, reserved, savings, invested
Home

The screen that already exists, light and dark.

This is not a canvas: it is the app running in the iOS simulator, on first launch. Your accounts with the available figure at $0,00, the Registrá con IA bar with its three buttons, and a card that explains the deal: write, record or snap a photo, the AI assembles it and you confirm before saving.

White and ink, cards on a barely grey surface and three colours with a fixed meaning: amber for anything pending, red for expenses and over-commitment, emerald for income and savings. The AI button, raised in the middle of the tab bar, is the only accent.

Home screen in light mode: Finanzas, Tus cuentas, the Disponible card at $0,00, the Registrá con IA bar, the card Registrá tu plata como un mensaje and the empty state Sin cuentas todavía
Home · iOS simulator, light
The same home screen in dark mode
Home · iOS simulator, dark
The proxy

Only the capture travels; the ledger stays.

The app does not talk to OpenAI: it talks to a Cloudflare Worker that holds the key and exposes three routes, /parse, /transcribe and /image. The only thing that crosses the network is the message, the audio or the photo; the ledger never leaves the phone.

Each device has a daily quota, 20 texts, 10 voice notes and 10 photos, plus 30 requests per minute per IP. Text is read by gpt-5.4-nano, audio by gpt-4o-mini-transcribe and receipts by gpt-4o-mini with vision, all with strict json_schema output and a schema hash shared between the app and the Worker to catch drift.

20 / 10 / 10
daily quota per device
30
requests per minute per IP
Cards and installments

A card purchase does not move the bank. Paying the statement does.

A purchase on a card adds debt to the card and does not touch the bank account until the statement is paid on its due date. Each card has a closing date and a due date; each purchase in installments spreads them over the following months, 1/6, 2/6, up to 6/6.

That is what the monthly projection is built from: expected to receive, expected to pay and net for the month. It is not an AI forecast, it is the sum of what is already committed.

2
dates per card: closing and due
3
lines in the monthly projection
0
bank movements until the statement is paid
Architecture

Hexagonal, local-first, tested.

Expo SDK 56 with expo-router, React Native 0.85 on the new architecture, React 19 and TypeScript. NativeWind with Tailwind tokens for the interface, Zustand slices for state and Drizzle ORM over expo-sqlite for the ledger, which lives on the phone with 19 versioned migrations.

The layers are the hexagonal ones: domain, use cases with their ports, infrastructure adapters and UI. Twenty ports, sixteen repositories, 501 source files. And 1,119 tests in 99 green suites at the Fase 7 gate, with a corpus of 30 Rioplatense phrases the parser has to pass at 90%.

501
source files
20
application ports
16
repositories
19
SQL migrations
1,119
tests in 99 suites
In development
1,119tests
19migrations
3capture channels

Not published yet: an own product in development, mobile-first.

iOS simulator captures; no users and no usage metrics.
Next projectDonWeb Cloud — Content platformDonWeb Cloud's editorial platform: Ghost at the core, a custom theme and an in-house dashboard that feeds series, hubs and front pages.