<?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: Abhishek</title>
    <description>The latest articles on DEV Community by Abhishek (@abhishek_44d97e81b5a38faa).</description>
    <link>https://dev.to/abhishek_44d97e81b5a38faa</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%2F3780593%2F29d735aa-4629-41a4-bc28-ca41db483538.png</url>
      <title>DEV Community: Abhishek</title>
      <link>https://dev.to/abhishek_44d97e81b5a38faa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhishek_44d97e81b5a38faa"/>
    <language>en</language>
    <item>
      <title>NameLock</title>
      <dc:creator>Abhishek</dc:creator>
      <pubDate>Thu, 15 Oct 2026 13:47:16 +0000</pubDate>
      <link>https://dev.to/abhishek_44d97e81b5a38faa/namelock-159f</link>
      <guid>https://dev.to/abhishek_44d97e81b5a38faa/namelock-159f</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;p&gt;The banner is already printed when the shop notices. The customer wrote Aadhya, with two a's, not Adya. The sheet says Adya. That sheet gets thrown away, and the shop prints it again.&lt;/p&gt;

&lt;p&gt;A chat tool does this on its own. It "fixes" a spelling. For a flex and wedding shop, that fix is the mistake.&lt;/p&gt;

&lt;p&gt;So I built NameLock. A local Gemma model drafts the banner line from the WhatsApp note. A plain Python check then refuses to print if one letter of a name has changed. I have not sold it, and I did not invent a shop or a first customer.&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%2Fzr8n9m82xibajziyq4n8.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%2Fzr8n9m82xibajziyq4n8.png" alt="Do not print: the banner says Adya, the customer wrote Aadhya" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The customer wrote Aadhya. A tool that "fixes" spellings put Adya on the banner. That is a reprint. NameLock stamps &lt;strong&gt;Do not print&lt;/strong&gt;, shows the two spellings, and keeps the print button off until the letters match.&lt;/p&gt;

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

&lt;p&gt;A print-shop name proof. The shop is the customer. A reprint costs a banner. I have not sold this to anyone, and I did not invent a shop or a price.&lt;/p&gt;

&lt;p&gt;Orders look like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;blue flex 6 by 3, birthday, name Aadhya, with two a's, not Adya&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Gemma drafts &lt;code&gt;Happy Birthday Aadhya&lt;/code&gt;. Then a plain Python check compares every name to the customer's own words. If a letter changed, the page stamps &lt;strong&gt;Do not print&lt;/strong&gt;. One click puts the customer's spelling back. The stamp turns &lt;strong&gt;Safe to print&lt;/strong&gt;, and the button turns on.&lt;/p&gt;

&lt;p&gt;The check, in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Blocks a spelling the customer rejected ("not Adya").&lt;/li&gt;
&lt;li&gt;Blocks a name that is not in the customer's message.&lt;/li&gt;
&lt;li&gt;Blocks a name missing from the banner. A near miss (Adya for Aadhya) is named, and a repair is offered.&lt;/li&gt;
&lt;li&gt;Asks for a confirmation, not a silent merge, when a name is close to a spelling the shop already approved.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Accents count: José is not Jose. The model may arrange the line. It may not change a name.&lt;/p&gt;

&lt;p&gt;What it will not do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It will not print a changed name. Skipping the button and posting Adya straight to &lt;code&gt;/api/print&lt;/code&gt; still returns 409 and no page.&lt;/li&gt;
&lt;li&gt;It will not store the WhatsApp message. Tiger gets the approved spelling only, after a banner actually prints.&lt;/li&gt;
&lt;li&gt;It will not merge a close name on its own. Priyanca after an approved Priyanka asks the shop to confirm. It does not become Priyanka.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;1. The desk.&lt;/strong&gt; One page. The four steps (Message, Draft, Lock, Print) show where the job is.&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%2F5udhh7thuay0lafn1smq.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%2F5udhh7thuay0lafn1smq.png" alt="The NameLock desk" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The customer's message.&lt;/strong&gt; Paste the WhatsApp text, or pick a sample. The page shows size, colour and occasion as tags. On the shop laptop, Gemma reads this. In the public demo, a scripted drafter does.&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%2Fnpe6l9107p9zgj3n1g48.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%2Fnpe6l9107p9zgj3n1g48.png" alt="The customer's message" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The lock stops a changed name.&lt;/strong&gt; The drafted line is &lt;code&gt;Happy Birthday Adya&lt;/code&gt;. The customer wrote Aadhya. Print stays off.&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%2Fzr8n9m82xibajziyq4n8.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%2Fzr8n9m82xibajziyq4n8.png" alt="Do not print: Adya instead of Aadhya" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. One click puts the name back.&lt;/strong&gt; &lt;strong&gt;Use the customer's spelling on the banner&lt;/strong&gt; restores Aadhya. The lock runs again. The repair is only offered if that text itself passes.&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%2Fyym1shmwvvmhyvikmkdj.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%2Fyym1shmwvvmhyvikmkdj.png" alt="Safe to print: Aadhya restored" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The print sheet.&lt;/strong&gt; &lt;strong&gt;Proof passed&lt;/strong&gt;, the names that were checked, and a yellow banner that fits the text. The server runs the lock a second time before it returns this page. Posting Adya straight to &lt;code&gt;/api/print&lt;/code&gt; still gets a 409.&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%2Fcnpo66p6a0u9j0jlb012.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%2Fcnpo66p6a0u9j0jlb012.png" alt="The print sheet" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. The shop remembers.&lt;/strong&gt; Printed names are saved as approved spellings. The next time a message has a name that is close but not the same (Priyanca after Priyanka), the page asks. It does not merge them silently.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live sample demo:&lt;/strong&gt; &lt;a href="https://dev.toPASTE-RENDER-URL-HERE"&gt;PASTE-RENDER-URL-HERE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That page has no model. A scripted drafter builds the line. Tick &lt;strong&gt;Imitate a tool that fixes spellings&lt;/strong&gt;, pick &lt;strong&gt;Two a's, not Adya&lt;/strong&gt;, and draft. You should see the red stamp, then one click to green. The label on the page says it is scripted. Nothing you type is stored.&lt;/p&gt;

&lt;p&gt;The real Gemma run stays on the shop laptop. A public page cannot call it.&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/abhishekmsm51w-star" rel="noopener noreferrer"&gt;
        abhishekmsm51w-star
      &lt;/a&gt; / &lt;a href="https://github.com/abhishekmsm51w-star/namelock" rel="noopener noreferrer"&gt;
        namelock
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Banner name proof: Gemma drafts the line, a spelling lock blocks a changed name.
    &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;NameLock&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12" rel="nofollow"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One wrong letter in a name means a banner gets thrown away and printed again. NameLock lets a local
open-weight model draft the banner line, then refuses to print if any name is not exactly as the customer wrote it.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What I Built&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;A flex-banner and wedding-card print shop gets orders as messy WhatsApp messages:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;blue flex 6 by 3, birthday, name Aadhya, with two a's, not Adya&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;NameLock reads the message and drafts the banner (&lt;code&gt;Happy Birthday Aadhya&lt;/code&gt;). Then a plain Python check
compares every name on the banner to the customer's own words. If a letter changed, the page stamps
&lt;strong&gt;Do not print&lt;/strong&gt;, shows the customer's spelling next to the banner's spelling, and keeps the print button off
One click puts the customer's spelling back, the stamp turns &lt;strong&gt;Safe to&lt;/strong&gt;…&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/abhishekmsm51w-star/namelock" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;MIT. Two files decide whether a banner can print. &lt;code&gt;namelock/lock.py&lt;/code&gt; is the check, and it has no model in it. &lt;code&gt;namelock/book.py&lt;/code&gt; is the spelling book, SQLite on the laptop or Tiger Cloud when &lt;code&gt;DATABASE_URL&lt;/code&gt; is set.&lt;/p&gt;

&lt;h3&gt;
  
  
  The print gate in &lt;code&gt;namelock/app.py&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/print&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;print_page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;note&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;banner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;approved&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;names&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;printable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;HTTPException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;409&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Not printable: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&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="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;issues&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;approve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# a printed name is an approved spelling
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;_print_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;banner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gemma lives in &lt;code&gt;namelock/drafter.py&lt;/code&gt;. It asks Ollama for JSON and is never trusted. Whatever it returns goes through &lt;code&gt;verify()&lt;/code&gt; before this gate. Sample mode, with no model, is &lt;code&gt;NAMELOCK_BACKEND=demo&lt;/code&gt;. The run commands are in the repo README.&lt;/p&gt;

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

&lt;p&gt;The model drafts. The lock decides. The server checks again before anything can print. On the shop laptop that drafter is Gemma through Ollama. On the public demo it is the scripted stand-in. Either way the same check runs, and a pass writes the name into &lt;code&gt;approved_names&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma is untrusted on purpose.&lt;/strong&gt; &lt;code&gt;gemma3:1b&lt;/code&gt; through Ollama returns JSON: names copied as typed, occasion, size, colour, banner line. The prompt says never respell a name. I still send every draft through &lt;code&gt;lock.verify()&lt;/code&gt;. Swapping the model does not touch the check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lock is plain Python, and the tests notice if it breaks.&lt;/strong&gt; NFC only, so José is not Jose. A possessive &lt;code&gt;'s&lt;/code&gt; is not part of the name. An all-caps banner still matches. A repair is offered only when the repaired text itself passes the same check. 105 tests pass. I deleted the "name missing from the banner" rule on purpose and 26 tests failed, then I put the rule back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Gemma actually did.&lt;/strong&gt; On 15 Oct 2026 I ran 20 invented names (Aadhya, Siobhan, José, D'souza, Mary-Anne and others) through &lt;code&gt;gemma3:1b&lt;/code&gt; on this PC. The model did not respell any of them. It dropped 2 off the banner instead: Siobhan became a generic celebration line, and Mary-Anne became the size and colour. The lock caught both. 0 leaked. 0 false alarms. Median draft 0.4s. The first call took 61s while the model loaded.&lt;/p&gt;

&lt;p&gt;The red stamp in the screenshots is not that Gemma run. The checkbox &lt;strong&gt;Imitate a tool that fixes spellings&lt;/strong&gt; is a simulation I wrote, so a public page can show the bug without a model. The bench that catches 20 of 20 tests the lock against that simulation. It is not a score for Gemma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tiger stores spellings, not messages.&lt;/strong&gt; After a banner prints, each name goes into one table on Tiger Cloud:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;table&lt;/span&gt; &lt;span class="n"&gt;if&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;exists&lt;/span&gt; &lt;span class="n"&gt;approved_names&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;key&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;primary&lt;/span&gt; &lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next time a note is close to an approved spelling but not the same, the lock asks. This is a plain Postgres table. It is not pgvector and it is not hybrid search.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Render hosts the sample, not the model.&lt;/strong&gt; &lt;code&gt;render.yaml&lt;/code&gt; is one free Python web service with &lt;code&gt;NAMELOCK_BACKEND=demo&lt;/code&gt;. There is no &lt;code&gt;DATABASE_URL&lt;/code&gt; on Render, so the demo book is memory and dies on restart. Real notes stay on the laptop, where Ollama listens at &lt;code&gt;127.0.0.1:11434&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Actions fails the build if a changed name can print.&lt;/strong&gt; &lt;code&gt;.github/workflows/test.yml&lt;/code&gt; runs pytest, then &lt;code&gt;bench.py&lt;/code&gt; twice: once with a faithful drafter, once with the simulated autocorrect. A leak is a red build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where data goes.&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;Path&lt;/th&gt;
&lt;th&gt;Customer message&lt;/th&gt;
&lt;th&gt;Names&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Shop laptop, Ollama&lt;/td&gt;
&lt;td&gt;Stays on the laptop. The model runs at &lt;code&gt;127.0.0.1:11434&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;Approved spellings in local SQLite, or in Tiger Cloud if &lt;code&gt;DATABASE_URL&lt;/code&gt; is set. Names only.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public demo on Render&lt;/td&gt;
&lt;td&gt;Sample notes. The text you type hits the Render server and is not stored.&lt;/td&gt;
&lt;td&gt;In memory. Lost on restart.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The page loads fonts from Google Fonts, so the browser contacts Google.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not done.&lt;/strong&gt; The 20 names are invented. There is no first user, so this post has no "what they said" section. The public demo cannot show Gemma.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug I actually hit
&lt;/h2&gt;

&lt;p&gt;I built the lock because I expected Gemma to "fix" Aadhya into Adya, the way a chat tool does. On the real run it did not do that.&lt;/p&gt;

&lt;p&gt;I gave &lt;code&gt;gemma3:1b&lt;/code&gt; 20 invented names. It kept the spellings it used. It failed a different way: two names never reached the banner. Siobhan came back as a generic celebration line. Mary-Anne came back as the size and the colour. The lock stopped both. Nothing leaked, and there were no false alarms. The first call took 61 seconds while the model loaded. After that the median draft was 0.4 seconds.&lt;/p&gt;

&lt;p&gt;The red &lt;strong&gt;Do not print&lt;/strong&gt; stamp in the screenshots is not that Gemma run. The public demo has no model, so the checkbox &lt;strong&gt;Imitate a tool that fixes spellings&lt;/strong&gt; is a simulation I wrote, to show the reprint bug on a page anyone can open. The 20-out-of-20 bench scores that simulation. It does not score Gemma.&lt;/p&gt;

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

&lt;p&gt;Three things a closed chat tool would not give this shop.&lt;/p&gt;

&lt;p&gt;The messages stay on the counter. They hold names and phone numbers. With a local model they never leave the laptop.&lt;/p&gt;

&lt;p&gt;There is no fee per banner. The shop prints many small jobs.&lt;/p&gt;

&lt;p&gt;The shop can fix the behaviour, not hope for it. The bug is a hosted chat tool that "corrects" a spelling. With an open model I can pin the instructions, swap the model, and put a check after it that does not depend on the model. The lock does not care which model drafted the line.&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;gemma3:1b&lt;/code&gt; through Ollama drafts every real banner. On the 20-name run it dropped Siobhan and Mary-Anne. The lock caught both. 0 leaked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Tiger Data.&lt;/strong&gt; Printed names go into &lt;code&gt;approved_names&lt;/code&gt; on Tiger Cloud, and a near spelling asks for confirmation. Plain table. Not vector search.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render.&lt;/strong&gt; One free web service from &lt;code&gt;render.yaml&lt;/code&gt;, sample notes only, no model and no database on the server. Live link is in Demo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of GitHub Actions.&lt;/strong&gt; Every push runs the tests and both 20-name benches. The build fails if a changed name could still print.&lt;/li&gt;
&lt;/ul&gt;

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

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Plant Care AI</title>
      <dc:creator>Abhishek</dc:creator>
      <pubDate>Tue, 06 Oct 2026 03:45:28 +0000</pubDate>
      <link>https://dev.to/abhishek_44d97e81b5a38faa/plant-care-ai-3d9m</link>
      <guid>https://dev.to/abhishek_44d97e81b5a38faa/plant-care-ai-3d9m</guid>
      <description>&lt;h1&gt;
  
  
  🌿 PlantCare AI — Take a Photo. Understand Your Plant. Go Touch Grass.
&lt;/h1&gt;

&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;Most gardening and plant diagnostic apps have a counterproductive design pattern: they try to keep you glued to your phone. Between endless scrolling forums, chat feeds, locked paywalls, and invasive notifications, the experience often pulls you &lt;em&gt;away&lt;/em&gt; from nature rather than connecting you with it.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;PlantCare AI&lt;/strong&gt; to invert this dynamic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PlantCare AI&lt;/strong&gt; is a lightweight, privacy-first plant health assistant powered by Google's open-weight &lt;strong&gt;Gemma&lt;/strong&gt; model family. It is built specifically around the Hacktoberfest 2026 Week 1 theme: &lt;strong&gt;"Touch Grass."&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Core Philosophy: The Screen is the Shortest Step
&lt;/h3&gt;

&lt;p&gt;Instead of an AI chatbot designed for long conversations, the entire user journey takes less than 60 seconds:&lt;/p&gt;

&lt;p&gt;$$\text{📸 Take Photo} \longrightarrow \text{🤖 Gemma Multimodal Inspection} \longrightarrow \text{🌱 Actionable Diagnosis} \longrightarrow \text{🌿 Touch Grass Task} \longrightarrow \text{🪴 Hands in the Dirt}$$&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instant Botanical Identification&lt;/strong&gt;: Accurately recognizes common and botanical species names with confidence scoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Health &amp;amp; Vitality Rating&lt;/strong&gt;: Assesses overall vitality (&lt;code&gt;Healthy&lt;/code&gt;, &lt;code&gt;Mostly Healthy&lt;/code&gt;, &lt;code&gt;Needs Attention&lt;/code&gt;, &lt;code&gt;Unhealthy&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Possible Disease Assessment&lt;/strong&gt;: Detects visual indicators consistent with fungal pathogens (e.g., Early Blight, Powdery Mildew), pest damage (e.g., Spider Mite stippling), and watering stress. It always includes a responsible safety disclaimer: &lt;em&gt;AI visual analysis is an assessment, not a laboratory pathology test.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practical Care Matrix&lt;/strong&gt;: Straightforward recommendations for watering schedule, sunlight requirements, and potting soil drainage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hands-On Action Checklist&lt;/strong&gt;: Interactive, actionable physical steps (e.g., prune diseased foliage with sanitized shears, increase ventilation, add clean mulch).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "Touch Grass" Mission&lt;/strong&gt;: Generates a single, real-world outdoor task (e.g., &lt;em&gt;"Go outside, wipe dust off the broad leaves with a damp cloth in fresh outdoor air, and take three deep breaths"&lt;/em&gt;). When completed, clicking &lt;strong&gt;"✓ I Did It"&lt;/strong&gt; triggers a celebratory confetti burst to reward real-world action!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Demo Mode&lt;/strong&gt;: Includes 3 realistic pre-built botanical scenarios (Healthy Monstera, Tomato with Early Blight, Fiddle Leaf Fig with Pest Stress) so judges and users can test the full flow instantly without needing an API key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy By Design&lt;/strong&gt;: Uploaded photos are processed in-memory and never stored on disk or databases. Zero login or tracking required.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Repository&lt;/strong&gt;: &lt;a href="https://github.com/abhishekusersfaci-lang/Plantcare-ai" rel="noopener noreferrer"&gt;https://github.com/abhishekusersfaci-lang/Plantcare-ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Testing&lt;/strong&gt;: Run &lt;code&gt;npm run dev&lt;/code&gt; and open &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;(If you deploy to Vercel or record a short video clip/Loom, you can paste the live link and embed your demo video or screenshot right here!)&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;The complete source code is open source under the MIT License:&lt;/p&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/abhishekusersfaci-lang" rel="noopener noreferrer"&gt;
        abhishekusersfaci-lang
      &lt;/a&gt; / &lt;a href="https://github.com/abhishekusersfaci-lang/Plantcare-ai" rel="noopener noreferrer"&gt;
        Plantcare-ai
      &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="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌿 PlantCare AI&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Take a photo. Understand your plant. Help it grow."&lt;/strong&gt;&lt;br&gt;
An open-AI-powered plant health assistant built with Google's &lt;strong&gt;Gemma&lt;/strong&gt; open-weight model family.&lt;br&gt;
&lt;em&gt;Created for the Hacktoberfest 2026 Open-Source AI Challenge (Week 1 Theme: "Touch Grass").&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📌 Problem&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Indoor gardeners, balcony farmers, and plant enthusiasts often notice wilting, yellowing leaves, or spots on their plants but have no idea what caused them or what steps to take. Commercial plant apps often lock diagnostic insights behind paywalls, require account registrations, or encourage endless screen-time browsing rather than getting users hands-on in the dirt.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌱 Solution&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;PlantCare AI&lt;/strong&gt; provides an instant, privacy-first plant health assessment powered by Google's open-weight &lt;strong&gt;Gemma&lt;/strong&gt; model. With a single photograph, Gemma identifies the plant species, assesses vitality, detects visual symptoms consistent with common plant diseases, suggests tailored watering and sunlight advice, and gives the user &lt;strong&gt;one practical outdoor "Touch Grass" action&lt;/strong&gt; to disconnect from their screen…&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/abhishekusersfaci-lang/Plantcare-ai" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Repository Link:
&lt;/h3&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://github.com/abhishekusersfaci-lang/Plantcare-ai" rel="noopener noreferrer"&gt;https://github.com/abhishekusersfaci-lang/Plantcare-ai&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




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

&lt;h3&gt;
  
  
  1. The Core AI Model: Gemma 4 Multimodal (&lt;code&gt;gemma-4-31b-it&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;At the heart of the diagnostic engine is &lt;strong&gt;Gemma&lt;/strong&gt;, Google's family of lightweight, state-of-the-art open-weight models.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why Gemma?&lt;/strong&gt; Rather than using proprietary closed models like Gemini, the app strictly uses &lt;strong&gt;Gemma 4&lt;/strong&gt; (&lt;code&gt;gemma-4-31b-it&lt;/code&gt;). Gemma 4 features a native multimodal architecture capable of reasoning over high-resolution image inputs and textual instructions simultaneously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multimodal Visual Diagnostics&lt;/strong&gt;: The model inspects raw image bytes directly to recognize leaf venation, concentric lesion rings (such as target-spotting in &lt;em&gt;Alternaria solani&lt;/em&gt;), chlorotic yellow margins, and pest damage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured JSON Schema&lt;/strong&gt;: Gemma returns structured, validated JSON conforming to our strict TypeScript schema, eliminating hallucinations and ensuring smooth rendering on the frontend.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework&lt;/strong&gt;: Next.js 15 (App Router, React 19, TypeScript)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling&lt;/strong&gt;: Tailwind CSS with custom nature-inspired color tokens (emerald greens, forest tones, earth ambers, and glassmorphism)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Integration&lt;/strong&gt;: Official Google GenAI SDK (&lt;code&gt;@google/genai&lt;/code&gt;) running strictly server-side in Next.js Route Handlers (&lt;code&gt;/api/analyze&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Micro-Interactions &amp;amp; Delight&lt;/strong&gt;: &lt;code&gt;canvas-confetti&lt;/code&gt; for the outdoor task celebration, &lt;code&gt;lucide-react&lt;/code&gt; for botanical iconography, and CSS seedling animations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Architecture Overview
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[User Camera / Photo Upload]
            │
            ▼
[Next.js Client (Drag &amp;amp; Drop / Camera Capture)]
            │ (POST multipart/form-data or Base64)
            ▼
[Server-side API Route: /api/analyze]
   ├── MIME Type Validation (JPG, PNG, WEBP)
   ├── Size Limit Check (&amp;lt; 10MB)
   └── Key / Demo Mode Resolver
            │
            ▼
[Google GenAI SDK with Gemma 4: gemma-4-31b-it]
            │
            ▼
[JSON Validator &amp;amp; Normalizer]
            │
            ▼
[Polished Plant Report + Touch Grass Interactive Card]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Open-weight models like &lt;strong&gt;Gemma&lt;/strong&gt; are pivotal for the future of specialized, privacy-sensitive AI applications:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Private &amp;amp; Local Edge Inference&lt;/strong&gt;: Plant care happens in backyards, balconies, and remote greenhouses where internet connectivity may be scarce. Open weights make it possible to run inference completely offline on edge devices (via Ollama, llama.cpp, or on-device NPUs), ensuring farmers' and gardeners' photos never leave their hardware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community Fine-Tuning&lt;/strong&gt;: Open weights allow researchers and agricultural universities to fine-tune Gemma on hyper-local plant diseases, rare native flora, and regional crop pests that proprietary commercial APIs ignore.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparency &amp;amp; Safety&lt;/strong&gt;: In agriculture, understanding why an AI flagged a symptom matters. Open-source models allow developers to inspect prompt responses, inspect latent activations, and ensure diagnostic caveats are responsibly communicated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Vendor Lock-In&lt;/strong&gt;: Developers are not tied to a single platform's pricing or sudden deprecation cycles; weights can be served across Google AI Studio, Vertex AI, Hugging Face, or self-hosted GPU clusters.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;This project was built and pair-programmed with an advanced AI coding agent in Google Antigravity IDE. The agent verified the latest official Google Gemma multimodal models (&lt;code&gt;gemma-4-31b-it&lt;/code&gt;), scaffolded the complete Next.js 15 application, created custom SVG botanical assets, tested the live API route end-to-end, and ensured that &lt;code&gt;.env.local&lt;/code&gt; API credentials stayed protected while pushing directly to GitHub.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemma&lt;/strong&gt;: Built with and powered by Google's open-weight Gemma multimodal model family (&lt;code&gt;gemma-4-31b-it&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Touch Grass Challenge (Week 1)&lt;/strong&gt;: Encourages users to close the app, step outside into their gardens or balconies, and physically care for living plants.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Study Buddy</title>
      <dc:creator>Abhishek</dc:creator>
      <pubDate>Fri, 02 Oct 2026 14:03:50 +0000</pubDate>
      <link>https://dev.to/abhishek_44d97e81b5a38faa/study-buddy-57m5</link>
      <guid>https://dev.to/abhishek_44d97e81b5a38faa/study-buddy-57m5</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;h1&gt;
  
  
  StudyBuddy — The Intelligent Focus, Flashcard &amp;amp; Quiz Companion
&lt;/h1&gt;

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

&lt;p&gt;I built &lt;strong&gt;StudyBuddy&lt;/strong&gt; for my close friend Alex, who has been preparing for tech certifications and university exams while juggling a busy schedule. Alex constantly faced two major obstacles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Focus fragmentation &amp;amp; tab overload:&lt;/strong&gt; Juggling three separate tools for a Pomodoro timer, Quizlet for flashcards, and random online quiz sites — each loaded with paywalls, ads, and login prompts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passive vs. Active Recall:&lt;/strong&gt; Alex often fell into the trap of passively reading notes instead of actively testing knowledge with practice questions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;StudyBuddy&lt;/strong&gt; solves this by unifying Alex's entire study loop into a single, cohesive, distraction-free web application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⏱️ &lt;strong&gt;Customizable Pomodoro Clock:&lt;/strong&gt; Features an animated circular SVG countdown, quick +/- 1m and 5m adjusters, configurable focus and break durations, and a built-in &lt;strong&gt;Web Audio ambient noise generator&lt;/strong&gt; (gentle rain, deep oceanic brown noise, and white noise) running 100% locally in the browser with zero external audio assets.&lt;/li&gt;
&lt;li&gt;🗂️ &lt;strong&gt;Interactive 3D Flashcards:&lt;/strong&gt; Built with spatial 3D CSS perspective flips. Alex can switch between curated decks (Web Development, Biology &amp;amp; Science) or create custom decks with an intuitive card manager. Supports quick keyboard shortcuts (&lt;code&gt;Space&lt;/code&gt; to flip, &lt;code&gt;Arrow&lt;/code&gt; keys to navigate, &lt;code&gt;M&lt;/code&gt; for Mastered, and &lt;code&gt;R&lt;/code&gt; for Review).&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Dual-Engine Quiz Platform:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instant Deck-to-Quiz:&lt;/strong&gt; Converts any flashcard deck into a dynamic multiple-choice quiz on the fly, smartly generating distractors from other cards in the deck.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Quiz Builder:&lt;/strong&gt; Allows Alex to create bespoke exams with custom options, designated correct answers, and instant explanations upon answering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post-Quiz Review:&lt;/strong&gt; Displays mastery percentage, letter grade badges, question-by-question breakdown of mistakes, and encouragement from the mascot.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;Pixel Buddy Mascot:&lt;/strong&gt; An animated, expressive companion widget with blinking eyes, a glowing halo, and mood shifts that cheers Alex on, shares science-backed study tips (the Feynman Technique, Interleaving, Active Recall), and celebrates milestone quiz scores.&lt;/li&gt;
&lt;li&gt;🔒 &lt;strong&gt;Privacy-First &amp;amp; Zero Friction:&lt;/strong&gt; Everything runs client-side with &lt;code&gt;localStorage&lt;/code&gt; persistence, zero account logins required, and full JSON backup export/import capabilities.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Local Demo:&lt;/strong&gt; Open [&lt;code&gt;https://innovatorcloudy.github.io/studdybuddy/&lt;/code&gt;] in any modern browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick Preview &amp;amp; Workflow:&lt;/strong&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Focus:&lt;/strong&gt; Start a 25-minute Pomodoro block, toggle ambient rain sounds, and set your target milestone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review:&lt;/strong&gt; Flip through high-yield flashcards with 3D animation, marking items as mastered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test:&lt;/strong&gt; Click "Quiz This Deck" to immediately test retention under test-like conditions with real-time feedback and explanations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track:&lt;/strong&gt; Check daily streak, total focus minutes, and cards mastered in the Stats panel.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;(You can also view a live deployed version hosted on GitHub Pages: &lt;code&gt;https://innovatorcloudy.github.io/studdybuddy&lt;/code&gt;)&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;The complete source code is lightweight, modular, and dependency-free:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/Innovatorcloudy/studdybuddy" rel="noopener noreferrer"&gt;https://github.com/Innovatorcloudy/studdybuddy&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Architecture Highlights:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;index.html&lt;/code&gt;&lt;/strong&gt;: Clean semantic HTML5 structure with accessible ARIA tab patterns and accessible modal dialogs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;style.css&lt;/code&gt;&lt;/strong&gt;: Modern dark-mode aesthetic inspired by twilight nebulae, featuring glassmorphism (&lt;code&gt;backdrop-filter: blur&lt;/code&gt;), smooth 3D CSS transforms (&lt;code&gt;rotateY(180deg)&lt;/code&gt;), and fluid responsive layout grids.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;app.js&lt;/code&gt;&lt;/strong&gt;: Pure Vanilla ES6+ featuring:

&lt;ul&gt;
&lt;li&gt;Web Audio API synthesizer for harmonic completion chimes and procedural ambient sound buffers.&lt;/li&gt;
&lt;li&gt;State management engine syncing with &lt;code&gt;localStorage&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Dynamic distractor generator for automatic quiz creation from flashcard decks.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;StudyBuddy was designed and developed through an agentic AI pair-programming workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Iterative Problem Framing:&lt;/strong&gt; I collaborated with an AI coding assistant to break Alex's study pain points down into a unified single-page architecture (Timer + Flashcards + Quiz + Mascot).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Dependency Sound Synthesis:&lt;/strong&gt; Rather than bundling heavy MP3 audio files or relying on external CDNs that could fail offline, we used the browser's native &lt;strong&gt;Web Audio API&lt;/strong&gt; to procedurally synthesize harmonic bell chimes and continuous Brownian/rain noise filters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adaptive Quiz Generation Algorithm:&lt;/strong&gt; We engineered an automated quiz constructor that analyzes flashcard decks and dynamically pairs each prompt with randomized distractor answers drawn from the deck, ensuring instant quizzes with zero manual setup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessible Micro-Interactions:&lt;/strong&gt; The AI agent assisted in fine-tuning 3D card flips, SVG progress-ring math (&lt;code&gt;stroke-dashoffset&lt;/code&gt; transitions), keyboard event listeners, and animated mascot state reactions.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Open innovation and open-source tooling fundamentally democratize learning:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Education Without Paywalls:&lt;/strong&gt; Essential learning tools shouldn't lock basic features like spaced repetition or custom quizzes behind expensive monthly subscriptions. By building on open web standards, anyone with a browser can study effectively for free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Ownership &amp;amp; Privacy:&lt;/strong&gt; Students' study habits, notes, and quiz histories shouldn't be harvested for ads or walled inside proprietary ecosystems. StudyBuddy stores everything locally on the user's device with easy JSON export/import.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community Extensibility:&lt;/strong&gt; Open innovation empowers students and educators to fork the codebase, adapt the mascot, integrate specialized medical or language flashcard decks, and tailor the experience to neurodiverse learning styles without corporate gatekeeping.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Workspace:&lt;/strong&gt; &lt;code&gt;f:\dev&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Harness:&lt;/strong&gt; Antigravity Agentic Assistant / Gemini 3.8&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session Highlights:&lt;/strong&gt; Autonomous scaffolding of semantic HTML, responsive CSS design system with 3D flip dynamics, Web Audio API sound generator, interactive custom quiz builder, and live browser validation.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Primary:&lt;/strong&gt; Hacktoberfest Weekend Challenge: Build for a Friend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Categories:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Build for a Friend&lt;/em&gt; (Personalized study buddy for Alex)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Open Innovation / Open-Source AI&lt;/em&gt; (Accessible, privacy-first educational tool)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Best Design &amp;amp; User Experience&lt;/em&gt; (Sleek dark mode, 3D card flipping, and animated companion)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built with ❤️ for Alex and curious minds everywhere!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Jan Sahay — From a Financial Crisis to a Citizen AI Voice Assistant</title>
      <dc:creator>Abhishek</dc:creator>
      <pubDate>Sat, 15 Aug 2026 10:29:08 +0000</pubDate>
      <link>https://dev.to/abhishek_44d97e81b5a38faa/jan-sahay-from-a-financial-crisis-to-a-citizen-ai-voice-assistant-2l8n</link>
      <guid>https://dev.to/abhishek_44d97e81b5a38faa/jan-sahay-from-a-financial-crisis-to-a-citizen-ai-voice-assistant-2l8n</guid>
      <description>&lt;h1&gt;
  
  
  🛡️ Jan Sahay (जन सहाय) — AI-Powered Citizen Assistance Platform
&lt;/h1&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;A 10-Day Journey Building a Real-Time, Multilingual Voice Agent for Financial Safety, Government Welfare &amp;amp; Cyber Fraud Containment&lt;/em&gt;
&lt;/h3&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%2F91bygk2z8tb4kzmxln7x.jpg" 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%2F91bygk2z8tb4kzmxln7x.jpg" alt=" " width="800" height="378"&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%2F9wau50369i8z9h7ifj4z.jpg" 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%2F9wau50369i8z9h7ifj4z.jpg" alt="Jan Sahay Banner" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📖 The Story That Started It All
&lt;/h2&gt;

&lt;p&gt;Imagine a small shopkeeper in Delhi named &lt;strong&gt;Ramesh&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One evening, Ramesh receives a message on his phone:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Your bank account will be blocked tonight. Verify your KYC immediately by clicking the link below."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Anxious and rushed, he clicks the link. Within a few minutes, he realizes the message was fake and an unauthorized transaction has taken place.&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%2Fatc9fzmjjidxi00eud1j.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%2Fatc9fzmjjidxi00eud1j.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now he is gripped with panic and urgent questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;What should he do right now?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Who should he contact?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Can he report the fraud and freeze his account before the money is moved?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Are there government schemes or emergency funds that could help his family recover?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The information exists across various portals and government websites—but finding the right, authoritative guidance during a crisis is overwhelmingly difficult. Most portals are text-heavy, loaded with bureaucratic jargon, or only in English.&lt;/p&gt;

&lt;p&gt;That very question became the inspiration behind &lt;strong&gt;Jan Sahay (जन सहाय)&lt;/strong&gt;: a citizen-focused, voice-first AI platform built to make &lt;strong&gt;financial literacy, fraud prevention, government welfare schemes, and complaint guidance&lt;/strong&gt; accessible to every citizen. Instead of navigating complex portals or waiting in queues, citizens can simply talk naturally in Hindi, English, or Hinglish to an empathetic AI voice assistant.&lt;/p&gt;

&lt;p&gt;This document outlines the complete story, architecture, development log, challenges solved, and setup guide for Jan Sahay over &lt;strong&gt;10 Days of Building Voice Agents&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏛️ The 4 Core Functional Pillars
&lt;/h2&gt;

&lt;p&gt;Rather than building a generic open-ended chatbot, Jan Sahay is structured around four foundational pillars designed specifically for citizen welfare and digital safety:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  ┌──────────────────────────────┐
                  │          JAN SAHAY           │
                  │   Citizen Voice Assistant    │
                  └──────────────┬───────────────┘
                                 │
     ┌──────────────────┬────────┴─────────┬──────────────────┐
     ▼                  ▼                  ▼                  ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│  Financial   │ │    Fraud     │ │  Government  │ │  Complaint   │
│   Literacy   │ │  Prevention  │ │   Schemes    │ │  Assistance  │
└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;💰 Financial Literacy:&lt;/strong&gt; Jargon-free guidance on savings accounts, budgeting fundamentals, formal credit, interest rates, and long-term financial planning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🛡️ Fraud Prevention:&lt;/strong&gt; Real-time coaching on OTP/PIN safety, identifying phishing messages, fake caller identification, and avoiding malicious screen-sharing APKs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🏛️ Government Welfare Schemes:&lt;/strong&gt; Deterministic eligibility calculations and checklists for &lt;strong&gt;PMJDY&lt;/strong&gt;, &lt;strong&gt;PMSBY&lt;/strong&gt;, &lt;strong&gt;PMJJBY&lt;/strong&gt;, &lt;strong&gt;Atal Pension Yojana (APY)&lt;/strong&gt;, &lt;strong&gt;Sukanya Samriddhi (SSY)&lt;/strong&gt;, &lt;strong&gt;PM Mudra Yojana&lt;/strong&gt;, and &lt;strong&gt;PM-KISAN&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📞 Complaint &amp;amp; Emergency Triage:&lt;/strong&gt; Structured step-by-step incident response for cybercrime reporting (&lt;strong&gt;1930 / cybercrime.gov.in&lt;/strong&gt;), bank dispute filing for RBI Zero-Liability protection, and consumer forum escalations.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🏗️ System Architecture &amp;amp; Real-Time Voice Flow
&lt;/h2&gt;

&lt;p&gt;Jan Sahay achieves sub-500ms voice turnaround times using real-time WebRTC audio streaming, streaming transcription, low-latency LLM reasoning, and natural Indian voice synthesis.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Real-Time Audio Pipeline Flow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
    A["🎙️ Citizen Speaks Audio"] --&amp;gt; B["⚡ LiveKit WebRTC&amp;lt;br/&amp;gt;Real-Time Transport"]
    B --&amp;gt; C["🗣️ Deepgram Nova-2&amp;lt;br/&amp;gt;Streaming Speech-to-Text"]
    C --&amp;gt; D["🧠 Google Gemini AI&amp;lt;br/&amp;gt;Reasoning &amp;amp; Intent"]
    D --&amp;gt; E["💰 Financial Rules Engine&amp;lt;br/&amp;gt;+ Caller Memory DB"]
    E --&amp;gt; F["🔊 Murf Falcon TTS&amp;lt;br/&amp;gt;Ultra-Fast Indian Voices"]
    F --&amp;gt; G["🗣️ Natural Voice&amp;lt;br/&amp;gt;Playback to Citizen"]

    G -.-&amp;gt; A

    style A fill:#1E293B,stroke:#38BDF8,color:#fff
    style B fill:#0284C7,stroke:#38BDF8,color:#fff
    style C fill:#0D9488,stroke:#2DD4BF,color:#fff
    style D fill:#6366F1,stroke:#A5B4FC,color:#fff
    style E fill:#D97706,stroke:#FDE68A,color:#fff
    style F fill:#EA580C,stroke:#FDBA74,color:#fff
    style G fill:#10B981,stroke:#6EE7B7,color:#fff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Complete Multi-Tier Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                        ┌──────────────────────┐
                        │        CITIZEN       │
                        └──────────┬───────────┘
                                   │ (Speaks / Listens)
                                   ▼
                        ┌──────────────────────┐
                        │ Jan Sahay Web Portal │
                        │   (Next.js Client)   │
                        └──────────┬───────────┘
                                   │ WebRTC Audio Stream (LiveKit)
                                   ▼
                        ┌──────────────────────┐
                        │ LiveKit Voice Agent  │
                        └─────┬──────────┬─────┘
                              │          │
        ┌─────────────────────┘          └─────────────────────┐
        ▼                                                      ▼
┌───────────────┐                                      ┌───────────────┐
│   Deepgram    │ (Audio to Text)                      │  Murf Falcon  │ (Text to Audio)
│  Nova-2 STT   │                                      │   (TTS API)   │
└───────┬───────┘                                      └───────▲───────┘
        │                                                      │
        ▼                                                      │
┌──────────────────────────────────────────────────────────────┴───────┐
│                     Google Gemini Orchestrator                       │
└───────┬───────────────────────────────┬──────────────────────────────┘
        │                               │
        ▼                               ▼
┌───────────────┐               ┌───────────────┐
│ Caller Memory │               │ Rules Engine  │
│ (SQLite DB)   │               │ (Deterministic│
│               │               │ Scheme Logic) │
└───────────────┘               └───────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎙️ Meet the Team of AI Specialists
&lt;/h2&gt;

&lt;p&gt;Jan Sahay uses a multi-agent federation where a main intake guide dynamically hands off the conversation to dedicated domain specialists, matching their persona with the optimal &lt;strong&gt;Murf Falcon voice profile&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;Specialist Avatar&lt;/th&gt;
&lt;th&gt;Agent Role &amp;amp; Domain&lt;/th&gt;
&lt;th&gt;Voice Profile&lt;/th&gt;
&lt;th&gt;Supported Locales&lt;/th&gt;
&lt;th&gt;Key Capabilities&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Anisha&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Main Intake &amp;amp; General Guide&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Anisha&lt;/code&gt; (Murf Falcon)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;en-IN&lt;/code&gt; / &lt;code&gt;hi-IN&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Warm intake, 2-turn scoping, personalized greetings, banking basics.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Samar&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cyber Safety &amp;amp; Emergency Containment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Samar&lt;/code&gt; (Murf Falcon)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;en-IN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Golden hour containment, 1930 reporting, bank helpline lookup.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pooja&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Government Schemes &amp;amp; Pension Guide&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Pooja&lt;/code&gt; (Murf Falcon)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;en-IN&lt;/code&gt; / &lt;code&gt;hi-IN&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;APY pension calculators, Sukanya Samriddhi (8.2%), PMJDY/PMSBY/PMJJBY.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Samar&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Micro-Credit &amp;amp; Business Loans&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Samar&lt;/code&gt; (Murf Falcon)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;en-IN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PMMY Mudra loans (Shishu, Kishore, Tarun), PM SVANidhi vendor loans.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Palak&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Agri-Financial &amp;amp; Crop Insurance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Palak&lt;/code&gt; (Murf Falcon)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;en-IN&lt;/code&gt; / &lt;code&gt;hi-IN&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;PMFBY 72-hr crop loss reporting, PM-KISAN e-KYC status, Kisan Credit Cards.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  📅 10-Day Development Journey &amp;amp; Log
&lt;/h2&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%2Fefwcphxmh1l7r2dzf2pz.jpg" 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%2Fefwcphxmh1l7r2dzf2pz.jpg" alt="Development Highlights" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🟢 Day 1 — The Problem: Financial Confusion Is Everywhere
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Key Realization&lt;/strong&gt;: Financial information is available, but accessibility is broken. Ordinary citizens struggle with banking, digital safety (UPI fraud/phishing), welfare schemes, and dispute recourse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Objective&lt;/strong&gt;: Build an AI assistant that feels less like a search engine and more like a patient, empathetic citizen-support counselor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core Pillars Defined&lt;/strong&gt;: Simple, Conversational, Multilingual, Trustworthy, and Voice-first.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟢 Day 2 — Designing the Citizen Experience
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Structured the core 4-pillar interaction model (Financial Literacy, Fraud Prevention, Government Schemes, Complaint Assistance).&lt;/li&gt;
&lt;li&gt;Defined prompt rules prohibiting hallucinations and outlining empathetic responses for users facing financial distress.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟢 Day 3 — Giving the AI a Memory
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Problem&lt;/strong&gt;: Stateless chatbots suffer from amnesia. If Ramesh calls today about his daughter's education fund and calls back tomorrow, repeating context causes friction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Built the &lt;strong&gt;Caller Memory Database&lt;/strong&gt; (&lt;code&gt;backend/caller_data.db&lt;/code&gt; using SQLite) with schema for &lt;code&gt;user_id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;language_pref&lt;/code&gt;, &lt;code&gt;demographic_facts&lt;/code&gt;, and &lt;code&gt;discussed_schemes&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy First&lt;/strong&gt;: Integrated explicit verbal consent checks (&lt;em&gt;"May I remember this for your next call?"&lt;/em&gt;) before storing non-PII demographic facts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟢 Day 4 — Building the Government Scheme Knowledge Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Architecture Rule&lt;/strong&gt;: &lt;em&gt;LLM handles dialogue $\rightarrow$ Deterministic Rules Engine guarantees official policy truth.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Implemented exact formula calculators for:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PMJDY&lt;/strong&gt;: Zero balance, RuPay debit card, ₹2L accident insurance cover.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PMSBY&lt;/strong&gt;: Accidental death/disability cover (Age 18–70, ₹20/year premium, ₹2 Lakh cover).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PMJJBY&lt;/strong&gt;: Life insurance cover (Age 18–50, ₹436/year premium, ₹2 Lakh cover).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APY&lt;/strong&gt;: Atal Pension Yojana pension slabs (₹1,000–₹5,000/mo at age 60 based on entry age).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSY&lt;/strong&gt;: Sukanya Samriddhi Yojana (Girl child &amp;lt; 10 yrs, current 8.2% interest, tax exemptions).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟢 Day 5 — Turning Text Into a Real-Time Voice Conversation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Integrated &lt;strong&gt;LiveKit WebRTC Agents&lt;/strong&gt; with &lt;strong&gt;Deepgram Nova-2 STT&lt;/strong&gt; and &lt;strong&gt;Murf Falcon TTS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enabled streaming bidirectional audio with Silero VAD (Voice Activity Detection) for seamless turn detection and low-latency interruptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟢 Day 6 — Making Jan Sahay Multilingual &amp;amp; Code-Mixed
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Configured STT and TTS mappings for English (&lt;code&gt;en-IN&lt;/code&gt;), Hindi (&lt;code&gt;hi-IN&lt;/code&gt;), and conversational Hinglish.&lt;/li&gt;
&lt;li&gt;Enforced single-language response purity per turn to eliminate double-audio slash artifacts (&lt;code&gt;"Hello / नमस्ते"&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟢 Day 7 — Fraud Prevention as a First-Class Feature
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Implemented &lt;strong&gt;Immediate Action Matrix&lt;/strong&gt; for cyber safety:

&lt;ul&gt;
&lt;li&gt;Strict alerts on OTP/PIN confidentiality.&lt;/li&gt;
&lt;li&gt;Screen-sharing warning triggers (AnyDesk, TeamViewer).&lt;/li&gt;
&lt;li&gt;Unverified QR code and UPI PIN receiving scam alerts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Golden Hour Protocols&lt;/strong&gt; to halt fund movement.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟢 Day 8 — Action-Oriented Complaint Assistance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Developed structured escalation protocols:

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Banking Disputes&lt;/strong&gt;: Card freeze, dispute filing within 3 days for RBI Zero-Liability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cybercrime Reporting&lt;/strong&gt;: Guided walkthrough for &lt;code&gt;cybercrime.gov.in&lt;/code&gt; and National Helpline &lt;strong&gt;1930&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human Escalation&lt;/strong&gt;: Generates unique escalation reference IDs (e.g., &lt;code&gt;ESC-XXXXX&lt;/code&gt;) logged to SQLite for officer review.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟢 Day 9 — Building the Web Portal &amp;amp; Telemetry Dashboard
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Developed a high-performance &lt;strong&gt;Next.js&lt;/strong&gt; web application with a single-click 🎙️ &lt;strong&gt;"Start Talking"&lt;/strong&gt; interface.&lt;/li&gt;
&lt;li&gt;Built real-time telemetry tracking turn latency, outcome classifications (resolved/escalated), and active escalation queues at &lt;code&gt;/api/dashboard&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Added telephony SIP outbound calling capability (&lt;code&gt;backend/src/outbound_call.py&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟢 Day 10 — Open-Source Release &amp;amp; Architecture Documentation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Packaged repository with automated startup scripts (&lt;code&gt;start_app.ps1&lt;/code&gt; / &lt;code&gt;start_app.sh&lt;/code&gt;), comprehensive API documentation, and architecture diagrams.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚧 Challenges Faced &amp;amp; How We Solved Them
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 🌐 Multilingual &amp;amp; Language Switching Inconsistencies
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Problem&lt;/strong&gt;: In bilingual English/Hindi environments, the agent sometimes randomly replied in Hindi to an English prompt or switched languages mid-conversation without user intent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How We Solved It&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Implemented session-level language tracking in SQLite memory.&lt;/li&gt;
&lt;li&gt;Enforced strict prompt guidelines: detect user language preference, maintain it consistently across turns, and switch languages only when explicitly requested by the citizen.&lt;/li&gt;
&lt;li&gt;Required native Devanagari script output for Hindi responses to ensure Murf Falcon TTS synthesizes authentic intonation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. 🧠 Hallucination-Free Financial Reasoning
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Problem&lt;/strong&gt;: Financial queries involving age limits, cutoff dates, premium tiers, and pension returns must be 100% accurate. LLMs can hallucinate calculation schedules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How We Solved It&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Decoupled conversational empathy from calculations.&lt;/li&gt;
&lt;li&gt;Gemini extracts parameters (age, target pension, child age) and calls deterministic Python functions (&lt;code&gt;calculate_apy_contribution&lt;/code&gt;, &lt;code&gt;get_scheme_details&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Verified math is returned to Gemini to format as a spoken response.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Citizen Question ──&amp;gt; Gemini AI (Intent Extraction) ──&amp;gt; Python Rules Engine ──&amp;gt; Verified Result ──&amp;gt; Murf Voice
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. 🔄 Dynamic Voice Profile Switching in WebRTC
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Problem&lt;/strong&gt;: Tearing down WebRTC rooms when switching from Anisha to Samar or Pooja caused noticeable audio stutters and 2–3s delays.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How We Solved It&lt;/strong&gt;: Kept the WebRTC audio transport live while dynamically swapping the Murf Falcon voice profile parameters in-flight during tool execution.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. 🛡️ Accidental PII Memorization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Problem&lt;/strong&gt;: Panicked callers reporting fraud frequently blurt out card numbers or PINs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How We Solved It&lt;/strong&gt;: Built an automated sanitization regex layer in &lt;code&gt;save_caller_facts&lt;/code&gt; and &lt;code&gt;create_escalation&lt;/code&gt; that automatically scrubs card numbers, OTPs, PINs, and passwords before database commits.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔮 What's Next on the Roadmap
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;📞 Telephony &amp;amp; IVR Toll-Free Access&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;SIP Trunking integration with Exotel / Twilio so citizens without smartphones can dial a toll-free number from any basic feature phone.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🗣️ Hyper-Local Regional Dialects&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Expand beyond Hindi/English to regional languages (Bhojpuri, Maithili, Bengali, Marathi, Tamil, Telugu).&lt;/li&gt;
&lt;li&gt;Acoustic noise suppression tuned for busy Indian environments (markets, bus stops, railway stations).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📄 DigiLocker &amp;amp; Voice-Guided Application&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Voice OTP authorization for instant eligibility verification via DigiLocker.&lt;/li&gt;
&lt;li&gt;Voice-guided form pre-filling for PM-KISAN and Sukanya Samriddhi portals.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📲 Multi-Channel Follow-ups (WhatsApp / SMS)&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Automated post-call summary SMS with verified helpline links, scheme forms, and grievance reference IDs.&lt;/li&gt;
&lt;li&gt;Instant downloadable PDF checklist generated at the end of the voice call.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🚨 Proactive Outbound Alerts&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Automated voice alerts when subsidy installments (PM-KISAN, APY pensions) are credited.&lt;/li&gt;
&lt;li&gt;Geo-targeted voice broadcasts warning citizens about emerging phishing scams in their district.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🛠️ Step-by-Step Quickstart Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt; 3.10+&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://docs.astral.sh/uv/" rel="noopener noreferrer"&gt;uv&lt;/a&gt;&lt;/strong&gt; (Fast Python package manager)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# Windows (PowerShell)&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;powershell&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ExecutionPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ByPass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"irm https://astral.sh/uv/install.ps1 | iex"&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="c"&gt;# macOS/Linux&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;curl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-LsSf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://astral.sh/uv/install.sh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js&lt;/strong&gt; 18+ and &lt;strong&gt;pnpm&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; pnpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LiveKit Cloud Account&lt;/strong&gt;: &lt;a href="https://cloud.livekit.io/" rel="noopener noreferrer"&gt;cloud.livekit.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Murf AI API Key&lt;/strong&gt;: &lt;a href="https://murf.ai/api/dashboard" rel="noopener noreferrer"&gt;murf.ai/api/dashboard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google AI Studio API Key&lt;/strong&gt;: &lt;a href="https://aistudio.google.com/" rel="noopener noreferrer"&gt;aistudio.google.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deepgram API Key&lt;/strong&gt;: &lt;a href="https://deepgram.com/" rel="noopener noreferrer"&gt;deepgram.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Step 1: Clone the Repository &amp;amp; Configure Secrets
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/your-username/jan-sahay-voice-agent.git
&lt;span class="nb"&gt;cd &lt;/span&gt;jan-sahay-voice-agent/murf-livekit-starter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create &lt;code&gt;.env.local&lt;/code&gt; files in both &lt;code&gt;backend/&lt;/code&gt; and &lt;code&gt;frontend/&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;backend/.env.local&lt;/code&gt;&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LIVEKIT_URL=wss://your-project.livekit.cloud
LIVEKIT_API_KEY=your_livekit_key
LIVEKIT_API_SECRET=your_livekit_secret
MURF_API_KEY=your_murf_falcon_api_key
DEEPGRAM_API_KEY=your_deepgram_api_key
GOOGLE_API_KEY=your_gemini_api_key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;frontend/.env.local&lt;/code&gt;&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LIVEKIT_URL=wss://your-project.livekit.cloud
LIVEKIT_API_KEY=your_livekit_key
LIVEKIT_API_SECRET=your_livekit_secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 2: Install Backend Dependencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;backend
uv &lt;span class="nb"&gt;sync
&lt;/span&gt;uv run python src/agent.py download-files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 3: Install Frontend Dependencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ../frontend
pnpm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 4: Run the Application
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Option A: One-Click Startup Script (Recommended)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Windows (PowerShell):&lt;/span&gt;
.&lt;span class="se"&gt;\s&lt;/span&gt;tart_app.ps1

&lt;span class="c"&gt;# Linux / macOS:&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x start_app.sh
./start_app.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Option B: Separate Terminals
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Terminal 1: Backend Voice Worker&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;backend
uv run python src/agent.py dev

&lt;span class="c"&gt;# Terminal 2: Frontend Web UI &amp;amp; Dashboard&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;frontend
pnpm dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;strong&gt;&lt;code&gt;http://localhost:3000&lt;/code&gt;&lt;/strong&gt; in your browser, click &lt;strong&gt;"Start talking"&lt;/strong&gt;, grant microphone access, and begin speaking with &lt;strong&gt;Anisha&lt;/strong&gt;!&lt;/p&gt;




&lt;h2&gt;
  
  
  📁 Repository Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jan-sahay/
├── README.md                           # Main documentation &amp;amp; 10-day build story
└── murf-livekit-starter/
    ├── start_app.ps1                   # Windows 1-click startup script
    ├── start_app.sh                    # Linux/macOS 1-click startup script
    ├── backend/
    │   ├── caller_data.db              # SQLite Caller Memory &amp;amp; Escalations DB
    │   ├── src/
    │   │   ├── agent.py                # Main LiveKit Agent &amp;amp; Multi-Specialist logic
    │   │   ├── db.py                   # SQLite memory CRUD, calculators &amp;amp; PII sanitizer
    │   │   ├── prompt.py               # Anisha persona &amp;amp; system guardrails
    │   │   ├── specialist_prompts.py   # Prompts for Samar, Pooja, and Palak
    │   │   └── outbound_call.py        # Telephony SIP outbound dialer
    │   └── pyproject.toml              # uv Python dependencies
    └── frontend/
        ├── app/
        │   ├── page.tsx                # Next.js Voice Assistant Web Interface
        │   └── api/dashboard/route.ts  # Observability &amp;amp; Escalations API
        └── package.json                # Frontend dependencies (pnpm)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






</description>
      <category>voiceagent</category>
      <category>10daysofaivoiceagents</category>
      <category>murffalcon</category>
      <category>voiceforbharat</category>
    </item>
    <item>
      <title>my post mera post</title>
      <dc:creator>Abhishek</dc:creator>
      <pubDate>Sat, 15 Aug 2026 05:58:28 +0000</pubDate>
      <link>https://dev.to/abhishek_44d97e81b5a38faa/my-post-mera-post-38j4</link>
      <guid>https://dev.to/abhishek_44d97e81b5a38faa/my-post-mera-post-38j4</guid>
      <description>&lt;p&gt;happy guys&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>Navigatop</title>
      <dc:creator>Abhishek</dc:creator>
      <pubDate>Sat, 11 Apr 2026 13:58:12 +0000</pubDate>
      <link>https://dev.to/abhishek_44d97e81b5a38faa/navigatop-2lm2</link>
      <guid>https://dev.to/abhishek_44d97e81b5a38faa/navigatop-2lm2</guid>
      <description>&lt;h2&gt;
  
  
  📖 Overview
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Navigato Platinum&lt;/strong&gt; is a premium...&lt;/p&gt;

&lt;p&gt;In a venue hosting &lt;strong&gt;132,000 attendees&lt;/strong&gt;, congestion and emergency response are critical life-safety challenges. Navigato solves this by aggregating real-time occupancy data and delivering strategic insights via an &lt;strong&gt;AI-Grounded Spatial Hub&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Approach and Logic
&lt;/h2&gt;

&lt;p&gt;Large venues suffer from "Information Blackouts" during peak events. Navigato creates a &lt;strong&gt;Single Source of Truth&lt;/strong&gt; across defined zones (Gates, Food Courts, Pavilions).&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Strategic Decision Making
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Status Derivation&lt;/strong&gt;: Zone health (Clear, Moderate, Crowded, Critical) is dynamically calculated using a weighted threshold algorithm based on live capacity-to-density ratios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pathfinding (Dijkstra's Algorithm)&lt;/strong&gt;: Navigation routes are not just the shortest path; they are the &lt;strong&gt;fastest&lt;/strong&gt; path. The edge weights in our Dijkstra implementation are adjusted in real-time based on the congestion ratio of each zone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Context Grounding&lt;/strong&gt;: The Gemini assistant is "Stitched" into the stadium's live telemetry. Every prompt is injected with the current JSON state of the venue, enabling hyper-accurate, real-time advice.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ The Twin-Engine™ Architecture
&lt;/h2&gt;

&lt;p&gt;To achieve 100% startup stability on Google Cloud Run, Navigato utilizes a proprietary &lt;strong&gt;Twin-Engine&lt;/strong&gt; boot sequence.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sequenceDiagram
    participant GCR as Google Cloud Run
    participant E1 as Engine 1 (Safe-Start)
    participant E2 as Engine 2 (Platinum Core)

    GCR-&amp;gt;&amp;gt;E1: SIGINIT Launch
    E1-&amp;gt;&amp;gt;E1: Bind Port 8080 (Instantly)
    Note over E1: Health Check Passed (2ms)
    E1-&amp;gt;&amp;gt;E2: Modular Dynamic Import
    E2-&amp;gt;&amp;gt;E2: Warm up AI Clusters &amp;amp; GCS Streams
    E2--&amp;gt;&amp;gt;E1: Core Synchronized
    Note over E1,E2: Platform 100% Operational
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Engine 1 (The Shield)&lt;/strong&gt;: A lightweight Node.js entrypoint that binds to the assigned PORT immediately to prevent timeout errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engine 2 (The Intelligence)&lt;/strong&gt;: The modular Express 5.0 application logic, loaded after the port is stable.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📂 Full Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── server/                 # PLATINUM BACKEND ENGINE
│   ├── boot.ts             # Engine 1: Instant-bind bootstrapper
│   ├── index.ts            # Engine 2: Modular app logic (Express 5)
│   ├── routes/             # API Endpoints
│   │   ├── ai.ts           # Gemini 1.5 Flash Chat &amp;amp; Triage
│   │   └── incidents.ts    # GCS Visual Telemetry Pipeline
│   ├── services/           # External Service Layer
│   │   ├── gemini.ts       # Google Gen AI SDK Integration
│   │   ├── storage.ts      # Cloud Storage Stream Engine
│   │   └── analytics.ts    # BigQuery &amp;amp; Event Logging
│   └── middleware/         # Security &amp;amp; Auth
│       └── auth.ts         # Firebase Admin Token Verification
├── src/                    # ELITE FRONTEND HUB (React 19)
│   ├── components/         # Premium Component Library
│   │   ├── attendee/       # ZoneMap, LiveHub, Dispatch
│   │   └── layout/         # Glassmorphism Framework
│   ├── context/            # Global State (ZoneContext)
│   ├── hooks/              # Custom Logic (useAuth)
│   └── App.tsx             # Main System Entrypoint
├── Dockerfile              # Multi-Stage Production Shield
├── vite.config.js          # Advanced Rollup Code-Splitting
└── deploy.ps1              # One-Click Cloud Run Deployer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🛠️ Google Services Integration
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Integration Detail&lt;/th&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Cloud Run&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-stage container runtime with Twin-Engine boot.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Dockerfile&lt;/code&gt;, &lt;code&gt;boot.ts&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Maps JS API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Satellite imagery + Advanced Markers + Directions.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ZoneMap.tsx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gemini 1.5 Flash&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI Chat Assistant &amp;amp; Visual Incident Triage.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;gemini.ts&lt;/code&gt;, &lt;code&gt;ai.ts&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Visual telemetry streams for emergency dispatch.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;storage.ts&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Firebase Admin&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Role-based custom claims &amp;amp; Token security.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;auth.ts&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Cloud Logging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Structured JSON logging for 100% observability.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;index.ts&lt;/code&gt;, &lt;code&gt;boot.ts&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🏗️ System Visualizations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The Intelligence Pipeline (AI Triage)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TD
    A[Attendee Report] --&amp;gt;|Satellite Telemetry| B(Google Cloud Storage)
    A --&amp;gt;|Contextual Description| C(Navigato AI)
    B --&amp;gt; C
    C --&amp;gt;|Gemini 1.5 Flash| D{Strategic Severity}
    D --&amp;gt;|HIGH| E[Emergency Staff Dispatch]
    D --&amp;gt;|LOW/MED| F[Operational Logging]
    E --&amp;gt; G(Cloud Pub/Sub Alert)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. The Platinum Cloud Stack
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph LR
    User[Attendee] --&amp;gt;|React 19| FE(Frontend Hub)
    FE --&amp;gt;|Vite 8 / ESM| BE(Platinum Core)
    BE --&amp;gt;|Twin-Engine™ Boot| CR(Cloud Run)
    CR --&amp;gt;|Security| FA(Firebase Admin)
    CR --&amp;gt;|Spatial| GM(Google Maps)
    CR --&amp;gt;|Gen AI| AI(Gemini 1.5)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Setup &amp;amp; Running locally
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Environment Setup&lt;/strong&gt;: Add your &lt;code&gt;VITE_GOOGLE_MAPS_API_KEY&lt;/code&gt; to the &lt;code&gt;.env&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install &amp;amp; Build&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ignite the Platform&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;




&lt;blockquote&gt;
&lt;p&gt;[!IMPORTANT]&lt;br&gt;
&lt;strong&gt;Production Note&lt;/strong&gt;: Navigato Platinum is optimized for the &lt;strong&gt;Narendra Modi Stadium&lt;/strong&gt; geolocation. For local testing, use the "Force Sync" demo mode to bypass live GPS requirements.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Navigato Platinum • Strategic Crowd Intelligence&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Built by &lt;strong&gt;Abhishek&lt;/strong&gt; for &lt;strong&gt;Promptwars&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Building MovieSync in Public: A Real-Time Dashboard for Smarter Movie Intermissions</title>
      <dc:creator>Abhishek</dc:creator>
      <pubDate>Fri, 10 Apr 2026 05:23:53 +0000</pubDate>
      <link>https://dev.to/abhishek_44d97e81b5a38faa/building-moviesync-in-public-a-real-time-dashboard-for-smarter-movie-intermissions-4h6n</link>
      <guid>https://dev.to/abhishek_44d97e81b5a38faa/building-moviesync-in-public-a-real-time-dashboard-for-smarter-movie-intermissions-4h6n</guid>
      <description>&lt;p&gt;Building MovieSync in Public (with Antigravity) 🎬🚀&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.amazonaws.com%2Fuploads%2Farticles%2Fb4td59m6v75x59vfptbm.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.amazonaws.com%2Fuploads%2Farticles%2Fb4td59m6v75x59vfptbm.png" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building in public means sharing not just the outcome, but the tools and decisions behind it. While creating MovieSync, I also leveraged Antigravity to accelerate development and deployment, making the project faster to ship and easier to scale.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;The Problem&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Movie intermissions are short, but queues are long. Whether it’s the washroom or food counter, people waste valuable break time waiting. There’s no visibility into crowd density, and decisions are made blindly.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;The Idea&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
MovieSync is a real-time venue dashboard that shows crowd levels across different areas using simple color indicators. Users can instantly decide where to go and avoid congestion.&lt;/p&gt;

&lt;p&gt;Tech Stack&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. React + Vite (Frontend)&lt;/li&gt;
&lt;li&gt;2. Vanilla CSS (Glassmorphism UI)&lt;/li&gt;
&lt;li&gt;3. Docker (Multi-stage build)&lt;/li&gt;
&lt;li&gt;4. Nginx (Static hosting)&lt;/li&gt;
&lt;li&gt;5. Google Cloud Run (Serverless deployment)&lt;/li&gt;
&lt;li&gt;6. Antigravity (Rapid development &amp;amp; cloud workflow acceleration)&lt;/li&gt;
&lt;li&gt;7. Frontend Architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built the UI with React and Vite to keep it lightweight and fast. Instead of using heavy UI frameworks, I hand-coded the layout with Vanilla CSS. The interface uses glassmorphism effects, smooth transitions, and micro-animations to create a premium experience.&lt;/p&gt;

&lt;p&gt;Real-Time Simulation&lt;/p&gt;

&lt;p&gt;Since real sensors were unavailable, I implemented dynamic simulators that mimic WebSocket-based IoT data. The dashboard updates crowd density in real time using:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Green → Low traffic&lt;br&gt;
Orange → Moderate traffic&lt;br&gt;
Red → High congestion&lt;br&gt;
Docker Multi-Stage Build&lt;br&gt;
The project uses a two-stage Docker setup:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Node stage builds optimized assets&lt;br&gt;
Nginx stage serves the static SPA on port 8080&lt;/p&gt;

&lt;p&gt;This keeps the container small and production-ready.&lt;/p&gt;

&lt;p&gt;Cloud Deployment with Google Cloud Run&lt;/p&gt;

&lt;p&gt;The container is deployed serverlessly using Google Cloud Run. It automatically scales based on traffic and integrates with Cloud Build for CI/CD.&lt;/p&gt;

&lt;p&gt;Deployment command:&lt;/p&gt;

&lt;p&gt;gcloud run deploy moviesync --source . --port 8080&lt;br&gt;
Where Antigravity Helped&lt;/p&gt;

&lt;p&gt;Antigravity helped streamline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rapid scaffolding of the project structure&lt;/li&gt;
&lt;li&gt;Faster iteration during UI development&lt;/li&gt;
&lt;li&gt;Simplified deployment workflow&lt;/li&gt;
&lt;li&gt;Reduced setup complexity for cloud deployment&lt;/li&gt;
&lt;li&gt;Improved developer productivity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using Antigravity alongside Cloud Run made the entire process smoother and quicker.&lt;/p&gt;

&lt;p&gt;Key Features&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time queue dashboard&lt;/li&gt;
&lt;li&gt;Serverless scalable deployment&lt;/li&gt;
&lt;li&gt;Lightweight UI&lt;/li&gt;
&lt;li&gt;Dockerized production build&lt;/li&gt;
&lt;li&gt;Antigravity-powered workflow&lt;/li&gt;
&lt;li&gt;Open-source repository&lt;/li&gt;
&lt;li&gt;What's Next&lt;/li&gt;
&lt;li&gt;Real IoT sensor integration&lt;/li&gt;
&lt;li&gt;WebSocket backend&lt;/li&gt;
&lt;li&gt;Predictive analytics&lt;/li&gt;
&lt;li&gt;Mobile PWA version&lt;/li&gt;
&lt;li&gt;Multi-venue support&lt;/li&gt;
&lt;li&gt;Final Thoughts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MovieSync demonstrates how modern tools like React, Docker, Google Cloud Run, and Antigravity can be combined to build scalable real-time applications quickly. Building in public made the journey more transparent and collaborative.&lt;/p&gt;

&lt;p&gt;What are you building right now? 🚀&lt;/p&gt;

</description>
      <category>ai</category>
      <category>antigravity</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
