Case study · Data & AI

A finance app that checks its own maths

My own money app. Spending arrives as a bank notification, a receipt photo or a sentence to a Telegram bot — and nothing reaches the ledger until it has been checked, approved or reconciled.

Role
Sole designer & engineer
Type
Personal project, self-hosted
Surfaces
Web · Android · Telegram bot
Stack
React · Express · sql.js · Mistral OCR · Capacitor
Finance app dashboard on desktop
Finance app dashboard on a phoneFinance app budgets on a phone

Desktop and Android · generic demo data

Capture

Four ways in, one gate

Logging money has to take one tap or nobody does it. Every path lands in the same draft and the same approval card.

  • Bank notificationA native Android listener turns a bank or wallet notification into a draft.
  • Receipt photoMistral OCR reads it, a small model extracts fields, RAG suggests the category.
  • A plain sentence“Spent 12.50 at the market yesterday” — in English or Portuguese.
  • Guided /addExpense, income or transfer, filled with the card’s buttons.
One draft → one Telegram approval card → ledgerApprovals, corrections and rejections all feed the category memory.
Reconciliation

Statements are parsed, never guessed

Each bank’s statement gets a deterministic parser, not a model — it can’t invent a row. Then the numbers have to add up:

  1. 1Every row’s running balance
  2. 2Opening + movements = closing
  3. 3The declared debit and credit totals

Forty cents out and the whole import is refused. A format with nothing to check says “unverifiable”, never “passed”.

Finance app budgets on desktop

Backups that get reopened

Nightly copies are taken from memory, read back, integrity-checked and row-counted before they count.

One warning a week, or none

Habit alerts are templates over measured numbers — no model to invent a figure, and silence below threshold.

Money moves atomically

Every balance-changing write runs in one transaction — half a write is silent corruption.

Two auth layers

Edge auth plus app-level device tokens, stored hashed and revocable instantly.

Finance app transactions
Transactions
Finance app goals and achievements
Goals & achievements
Finance app accounts
Accounts & statement import