Money management · Personal product
Orange: everyday money and shared expenses, together.
A multifunctional money management app built with Flutter and NestJS: expense tracking, flexible bill splits, group and event budgets, settlement records, chat, spending insights, and AI-assisted receipt scanning.
orangeEveryday money.
Shared life.
- TrackExpenses, receipts & spending insights
- SplitFriends, groups & event budgets
- SettleBalances, records & conversations
Product overview · Flutter + NestJS
01 / context
The product and my role
I built Orange to bring personal spending and shared expenses into one app. The product connects expense entry, friends, groups, events, balances, and conversations. My work spans the Flutter interface, API integration, local persistence, and the NestJS/MongoDB backend.
02 / contribution
What I worked on
- Built expense creation and detail flows with equal, percentage, and custom splits, receipt attachments, and drafts that persist across app restarts.
- Connected friends, groups, and events with budgets, member management, balances, and settlement recording.
- Integrated Gemini receipt extraction to prefill the expense form, with editable amounts, categories, dates, and notes before saving.
- Built spending summaries, category breakdowns, and weekly, monthly, and yearly trends; added backend services for income records and income-versus-expense reporting.
- Implemented direct and group chat through REST APIs, including expense and settlement cards, alongside a Socket.IO gateway in the backend.
- Connected Firebase phone authentication and Google sign-in with backend sessions, secure token storage, and authenticated navigation.
03 / engineering
Design considerations
Account for the smallest currency unit
Money values are stored as integer minor units. Equal splits distribute the remainder across participants, and percentage splits reconcile rounding differences against the original total. The Flutter app converts and formats amounts at the interface boundary.
Make receipt scanning a reviewable step
A scan prefills an editable expense form. Receipt storage is deferred until the user saves, so abandoned scans do not create stored images. The form retains the uploaded receipt URL when retrying an expense save.
Preserve progress and load sections independently
Hive keeps expense drafts across app restarts, and leaving an unfinished form offers a save-draft option. Home sections have independent loading and error states, allowing available results to appear while other requests are still running.
Keep shared spending in its conversation
Expense and settlement records also appear as chat cards, giving friends and groups context for a balance. The current Flutter chat flows use REST; the backend also includes a Socket.IO gateway for live messaging.
04 / outcome
Where the work stands
Built a personal product spanning mobile UX, local persistence, backend services, and money calculations. Core expense, group, chat, insights, and receipt-scanning flows are connected to APIs. Rewards and subscription screens remain previews. Source code is private.