Inspiration

FarmBridge lahir dari evolusi konsep awal kami, "FarmBus" — sebuah marketplace B2B yang menjembatani petani dengan buyer institusional (restoran, kafe, hotel, katering). Kami melihat tiga masalah nyata: petani kehilangan margin signifikan karena bergantung pada tengkulak, buyer institusional kesulitan menilai kredibilitas petani baru karena testimoni konvensional tidak mencerminkan konsistensi operasional, dan negosiasi harga masih terjadi manual lewat WhatsApp tanpa acuan harga wajar bagi kedua pihak. Nama "FarmBridge" merepresentasikan tiga pilar yang ingin kami jembatani: kepercayaan lewat data transaksi riil (bukan testimoni), asimetri informasi harga lewat rekomendasi harga di titik keputusan, dan hubungan jangka panjang lewat pesanan berulang.

What it does

FarmBridge menghubungkan petani langsung dengan buyer institusional lewat:

  • Trust Score tiga-dimensi — on-time delivery rate, rejection rate, dan fulfillment consistency ditampilkan terpisah (bukan satu skor gabungan), dihitung dari data transaksi riil dengan rolling window 90 hari, supaya buyer bisa menilai berdasarkan dimensi yang relevan bagi kebutuhannya.
  • Rekomendasi harga rule-based yang muncul langsung di dalam thread chat negosiasi, terlihat simetris oleh buyer maupun petani — transparansi dua arah adalah prinsip desain, bukan fitur tambahan.
  • Negosiasi terstruktur dengan state machine formal (Counter/Accept/Decline) dan auto-expiry 6 jam, plus jalur Buy Now untuk beli langsung tanpa tawar-menawar.
  • Recurring Order — buyer dan petani bisa mengunci kesepakatan berulang, dengan notifikasi H-1 ke petani untuk konfirmasi, reschedule, atau pause.
  • Buyer Profile dengan metrik kredibilitas nyata (total pengadaan, fulfillment rate, volume bulanan rata-rata) yang ditampilkan ke petani — supaya kepercayaan tidak hanya berlaku satu arah.
  • Onboarding tanpa login/password — cukup pilih peran (petani/buyer) dan isi nama, langsung masuk aplikasi.

How we built it

Kami tim berempat dengan pembagian peran yang jelas: Hafizh sebagai project lead, full-stack, dan pemegang integration branch; Nevan di backend/infrastruktur; Fachri di frontend Flutter; dan Alexander di desain.

  • Frontend: Flutter dengan satu codebase untuk kedua peran (farmer & buyer), navigasi role-based lewat GoRouter.
  • Backend: Supabase — Postgres untuk data transaksional relasional, Auth (Anonymous Auth + Row Level Security per peran), Storage untuk foto listing, dan Edge Functions (Deno) untuk logic rekomendasi harga dan job terjadwal.
  • Realtime: Supabase Realtime untuk sinkronisasi chat negosiasi dan notifikasi tanpa polling.
  • Scheduled jobs: pg_cron memicu Edge Function untuk auto-expire negosiasi (6 jam) dan trigger siklus recurring order.
  • Notifikasi: Firebase Cloud Messaging untuk push saat aplikasi di background.
  • Desain & planning: 42 screen Figma sebagai source of truth, di-cross-check berulang kali terhadap PRD; breakdown kerja terstruktur lewat JIRA (13 sprint) dengan choreography merge nevan_dev → hafizh_dev → fachri_dev → main, dijaga oleh gate check (flutter analyze, supabase db push --dry-run) sebelum setiap merge ke main.

Challenges we ran into

  • Waktu 30 jam hackathon memaksa kami memprioritaskan dengan tegas — beberapa fitur sengaja kami nyatakan out of scope untuk MVP.
  • PRD berevolusi beberapa kali setelah deep-dive ulang ke Figma — misalnya model fulfillment awalnya kami asumsikan dua langkah (buyer QC dulu), ternyata desain aslinya satu langkah (petani fulfill langsung final); model auth juga berubah total dari email+password menjadi role-picker tanpa login sama sekali, tetap memakai Supabase Anonymous Auth di baliknya agar RLS tidak berubah.
  • Koordinasi skema database lintas anggota tim — misalnya kolom device_token untuk FCM perlu disepakati Nevan dan Hafizh sebelum migration ditulis, supaya tidak terjadi migration susulan atau konflik edit pada file yang sama.
  • Menjaga RLS tetap ketat namun fleksibel — negosiasi dan transaksi harus privat antar buyer, sementara trust_metrics dan buyer_metrics harus bisa dibaca publik tapi hanya bisa ditulis oleh pemiliknya.
  • Beberapa gap lolos dari perencanaan awal — UI konfirmasi H-1 untuk petani pada recurring order belum sempat mendapat ticket resmi, dan endpoint GET /negotiations untuk chat inbox sempat diimplementasikan informal sebelum tercatat di PRD.

Accomplishments that we're proud of

  • Sistem kepercayaan yang benar-benar dua arah — baik petani maupun buyer melihat metrik nyata berbasis data transaksi, bukan rating bintang subjektif satu arah.
  • Transparansi harga yang ditanam langsung di titik keputusan negosiasi, bukan sekadar fitur tempelan.
  • Onboarding tanpa friksi (tanpa login) yang tetap menjaga keamanan lewat RLS berbasis Supabase Anonymous Auth.
  • Audit sistematis terhadap 46 ticket JIRA non-epic — seluruhnya berhasil dipetakan dengan benar ke sprint dan assignee yang tepat tanpa mismatch.

What we learned

  • Field customfield_10020 di JIRA (bukan field bernama "sprint") menyimpan data sprint — jebakan kecil yang bisa bikin query salah kalau tidak tahu.
  • Query Figma API ke root node file besar bisa menghabiskan rate limit sebelum dapat data frame yang berguna — lebih efisien menarget node ID spesifik.
  • Disiplin choreography merge dengan gate check di setiap tahap jauh lebih efektif mencegah error menular antar sprint dibanding memperbaikinya belakangan.

What's next for FarmBridge

  • Memformalkan keputusan untuk gap UI konfirmasi H-1 petani pada recurring order.
  • Mendokumentasikan secara tertulis keputusan scope untuk edge case yang belum tercakup penuh.
  • Menyelesaikan verifikasi QA visual Figma untuk beberapa frame yang masih belum terkonfirmasi.
  • Eksplorasi pasca-MVP: moderasi konten listing, metrik buyer_cancellation_rate, dan kolom analitik negotiations.origin untuk membedakan rasio Buy Now vs negosiasi manual.

Built With

  • dart
  • deno
  • figma
  • firebase-cloud-messaging
  • flutter
  • go-router
  • pg-cron
  • postgresql
  • riverpod
  • row-level-security
  • supabase
  • supabase-auth
  • supabase-edge-functions
  • supabase-realtime
Share this project:

Updates