Find street vendors near you, see what they sell, and see which streets they're allowed to trade on.
3rd place · GENETIC 2024
Download the APK · Live API · Vendor app · API source
Location flow
device GPS → PUT /api/users/location → GET /api/pedagang/show-all
→ server-side haversine distance + prohibited-zone containment
→ client renders markers and overlay
- Nearby vendors on a map, with server-computed distance
- Vendor profiles, menus and prices
- Prohibited-zone overlay
- Cart, orders and vendor subscriptions
- OTP registration, ratings and reviews
Three months of field research relocated the problem from discovery to regulation: vendors are fined for trading in zones that were never communicated to them. That is why zone data is a first-class API resource rather than a map decoration.
Team lead. Code ownership by area:
Primary author — cart, payment, subscriptions and chat screens; the whole auth flow (onboarding, login, register, OTP); vendor detail; profile; the map/home screen; the vendor API client.
Shared — order and explore screens.
Non-code: the field research and the proposal the entry was judged on.
Limitation: never reached real vendors. No users, no adoption, no production deployment.
Two Flutter apps against one Laravel API — separate apps rather than role-switching, because the audiences share almost no screens and one assumes movement while the other assumes a fixed stall.
Feature structure. Every screen is a GetX triad: *_binding.dart, *_controller.dart, *_view.dart, with model/ and widget/ beside it. Controllers are registered with Get.lazyPut in the binding, and the binding is attached to the route in app/router/app_pages.dart, so a controller constructs on push and disposes on pop.
Networking. One Dio instance (api/dio_instance.dart) with BaseOptions and an InterceptorsWrapper handling request and error paths centrally. The bearer token is injected per call behind an isAuthorize flag rather than globally, so public endpoints carry no credentials.
API layer is split by domain — auth, cart, pedagang — each with model/ and service/. Responses are typed via json_serializable.
Geo is resolved server-side in PedagangController::distance() — distance and zone containment are computed by the API, and the Maps key is used only for rendering.
flutter pub get
flutter run
flutter build apk --release --split-per-abiRequires a Google Maps API key in android/app/src/main/AndroidManifest.xml.
- No automated tests.
- Location permission denial is handled by a prompt, not a degraded browse mode.