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
FirestoreProviderrepository. - Map & Location:
flutter_mapwith 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
- cloud-firestore
- dart
- firebase
- firebase-auth
- firebase-cloud-messaging
- flutter
- flutter-bloc
- flutter-map
- geohash
- geolocator
- openstreetmap
- revenuecat
Log in or sign up for Devpost to join the conversation.