Case study

SplitEase

Finance · Group expenses

Split expenses with friends and groups. Invite people, track who owes what, and keep everything in sync in real time — with Owner, Admin, and Member roles for fine-grained permissions.

The problem

Why it needed building

Splitting money is simple for one dinner, but it gets messy over a month of rent, groceries, cabs and trips. People forget who paid, splits are rarely equal, and asking a friend for money is awkward when you are not sure of the exact amount. On top of that, most people track their own spending in a second app. SplitEase keeps a running, accurate balance with every friend and group, lets you settle up in one tap, and tracks personal expenses and budgets in the same place.

My role

What I owned

  • Product, UI and UX design across 36 screens
  • Flutter app with Clean Architecture, flutter_bloc, GetIt and fpdart
  • Supabase backend: Postgres schema, row-level security and 45 RPC functions
  • Real-time friend requests with Supabase Realtime
  • Personal finance features: recurring bills, category budgets and spending analytics

The approach

Key decisions

  1. 1

    Money logic in the database

    Every create, update, delete and settle-up runs as one transactional Postgres RPC on Supabase (45 in total). A single expense touches the expense, every participant’s share, attachments and the activity feed, so either all of it is saved or none of it is.

  2. 2

    Four ways to split

    Expenses can be split equally, by exact amounts, by percentage or by shares, with any member as the payer. A dedicated SplitBloc owns all four modes and keeps the numbers correct as members are added, removed or switched between modes.

  3. 3

    Groups, friends and settle-up

    Groups have admin and member roles, and people join with an invite code or QR code. Each friend and group has its own dashboard with balances and shared history. Settle-up records a payment in a few taps and warns you before you pay more than you owe.

  4. 4

    Personal finance in the same app

    Personal expenses, recurring bills with reminders, monthly category budgets and fl_chart analytics with a drill-down into the transactions behind each category, all next to your shared balances.

  5. 5

    Clean Architecture, built to extend

    About 43k lines of Dart across 12 feature modules, each split into data, domain and presentation. The domain layer is pure Dart, each operation is its own usecase (65 of them), and errors are returned as Either values with fpdart instead of thrown. GetIt wires it together and flutter_bloc drives 33 blocs and cubits.

The product

Screens

SplitEase screenshot 1SplitEase screenshot 2SplitEase screenshot 3SplitEase screenshot 4SplitEase screenshot 5SplitEase screenshot 6SplitEase screenshot 7SplitEase screenshot 8SplitEase screenshot 9SplitEase screenshot 10SplitEase screenshot 11SplitEase screenshot 12SplitEase screenshot 13SplitEase screenshot 14SplitEase screenshot 15SplitEase screenshot 16SplitEase screenshot 17

Swipe to see more · tap a screen to open it full size

Challenges

The hard parts

Balances that never go stale

One expense changes the dashboard, the group, the friend page, the activity feed and analytics. A cross-screen refresh bus with ID-scoped flags means only the screens that were affected refetch when you return to them.

Fewer round-trips

Group and friend dashboards each load from a single server-side RPC, and long lists like the activity feed use paginated RPCs with infinite scroll and skeleton loaders.

Friend requests that feel live

A Supabase Realtime subscription, filtered on the server to the current user’s pending requests, shows new requests instantly without polling.

Safe by default

Row-level security limits users to data they are part of, deleted expenses can be restored, and feature flags let unfinished features ship switched off.

Results

What it achieved

  • Built solo: 12 feature modules, 36 screens, 65 usecases and 45 backend RPCs
  • ~43k lines of Dart since January 2026
  • Grew from a split tracker into a personal finance app without rewriting earlier features
  • One Flutter codebase for iOS and Android, with no custom backend server to run