Skip to content

2026SoloMobile

Finance Tracker Mobile

The Flutter client for the tracker above — ten feature modules, 10,856 lines, tokens in the OS keystore.

Finance Tracker Mobile

Overview

The mobile client for Personal Finance Tracker, consuming the same Go API as the web app. 10,856 lines across 101 Dart files, organised feature-first into ten independent modules: auth, dashboard, transactions, calendar, reports, savings, instalments, groups, settings, and more. The boundaries are enforced rather than aspirational — core and shared never import from features, and no feature reaches into another feature's data layer. Navigation is go_router, HTTP is dio, charts are fl_chart, and auth tokens live in the OS keychain or keystore via flutter_secure_storage rather than in plain preferences.

The problem

Keeping one product consistent across web and mobile when the two use entirely different state paradigms — Redux Toolkit on one side, Riverpod on the other — while still releasing features to both at the same time without behavioural drift.

What I did

I set explicit architectural boundaries on the mobile side so each of the ten features could move independently, then coordinated releases per feature rather than per platform: the savings module shipped with equivalent changes in Go, React, and Flutter in a single cycle. One release bug worth remembering — the app worked in debug and failed in release, because Android grants the INTERNET permission automatically in debug builds but not in release ones.

In the build

  • Feature-first architecture with ten enforced module boundaries
  • Riverpod state management with code generation
  • Declarative go_router navigation with route guards
  • Tokens stored in the OS keychain or keystore, not preferences
  • Interactive charts with fl_chart
  • Indonesian currency and date formatting via intl
  • Builds for Android, iOS, and desktop targets

Stack

  • Flutter
  • Dart 3.10
  • Riverpod
  • go_router
  • dio
  • fl_chart