<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aghazie David</title>
    <description>The latest articles on DEV Community by Aghazie David (@aghazie_david_4dc30f4c9a8).</description>
    <link>https://dev.to/aghazie_david_4dc30f4c9a8</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4176563%2F2a3d0ba9-75d7-4e47-9a8c-aa63e0b32f53.png</url>
      <title>DEV Community: Aghazie David</title>
      <link>https://dev.to/aghazie_david_4dc30f4c9a8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aghazie_david_4dc30f4c9a8"/>
    <language>en</language>
    <item>
      <title>Kwota: a Nigerian plumber talks through the job in Pidgin, and the customer gets a priced quote on WhatsApp</title>
      <dc:creator>Aghazie David</dc:creator>
      <pubDate>Mon, 19 Oct 2026 01:06:59 +0000</pubDate>
      <link>https://dev.to/aghazie_david_4dc30f4c9a8/kwota-a-nigerian-plumber-talks-through-the-job-in-pidgin-and-the-customer-gets-a-priced-quote-on-1f04</link>
      <guid>https://dev.to/aghazie_david_4dc30f4c9a8/kwota-a-nigerian-plumber-talks-through-the-job-in-pidgin-and-the-customer-gets-a-priced-quote-on-1f04</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;In Nigeria, if your tap is leaking, you call a plumber you know. He comes, looks under the sink, says "e no too bad", and tells you he'll "send you the price". Then the price arrives two days later, or not at all, often as a voice note or a photo of a page torn from an exercise book.&lt;/p&gt;

&lt;p&gt;That gap between &lt;em&gt;looking at the job&lt;/em&gt; and &lt;em&gt;sending the quote&lt;/em&gt; is where artisans lose work. Writing quotes is unpaid evening work. A slow quote goes to the next plumber, and a handwritten one looks less trustworthy than it should.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kwota&lt;/strong&gt; (it's how "quote" sounds when you say it in Pidgin) closes that gap before the artisan leaves the customer's gate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The plumber, painter or tiler walks the job and &lt;strong&gt;talks&lt;/strong&gt;, the way he already sends voice notes: &lt;em&gt;"Madam, the kitchen tap dey leak for two points. I go change three lengths of half inch pipe, plus four elbows. Workmanship na fifteen thousand."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Kwota transcribes it (Pidgin, Yoruba, Hausa, Igbo or Nigerian English) and maps it onto &lt;strong&gt;his own price list&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It shows every number it heard and the exact words each came from, so he can confirm.&lt;/li&gt;
&lt;li&gt;One tap makes a clean PDF quote with his business name, and opens WhatsApp with the quote already typed out for the customer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Who pays?&lt;/strong&gt; Independent artisans: plumbers, painters, tilers, AC technicians and electricians. There are millions of them, and their whole business already runs on WhatsApp. A neat quote that lands in ten minutes wins jobs. The model I have in mind is a small monthly fee (around ₦1,500, about the cost of a recharge card), or pay-per-quote for artisans who only quote a few times a month.&lt;/p&gt;

&lt;p&gt;Two rules shaped everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kwota never invents a price.&lt;/strong&gt; Every naira on the quote comes from the artisan's own editable price list, or from an amount he said out loud, and that line is flagged so he double-checks it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kwota never guesses sizes from photos.&lt;/strong&gt; Photos help describe the scope ("water-stained ceiling, rusted pipe under the sink"), but measurements have to be spoken and confirmed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live on Hugging Face Spaces (free ZeroGPU): &lt;strong&gt;&lt;a href="https://huggingface.co/spaces/Cipoklean/kwota" rel="noopener noreferrer"&gt;https://huggingface.co/spaces/Cipoklean/kwota&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open it, pick a trade (plumber, painter or tiler sample price lists), then record or type the job. A typed run of the voice note above gives:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Qty&lt;/th&gt;
&lt;th&gt;Unit price&lt;/th&gt;
&lt;th&gt;Amount&lt;/th&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Leak repair labour&lt;/td&gt;
&lt;td&gt;2 point&lt;/td&gt;
&lt;td&gt;₦6,000&lt;/td&gt;
&lt;td&gt;₦12,000&lt;/td&gt;
&lt;td&gt;✓ heard "two points"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;½ inch PVC pressure pipe&lt;/td&gt;
&lt;td&gt;3 length&lt;/td&gt;
&lt;td&gt;₦3,800&lt;/td&gt;
&lt;td&gt;₦11,400&lt;/td&gt;
&lt;td&gt;✓ heard "three lengths"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elbow / bend fitting&lt;/td&gt;
&lt;td&gt;4 pc&lt;/td&gt;
&lt;td&gt;₦700&lt;/td&gt;
&lt;td&gt;₦2,800&lt;/td&gt;
&lt;td&gt;✓ heard "four"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workmanship&lt;/td&gt;
&lt;td&gt;1 job&lt;/td&gt;
&lt;td&gt;₦15,000&lt;/td&gt;
&lt;td&gt;₦15,000&lt;/td&gt;
&lt;td&gt;⚠ price you said&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then &lt;strong&gt;Make the quote&lt;/strong&gt; produces the PDF (with a proper ₦ sign, which needed a bundled font) and a &lt;code&gt;wa.me&lt;/code&gt; link with the message ready to send.&lt;/p&gt;

&lt;p&gt;There's also a &lt;strong&gt;Test the ear&lt;/strong&gt; tab. Upload a batch of voice notes and the numbers each one &lt;em&gt;should&lt;/em&gt; contain, and it scores how well the speech model kept them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/cipoklean" rel="noopener noreferrer"&gt;
        cipoklean
      &lt;/a&gt; / &lt;a href="https://github.com/cipoklean/kwota" rel="noopener noreferrer"&gt;
        kwota
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
  &lt;tr&gt;
    &lt;th&gt;title&lt;/th&gt;
    &lt;td&gt;Kwota&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;emoji&lt;/th&gt;
    &lt;td&gt;🧾&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;colorFrom&lt;/th&gt;
    &lt;td&gt;green&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;colorTo&lt;/th&gt;
    &lt;td&gt;gray&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;sdk&lt;/th&gt;
    &lt;td&gt;gradio&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;sdk_version&lt;/th&gt;
    &lt;td&gt;6.30.0&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;python_version&lt;/th&gt;
    &lt;td&gt;3.12&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;app_file&lt;/th&gt;
    &lt;td&gt;app.py&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;pinned&lt;/th&gt;
    &lt;td&gt;false&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;license&lt;/th&gt;
    &lt;td&gt;mit&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;short_description&lt;/th&gt;
    &lt;td&gt;Talk a job through in Pidgin, send a quote on WhatsApp&lt;/td&gt;
  &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🧾 Kwota: talk your quote&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Kwota turns a Nigerian artisan's walk-through voice note into a clean, priced quote
they can send on WhatsApp before leaving the customer's gate.&lt;/p&gt;
&lt;p&gt;A plumber, painter or tiler inspects the job, takes a few photos and talks
&lt;em&gt;"Madam, the kitchen tap dey leak for two points. I go change three lengths of half inch pipe, four elbows."&lt;/em&gt;
Kwota hears it, maps it onto &lt;strong&gt;the artisan's own price list&lt;/strong&gt;, shows every number it heard
for a quick check, then makes a PDF and opens WhatsApp with the quote typed out.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Quoting is unpaid evening work. Slow quotes lose jobs, and handwritten ones look less
trustworthy than they should. Most artisans already run…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/cipoklean/kwota" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Plain Python and Gradio: &lt;code&gt;kwota/asr.py&lt;/code&gt; (speech), &lt;code&gt;kwota/numbers.py&lt;/code&gt; (quantity extraction), &lt;code&gt;kwota/quote.py&lt;/code&gt; (price lists, the Gemma draft and its validator), &lt;code&gt;kwota/llm.py&lt;/code&gt; (Gemma backends), &lt;code&gt;kwota/document.py&lt;/code&gt; (PDF and WhatsApp). 15 tests cover the number and quote logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;voice note ──► NaijaVox-2.0 (open ASR: Pidgin, Yoruba, Hausa, Igbo, Nigerian English)
                    │
photos ──► Gemma 3 (multimodal) ──► one-line job scope (never sizes, never prices)
                    │
transcript ──► Gemma 3 12B ──► line items chosen from YOUR price list, as JSON
                    │
          numbers.py ──► every quantity actually heard, plus the words it came from
                    │
    confirm screen: anything unheard is flagged, and everything is editable
                    │
            PDF quote + wa.me link
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Listening: NaijaVox-2.0.&lt;/strong&gt; An open speech model trained on Nigerian speech. Whisper-style models trained mostly on global English fall apart on "e dey leak for two points". Long voice notes get cut into 28-second chunks with overlap, so nothing falls between the cracks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thinking: Gemma 3 12B&lt;/strong&gt; (&lt;code&gt;unsloth/gemma-3-12b-it&lt;/code&gt;, an ungated mirror), running on the Space's ZeroGPU. Gemma gets the transcript and the price list (ids, units, aliases, but &lt;strong&gt;no prices&lt;/strong&gt;) and returns JSON: which item ids were mentioned, the quantity, and the exact words it came from. It also writes the one-sentence job description, and reads photos when they're attached. The same code runs offline through Ollama (&lt;code&gt;gemma3:4b&lt;/code&gt;) on a laptop, which matters for an artisan who doesn't want his customers' data on someone else's server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not trusting the model: &lt;code&gt;validate()&lt;/code&gt; + &lt;code&gt;numbers.py&lt;/code&gt;.&lt;/strong&gt; This is the part I'm proudest of, because speech recognition &lt;em&gt;will&lt;/em&gt; get words wrong. NaijaVox's own benchmark puts Pidgin word error at roughly one word in seven, and a misheard number costs the artisan real money. So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;numbers.py&lt;/code&gt; deterministically pulls out every quantity in the transcript: digits, English number words, &lt;strong&gt;Yoruba, Hausa and Igbo counting words&lt;/strong&gt; (&lt;em&gt;eeji&lt;/em&gt; = 2, &lt;em&gt;biyu&lt;/em&gt; = 2, &lt;em&gt;biyar&lt;/em&gt; = 5...), units like lengths, bags, cartons and buckets, and dimensions like "twelve by fifteen feet" (read as 180 sq ft).&lt;/li&gt;
&lt;li&gt;"Half inch pipe" is a size, not a quantity of 0.5, so pipe sizes are excluded.&lt;/li&gt;
&lt;li&gt;"Thirteen" and "thirty" are kept strictly apart, because they're the classic mishearing.&lt;/li&gt;
&lt;li&gt;Gemma's quantity has to match a number that was actually heard. If it doesn't, the line is flagged &lt;code&gt;⚠ check qty&lt;/code&gt;. If Gemma picks an id that isn't on the list, it's dropped. Prices are always looked up, never generated.&lt;/li&gt;
&lt;li&gt;If Gemma is down or returns junk, a rule-based alias matcher (with fuzzy matching for NaijaVox spelling drift like "cistan" and "emulshon") drafts the quote instead, and the UI says why.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A bug worth telling.&lt;/strong&gt; During the final test, &lt;em&gt;"Workmanship na fifteen thousand"&lt;/em&gt; produced a quote of &lt;strong&gt;₦150,000,000&lt;/strong&gt;. The matcher read "fifteen thousand" as fifteen thousand call-outs at ₦10,000 each. That's exactly the failure this whole design exists to catch, and it slipped through anyway. Now a bare amount of a thousand or more is treated as naira, never as a count. On a per-job line it becomes the price the artisan said, flagged for him to confirm, and a test pins it down. Any plumber who saw a ₦150m quote would have closed the app forever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory without a server.&lt;/strong&gt; The business name, phone number and edited price list live in the artisan's own browser (Gradio &lt;code&gt;BrowserState&lt;/code&gt;). Kwota has no database and no account to create.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Because the people Kwota serves are exactly who closed AI handles worst, and can least afford.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language.&lt;/strong&gt; The voice notes are in Pidgin, with Yoruba and Hausa numbers mixed in. NaijaVox exists because people trained an &lt;em&gt;open&lt;/em&gt; model on Nigerian speech and published it. I couldn't fine-tune a closed API to tell &lt;em&gt;eeji&lt;/em&gt; from &lt;em&gt;eeta&lt;/em&gt;, but I can build on a model the community already tuned.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost.&lt;/strong&gt; A ₦1,500-a-month product can't pay per-token cloud bills on every voice note. Open weights let Kwota run on free ZeroGPU today, on a cheap GPU later, or fully offline on a laptop with Ollama, at zero marginal cost per quote. That's the difference between a business that works in naira and one that doesn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data.&lt;/strong&gt; Quotes contain customers' names, phone numbers and what's broken in their homes. With an open model, the artisan can keep all of that on his own machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trust and control.&lt;/strong&gt; With a model I can run and inspect, I could wrap it in deterministic checks and decide exactly what it's allowed to touch: item ids, never prices. With an open model, the guardrails are mine to build, not a black box's promise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No lock-in.&lt;/strong&gt; If Gemma 4 or a better Nigerian ASR model ships next month, it's one environment variable to switch.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;: Gemma 3 12B drafts every quote, as structured JSON constrained to the artisan's price list, and reads job photos for scope. The same pipeline runs on Ollama with &lt;code&gt;gemma3:4b&lt;/code&gt; for offline use.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Built solo in Nigeria. If you know an artisan who quotes by voice note, send them the link. I'd love to hear what they'd want next.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Ugbo: Ask Your Farm in Pidgin, Go Outside</title>
      <dc:creator>Aghazie David</dc:creator>
      <pubDate>Mon, 12 Oct 2026 00:33:41 +0000</pubDate>
      <link>https://dev.to/aghazie_david_4dc30f4c9a8/ugbo-ask-your-farm-in-pidgin-go-outside-1boh</link>
      <guid>https://dev.to/aghazie_david_4dc30f4c9a8/ugbo-ask-your-farm-in-pidgin-go-outside-1boh</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;For most people, "touch grass" is a joke. For millions of smallholder farmers in Nigeria, the grass is the job, and getting it wrong costs a season.&lt;/p&gt;

&lt;p&gt;The question every farmer asks at this time of year is simple: "Rain don start. Make I plant maize now?" Plant too early, on a false start, and the seedlings die in the dry spell that follows. Wait too long and you miss the window. The answer depends on how much rain actually fell in your village, what's coming this week, and what the season allows for your crop. That information exists, but it lives in English-language weather apps and extension PDFs, not in the languages farmers speak.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ugbo&lt;/strong&gt; (Igbo for "farm") is a voice-first weekly field plan. A farmer picks their town and crops, asks a question in Nigerian Pidgin, Hausa, Yorùbá, Igbo or English, and Ugbo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Checks the real rain at their village for the last 14 days and the next 7&lt;/li&gt;
&lt;li&gt;Works out what the season allows for each crop in their zone (South, Middle Belt, North)&lt;/li&gt;
&lt;li&gt;Speaks back a short plan in a Nigerian voice, ending with &lt;strong&gt;the one job to do in the field today&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The screen is the shortest part of the experience. Ask, listen, go to the farm.&lt;/p&gt;

&lt;p&gt;A real answer for Suleja (Niger State), maize and yam, this week:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;See your week for Suleja. Rain wey fall for the last 14 days: 85 mm. Rain wey go fall for the next 7 days: 17 mm. The soil don wet well well. How sure: I sure. For your maize, na time to harvest. For your yam, na time to harvest... The main work for today: Waka round your farm, check for weed and insect.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live app: &lt;a href="https://cipoklean-ugbo.hf.space/" rel="noopener noreferrer"&gt;https://cipoklean-ugbo.hf.space/&lt;/a&gt;&lt;br&gt;
Hugging Face Space: &lt;a href="https://huggingface.co/spaces/Cipoklean/ugbo" rel="noopener noreferrer"&gt;https://huggingface.co/spaces/Cipoklean/ugbo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try it: set your town, tick your crops, pick a language, type or say "Make I plant maize now?" and tap &lt;strong&gt;Get my week plan&lt;/strong&gt;. The plan plays aloud automatically.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/cipoklean" rel="noopener noreferrer"&gt;
        cipoklean
      &lt;/a&gt; / &lt;a href="https://github.com/cipoklean/ugbo" rel="noopener noreferrer"&gt;
        ugbo
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
  &lt;tr&gt;
    &lt;th&gt;title&lt;/th&gt;
    &lt;td&gt;Ugbo&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;emoji&lt;/th&gt;
    &lt;td&gt;🌱&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;colorFrom&lt;/th&gt;
    &lt;td&gt;green&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;colorTo&lt;/th&gt;
    &lt;td&gt;yellow&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;sdk&lt;/th&gt;
    &lt;td&gt;gradio&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;sdk_version&lt;/th&gt;
    &lt;td&gt;6.30.0&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;python_version&lt;/th&gt;
    &lt;td&gt;3.12&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;app_file&lt;/th&gt;
    &lt;td&gt;app.py&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;pinned&lt;/th&gt;
    &lt;td&gt;false&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;th&gt;license&lt;/th&gt;
    &lt;td&gt;mit&lt;/td&gt;
  &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌱 Ugbo — talk to your farm&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Ugbo&lt;/em&gt; means "farm" in Igbo.&lt;/p&gt;
&lt;p&gt;Ugbo is a voice-first weekly field plan for smallholder farmers in Nigeria
A farmer taps one button and asks, in Pidgin, Hausa, Yorùbá, Igbo or English,
something like &lt;em&gt;"Rain don start, make I plant maize now?"&lt;/em&gt; Ugbo checks the real
rain at their village, works out what the season allows for their crops, and
&lt;strong&gt;speaks back&lt;/strong&gt; a short plan that ends with the one job to do in the field today.&lt;/p&gt;
&lt;p&gt;The screen is the shortest part of the experience. Ask, listen, go to the farm.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://huggingface.co/spaces/Cipoklean/ugbo" rel="nofollow noopener noreferrer"&gt;huggingface.co/spaces/Cipoklean/ugbo&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt; 🎤 voice ──► NaijaVox-2.0 (open ASR) ──► question text
                                              │
 town ──► Open-Meteo / MET Norway / NASA POWER ──► rain facts (14 days back, 7&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/cipoklean/ugbo" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; voice ──► NaijaVox-2.0 (open ASR) ──► question text
 town  ──► Open-Meteo / MET Norway / NASA POWER ──► rain facts
 crops ──► plain-rule Nigerian crop calendar ──► this week's signals
                 Gemma 3 12B (open weights) ──► plan in the farmer's language
                 fact check ──► templated plan if Gemma drifts
                 Nigerian neural voice ──► spoken plan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Listening: NaijaVox-2.0.&lt;/strong&gt; An Apache-2.0 Whisper-large-v3 fine-tune for Nigerian languages. Ugbo echoes back "You asked: ..." so a farmer can catch a mishearing before acting on the answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thinking: rules decide the facts, Gemma decides the words.&lt;/strong&gt; This was the most important design choice. A language model should never invent a planting date for someone whose harvest depends on it. So the facts come from transparent rules in &lt;code&gt;season.py&lt;/code&gt;: planting and harvest windows per crop and zone, heavy-rain warnings (don't spray or fertilize before 25 mm+), dry-spell checks, and a soil-moisture estimate from rain minus evapotranspiration.&lt;/p&gt;

&lt;p&gt;Gemma 3 12B, running in-process on Hugging Face ZeroGPU, only explains those facts in the farmer's language. Then Ugbo checks Gemma's work: &lt;strong&gt;every number in its answer must appear in the facts it was given.&lt;/strong&gt; If Gemma invents a rainfall figure or a fertilizer rate, its answer is thrown away and a templated plan built from the rules is used instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Catching false starts.&lt;/strong&gt; Early rain followed by a dry spell is the classic way to lose a season. Ugbo only treats the rains as established after 3+ rainy days in the last week, 20 mm+ in two weeks, and no 4-day dry spell in the forecast. Until then it says "wait", and every plan says how sure it is: sure, fairly sure, or not sure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always answering.&lt;/strong&gt; Free GPU quota runs out, and a farmer shouldn't get an error. When Gemma is unavailable, Ugbo answers from the rules: a hand-written Pidgin template, machine-translated Hausa, Yorùbá and Igbo, or English.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speaking.&lt;/strong&gt; I first used the phone's built-in Web Speech voice, then found it didn't play on my own Android phone. The web app now uses a Nigerian English neural voice for English and Pidgin and a Hausa voice for Hausa, delivered as a small MP3 that plays in any browser. The CLI can still speak with open voices (Naija TTS and Meta's MMS-TTS), which I'd like to bring back to the web app once I can afford the GPU time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free to run.&lt;/strong&gt; Every weather source is free and keyless. The whole thing runs on a free Hugging Face Space, and the Gemma backend is swappable: &lt;code&gt;ollama&lt;/code&gt; for fully local, or hosted Gemma when you don't have the hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Because the people Ugbo is for are the people closed AI forgets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nigerian languages exist in open models because Nigerians built them.&lt;/strong&gt; NaijaVox, Naija TTS and MMS exist because researchers fine-tuned and released open weights for Pidgin, Hausa, Yorùbá and Igbo. No closed speech API I looked at understood a Pidgin farm question as well, and I couldn't have fine-tuned one if it didn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I can make the model behave.&lt;/strong&gt; With open weights I control the whole pipeline: the prompt, the fact check, the fallback. I can guarantee Ugbo never states a number the rules didn't produce. That matters more than eloquence when the advice is about someone's harvest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; A farmer in Suleja shouldn't need a credit card, and neither should the developer serving them. Open weights on free compute, free open weather data, and an MIT license mean any extension office, co-op or student can fork it and run it for their own state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It can go where farmers are.&lt;/strong&gt; Gemma runs on &lt;code&gt;ollama&lt;/code&gt; on a laptop. The next step is a WhatsApp voice-note or phone-call front end served from a cheap local machine, so farmers without smartphones or steady data can ask too. A closed API would make every one of those calls a bill.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's not done yet.&lt;/strong&gt; I haven't measured speech accuracy on real farm questions (Igbo is weaker), and the crop calendar still needs checking row by row against IITA and state ADP calendars. If you speak one of these languages or work in agricultural extension, that's the most useful contribution you could make. CONTRIBUTING.md has the details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma: Gemma 3 12B writes every plan, constrained by a rules engine and a number-level fact check so it explains real data instead of inventing it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Ugbo is a rule of thumb, not a replacement for your local extension officer. Rain data comes from weather models, not a gauge on your farm.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
