← Back to work

Case file 07Personal finance app

BudgetBuddy

Most budgeting apps are either too heavy or too stupid: bank integrations and a subscription, or a running list with no analysis. BudgetBuddy is the middle — fast daily entry, honest monthly insight, and nothing between you and the first entry.

20+
Built-in categories
0
Servers to run
3
Sign-in methods
BudgetBuddy interface

The glitch

Knowing where the money went is a daily problem answered monthly, which is why the answer is always a guess. The app had to make capture instant enough to actually happen at the moment of spending, then roll those entries into something worth reading at the end of the month. It also had to start working before it asked who you are, because an account wall at the door is where budgeting apps go to die.

Jacking in

  • Built a date-navigable daily log of income, expense and ATM entries with live per-day totals, and monthly reports that break spending down by category with percentage bars and a day-by-day rollup.

  • Modelled ATM withdrawals as transfers rather than expenses, so cash coming out of a machine stops being counted twice. A small decision that decides whether the totals are believable.

  • Scoped every read and write to the signed-in uid under a per-user document tree in Firestore, so the data layer is isolated per account with no server to run or scale.

  • Root-caused an instant-launch crash that only appeared in release builds: the Firebase v12 SDK's package exports map resolves incorrectly under Metro, throwing during initial module evaluation with no dev overlay to show it. The fix was a proper metro.config.js, which replaced a run of symptom-level workarounds. Reproduce at the layer the failure actually lives in.

  • Wired Firebase Auth persistence through AsyncStorage so a session — including a guest one — survives a cold start instead of silently dropping to memory and logging everyone out.

  • Added anonymous auth that still issues a real uid, so the whole data layer works from first launch and can be upgraded to a permanent email or Google account later.

  • Fixed a CI pipeline that failed on a lockfile written by npm 11 against a runner on npm 10, which dedupes Firebase's nested dependencies differently. Lockfiles are version-sensitive; match the tool that consumes them.

  • Shipped CSV import and export, because a finance app that traps your data is a finance app you should not trust.