> cd ~/blog/mybudgetapp

Cross-Platform Finance with Flutter + Firebase

2026-03-16

I've tried every finance app category: commercial apps with subscription fees, spreadsheets that I maintain for two weeks and then abandon, bank-provided tools that only see one account. None of them stuck. The commercial apps know too much about me and cost money; the spreadsheets require too much discipline. I wanted something simple enough to actually use and personal enough to trust, so I built it.

Why Flutter

A finance app you only check on your phone is a finance app you stop using. I wanted Android for daily tracking, Windows for the monthly review where I actually think through the numbers, and a web version for quick checks when I'm on someone else's computer. Flutter gives you all three from one codebase in Dart. That's the pitch, and for this project it mostly delivered.

I was skeptical about Flutter for desktop — the reputation was that it worked but felt unfinished. In practice, Windows support is more mature than its reputation suggests. The widget system renders correctly, keyboard navigation works, and the window management is solid. There are edge cases, but I didn't hit anything that blocked me.

Data Model

I kept the model deliberately small: accounts, transactions, transfers between accounts, and goals. That's it. No categories with forty sub-categories, no tagging taxonomy, no investment portfolio integration. The decision to keep it simple was the most important design decision I made. Every finance app I've abandoned had become too complex to maintain. Simple enough to actually use is a feature.

Accounts have a type (checking, savings, credit, cash) and a running balance. Transactions belong to an account and have a date, amount, and a short note. Transfers move money between accounts without double-counting. Goals are just a target amount attached to a savings account with a deadline. The whole model fits in five Firestore collections.

Firebase Backend

Firestore gives me real-time sync across devices with essentially no server code. Android, Windows, and web all read from the same collections. Firebase Auth handles login — I'm the only user, so the implementation is trivial, but having auth means the data isn't publicly readable. No server to manage, no deployment pipeline, no on-call rotation. For a personal app with one user, this is the correct infrastructure choice.

What the Web Version Is Actually For

I expected the web version to be a fallback. It turned out to be the one I open most often on weekday mornings — a quick dashboard check to see where the month is tracking before I start work. The full layout renders well in a browser tab. I didn't need to build a separate dashboard; the same Flutter app in a browser window serves the purpose.

The Widget System Surprise

Flutter's widget composition model initially feels verbose. Everything is a widget. Padding is a widget. Alignment is a widget. After three weeks with it, I stopped noticing the verbosity and started noticing the precision. Every visual property is explicit and traceable. When something looks wrong, you know exactly which widget is responsible. Coming from CSS, where layout bugs can be genuinely mysterious, that explicitness is a relief I didn't expect to appreciate as much as I do.

MyBudgetApp Dart Flutter Firebase

← back to blog