© 2026 Java Kanaya

Mone

A mobile finance tracker with split-bill collaboration, built to solve real-world expense tracking among friends.

Repository
Flutter
Firebase
Dart

Overview

Mone is a personal finance tracker designed for simple expense tracking and smart bill splitting among friends. Built with Flutter, Firebase, and Dart, the app allows users to track their expenses, visualize spending patterns through charts, and collaborate with friends to split bills seamlessly.

The app features a friend system where users can add connections by username, create split-bill transactions, and assign specific amounts to each person—or split evenly for faster processing. Mone is fully functional and connected to Firebase for real-time data synchronization.

Project Goals

This project was created as part of a Mobile Programming course. My teammate and I chose to build a finance tracker because we faced this problem ourselves. As friends who hung out together frequently, we constantly paid for each other—coffee, meals, transportation. Over time, the bills built up.

Initially, we tracked everything in a simple notes app, but it quickly became tedious. We had to manually count who owed whom, double-check amounts, and update records every time we met. We realized we needed a better solution—one that could automate the tracking, handle splits intelligently, and keep everything organized in one place.

While we built Mone for ourselves, we knew many people face the same challenge. Our goal was to create an app that solved this problem while learning Flutter and mobile development from the ground up.

Screenshots

Login screen and dashboard with spending charts
Login screen and spending visualization dashboard
Split bill interface
Smart bill splitting with friends

Challenges and How We Overcame Them

The biggest challenge for me was state management in Flutter. Coming from a backend development background, managing UI state with Riverpod was completely new. At first, I struggled to understand how state flows through the app, when to use providers, and how to properly separate business logic from UI code. It took a lot of trial and error—and many "aha" moments—before the patterns finally clicked.

Another challenge was defining our business logic, particularly around edge cases like deletions and updates. What happens when someone deletes a split bill that others have already paid into? How do we handle updates to shared expenses? These scenarios were complex, and we realized we couldn't solve everything within our timeline.

To move forward, we decided to focus on the MVP and prioritize the happy flow. This meant implementing core features—adding friends, creating split bills, and tracking expenses—while postponing edge cases like deletion for future iterations. It wasn't ideal, but it allowed us to deliver a functional product within our course timeline.

I also worked extensively on the transaction UI and charts, building visualizations for income, expenses, and monthly spending trends. Integrating Firebase for real-time synchronization, push notifications, and Crashlytics added another layer of complexity, but it was essential for making the app feel responsive and reliable.

Learnings

This project was my first full-featured Flutter application, and it taught me a great deal about mobile development. I learned how Flutter apps are structured, how navigation works, and how to build responsive UIs that adapt to different screen sizes.

More importantly, I gained a real understanding of state management. While I had encountered the concept before in web frameworks, working with Riverpod in Flutter forced me to think deeply about data flow, reactivity, and separation of concerns. The moments when everything finally clicked felt incredibly rewarding.

I also learned how to integrate Firebase services—Firestore for real-time data, Cloud Messaging for push notifications, and Crashlytics for error tracking. Understanding how mobile apps communicate with backend services and handle asynchronous data was a crucial skill I took away from this project.

Beyond the technical skills, I learned the importance of scoping and prioritization. We couldn't build everything we wanted, so we had to make tough decisions about what to include in the MVP. This taught me how to balance ambition with pragmatism—a lesson that applies to every software project.

Attributions

  • Afiq Fawaz Haidar: Mobile Developer
  • Java Kanaya Prada: Mobile Developer