BudgetLens
A personal finance app that links real bank accounts, categorises spending on its own, and tells you the moment you have gone over.
- Period
- 2025
- Role
- Full-stack — schema, API, categorisation, frontend
- Team
- Solo
- Status
- Live on GitHub
Plaid
Real bank linking, real transactions
AES-256
Encryption at rest for financial data
Realtime
Overspend alerts by email as they happen
The problem
Budgeting apps assume you will do the filing. Students and people in their first job will not — they check their balance, feel vaguely bad, and close the tab. The useful product is not a nicer spreadsheet, it is something that categorises the spending for you and interrupts you before the money is gone rather than after.
What I built
- 01 Integrated the Plaid API for secure bank account linking and live transaction fetching, so the data is the user's actual spending rather than something typed in by hand.
- 02 Built automatic expense categorisation with fuzzy matching over merchant strings, which handles the reality that the same coffee shop appears under four different names.
- 03 Implemented real-time overspend alerts that fire by email the moment a category crosses its limit.
- 04 Designed the MySQL schema, the Express API, and role-based access with JWT authentication, with AES-256 encryption for data at rest.
- 05 Built the React 19 and Tailwind frontend, including Recharts breakdowns that make the split obvious at a glance.
Hardest part
Financial data raises the stakes on every decision that is normally routine. Auth, encryption at rest, and what you are allowed to log stop being checkboxes when the rows are somebody's transactions. The fuzzy categorisation was the fiddliest part in practice — merchant strings are chaos, and the difference between a useful tool and an annoying one is whether it guesses right often enough that the user stops correcting it.
Outcome
A full-stack app that goes end to end: link a bank, watch it sort your spending, get told when you have overspent — with the security work done rather than deferred.
This is the project where I stopped thinking of security as a later phase. Once you hold a token that reaches somebody’s bank, encryption at rest and careful logging are not polish — they are the reason the thing is allowed to exist.
It is also the project that taught me how much product sits inside a categorisation function. Get it right and the app feels like it understands you. Get it slightly wrong and every session becomes data entry, which is the exact thing the user came here to avoid.