Case study
Financial Management
Household budgeting that reads bank emails, checks receipts and keeps a zero-based plan. In daily use.
- Python
- FastAPI
- PocketBase
- Gemini
- Google Apps Script
- WebAuthn
- Web Push
- PWA
The problem
Tracking a household budget by hand never lasts. Every card payment already sends an email, so the app should start there and only ask a person to confirm.
What I built
- Bank emails (BCA, Mandiri) → a Google Apps Script → an HMAC-signed ingest endpoint; no Google credentials on the server.
- Rule-based parsers with an LLM fallback (with an amount cross-check); account and card numbers are redacted before anything reaches the AI.
- Confirm each transaction with a receipt photo (AI reads it and checks it matches), split across categories; receipts saved to Google Drive.
- Envelope (zero-based) budgeting, e-wallet top-ups as balances, reports with forecasts, an AI advisor, and Web Push tuned for iPhone.
- A Face ID lock enforced by the server (passkeys), heartbeat so typing never locks, nightly verified backups.
Highlights




Try it
Parse a bank email
A fake bank notification: see the fields the parser pulls out and what gets redacted before any AI call. Then try zero-based envelopes.
Try it
Give every rupiah a job
Zero-based budgeting: assign income to envelopes until nothing is left unassigned, as the app's monthly plan does.
How it works
- 1Bank email
- 2Gmail + Apps Script
- 3Signed ingest
- 4Parse + redact
- 5Confirm with receipt
- 6Envelopes, reports, push
Engineering notes
- Real money data lives here, so every screenshot on this page comes from a scratch copy with a made-up household.
- Parser tests run on name-scrubbed real emails; forwarded emails taught me to normalise CRLF line endings.
- iOS details matter: high-urgency pushes, retrying the first request after a long sleep, and a fixed app frame.
How I build
Designed, built, tested and deployed by me with an AI coding assistant (Claude Code): I set the requirements, review every change, test on scratch copies with fake data, and run it in production.