Inspiration

Every week, SPPG kitchens under Indonesia's Makan Bergizi Gratis (MBG) program buy hundreds of kilograms of fresh produce, often from distant distributors, at higher prices, with longer delivery times. Meanwhile, farmers growing those exact vegetables live twenty minutes away in Garut. The problem isn't supply, it's that the two sides have no channel to find each other. Farmers have no apps, no dashboards, no sales teams. What they do have is WhatsApp.

What it does

Tanitera connects MBG kitchens directly with local farmers, without asking farmers to install anything. SPPG staff post ingredient needs on a web dashboard. Tanitera finds every registered farmer within a 30 km radius using geospatial matching and broadcasts the demand straight to their WhatsApp. Farmers reply according to the format given . The dashboard ranks every offer by distance and price next to the raw message. One click confirms the deal, sends the farmer a pickup schedule via WhatsApp, and logs it in the kitchen's procurement history.

How we built it

The web app is Next.js (App Router) with Tailwind CSS and shadcn/ui, deployed on Vercel. Data lives in Supabase (PostgreSQL) with the PostGIS extension powering distance-based matching and ranking through SQL views and functions. WhatsApp runs through Fonnte, its API sends demand broadcasts, and its webhook delivers farmer replies to our API routes. Incoming messages are parsed by Gemini Flash (temperature 0, JSON mode) with a deterministic regex fallback. The AI extracts, the code calculates, and it never invents numbers. Supabase Realtime pushes new offers to the dashboard live.

Challenges we ran into

Parsing real farmer language was the hardest part: a price regex that split "8000" into 8 + 000, short commodity names like "kol" silently dropped by a minimum-length rule, and replies that don't fit any format at all, as in some farmers decline in Sundanese ("teu aya"), which our parser still doesn't handle reliably. That failure mode is exactly why we added the manual review queue: unparseable messages are stored for staff instead of being silently dropped. Our first ranking formula also failed in an important way, min-max normalization let a Rp 80,000/kg offer outrank a Rp 10,000/kg one on a trivial distance advantage, so we replaced it with proportional ratio-based scoring against the 30 km service radius and the lowest price.

Accomplishments that we're proud of

A real end-to-end WhatsApp round-trip: broadcast a demand, get a messy human reply, and watch it appear parsed, scored, and ranked on the dashboard in real time. We're also proud that unmatched offers are never silently dropped, they land in a review queue for staff, and that the whole ranking is explainable SQL, not a black box.

What we learned

No public dataset contains individual farmer phone numbers, onboarding has to go through institutions that already hold that trust and contact data (Gapoktan and BUMDes), which shaped our B2B2C go-to-market. We also learned to let AI do only what it's good at: extraction stays with the model, every calculation stays deterministic.

What's next for Tanitera

A pilot with one SPPG kitchen in Garut and one Gapoktan partner; then a trust layer: payments, delivery confirmation, and farmer reliability scores, then scaling kitchen-by-kitchen across West Java's MBG network.

Built With

Share this project:

Updates