Abrar Mahir Esam
Résumé

Two offline-first Flutter apps: SpendSplit and Nudge

3 November 2026FlutterDartSQLiteMobile

No accounts, no backend, no analytics. How betting on local-first shaped an expense tracker and a task manager that nags you in the right way.

On this page

My two personal Flutter apps make the same bet: your data stays on your phone. There are no accounts, no servers and no analytics. Here's how that shaped each one.

SpendSplit: one balance, two pockets

SpendSplit is a minimalist expense tracker for iOS and Android. It splits one bank balance into Available and Savings, with a biometric lock and a separate USD tracker. All data lives in SQLite on the device, and sensitive settings stay in the platform keystore.

The rule I'm most attached to is that every figure is derived from the entries and never stored. The ledger is always the source of truth, so there's nothing to drift out of sync. Bank SMS alerts become entries flagged for review: Android reads them directly, and iOS takes them through a Shortcuts automation.

  • Monthly budget with a pace marker, plus per-category budgets
  • Graphs: running spend, a 12-month income overlay, a daily heatmap and a balance trend
  • Savings goals with a completion forecast based on your saving pace
  • A separate USD ledger with an annual allowance and a year-end projection
  • CSV and PDF export, CSV import and a full JSON backup
  • Biometric lock, with balances hidden in the app switcher
SpendSplit: Home
Home
SpendSplit: History
History
SpendSplit: New entry
New entry
SpendSplit: Monthly
Monthly
SpendSplit: Graphs
Graphs
SpendSplit: Goals
Goals
SpendSplit: Dollar Tracker
Dollar Tracker
SpendSplit: Settings
Settings
SpendSplit: Lock
Lock

Built with Flutter, Riverpod, Drift (SQLite), GoRouter and fl_chart. It's at v1.3.0, and the code is on GitHub.

Nudge: tasks that don't let you off the hook

Nudge is a local-first task manager where important tasks stay visible and keep reminding you until they're handled. The Focus tab shows a streak, one spotlight task, then your overdue, today and up-next lists.

The part I like is the escalation engine. A task you keep putting off climbs back into the spotlight with a "Put off N times" marker, and gets a daily nudge once its reminders have fired. Quiet hours shift reminders instead of dropping them.

  • Natural-language quick add with tags, such as "call mom tomorrow 5pm"
  • Fixed or repeat-after-completion recurrence, with custom rules
  • Multiple reminders, opt-in persistent alarms, quiet hours and snooze
  • Daily and monthly habits with check-ins, timers, checkpoints and streaks
  • Goals with checkpoints and a progress chart
  • A Pomodoro timer that credits time to the task
  • Home-screen widgets with deep links, and eight colour palettes
Nudge: Focus
Focus
Nudge: Calendar
Calendar
Nudge: Habits
Habits
Nudge: Goal detail
Goal detail
Nudge: Settings
Settings

It's built with Flutter, Dart, SQLite and local notifications, and it's at v2.0.0. Source on GitHub.

What local-first costs and buys

It buys you simplicity: no sign-in, no sync conflicts, nothing to host, and nothing of yours on someone else's server. It costs you the safety net, since the phone is the only copy. That's why both apps have export and import, with a full JSON backup in each.