← All Projects

Budget Buddy

A personal finance tracker where every figure on screen is recomputed from the full ledger, so a rounding error can never accumulate into a wrong balance.

IndustryPersonal Finance
Product TypeMobile App
PlatformiOS & Android
StorageLocal SQLite ledger
ResultBalances that are provably correct, not merely fast
Budget Buddy project hero image

The impact:

3
Ledger tables as source of truth
0
Incremental balance adjustments
100%
Works offline
0
Cache invalidation in app code

What this product is.

Budget Buddy is a Cupertino-first personal finance tracker: accounts, transactions, assets and liabilities, statistics, bank statement import and encrypted backup to the user's own Google Drive. It runs entirely offline, on a local SQLite ledger the user owns.

PROJECT FACTS
IndustryPersonal Finance
Product TypeMobile App
PlatformiOS & Android
StorageLocal SQLite ledger
ResultBalances that are provably correct, not merely fast

What needed solving.

Finance apps almost always cache balances and adjust them incrementally, because recomputing is slow. That is also how they end up wrong: one missed invalidation, one interrupted write, and the displayed balance quietly drifts from the ledger forever. The app had to stay fast on years of transaction history without ever trading away correctness.

How we approached it.

Three ledger tables are the only source of truth, and every amount on screen is a projection recomputed from full SQL sums — never adjusted in place, so errors cannot accumulate. Cached account balances are invalidated by SQLite triggers installed in the same transaction as the write, plus a revision watermark, which means no Dart code path can forget to invalidate and an app kill cannot leave stale data reading as clean. Running balances are never stored at all: the visible window is folded in memory from the trusted account total minus a SQL tail sum, pinned to the legacy semantics by an equivalence test.

What's inside?

Balances that cannot drift

Every amount is recomputed from full SQL sums over the ledger, never incrementally adjusted, so rounding errors have nowhere to accumulate.

Invalidation enforced by the database

SQLite triggers installed alongside every ledger write make it impossible for application code to forget to invalidate a cached balance.

Bank statement import

Statements are parsed and reconciled into the ledger, with sync services keeping imported and manual entries consistent.

Backup to the user's own Drive

Data syncs to the customer's personal Google Drive rather than a vendor server — the user keeps custody of their finances.

Incognito mode

Long-press any summary panel to replace every visible amount with an emoji; the state persists across restarts while calculations keep using real numbers.

Honest premium gating

Locked features stay visible with a lock badge and open the subscription screen, instead of hiding functionality the user paid attention to.

Tools change. Standards don’t.

We choose the stack around the product — not the other way around.

  • Flutter
  • Dart
  • SQLite
  • Provider
  • Firebase
  • Crashlytics
  • Google Drive API
  • ARB localization
  • GitHub Actions
  • Fastlane

Flutter, Dart, SQLite, Provider, Firebase, Crashlytics, Google Drive API, ARB localization, GitHub Actions, Fastlane

What we handled.

We worked on the product development and implementation, focusing on building a polished, functional and user-friendly experience aligned with the goals of the product.

Product design and architecture
Ledger and caching model
Performance optimization
Bank statement import and Drive sync
Release engineering