<?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: Academic</title>
    <description>The latest articles on DEV Community by Academic (@academic_efab3f3ad2434623).</description>
    <link>https://dev.to/academic_efab3f3ad2434623</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%2F3869066%2F34d6178e-e4b6-49a2-a50f-92d0cb7bbc04.png</url>
      <title>DEV Community: Academic</title>
      <link>https://dev.to/academic_efab3f3ad2434623</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/academic_efab3f3ad2434623"/>
    <language>en</language>
    <item>
      <title>I Stopped Deciding Dinner — a Sloth Does It Now (आज क्या बनाऊँ?)</title>
      <dc:creator>Academic</dc:creator>
      <pubDate>Wed, 21 Oct 2026 16:19:17 +0000</pubDate>
      <link>https://dev.to/academic_efab3f3ad2434623/i-stopped-deciding-dinner-a-sloth-does-it-now-aaj-kyaa-bnaauun-3p34</link>
      <guid>https://dev.to/academic_efab3f3ad2434623/i-stopped-deciding-dinner-a-sloth-does-it-now-aaj-kyaa-bnaauun-3p34</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;The question that ruins 6 PM every day is not "can I cook?" â€” it is "à¤†à¤œ à¤•à¥à¤¯à¤¾ à¤¬à¤¨à¤¾à¤Šà¤?" (what should I cook today?). Standing in front of an open fridge, recalculating the same inventory for the thousandth time, while hungry. That is decision fatigue, and it costs more energy than the cooking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;à¤†à¤œ à¤•à¥à¤¯à¤¾ à¤¬à¤¨à¤¾à¤Šà¤? (Aaj Kya Banau?)&lt;/strong&gt; ends the ritual:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tick your kitchen once.&lt;/strong&gt; 52 common Indian-kitchen ingredients as checkboxes in four groups â€” atta, chawal, dals, sabzis, dahi, masale. The browser remembers it (Gradio &lt;code&gt;BrowserState&lt;/code&gt;) â€” no account, no server-side storage, nothing leaves your device.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Say how lazy you feel&lt;/strong&gt; â€” &lt;em&gt;à¤•à¤® à¤®à¥‡à¤¹à¤¨à¤¤&lt;/em&gt; caps suggestions at effort 2 out of 5.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Press one button.&lt;/strong&gt; The first card &lt;strong&gt;is&lt;/strong&gt; tonight's dinner. A deterministic matcher picks the top 3 from a &lt;strong&gt;40-recipe open database&lt;/strong&gt;, ranked by fewest missing items, then least effort, then least time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"à¤à¤• à¤šà¥€à¤œà¤¼ à¤²à¥‡ à¤†à¤“"&lt;/strong&gt; (bring just one thing) â€” nothing perfect in the kitchen? Instead of pretending, it shows what is one ingredient away: &lt;em&gt;à¤¬à¤¸ à¤Ÿà¤®à¤¾à¤Ÿà¤° à¤²à¥‡ à¤†à¤“, à¤”à¤° à¤¸à¥ˆà¤‚à¤¡à¤µà¤¿à¤š à¤¬à¤¨ à¤œà¤¾à¤à¤—à¤¾&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma only writes the mood.&lt;/strong&gt; A short Hinglish verdict, a one-line pitch and chef tip per dish, and it parses your genuinely messy free text ("thoda basi chawal hai, aadha gobhi bhi") onto the ingredient vocabulary. &lt;strong&gt;It never chooses recipes and never invents ingredients&lt;/strong&gt; â€” every id in its JSON output is clamped to the database shipped in the repo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model down does not mean dinner down.&lt;/strong&gt; No API key, no network, rate-limited? The matcher still decides; pitches and tips fall back to the recipe database itself. The app works fully offline in mock mode.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://aaj-kya-banau-rcaf.onrender.com/" rel="noopener noreferrer"&gt;https://aaj-kya-banau-rcaf.onrender.com/&lt;/a&gt; (free tier â€” first load may take a minute to wake)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbur4fvxuhon1bfalp4m2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbur4fvxuhon1bfalp4m2.png" alt="Tick your kitchen â€” the browser remembers it" width="800" height="1777"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9oqpqbh2um56wue05zfw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9oqpqbh2um56wue05zfw.png" alt="Free text + how lazy are you today" width="800" height="1777"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1jpc56z47qlomasuliye.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1jpc56z47qlomasuliye.png" alt="Gemma writing the verdict" width="800" height="1777"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FYuser00123%2Faaj-kya-banau%2Fmain%2Fdocs%2Fscreenshots%2F4-dinner.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FYuser00123%2Faaj-kya-banau%2Fmain%2Fdocs%2Fscreenshots%2F4-dinner.png" alt="Tonight's verdict and top 3 cards" width="760" height="6032"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv80uih8lpij1rq15f03o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv80uih8lpij1rq15f03o.png" alt="The one-away shortlist and the shopping list" width="800" height="1777"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A real session from testing: with chawal, dahi, aloo, pyaz, tamatar and basics ticked, plus "thoda basi chawal hai, aadha gobhi bhi" typed in the free-text box, the app picked &lt;strong&gt;à¤¦à¤¹à¥€-à¤šà¤¾à¤µà¤² (5 minutes, zero shopping)&lt;/strong&gt; as tonight's dinner, put &lt;strong&gt;à¤®à¤¸à¤¾à¤²à¤¾ à¤®à¥ˆà¤—à¥€&lt;/strong&gt; second â€” and, because "basi chawal" was parsed onto the vocabulary, &lt;strong&gt;à¤¬à¤¾à¤¸à¥€ à¤šà¤¾à¤µà¤² à¤­à¥à¤¨à¤¾&lt;/strong&gt; (fried rice from yesterday's rice) appeared as card 3. The whole round trip, including Gemma's verdict and pitches, took 88 seconds on the free tier.&lt;/p&gt;

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

&lt;p&gt;Everything is on GitHub (MIT, recipes included): &lt;strong&gt;&lt;a href="https://github.com/Yuser00123/aaj-kya-banau" rel="noopener noreferrer"&gt;https://github.com/Yuser00123/aaj-kya-banau&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kitchen.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;52-ingredient vocabulary + the matcher (all decisions happen here)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;recipes.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the 40-recipe open database â€” plain, editable Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;prompts.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gemma's narrow job: the prompt, the clamp, the offline fallback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;llm.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;provider adapter (any OpenAI-compatible endpoint, Ollama, or mock)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;app.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gradio 6 UI, BrowserState persistence, &lt;code&gt;/health&lt;/code&gt;, PWA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Adding your family's recipe is deliberately boring â€” no JSON, no schema, eight-ish lines of Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nc"&gt;R&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gobhi_paratha&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;à¤—à¥‹à¤­à¥€ à¤ªà¤°à¤¾à¤ à¤¾&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ðŸ«“&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;atta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;phool_gobhi&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pyaz&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adrak&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lasun&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;namak&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gobhi kaddukas karke namak laga ke 10 minute chhod do.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Atta gundh ke parathe banao, bhigote bhar lo.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tawe par ghee ke saath sunhare ho tak seko.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sunday-feeling dinner, aaj hi bana lo.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Kaddukas geela lage to kapde mein kas ke nikaal do â€” paratha phulega.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;verify()&lt;/code&gt; runs on import and refuses to start the app with a bad ingredient id â€” a PR that breaks the kitchen breaks the tests. The test suite is 45 offline checks (matcher rules, veg filter, effort caps, free-text parsing, prompt clamping, the &lt;code&gt;/health&lt;/code&gt; endpoint) that need no API key and no network.&lt;/p&gt;

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

&lt;p&gt;Before writing code I read the week's entries first â€” when I checked, the field was full of file sorters, inbox tidiers and chat digesters. Recipe deciders existed but generic, so the opening was: an Indian-kitchen ground truth (a fixed, realistic ingredient vocabulary) and an open recipe database anyone can extend. That is what the sloth sits on.&lt;/p&gt;

&lt;p&gt;The central design decision: &lt;strong&gt;decisions in code, mood in the model.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The matcher is ~40 lines of pure Python: &lt;code&gt;missing &amp;lt;= 0&lt;/code&gt; means perfect, &lt;code&gt;missing == 1&lt;/code&gt; lands the dish in the one-away list, and a sort key of &lt;code&gt;(missing, fits-sloth-level, effort, minutes)&lt;/code&gt; ranks everything else. If nothing fits today's laziness cap, it relaxes the bar and says so loudly instead of quietly returning nothing.&lt;/li&gt;
&lt;li&gt;Free text gets a deterministic first pass â€” Hindi labels and Roman aliases, longest match first, with matched text consumed so "basi chawal" does not also fire "chawal" â€” and Gemma handles the truly messy rest.&lt;/li&gt;
&lt;li&gt;Gemma makes &lt;strong&gt;one JSON call&lt;/strong&gt; (&lt;code&gt;verdict&lt;/code&gt;, per-recipe &lt;code&gt;pitch&lt;/code&gt;/&lt;code&gt;tip&lt;/code&gt;, &lt;code&gt;parsed_extras&lt;/code&gt;, &lt;code&gt;shopping_line&lt;/code&gt;) through Gemini's OpenAI-compatible endpoint. The response is then &lt;strong&gt;clamped&lt;/strong&gt;: invented recipe ids are dropped, unknown ingredients are dropped, empty fields are filled from the database. The model can flavor the dinner; it cannot change what's for dinner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An AI coding agent did most of the typing on this one â€” the ingredient vocabulary, the matcher rules, the recipe database format and the clamp logic were designed in conversation and I reviewed and tested everything (including catching that my first draft pointed à¤†à¤²à¥‚-à¤—à¥‹à¤­à¥€ at cabbage instead of cauliflower â€” in most Indian kitchens that dish is à¤«à¥‚à¤²à¤—à¥‹à¤­à¥€).&lt;/p&gt;

&lt;p&gt;Deployment is a Render Blueprint from the repo (&lt;code&gt;render.yaml&lt;/code&gt;): free web service, health check on &lt;code&gt;/health&lt;/code&gt;, the Gemini key as the only secret.&lt;/p&gt;

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

&lt;p&gt;Because the interesting part of this app is not the model â€” it is the &lt;strong&gt;database&lt;/strong&gt;. Forty everyday recipes in a plain Python file, MIT licensed, eight lines to add your mother's version, with a verifier that keeps contributions honest. A hundred families forking it and adding their own recipes is worth more than any prompt engineering I could do.&lt;/p&gt;

&lt;p&gt;And because a small open-weight model, clamped to ids from an open repository, gives AI-flavored writing without AI-authored facts. Swap the endpoint to a local Ollama with one environment variable and the app never talks to a cloud at all â€” the sloth keeps deciding dinner either way.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Render&lt;/strong&gt; â€” deployed as a Blueprint (&lt;code&gt;render.yaml&lt;/code&gt;), free web service, &lt;code&gt;/health&lt;/code&gt; health check, sleeps and wakes like a proper sloth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma&lt;/strong&gt; â€” Gemma writes the verdict, pitch and tips and parses messy kitchen notes; JSON mode, single call, output clamped to the open recipe database.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Arzi Likho (अर्ज़ी लिखो) — the ₹30 cyber-café application letter, drafted in formal Hindi by Gemma 4 in three minutes</title>
      <dc:creator>Academic</dc:creator>
      <pubDate>Thu, 15 Oct 2026 09:23:51 +0000</pubDate>
      <link>https://dev.to/academic_efab3f3ad2434623/arzi-likho-arjii-likho-the-30-cyber-cafe-application-letter-drafted-in-formal-hindi-by-gemma-23f8</link>
      <guid>https://dev.to/academic_efab3f3ad2434623/arzi-likho-arjii-likho-the-30-cyber-cafe-application-letter-drafted-in-formal-hindi-by-gemma-23f8</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;Walk into any cyber café or Jan Seva Kendra in small-town Uttar Pradesh and there is a typing counter, and the counter has a queue. A woman wants to know why her widow pension stopped in April. A student needs a bonafide certificate by Monday. Someone's electricity bill is four times what it was last month. Each of them pays ₹30–100 to have it typed as a formal Hindi application — सेवा में, विषय, महोदय, प्रार्थना, भवदीय — addressed to exactly the right office, because a letter to the wrong office goes nowhere.&lt;/p&gt;

&lt;p&gt;The operator types these letters from memory, twenty a day, fifteen to twenty minutes each. The addressee is sometimes wrong (is a ration-card correction the जिला पूर्ति अधिकारी or the पूर्ति निरीक्षक?). The ₹10 RTI fee and the 30-day reply rule get quoted from memory. The customer stands there while Windows updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arzi Likho&lt;/strong&gt; (अर्ज़ी लिखो — "write the application") turns that into three minutes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick the matter — &lt;strong&gt;twelve of them&lt;/strong&gt;: RTI application and RTI first appeal, ration card, pension, electricity, police complaint, public grievance, certificates, school, bank, document correction, biodata. Pick the district — all 75 UP districts, Raebareli by default.&lt;/li&gt;
&lt;li&gt;Fill five to ten plain-Hindi fields. Not "compose a letter" — just: who, where, what happened, what you want.&lt;/li&gt;
&lt;li&gt;Out comes the full formal letter, plus a &lt;strong&gt;"कहाँ जमा करें" box&lt;/strong&gt; — the office, the online portal (rtionline, jansunwai, edistrict, sspy…), the helpline (1912, 1076, 112, 1967, 1947), the fee, the time limit and the attachments checklist. Then: print, &lt;strong&gt;.docx download&lt;/strong&gt; (cafés live in Word), an &lt;strong&gt;English version&lt;/strong&gt; for offices that accept one, and a &lt;strong&gt;WhatsApp follow-up message&lt;/strong&gt; with the reference number left blank for later.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Who would pay, and why:&lt;/strong&gt; the operator — I'd charge about ₹199/month — because it turns a 20-minute error-prone typing job into a 3-minute one at the same ₹30–50 per customer, and the addressee, the act, the fee and the portal are never wrong, because they aren't typed from memory at all. To be honest about the "side hustle" part: &lt;strong&gt;I have not signed up a paying café yet.&lt;/strong&gt; That's the next step, not this week's claim; this week was about proving the drafts are good enough to sell.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://arzi-likho.onrender.com/" rel="noopener noreferrer"&gt;https://arzi-likho.onrender.com/&lt;/a&gt; — free Render instance, so the first load can take 30–60 s while it wakes. Then pick a matter, fill the form, and Gemma 4 writes the letter in 30–90 s (the status line tells the customer so honestly).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;The 12 matters&lt;/th&gt;
&lt;th&gt;The form&lt;/th&gt;
&lt;th&gt;Writing…&lt;/th&gt;
&lt;th&gt;The letter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2nz7pkpw2orp9uuy4b7k.png" alt="Matter picker with all 12 application types" width="800" height="1777"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FYuser00123%2Farzi-likho%2Fmain%2Fdocs%2Fscreenshots%2F2-form.png" alt="RTI form filled with a real Raebareli case" width="800" height="4691"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc44msfnoo9im3nv5645m.png" alt="Status: Gemma is writing your application" width="800" height="1777"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FYuser00123%2Farzi-likho%2Fmain%2Fdocs%2Fscreenshots%2F4-letter.png" alt="The finished formal Hindi letter and the where-to-file box" width="800" height="5569"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;(The "कहाँ जमा करें" box on its own: &lt;a href="https://raw.githubusercontent.com/Yuser00123/arzi-likho/main/docs/screenshots/5-kahan.png" rel="noopener noreferrer"&gt;&lt;code&gt;5-kahan.png&lt;/code&gt;&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the letters actually looked like&lt;/strong&gt; when I ran four real-shaped cases against the live app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RTI against the electricity department&lt;/strong&gt; (46 s). My two rough points came back as proper numbered prose: &lt;em&gt;"वांछित सूचनाएं इस प्रकार हैं: 1. पिछले वित्त वर्ष में मेरे खाते में जमा कुल बिल राशि का विवरण। 2. गलत बिल वसूली के संबंध में जारी किए गए आदेश की प्रति।"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Police complaint, woman applicant&lt;/strong&gt; (83 s): &lt;em&gt;"रात्रि लगभग 8 बजे, जब मैं घर से सब्ज़ी लेने गई थी और वापस लौट रही थी, तब गाँव के पश्चिमी छोर पर खेत के पास दो अज्ञात युवकों ने मेरा रास्ता रोक लिया।"&lt;/em&gt; — the feminine गई थी / रही हूँ holds through the whole letter, because gender is a form field, not a guess. The पुलिस अधीक्षक gets a प्रतिलिपि line, as a police complaint should.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Village grievance&lt;/strong&gt; (30 s): routed to the खंड विकास अधिकारी (city cases go to the नगर पालिका instead). I hadn't typed the block name, so the letter reads &lt;em&gt;"विकास खंड — [खंड का नाम]"&lt;/em&gt;. That bracket is the feature I'm proudest of: &lt;strong&gt;a missing fact stays a visible blank; it is never invented.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Widow pension, stalled installments&lt;/strong&gt; (41 s), closing line: &lt;em&gt;"अतः प्रार्थना है कि कृपया मेरी पेंशन की रुकी हुई किश्तों की जांच कर उनका भुगतान जल्द से जल्द कराने की कृपा करें।"&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same call returns a formal &lt;strong&gt;English version&lt;/strong&gt; of the letter, and a &lt;strong&gt;WhatsApp follow-up&lt;/strong&gt; the operator can paste when the customer comes back asking what happened.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/Yuser00123/arzi-likho" rel="noopener noreferrer"&gt;https://github.com/Yuser00123/arzi-likho&lt;/a&gt; — MIT. Python 3.12, Gradio 6 on FastAPI, one &lt;code&gt;render.yaml&lt;/code&gt;, ten offline tests (&lt;code&gt;python test_app.py&lt;/code&gt; — no key, no network, &lt;code&gt;LLM_PROVIDER=mock&lt;/code&gt;). The file that matters most is &lt;code&gt;forms.py&lt;/code&gt;: twelve matters × (fields, addressee, act/section, fee, time limit, portals, attachments) × 75 districts, as plain editable Python.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Picking the hustle before building it.&lt;/strong&gt; Before writing code, I read the week's other 186 submissions. Receipt/invoice sorters: seventeen and counting. Etsy/eBay listing writers: eleven. "Scope-creep shields" for freelancers: a whole genre. Nobody was doing Indian government paperwork, in Hindi, for the counter that actually types it — so that's the lane. A cyber café is the rare customer you can name, walk to, and watch paying ₹30 in cash for the exact artefact the tool produces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The design decision everything hangs on: templates write the letter, the model writes the sentences.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part of the letter&lt;/th&gt;
&lt;th&gt;Who writes it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Addressee — जिला पूर्ति अधिकारी? अधिशासी अभियंता? थानाध्यक्ष?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;forms.py&lt;/code&gt; template&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Act &amp;amp; section (RTI §6(1), §19(1), CrPC §154), fee (₹10), 30-day limit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;forms.py&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Portals and helplines in the कहाँ जमा करें box&lt;/td&gt;
&lt;td&gt;&lt;code&gt;forms.py&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skeleton — date, सेवा में block, विषय, salutation, प्रार्थना, signature, संलग्नक&lt;/td&gt;
&lt;td&gt;&lt;code&gt;letter.py&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The narrative — what happened, since when, what is wanted&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Gemma 4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;English version + WhatsApp follow-up&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Gemma 4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Gemma never chooses an office, never quotes a fee, never cites a section. Its job is the part that is actually &lt;em&gt;writing&lt;/em&gt;: turning "पेंशन अप्रैल से बंद है, बैंक बोला विभाग से पूछो" into two dignified paragraphs of सरकारी हिंदी. The system prompt's hardest rules: use only the facts in the form; a blank becomes a &lt;code&gt;[कोष्ठक]&lt;/code&gt; placeholder, never an invention; no legal advice, no threats, no promises; the request line starts with कृपया because the app supplies the "अतः प्रार्थना है कि" itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing the model like code.&lt;/strong&gt; I drove the deployed app through its own API (&lt;code&gt;gradio_client&lt;/code&gt;) instead of eyeballing screenshots, and asserted on the letters. That's how I caught my favourite bug of the week: every letter's closing line read &lt;em&gt;"अतः प्रार्थना है कि अतः आपसे विनम्र निवेदन है कि…"&lt;/em&gt; — my template's prefix and Gemma's own prefix, doubled. Fixed three ways: a prompt rule, a sanitizer that strips leading connectives no matter who added them, and a cleaner subject template for police complaints. The same API pass confirmed the feminine grammar, the village/city addressee routing and the 30–83 s timings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keeping the counter alive when the model isn't.&lt;/strong&gt; The model's JSON is clamped to a schema: a partial response gets its missing parts filled from deterministic templates, and if the API is down entirely, the whole letter still comes out in mock mode — the counter must never stall in front of a paying customer. Ten offline tests exercise all twelve matters this way, including "no &lt;code&gt;[&lt;/code&gt; left when the form is complete" and "every portal lands in the कहाँ जमा करें box."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The UI is one fixed pool.&lt;/strong&gt; Twelve matters have different fields, but instead of dynamic component creation the app relabels and shows/hides a fixed pool of seventeen inputs — the matter switch is instant, nothing jumps. The letter itself is a plain &lt;strong&gt;editable&lt;/strong&gt; textbox: the operator fixes a name or adds a line &lt;em&gt;before&lt;/em&gt; printing (the print stylesheet prints only the letter), and the .docx is regenerated from whatever they edited. Drafts live in &lt;code&gt;gr.BrowserState&lt;/code&gt; — in the browser, not on the server: an Aadhaar number in a police complaint should not be in anyone's logs, including mine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I didn't start from zero:&lt;/strong&gt; &lt;code&gt;llm.py&lt;/code&gt; is the engine I built for my Week 1 project, &lt;a href="https://github.com/Yuser00123/pakshi-padosi" rel="noopener noreferrer"&gt;Pakshi Padosi&lt;/a&gt; — streaming-safe &lt;code&gt;&amp;lt;thought&amp;gt;&lt;/code&gt; stripping for Gemma 4, retries with a time budget, and one wrapper that runs the same model on Google's free tier or on a café's own PC with two environment variables. Reusing it is the open-source way of having a weekend.&lt;/p&gt;

&lt;p&gt;Full disclosure, same as last week: an AI coding agent did most of the typing on this project. The template data, the prompt rules, the Hindi register calls — and the mistakes — are mine.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;The data on the counter isn't the user's — it's their customers'.&lt;/strong&gt; Ration-card numbers, pension files, a widow's bank details, a police complaint about a threat. My demo runs on Render with the Gemini API's free tier because that is what I can host for ₹0 — but the &lt;em&gt;same code&lt;/em&gt;, pointed at Ollama (&lt;code&gt;LLM_BASE_URL=http://localhost:11434/v1&lt;/code&gt;), runs entirely on the café's own PC with no internet and no third party. That's not a checkbox; it's the difference between a tool a café can put on its counter and one it shouldn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The maths needs open weights.&lt;/strong&gt; A ₹30 application cannot carry per-token API costs plus a subscription and still leave the café a margin. Open weights run on hardware that already exists, at ₹0 per page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The network is worse than you think.&lt;/strong&gt; Village CSCs run on patchy 4G. The model doesn't need the internet — only the government e-portals do, and the box tells you which ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The templates are the product, and they're editable.&lt;/strong&gt; A Raebareli operator can open &lt;code&gt;forms.py&lt;/code&gt;, add their tehsil's office or correct a fee, and the app updates. No vendor ticket, no lock-in — and when a better Hindi model ships next year, it's two environment variables, not a migration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The register is the moat.&lt;/strong&gt; Closed general-purpose APIs drift into Hinglish or translate English letter structure literally. Here the सरकारी register is pinned by templates and the open model writes within it — and when an output is wrong I can see exactly which rule to fix: a prompt, a template, a sanitizer. You can't do that with a black box standing between a customer and their ration card.&lt;/p&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; — &lt;code&gt;gemma-4-31b-it&lt;/code&gt; writes every letter's narrative, request line, English version and WhatsApp follow-up from field-notes-only prompts with &lt;code&gt;[placeholder]&lt;/code&gt; discipline; the write-up covers thought-stripping, retry budgets, the schema clamp and the mock fallback that keeps the counter alive when the API is down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt; — deployed from &lt;code&gt;render.yaml&lt;/code&gt; on the free plan with a &lt;code&gt;/health&lt;/code&gt; check; the fix-test-fix loop during live API testing (two same-day pushes, each live in about two minutes) is exactly what a one-person side hustle needs from a platform.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built in Raebareli, Uttar Pradesh, 14–15 October 2026, mostly after dark.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Pakshi Padosi — a 60-second Hinglish card of the birds that are actually outside your door this week (GBIF Gemma 4)</title>
      <dc:creator>Academic</dc:creator>
      <pubDate>Fri, 09 Oct 2026 12:34:35 +0000</pubDate>
      <link>https://dev.to/academic_efab3f3ad2434623/pakshi-padosi-a-60-second-hinglish-card-of-the-birds-that-are-actually-outside-your-door-this-2hpc</link>
      <guid>https://dev.to/academic_efab3f3ad2434623/pakshi-padosi-a-60-second-hinglish-card-of-the-birds-that-are-actually-outside-your-door-this-2hpc</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;&lt;strong&gt;Pakshi Padosi&lt;/strong&gt; ("bird neighbour") is a small web app that answers one question in Hinglish: &lt;em&gt;which birds are actually around me this week, and how do I recognise them with my own eyes?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You give it a town (or press GPS) and how many minutes you have. In about a second it shows the data: how many bird records exist within 25â€“50 km of you for this time of year â€” from &lt;a href="https://www.gbif.org" rel="noopener noreferrer"&gt;GBIF&lt;/a&gt;, which means eBird and iNaturalist observations logged by real people â€” and which six species you should look for: three &lt;em&gt;padosi&lt;/em&gt; that are always here, three &lt;em&gt;mehmaan&lt;/em&gt; that are migrating in right now. Then &lt;strong&gt;Gemma 4&lt;/strong&gt; writes each bird a 60-second Hinglish card: size compared to a sparrow or a myna, the two most diagnostic field marks, where to stand, what it sounds like, and a one-line hook you'll actually remember (&lt;em&gt;"Kaala bird jiski laal pooch thartharati hai"&lt;/em&gt; â€” Black Redstart).&lt;/p&gt;

&lt;p&gt;Then it tells you to put the phone in your pocket. That is the whole design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The screen is the shortest part.&lt;/strong&gt; Read the card once (or print it â€” the print stylesheet strips the UI), then walk. No camera, no mic, no live identification. The app does nothing useful while you are outside, on purpose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Come back, tick, done.&lt;/strong&gt; The &lt;em&gt;Bahar&lt;/em&gt; tab is a six-box checklist plus one optional line of notes. Gemma turns the ticks into a two-line diary entry, and you can export the diary as Markdown or an eBird-style CSV. The diary lives only in your browser; your location goes to the open APIs that need it and nowhere else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grounded, not generated.&lt;/strong&gt; Gemma never chooses the birds. The species list, the resident/visitor status, the record counts, the hotspots and the sunrise window all come from data; the model only writes the descriptions, and every card shows the numbers behind it (&lt;em&gt;"24 records Â· 8 within 25 km"&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; people like me in small towns â€” I'm in Raebareli, Uttar Pradesh, a city of about 200,000 with no birding club that I know of and no field guide in the language people actually speak here. Anyone who has heard a bird on the way to work and wondered what it was, and whose comfortable language is Hinglish rather than field-guide English. It works for any place GBIF has data for â€” Delhi, Mumbai, Chennai and Bharatpur all give sensible cards â€” but it was built on Raebareli's data.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://pakshi-padosi.onrender.com/" rel="noopener noreferrer"&gt;https://pakshi-padosi.onrender.com/&lt;/a&gt; â€” free Render instance, so the first load can take ~30 s while it wakes up. The Raebareli card is instant; type your own town and Gemma writes the card bird by bird, usually inside 90 seconds.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Home&lt;/th&gt;
&lt;th&gt;The card&lt;/th&gt;
&lt;th&gt;Back from the walk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcnzhrld0f1aey6kl6exg.png" alt="Home screen: location, minutes, when, language" width="800" height="1777"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FYuser00123%2Fpakshi-padosi%2Fmain%2Fdocs%2Fscreenshots%2F2-card.png" alt="The six-bird Hinglish card for Raebareli, October 2026" width="760" height="5477"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiipm9bfkikyw5zurrrmk.png" alt="Bahar tab: six checkboxes and a one-line note" width="800" height="2880"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What the card said for Thursday morning in Raebareli:&lt;/strong&gt; window 6:10â€“6:50 AM (first hour after sunrise), 60 species recorded within 50 km this season, and &lt;em&gt;"Indira Gandhi Smarak Vanaspati Udyan (3.1 km) sabse paas hai"&lt;/em&gt; â€” a park three kilometres from my house that I had never once thought of as a birding place. The app found it by clustering where other people's October records actually came from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And the walk?&lt;/strong&gt; I haven't done it. I spent the mornings this week fixing the things below instead of standing next to a pond, and I'm not going to invent a field report in a post whose whole argument is that the app should never pretend. What &lt;em&gt;was&lt;/em&gt; tested: the live server, on a phone-sized browser, repeatedly â€” the Raebareli card in about 10 seconds, other towns filling in bird by bird from 35 seconds, and the data side checked against five cities. The app's job ends at the gate. Mine starts there, and that part is still owed.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/Yuser00123/pakshi-padosi" rel="noopener noreferrer"&gt;https://github.com/Yuser00123/pakshi-padosi&lt;/a&gt; â€” MIT. Python 3.12, Gradio 6 on FastAPI, one &lt;code&gt;render.yaml&lt;/code&gt;. Runs locally with &lt;code&gt;LLM_PROVIDER=mock&lt;/code&gt; and no keys at all, or against Ollama with &lt;code&gt;LLM_BASE_URL=http://localhost:11434/v1&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Data first, model second.&lt;/strong&gt; GBIF's occurrence API is free and needs no key. For a point, I facet bird records by species within 25 km â†’ 50 km â†’ 100 km until there are at least a thousand records for the Â±1-month season window (Raebareli needed 50 km: 1,177 seasonal records, 60 species, almost all from eBird). Four more faceted queries give each species' records per season, and that becomes a status: a resident keeps a fair share of its records in every season; a winter visitor vanishes in the monsoon.&lt;/p&gt;

&lt;p&gt;That classifier bit me twice, and fixing it was the most interesting hour of the build. First, a resident &lt;strong&gt;White-browed Wagtail&lt;/strong&gt; came out as a "winter visitor" because it had one monsoon record out of 26 â€” so small samples now need a &lt;em&gt;clean zero&lt;/em&gt; in the off-season. Second, when I tried Bharatpur, home of Keoladeo, &lt;strong&gt;25 of 60 species were "winter visitors"&lt;/strong&gt;, including the Painted Stork that breeds there. The data wasn't lying; the &lt;em&gt;birders&lt;/em&gt; only go in winter. So every species is now compared against &lt;em&gt;all&lt;/em&gt; bird records in the same circle, season by season â€” an effort correction. Bharatpur went from 25 false visitors to 1 (a real one, the Lesser Whitethroat). Raebareli's card ends up with three true winter visitors â€” White Wagtail, Black Redstart, Common Sandpiper â€” and three genuine neighbours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hotspots&lt;/strong&gt; are not a lookup table: the app pulls 300 recent seasonal records with coordinates, buckets them on a 2 km grid and names each bucket by its most common locality string. &lt;strong&gt;The window&lt;/strong&gt; comes from Open-Meteo (sunrise, rain, AQI â†’ &lt;em&gt;"first hour after sunrise; smog â€” short walk"&lt;/em&gt;), with plain NOAA sunrise maths as the fallback. &lt;strong&gt;Hindi names&lt;/strong&gt; are the honest weak spot: GBIF has no Hindi vernaculars, and Wikidata's Hindi labels are often English typed in Devanagari (&lt;em&gt;"à¤±à¥‡à¤¦-à¤µà¤¤à¥à¤¤à¥à¤²à¥‡à¤¦ à¤²à¤ªà¥à¤µà¤¿à¤™à¥"&lt;/em&gt;) or wrong (it calls the Common Sandpiper a kind of lapwing). So a curated list of folk names comes first, Wikidata second, and the card says &lt;em&gt;"Hindi naam pakka nahi"&lt;/em&gt; when neither is trustworthy. Lying about a bird's name to look complete is exactly what this app must not do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4&lt;/strong&gt; (&lt;code&gt;gemma-4-31b-it&lt;/code&gt;, open weights, through the Gemini API's free tier) writes only what needs writing. It gets our six species &lt;em&gt;with their status and record counts as input&lt;/em&gt; and returns strict JSON per bird; the card's header lines are templates filled from the data, so there is nothing to hallucinate there. Three things I learned about it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Through the OpenAI-compatible endpoint it reasons inline inside &lt;code&gt;&amp;lt;thought&amp;gt;â€¦&amp;lt;/thought&amp;gt;&lt;/code&gt; tags before answering. The client strips them (streaming-safe) and retries when the thinking eats the whole token budget.&lt;/li&gt;
&lt;li&gt;My first version asked for the whole card in one call. It worked â€” and took &lt;strong&gt;194 seconds&lt;/strong&gt; on the live server, and a single 500 lost everything. Now each bird is its own small call, six run in parallel, and the page fills in bird by bird (first one in ~35 s). A bird that still fails after its budget is shown with just its name and status from the data, plus a "press again" note: the finished ones are cached, so the second press only writes the missing ones.&lt;/li&gt;
&lt;li&gt;The endpoint throws intermittent 500s in batches. So the descriptions Gemma wrote for Raebareli's six birds during the first live runs ship with the repo as a seed cache â€” the demo town's card is instant and survives a bad API hour. Everything else is generated live, and &lt;code&gt;GET /cache&lt;/code&gt; dumps what the instance has written if you want to grow the seed. (One field mark in that seed was corrected by hand after checking a guide; the file says which.)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Render&lt;/strong&gt; runs it from a Blueprint (&lt;code&gt;render.yaml&lt;/code&gt;, free plan, &lt;code&gt;/health&lt;/code&gt; check). Free hosts share outbound IPs, and both Open-Meteo and OSM's Nominatim refused that IP within the first hour â€” fine from my laptop, &lt;em&gt;"map par nahi mila"&lt;/em&gt; in production. So geocoding falls back to Photon and then to a built-in table of Indian cities, the default town needs no geocoder at all, and the weather falls back to computed sunrise with a visible note (&lt;em&gt;"mausam service abhi busy"&lt;/em&gt;). None of that is glamorous; all of it is what makes the card show up on a phone at 6 AM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tooling:&lt;/strong&gt; Gradio 6 with &lt;code&gt;BrowserState&lt;/code&gt; for the diary, a print stylesheet, PWA manifest, Playwright for the screenshots, six offline tests with recorded fixtures (&lt;code&gt;LLM_PROVIDER=mock&lt;/code&gt;). I paired with an AI coding agent for most of the typing; the design, the data decisions and the Hindi name curation are mine, and so are the mistakes.&lt;/p&gt;

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

&lt;p&gt;Nothing in this app is mine except the glue, and that is the point. The bird list is thousands of people's morning walks, logged into eBird and iNaturalist and published through GBIF under open licences. The map is OpenStreetMap. The weather is Open-Meteo. The Hindi names are Wikidata, with my corrections going back as the next edit. The language model is open weights â€” swap &lt;code&gt;LLM_BASE_URL&lt;/code&gt; to Ollama and the same Hinglish bird cards come out of a laptop in Raebareli with no account anywhere, which is where I want this to end up: a district school running it on one old machine.&lt;/p&gt;

&lt;p&gt;Open data is also what lets the app be &lt;em&gt;honest&lt;/em&gt;. A closed "AI bird guide" says &lt;em&gt;"you may see a Black Redstart"&lt;/em&gt;; this one says &lt;em&gt;"9 records in this window, 3 within 25 km, zero in the monsoon"&lt;/em&gt; â€” and when the data is thin it says that too, in the same font size. When the classifier mislabelled a wagtail I could see exactly which 26 records did it and fix the rule in ten lines; when Wikidata's Hindi was wrong I could see it was a bot transliteration and route around it. You cannot debug a black box with a field guide in your other hand.&lt;/p&gt;

&lt;p&gt;And open models change who gets to be &lt;em&gt;for&lt;/em&gt; whom. Field guides for India are written in English for people who already own binoculars. A 31-billion-parameter model that anyone can run, fed a species list from a public API, will patiently write &lt;em&gt;"Maina se thoda chhota, cheeks par red patch"&lt;/em&gt; for a town of 200,000 that no publisher will ever target. That is not a smaller version of the English product. It is a different product, and only open pieces make it buildable in three evenings by one person.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session (optional)
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;(skipped)&lt;/em&gt;&lt;/p&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; â€” &lt;code&gt;gemma-4-31b-it&lt;/code&gt; writes every bird description and diary entry from a data-grounded prompt; the write-up documents thought-stripping, per-bird parallel calls, the retry budget and the seed cache that made a slow free-tier endpoint usable on a phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt; â€” deployed from &lt;code&gt;render.yaml&lt;/code&gt; on the free plan with a health check, plus the production lessons about shared-IP refusals and the fallbacks that fixed them.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built in Raebareli, Uttar Pradesh, 6â€“8 October 2026, mostly after dark.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Samjhao — I built my friend a Hinglish study buddy on open-weight Gemma</title>
      <dc:creator>Academic</dc:creator>
      <pubDate>Sat, 03 Oct 2026 09:46:47 +0000</pubDate>
      <link>https://dev.to/academic_efab3f3ad2434623/samjhao-i-built-my-friend-a-hinglish-study-buddy-on-open-weight-gemma-4749</link>
      <guid>https://dev.to/academic_efab3f3ad2434623/samjhao-i-built-my-friend-a-hinglish-study-buddy-on-open-weight-gemma-4749</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Around midnight, my phone buzzes. It's Suyash â€” a screenshot of a textbook page and three words: &lt;em&gt;"yeh kya bol raha hai?"&lt;/em&gt; ("what is this even saying?").&lt;/p&gt;

&lt;p&gt;Suyash is my closest friend, and he's preparing for JEE here in Prayagraj. Everything he studies from â€” NCERT, coaching modules, previous-year solutions â€” is in English. He thinks in Hindi. The problem isn't vocabulary; he can read every word. The problem is &lt;em&gt;register&lt;/em&gt;: a textbook explains like a textbook, and Suyash understands when a friend explains. For months, that friend has been me, at midnight, re-typing paragraphs in Hinglish with a chai analogy thrown in.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Samjhao&lt;/strong&gt; (à¤¸à¤®à¤à¤¾à¤“ â€” "explain it to me"): a small web app that does what I do at midnight, without me.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paste a paragraph, a PDF page, or just a topic name â€” "Le Chatelier's principle" is enough.&lt;/li&gt;
&lt;li&gt;Pick a depth â€” &lt;em&gt;Bilkul basic&lt;/em&gt;, &lt;em&gt;Exam ke liye&lt;/em&gt;, or &lt;em&gt;Deep dive&lt;/em&gt; â€” and a language â€” Hinglish, Hindi, or English.&lt;/li&gt;
&lt;li&gt;It explains the way Suyash actually talks, pulls out the key terms (English â†’ Hindi), gives three memory hooks, and ends with one realistic exam question with a model answer. Formulas render properly, because JEE Physics without &lt;code&gt;Â½mvÂ²&lt;/code&gt; is just vibes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quiz banao&lt;/strong&gt; turns the same material into five MCQs and scores them, with a &lt;em&gt;why&lt;/em&gt; under each â€” because JEE &lt;em&gt;is&lt;/em&gt; MCQs, and the wrong answer you don't understand is the one you'll repeat.&lt;/li&gt;
&lt;li&gt;Everything goes into a &lt;strong&gt;Doubt Diary&lt;/strong&gt;. Wrong answers become &lt;em&gt;weak points&lt;/em&gt;; one tap builds a revision test that targets exactly those.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I showed it to Suyash as soon as it ran, with his name in the title bar â€” &lt;em&gt;Suyash ka padhai saathi&lt;/em&gt;. He was shocked. Not polite-shocked; actually shocked that the paragraphs he'd been sending me had turned into a real app built around how &lt;em&gt;he&lt;/em&gt; learns.&lt;/p&gt;

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

&lt;p&gt;ðŸ”— &lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://samjhao.onrender.com" rel="noopener noreferrer"&gt;https://samjhao.onrender.com&lt;/a&gt; â€” a free Render instance, so give it ~40 seconds to wake up. Paste any paragraph from NCERT and press &lt;strong&gt;Samjhao ðŸ™&lt;/strong&gt;. Gemma 4 &lt;em&gt;thinks&lt;/em&gt; before it answers, so the first explanation takes 30â€“60 seconds; the app shows a &lt;em&gt;"ðŸ¤” Gemma soch raha haiâ€¦ 23s"&lt;/em&gt; timer while you wait.&lt;/p&gt;

&lt;p&gt;Here's the work-energy theorem, pasted straight from a Physics textbook, explained &lt;em&gt;Exam ke liye&lt;/em&gt; in Hinglish â€” definition, exam-ready points, key terms, a UPI-transaction memory hook, and one exam question:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn04f95r9u3spdrt4nxnj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn04f95r9u3spdrt4nxnj.png" alt="The work-energy theorem paragraph pasted into Samjhao and explained in Hinglish: definition with the rendered formula W_net = Î”K = Â½mvÂ² âˆ’ Â½muÂ², exam-ready points, key terms, memory hooks and an exam question" width="800" height="1416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One tap on &lt;strong&gt;Quiz banao&lt;/strong&gt; turns that same paragraph into five MCQs. I deliberately got two wrong â€” every answer gets a âœ…/âŒ and a one-line &lt;em&gt;why&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv557bzuh8bgf61fr7dd3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv557bzuh8bgf61fr7dd3.png" alt="Five-question Hinglish quiz on the work-energy theorem, scored 3/5, with the correct answer and a one-line explanation under each question" width="800" height="1287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the &lt;strong&gt;Doubt Diary&lt;/strong&gt; remembers it: the two wrong answers are now &lt;em&gt;weak points&lt;/em&gt;, one button builds a revision test from them, and the whole thing downloads as Markdown or JSON (nothing is stored on a server):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsvle58mz9oxl0sxdvxr1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsvle58mz9oxl0sxdvxr1.png" alt="The Doubt Diary tab: a table of explanations and quizzes with scores, a Revision test button, and Download/Backup buttons" width="800" height="445"&gt;&lt;/a&gt;&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/Yuser00123" rel="noopener noreferrer"&gt;
        Yuser00123
      &lt;/a&gt; / &lt;a href="https://github.com/Yuser00123/samjhao" rel="noopener noreferrer"&gt;
        samjhao
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Samjhao (समझाओ) — a Hinglish study buddy built for my friend Suyash's JEE prep, powered by open-weight Gemma. Paste a paragraph → friend-style explanation, quiz, Doubt Diary. Hacktoberfest 2026 Weekend Challenge: Build for a Friend.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;📚 Samjhao (समझाओ) — a Hinglish study buddy, built for one friend&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Paste a paragraph from the textbook (or a PDF page, or just a topic name) → get it explained the way a smart friend would, in &lt;strong&gt;Hinglish&lt;/strong&gt;, with key terms, memory hooks and an exam question → take a 5-question quiz → everything you struggled with lands in a &lt;strong&gt;Doubt Diary&lt;/strong&gt; that turns into a weekly revision test.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Built for &lt;strong&gt;Hacktoberfest 2026 · DEV Weekend Challenge: &lt;em&gt;Build for a Friend&lt;/em&gt;&lt;/strong&gt;, with an &lt;strong&gt;open-weight model (Gemma)&lt;/strong&gt; at its core.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why open-weight matters here&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need of a student in a UP hostel&lt;/th&gt;
&lt;th&gt;What open weights make possible&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No money&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gemma 4 is free on Google AI Studio (no card). Zero running cost.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hostel wifi dies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same app, &lt;code&gt;LLM_BASE_URL=http://localhost:11434/v1&lt;/code&gt; → Gemma 3 4B via Ollama, fully offline on a CPU laptop.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Their notes are &lt;em&gt;theirs&lt;/em&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nothing is stored server-side.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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/Yuser00123/samjhao" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;MIT licensed. The repo was created and finished inside the challenge window. The README has a five-command quickstart, the three screenshots above, and an offline mode.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;The open-source AI at the core is Gemma 4&lt;/strong&gt; (&lt;code&gt;gemma-4-31b-it&lt;/code&gt;), Google's Apache-2.0 open-weight model, served through Google AI Studio's free tier. It does everything: the explanation, the quiz (as strict JSON), and the revision test. There is no closed model anywhere in the code â€” not even as a fallback.&lt;/p&gt;

&lt;p&gt;Around it: Python, Gradio 6 mounted on FastAPI (UI plus a &lt;code&gt;/health&lt;/code&gt; endpoint that Render pings; it ships as a PWA so it installs on a phone), the &lt;code&gt;openai&lt;/code&gt; SDK pointed at an OpenAI-compatible endpoint, pypdf, and Render's free tier (Singapore region) for hosting.&lt;/p&gt;

&lt;p&gt;The piece I'm proudest of is &lt;code&gt;llm.py&lt;/code&gt; â€” a few hundred lines that know nothing about Google. It talks to &lt;em&gt;any&lt;/em&gt; OpenAI-compatible endpoint, so the same Gemma family runs three ways with two environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Google AI Studio â€” free, cloud&lt;/span&gt;
&lt;span class="nv"&gt;LLM_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://generativelanguage.googleapis.com/v1beta/openai/
&lt;span class="nv"&gt;LLM_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gemma-4-31b-it

&lt;span class="c"&gt;# Ollama â€” same app, no internet, CPU laptop&lt;/span&gt;
&lt;span class="nv"&gt;LLM_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:11434/v1
&lt;span class="nv"&gt;LLM_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gemma3:4b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It also absorbs the real-world mess: if a provider rejects the &lt;code&gt;system&lt;/code&gt; role, the prompt is folded into the first user turn and retried; if it lacks &lt;code&gt;response_format&lt;/code&gt;, a lenient JSON parser takes over; a 429 gets a polite retry and a Hinglish &lt;em&gt;"Gemma thoda busy hai"&lt;/em&gt; instead of a stack trace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The bug that taught me the most: Gemma 4 thinks out loud.&lt;/strong&gt; The first time the deployed app answered, the explanation began with &lt;code&gt;&amp;lt;thought&amp;gt;Ohm's Law. Suyash wantsâ€¦&amp;lt;/thought&amp;gt;&lt;/code&gt;. Gemma 4 is a reasoning model, and Google's OpenAI-compatible endpoint streams its chain of thought &lt;em&gt;inline&lt;/em&gt;, as ordinary text. So &lt;code&gt;llm.py&lt;/code&gt; grew a streaming-safe filter that removes &lt;code&gt;&amp;lt;thought&amp;gt;â€¦&amp;lt;/thought&amp;gt;&lt;/code&gt; blocks even when a tag is split across two chunks, and the UI shows the &lt;em&gt;soch raha hai&lt;/em&gt; timer until the first visible line arrives. The same afternoon the endpoint threw a few &lt;code&gt;500 Internal error&lt;/code&gt;s, and once the model spent its entire token budget thinking and returned nothing â€” both now retry automatically, and if all three attempts fail Suyash gets a Hinglish sentence, not a traceback. None of this is Gemma's fault; it's the price of using a reasoning model through a compatibility layer, and the fix is about eighty lines anyone can lift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The persona is a prompt, not a fine-tune.&lt;/strong&gt; Forty lines in &lt;code&gt;prompts.py&lt;/code&gt; encode how Suyash likes things explained: Roman-script Hinglish "the way two friends chat on WhatsApp", technical terms kept in English with the Hindi meaning in brackets the first time, analogies from chai/cricket/trains/UPI &lt;em&gt;only when they genuinely help&lt;/em&gt;, exam-precise definitions â€” and "if the material is garbled or isn't study material, say so; don't invent." The three depth levels change the word budget and structure, never the voice. (The UPI analogy in the screenshot? Gemma's own idea. The prompt just allowed it.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The quiz is structured output.&lt;/strong&gt; Gemma returns &lt;code&gt;{"topic", "questions": [{"q", "options"[4], "answer_index", "why"}]}&lt;/code&gt;; the app validates every question (exactly four options, one valid index) and drops anything malformed rather than show a broken quiz. Wrong answers are stored as weak points, and the revision prompt is told to &lt;em&gt;rephrase&lt;/em&gt; them, not repeat them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Doubt Diary is deliberately boring:&lt;/strong&gt; a list in the browser session with JSON export/import. No accounts, no database, nothing stored on a server. For a tool used by one person, that's a feature.&lt;/p&gt;

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

&lt;p&gt;I could have built this on a closed API in the same weekend. Here's what would have been worse, concretely:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It would cost money, and a JEE aspirant has none to spare.&lt;/strong&gt; Gemma 4 on AI Studio's free tier needs no card. Suyash can run this every night until the exam for â‚¹0. The moment a study tool has a monthly bill, it stops being used.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Internet is not a given at midnight.&lt;/strong&gt; Data packs run out; wifi drops. Because the weights are open, the &lt;em&gt;same code&lt;/em&gt; can point at Ollama with &lt;code&gt;gemma3:4b&lt;/code&gt; on a laptop â€” no internet, no account, no key. It's the same OpenAI-compatible protocol, so it's two environment variables, documented in the README. A closed API cannot do this, by definition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Suyash's doubts are his business.&lt;/strong&gt; The only thing that leaves the device is the pasted text, and it goes to a provider &lt;em&gt;we&lt;/em&gt; choose â€” including our own machine. No vendor is building a profile of what a JEE aspirant struggles with the night before a test.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The model can't be taken away.&lt;/strong&gt; Closed models get deprecated, re-priced, or geo-restricted. Apache-2.0 weights don't. If the free tier changes tomorrow, I change one URL. If Suyash ever wants Samjhao to know his exact syllabus, the weights can be fine-tuned â€” that path exists &lt;em&gt;because&lt;/em&gt; the model is open.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hinglish is a first-class citizen.&lt;/strong&gt; I was genuinely surprised how well Gemma handles Roman-script Hindi + English code-switching with precise technical terms â€” look at &lt;em&gt;"gatij urja"&lt;/em&gt; next to &lt;em&gt;kinetic energy&lt;/em&gt; in the screenshot. With open weights, that's an advantage I get to keep.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The honest counterpoint: free-tier rate limits are real (~15 requests a minute), and a 31B reasoning model served remotely takes 30â€“60 seconds per explanation. For one student at midnight, neither matters â€” and when it does, the open weights mean the fix is a smaller Gemma on his own laptop, not a bigger bill.&lt;/p&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 4 (&lt;code&gt;gemma-4-31b-it&lt;/code&gt;) is the only model in the project: explanation, quiz JSON, and revision test; swappable to Gemma 3 via Ollama for offline use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt; â€” deployed as a free Render web service from &lt;code&gt;render.yaml&lt;/code&gt; (Blueprint), Singapore region, with &lt;code&gt;/health&lt;/code&gt; as the health-check path; the app reads &lt;code&gt;PORT&lt;/code&gt; and ships as a PWA.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built solo.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>"The Internet Didn’t Need This… So I Built It Anyway"</title>
      <dc:creator>Academic</dc:creator>
      <pubDate>Thu, 09 Apr 2026 06:53:33 +0000</pubDate>
      <link>https://dev.to/academic_efab3f3ad2434623/the-internet-didnt-need-this-so-i-built-it-anyway-17d9</link>
      <guid>https://dev.to/academic_efab3f3ad2434623/the-internet-didnt-need-this-so-i-built-it-anyway-17d9</guid>
      <description>&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aprilfools-2026"&gt;DEV April Fools Challenge&lt;/a&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;I built the Useless Button Generator — a chaotic website where every click creates more buttons, plays a click sound, and roasts you for your terrible decisions.&lt;/p&gt;

&lt;p&gt;It tracks how many times users keep clicking (despite knowing it’s useless) and occasionally throws in random chaos like fake rewards or wiping the screen.&lt;/p&gt;

&lt;p&gt;It solves nothing.&lt;br&gt;
It wastes time.&lt;br&gt;
And you will click again 😈&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://april-fools.kesug.com/" rel="noopener noreferrer"&gt;Click here if you’re ready to make bad decisions&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Curious how this terrible idea works?&lt;br&gt;
Go ahead, make another bad decision:&lt;br&gt;
&lt;a href="https://github.com/Yuser00123/Useless-Button-Generator-/" rel="noopener noreferrer"&gt;Click here to see the code&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I built this masterpiece of bad decisions using HTML, CSS, JavaScript, and PHP.&lt;/p&gt;

&lt;p&gt;HTML for the structure (aka where poor choices begin).&lt;br&gt;
CSS to make everything look slightly chaotic and suspicious.&lt;br&gt;
JavaScript to generate infinite buttons, play sounds, and roast users in real-time.&lt;br&gt;
PHP to track and store the total number of bad decisions (clicks) globally.&lt;/p&gt;

&lt;p&gt;The frontend handles the chaos, while the backend quietly judges everyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

&lt;p&gt;I am submitting it for winning a surprise teapot or coffee maker with appropriate fixings.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>418challenge</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
