Personal productDesign Engineer — end to end
olbo
A personal finance app that reads your spending pace, not your balance — designed, built and shipped solo.
The product
An expense logged in four taps; the month's pace updates before the sheet closes.
The impact
Live and in daily use: log an expense by photo, voice, bank text or PDF, and one color tells you whether the month is on pace.
Context
Budgeting apps answer "how much is left", the anxious question. I built olbo for my own household: a local-first PWA in Colombian pesos whose traffic light reads spending pace against the calendar.
What I did
- 01
Product and interface — 24 views, from the traffic-light dashboard to AI that reads receipts, voice and PDFs.
- 02
Zero dependencies — vanilla ES modules, no build step; pure budget math, so 634 tests run in 292ms.
- 03
Privacy you can check — your data stays on the phone; the only thing that leaves it is the call to the AI.
What it can do
Capture is where finance apps die: if it takes effort, nobody does it. So olbo takes an expense however it arrives.
- AI
Photograph the receipt
Claude reads total, merchant and category into a card you confirm before saving.
- AI
Say the expense out loud
"Cincuenta mil en el mercado" becomes a structured movement: Claude with a forced tool call, flagged for review below 0.7 confidence.
- Product
Paste the bank's text message
Deliberately no model: an exact parser reads both bank formats offline, free, with no way to hallucinate an amount.
- AI
Read the whole card statement
A PDF becomes data: closing and due dates, monthly rate, every installment purchase and its remaining term.
How it happened
- 01
The problem was mine
Every app I tried counted cents in someone else's currency. Product first: whole pesos, my data on my own phone, one screen that says if I'm fine.
- 02
Built with AI, decided by tests
I paired with Claude but refused disposable output: a pure domain layer, with "today" always injected, so every test runs in Node without a browser. AI wrote fast; the tests decided what survived.
- 03
Shipping, then listening
Live as an installable, offline PWA, service worker at v150. Daily use surfaced what no spec would: a timezone bug that broke the color at night, and receipts I refused to retype.
Key decisions
The traffic light reads pace, not balance
Spending pace over the month elapsed: green up to 1, amber to 1.25, red above. 90% spent on the 28th is fine; 80% on the 10th is not.
Variable bills never reserve money
Power, water and fuel count only once you record what they cost. A reserved estimate can paint a false red, and one false red is enough to stop believing the color.
Privacy you can check, not just read
Everyone claims local-first. Here the CSP header proves it: nothing leaves the device except calls to api.anthropic.com. It cost every inline style, even inside SVGs.
- Vanilla JS (ES modules)
- PWA & Service Worker
- IndexedDB
- node --test
- Strict CSP
- Claude API
Design and engineering end to end. Claude worked inside the build and the product; the decisions, and the tests that enforce them, are mine.



