Inspiration

In Nigeria, feeding a household is the hardest arithmetic most families do every week. Food inflation moves prices constantly, and nobody quotes them in kilograms or grams, they quote them in custard buckets, painters, wraps and dericas.

And that is where the problem with generic meal planning tool lies. Every meal-planning tool assumes clean, structured, metric data. Nigerian food data is a WhatsApp message in pidgin, a chalkboard outside a stall, or a voice note from a vendor who's busy. And no dataset anywhere maps a custard bucket to an actual weight.

What it does

ChopChop — pidgin for eating well — reads market price data the way it actually arrives, learns what local containers mean, and plans a household's week within a naira budget, autonomously.

1. Ingests genuinely messy input. Real WhatsApp pidgin: "beans one painter dae around 5k for iron beans and 8k for brown beans." One clause, two products. It splits them into separate records with grade preserved, flags the hedge on "around", and drops confidence accordingly. When a unit isn't stated, it flags unit_not_stated rather than inventing kilograms.

2. Researches what it doesn't know. When it meets a container with no mapping, a dedicated research sub-agent searches the web. For a custard bucket of garri it found seven distinct figures ranging from 2.2kg to 3.33kg — sources genuinely disagree. It resolved to 2.8kg and scored its own confidence at 0.55, preserving the conflicting values and its reasoning in Firestore. Rice in the same bucket resolves to 4kg: same container, different density. It only learns each container once.

3. Plans while nobody is watching. Cloud Scheduler fires every Sunday at 6am Lagos time. A planner service reads every price and container mapping, produces seven days of realistic Nigerian meals and a costed shopping list, and writes it back. In testing it came in at ₦19,200 against a ₦20,000 budget, and noted that it chose iron beans over brown to save ₦3,000. Nobody opened an app.

How I built it

  • Gemini 3.5 Flash on Vertex AI (global endpoint)
  • Agent Development Kit — a root agent with three Firestore tools, plus a research sub-agent wrapped as an AgentTool. ADK doesn't allow built-in tools like google_search alongside custom function tools on one agent, so delegating search to a sub-agent was both the fix and the better architecture: search stays isolated from writes.
  • Cloud Run — two services, agent and planner, both scaling to zero
  • Firestore — three collections: prices, containers, plans
  • Cloud Scheduler — the weekly autonomous trigger
  • Gemini image generation for the title card

Challenges

Getting search to actually fire. Early runs looked perfect — the agent reported researched container weights with plausible reasoning. But the event trace showed no search calls at all. It was answering from model knowledge and presenting it as research. Restructuring search into a sub-agent fixed it properly rather than papering over it.

Confidence that meant something. The first version scored a hedged price at 0.9 because it had parsed it correctly. Confidence has to answer "how likely is this the real price", not "did I read it right". I rewrote the calibration so hedges cap at 0.7, unstated units at 0.6, and container confidence derives from how much the sources disagreed.

Container units versus natural units. A painter needs a capacity lookup. A tuber does not. Early runs sent the agent off to research "how many litres in a bunch of plantain".

What I learned

That the most valuable thing an agent can do with bad data is refuse to pretend it's good. Every design decision that made ChopChop more useful was about surfacing uncertainty rather than hiding it — flags, confidence scores, preserved contradictions. A flagged record is useful. A confident wrong one is not.

Also that local knowledge is a technical asset, not decoration. "Orobo chicken" (fat chicken)is a grade, not a species. "Red oil" is palm oil. Getting those right was what separated this from a generic extraction demo.

What's next

Voice-first input in pidgin — a market trader will never type into a form, but they'll send a voice note. Multi-vendor price reconciliation across markets. And a household learning loop that adjusts the plan based on what actually got cooked.

Built With

Share this project:

Updates

Submission history