Inspiration

As a student, I've often found myself wanting a quick, affordable meal but having to sift through sponsored placements and overpriced options on other food apps. I wanted to build a solution that puts the user's budget first. That idea became ForFood: a marketplace that ranks restaurants by price, then distance, then rating, ensuring that a user searching for a cheap meal actually sees the most affordable options near them.

What it does

ForFood is a two-sided marketplace app for budget-conscious diners and the restaurants that want to serve them.

For Diners: Users search for food by craving, budget, and location. The unique "budget-first" search algorithm ranks results by cheapest price first. Users add items to a single-restaurant cart, check out for delivery or pickup, track their order in real-time, chat directly with the restaurant, and leave reviews. The app also remembers a user's "usual" order for one-tap reordering.

For Restaurants: Restaurants get a dashboard to manage their menu, view incoming orders, progress them through a kitchen workflow (accepted → preparing → ready → completed), chat with customers, and view performance stats like revenue and top-selling items.

How we built it

Built solo using Flutter for the cross-platform mobile app and Firebase as the backend (Authentication, Firestore, Cloud Messaging).

  • State Management: BLoC pattern (flutter_bloc) for clean, predictable state.
  • Data Layer: All Firestore interactions abstracted through a single FirestoreProvider repository.
  • Map & Location: flutter_map with Geoapify tiles and OpenStreetMap. The core "nearby" search uses a custom Geohash encoder and neighbour query to efficiently find restaurants within a geographic grid.
  • RevenueCat: The restaurant subscription is powered by the RevenueCat SDK (purchases_flutter). Uses a Test Store configuration, allowing the full purchase and entitlement flow to be demonstrated without a public app store release — ideal for the Next Gen Award.

Challenges we ran into

The biggest technical challenge was efficient spatial search. Querying Firestore by location isn't straightforward. I solved it by building a custom geohashing utility that encodes latitude and longitude into a string, enabling fast prefix-range queries in Firestore to find restaurants within a neighbourhood.

Another challenge was performance. I addressed this with parallel data fetching using Future.wait (instead of sequential requests) and by adding disk caching for map tiles and images, which significantly speeds up repeat visits.

Accomplishments that we're proud of

Building and shipping a complete two-sided marketplace app as a solo developer:

  • A unique budget-first search algorithm
  • A full order lifecycle with real-time tracking and in-app chat
  • RevenueCat SDK integration for subscriptions and entitlements
  • A robust architecture using BLoC + a single-repository data layer

What we learned

This project deepened my understanding of building complex, data-driven mobile apps. I learned the importance of clean architecture when managing state across two very different user roles. I also gained practical experience integrating third-party SDKs like RevenueCat, and solving real-world problems like spatial indexing with geohashing.

What's next for ForFood

Adding a driver-specific role with live courier tracking, integrating Stripe for card payments (currently cash on delivery only), and expanding restaurant subscription tiers.

Awards Targeted

  • Next Gen Award

Built With

Share this project:

Updates

Submission history