<?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: Vikram Rautela</title>
    <description>The latest articles on DEV Community by Vikram Rautela (@vikram_rautela_vr).</description>
    <link>https://dev.to/vikram_rautela_vr</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%2F4153788%2Fe9dce91f-c8b6-4279-9d97-fd5d84506c80.png</url>
      <title>DEV Community: Vikram Rautela</title>
      <link>https://dev.to/vikram_rautela_vr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vikram_rautela_vr"/>
    <language>en</language>
    <item>
      <title>SlothList: a grocery list app for people who refuse to think about groceries</title>
      <dc:creator>Vikram Rautela</dc:creator>
      <pubDate>Fri, 23 Oct 2026 06:45:10 +0000</pubDate>
      <link>https://dev.to/vikram_rautela_vr/slothlist-a-grocery-list-app-for-people-who-refuse-to-think-about-groceries-1ba</link>
      <guid>https://dev.to/vikram_rautela_vr/slothlist-a-grocery-list-app-for-people-who-refuse-to-think-about-groceries-1ba</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I open the fridge. I stare into it. I close the fridge. Five minutes later I open it again, stare some more, and still can't tell you if we're out of milk or just low on it. By the time I actually sit down to write a shopping list, I've forgotten half of what I saw.&lt;/p&gt;

&lt;p&gt;This week's theme is "Slow and Steady" — build something that rewards laziness. So I built &lt;strong&gt;SlothList&lt;/strong&gt;: a tool that looks into your fridge and pantry &lt;em&gt;for&lt;/em&gt; you.&lt;/p&gt;

&lt;p&gt;You snap up to three photos. A vision model checks what's full, low, or empty. A text model turns that into one clean, categorized shopping list — and writes a ready-to-send WhatsApp message so you don't even have to retype it for whoever's doing the actual shopping.&lt;/p&gt;

&lt;p&gt;The laziest part: &lt;strong&gt;staples&lt;/strong&gt;. You type in the things you always want restocked — milk, eggs, coffee, whatever — exactly once. Every list from then on includes them automatically, scan or no scan. And if you can't even be bothered to take a photo, there's a "Reorder last list" button that rebuilds your list from last time with zero new input.&lt;/p&gt;

&lt;p&gt;It runs entirely on a laptop with no GPU, using open-weight models through Ollama.&lt;/p&gt;




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

&lt;p&gt;Here's SlothList after scanning a shelf — it correctly skipped the full carton of eggs, caught the near-empty milk and butter, and folded in my staples (coffee, toilet paper) without me mentioning them:&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%2Fsu98lx636y85rjpaximp.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%2Fsu98lx636y85rjpaximp.png" alt="SlothList: a categorized grocery list with a ready-to-send WhatsApp message" width="800" height="722"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Snap and forget
&lt;/h3&gt;

&lt;p&gt;Up to three photos of a fridge, freezer, or pantry shelf. No typing, no manual inventory.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Staples: set once, forever restocked
&lt;/h3&gt;

&lt;p&gt;This is the core "reward laziness" mechanic. Staples get merged into &lt;em&gt;every&lt;/em&gt; list, whether you scanned anything or not — so you never have to remember to add coffee again.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. One-click WhatsApp message
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hey, can you grab a few things on your way home? 🛍️
• Milk (1 L)
• Butter (500 g)
• Coffee (1 pack)
• Toilet paper (2 packs)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Copy it, paste it into a chat to your partner, roommate, or an Instacart shopper, done.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Reorder last list — the laziest possible path
&lt;/h3&gt;

&lt;p&gt;No camera, no typing, no thinking. One click rebuilds your last list plus your staples.&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/VIKRAM-009" rel="noopener noreferrer"&gt;
        VIKRAM-009
      &lt;/a&gt; / &lt;a href="https://github.com/VIKRAM-009/sloth-list" rel="noopener noreferrer"&gt;
        sloth-list
      &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;🦥 SlothList&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;The grocery list app for people who refuse to think about groceries.&lt;/p&gt;

&lt;p&gt;Built for &lt;strong&gt;Hacktoberfest 2026 Week 3: "Slow and Steady"&lt;/strong&gt; — build something with open-source AI that rewards laziness.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;
&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Snap up to 3 photos of your fridge, freezer, or pantry.&lt;/li&gt;
&lt;li&gt;A vision model (&lt;code&gt;gemma4:31b-cloud&lt;/code&gt; on Ollama Cloud, or a local model like &lt;code&gt;qwen2.5vl:3b&lt;/code&gt;) looks at the photos and spots what's full, low, or empty — no manual entry.&lt;/li&gt;
&lt;li&gt;A local text model (&lt;code&gt;llama3.2&lt;/code&gt; via Ollama) merges that with your &lt;strong&gt;staples&lt;/strong&gt; (things you always want restocked, set once) into one clean, categorized shopping list.&lt;/li&gt;
&lt;li&gt;It also writes a ready-to-send WhatsApp message so you can forward it to a partner, roommate, or shopper in one tap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feeling extra lazy?&lt;/strong&gt; Hit "Reorder last list" to reuse your last scan plus your staples — zero photos, zero thinking, one click.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Runs 100% on a laptop…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/VIKRAM-009/sloth-list" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;One Python file (&lt;code&gt;app.py&lt;/code&gt;), Flask + Pillow, no API keys, no external services besides Ollama.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;The stack:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;What I used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fridge/pantry vision&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Gemma 4&lt;/strong&gt; on Ollama Cloud (free plan), or local &lt;code&gt;qwen2.5vl:3b&lt;/code&gt; for fully offline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shopping list + WhatsApp message&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Llama 3.2 (3B)&lt;/strong&gt;, local, via &lt;a href="https://ollama.ai" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structured output&lt;/td&gt;
&lt;td&gt;JSON schema enforced through Ollama's &lt;code&gt;format&lt;/code&gt; parameter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web app&lt;/td&gt;
&lt;td&gt;Python 3.10 + Flask, single file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;Local &lt;code&gt;sloth_data.json&lt;/code&gt; for staples and history&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Built and tested on a normal laptop: Ubuntu, 15 GB RAM, no GPU.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keeping the vision model honest
&lt;/h3&gt;

&lt;p&gt;The prompt explicitly tells the model: &lt;em&gt;"Only list items you can actually see. Do not invent items."&lt;/em&gt; Small vision models can hallucinate a tidy, expected-looking fridge when the photo is blurry or doesn't show much — so I also made it report what it actually looked at (&lt;code&gt;observed&lt;/code&gt;), which shows up on the result page as a sanity check.&lt;/p&gt;

&lt;h3&gt;
  
  
  Full vs. low vs. empty, not a yes/no
&lt;/h3&gt;

&lt;p&gt;Early on I had the vision model just flag items as "present" or "missing," but that's useless — you don't want "milk" on your list because it saw a carton, you want it there because the carton's nearly empty. Splitting status into full/low/empty and only pulling low/empty items into the shopping list made the output actually useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Staples always win
&lt;/h3&gt;

&lt;p&gt;The list-building prompt is explicit: include &lt;em&gt;every&lt;/em&gt; staple "regardless of status," separate from whatever the scan found. That decouples "what's in the fridge right now" from "what I always want on hand," which is the whole point of the staples feature.&lt;/p&gt;




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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Your fridge is a private place.&lt;/strong&gt; A photo of what's inside it says a lot about a household — diet, budget, how many people live there, whether anyone's away. Running the vision model locally or through a single Ollama Cloud call, instead of handing photos to a always-on cloud app with analytics and ad targeting baked in, keeps that where it belongs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Laziness only works if it's free.&lt;/strong&gt; The entire pitch of this app is "set it up once, then do nothing." A per-scan API charge undercuts that — you'd start rationing your own laziness, which defeats the purpose. Open-weight models make "use it constantly without thinking about cost" actually true.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Runs on hardware you already own.&lt;/strong&gt; No GPU, 15 GB RAM, a laptop. The bar for "an AI app that quietly handles something for you" should be a laptop, not a subscription.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No model deprecation risk for a "set and forget" tool.&lt;/strong&gt; The whole point of SlothList is that you stop thinking about it. A tool you stop thinking about is exactly the kind of tool that breaks silently when a cloud provider retires a model or changes pricing. Open weights don't get discontinued out from under you.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/VIKRAM-009/sloth-list
&lt;span class="nb"&gt;cd &lt;/span&gt;sloth-list
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
python3 app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://localhost:5000&lt;/code&gt;, or &lt;code&gt;http://&amp;lt;laptop-ip&amp;gt;:5000&lt;/code&gt; on your phone over the same WiFi so you can snap the photo straight from the kitchen.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/VIKRAM-009/sloth-list" rel="noopener noreferrer"&gt;GitHub Repository: VIKRAM-009/sloth-list&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Thanks for reading! This challenge launched right alongside International Sloth Day (Oct 20) — may your fridge be well-stocked and your effort be minimal. 🦥&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>QuoteCraft: an offline AI that turns messy client WhatsApps into instant quotations and scopes</title>
      <dc:creator>Vikram Rautela</dc:creator>
      <pubDate>Mon, 19 Oct 2026 05:44:32 +0000</pubDate>
      <link>https://dev.to/vikram_rautela_vr/quotecraft-an-offline-ai-that-turns-messy-client-whatsapps-into-instant-quotations-and-scopes-2ka1</link>
      <guid>https://dev.to/vikram_rautela_vr/quotecraft-an-offline-ai-that-turns-messy-client-whatsapps-into-instant-quotations-and-scopes-2ka1</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;If you do any freelance work, consulting, or run a small service business, you know this exact message. It arrives on WhatsApp or Instagram DM at 10 PM:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"hi vikram! need a landing page for our boutique bakery in dehradun with menu, photo gallery, online order enquiry form connected to whatsapp, and google maps location. we have logo and photos ready. how much will this cost and can we get it before diwali? also need 3 revisions and basic seo."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Clients don't send neat requirement specifications. They send messy, conversational thoughts.&lt;/p&gt;

&lt;p&gt;And that puts freelancers in a bad dilemma:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;If you delay responding&lt;/strong&gt;, you lose the client to someone faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you send a quick casual price&lt;/strong&gt; (&lt;em&gt;"maybe ₹20,000"&lt;/em&gt;), you get trapped in endless &lt;strong&gt;scope creep&lt;/strong&gt; — the client later asks for payment gateway integrations, copywriting, and 12 revision rounds that you never agreed to do for free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you sit down to write a proper quote&lt;/strong&gt;, it takes 45 minutes of manual typing to draft deliverables, milestones, payment terms, and boundaries.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Quoting tools like PandaDoc or HoneyBook charge &lt;strong&gt;$19 to $49 every single month&lt;/strong&gt;. For a solo freelancer starting out, that is a huge recurring bill. Worse, pasting confidential client ideas, client phone numbers, and private business budgets into third-party cloud AI APIs can violate client NDAs and privacy.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;QuoteCraft&lt;/strong&gt;: a small, fast local web app that turns messy client WhatsApp messages into an itemized quotation, a scope-of-work, and a ready-to-send WhatsApp reply in about 15 seconds.&lt;/p&gt;

&lt;p&gt;It runs &lt;strong&gt;100% on a laptop&lt;/strong&gt; using a local open-weight model (&lt;strong&gt;Llama 3.2 via Ollama&lt;/strong&gt;). Zero cloud APIs, zero per-token cost, and confidential client details never leave your machine.&lt;/p&gt;




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

&lt;p&gt;Here is how QuoteCraft handles that real WhatsApp message for a boutique bakery in Dehradun:&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%2Fri8k9jzw1yftacakkt0q.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%2Fri8k9jzw1yftacakkt0q.png" alt="QuoteCraft overview: messy WhatsApp message on the left, structured quotation on the right" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Itemized Scope of Work
&lt;/h3&gt;

&lt;p&gt;QuoteCraft parses the message and builds a clean deliverables table with realistic timelines and pricing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Deliverable&lt;/th&gt;
&lt;th&gt;Estimated Days&lt;/th&gt;
&lt;th&gt;Estimated Cost (INR)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;UI/UX Design &amp;amp; Responsive Layout&lt;/strong&gt; — Mobile-first modern design matching bakery aesthetic&lt;/td&gt;
&lt;td&gt;3 Days&lt;/td&gt;
&lt;td&gt;₹ 7,500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Digital Menu &amp;amp; Photo Gallery&lt;/strong&gt; — Filterable categories with high-res photo showcase&lt;/td&gt;
&lt;td&gt;2 Days&lt;/td&gt;
&lt;td&gt;₹ 5,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;WhatsApp Order Integration &amp;amp; Maps&lt;/strong&gt; — Direct one-tap ordering &amp;amp; Google Maps embed&lt;/td&gt;
&lt;td&gt;2 Days&lt;/td&gt;
&lt;td&gt;₹ 4,500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;On-Page SEO &amp;amp; Speed Optimization&lt;/strong&gt; — Local search optimization &amp;amp; 90+ Lighthouse speed&lt;/td&gt;
&lt;td&gt;1 Day&lt;/td&gt;
&lt;td&gt;₹ 3,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total Estimated Investment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8 Days&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;₹ 20,000&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every row is &lt;strong&gt;interactive and editable&lt;/strong&gt;. If you want to change a price, adjust days, or add a custom task, you can edit it right in the table, and the total recalculates automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Anti-Scope Creep Shield (What is OUT of Scope)
&lt;/h3&gt;

&lt;p&gt;This is what freelancers usually forget to write, and what costs them money later. QuoteCraft automatically specifies what is &lt;strong&gt;not&lt;/strong&gt; included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚠️ &lt;em&gt;Paid domain registration and annual web hosting charges (paid directly by client)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;⚠️ &lt;em&gt;Food photography and copywriting for menu item descriptions (provided by client)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;⚠️ &lt;em&gt;Payment gateway merchant account registration (direct WhatsApp orders are included)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;⚠️ &lt;em&gt;Revisions exceeding 3 review rounds (billed separately at standard hourly rate)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. One-Click WhatsApp Reply
&lt;/h3&gt;

&lt;p&gt;Freelancers don't want to copy a rigid 5-page PDF into a chat. QuoteCraft generates a polite, friendly WhatsApp message pre-formatted with bold tags (&lt;code&gt;*text*&lt;/code&gt;) and emojis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hi Anita! 🧁 Thanks so much for reaching out.

I'd love to build the landing page for your bakery in Dehradun! Here is a quick quotation and timeline:

*Scope:*
• Custom mobile-friendly design with your logo &amp;amp; photos
• Interactive menu &amp;amp; photo gallery
• Direct WhatsApp ordering button (customers tap to order)
• Google Maps location &amp;amp; local SEO
• 3 review rounds included

*Timeline:* 8-10 business days (well before Diwali! 🪔)
*Total Investment:* ₹20,000 (40% advance to start)

Does this work for you? If yes, I can share the invoice and get started this Wednesday! 🙌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You hit &lt;strong&gt;"Copy WhatsApp Reply"&lt;/strong&gt;, paste it into your chat, and you are done in 30 seconds.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Print / Save as PDF
&lt;/h3&gt;

&lt;p&gt;For formal corporate clients who need a paper trail, hitting &lt;strong&gt;Print&lt;/strong&gt; renders an elegant, print-ready quotation sheet with quote reference ID, date, your business header, payment terms, and signature line.&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/VIKRAM-009" rel="noopener noreferrer"&gt;
        VIKRAM-009
      &lt;/a&gt; / &lt;a href="https://github.com/VIKRAM-009/quotecraft" rel="noopener noreferrer"&gt;
        quotecraft
      &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&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;💼 QuoteCraft&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Turn messy client WhatsApp messages into professional quotations, scope-of-work, and ready-to-send replies in seconds.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A local, privacy-first AI tool built for freelancers, solo agencies, and small service businesses.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/aa310a519d421027705c2a5553e301bdea1fa6e331b3cd73e02a9ba368f077d3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d332e31302b2d3337373641423f6c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/aa310a519d421027705c2a5553e301bdea1fa6e331b3cd73e02a9ba368f077d3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d332e31302b2d3337373641423f6c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465" alt="Python"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/932950c432dacf648537d94f1b1909ec708f8601b7b11192a54ffa2641fa0107/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466c61736b2d7765622532306170702d3030303030303f6c6f676f3d666c61736b266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/932950c432dacf648537d94f1b1909ec708f8601b7b11192a54ffa2641fa0107/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466c61736b2d7765622532306170702d3030303030303f6c6f676f3d666c61736b266c6f676f436f6c6f723d7768697465" alt="Flask"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2930d9a349a2a54697181adb621a91d9a0f9c9b2a1968b097d74e3963061b552/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4f6c6c616d612d4c6c616d612d2d332e322d77686974653f6c6f676f3d6f6c6c616d61266c6f676f436f6c6f723d626c61636b"&gt;&lt;img src="https://camo.githubusercontent.com/2930d9a349a2a54697181adb621a91d9a0f9c9b2a1968b097d74e3963061b552/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4f6c6c616d612d4c6c616d612d2d332e322d77686974653f6c6f676f3d6f6c6c616d61266c6f676f436f6c6f723d626c61636b" alt="Ollama"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b7fc39cc9fed7adecaf20b0f192da20a17222ce9ef3ad2b84a4bc553111b60d6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d384132424532"&gt;&lt;img src="https://camo.githubusercontent.com/b7fc39cc9fed7adecaf20b0f192da20a17222ce9ef3ad2b84a4bc553111b60d6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d384132424532" alt="Hacktoberfest 2026"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/317d93ce1f4a8ad3c37896d6612c70531e8806db75247d41a9859b8e70cd8586/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507269766163792d3130302532352532304f66666c696e652d326561343466"&gt;&lt;img src="https://camo.githubusercontent.com/317d93ce1f4a8ad3c37896d6612c70531e8806db75247d41a9859b8e70cd8586/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507269766163792d3130302532352532304f66666c696e652d326561343466" alt="100% Offline"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/fdc5d39abb04506b48ad89800159b6034008aec5f3a72ae264f4a016a96bde7b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f415049253230436f73742d253234302532305a65726f2d626c7565"&gt;&lt;img src="https://camo.githubusercontent.com/fdc5d39abb04506b48ad89800159b6034008aec5f3a72ae264f4a016a96bde7b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f415049253230436f73742d253234302532305a65726f2d626c7565" alt="No API Keys"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🤔 The Problem&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Every freelancer, solo developer, designer, photographer, and local business owner knows this pain:&lt;/p&gt;
&lt;p&gt;A client sends a rambling, messy message on WhatsApp or Instagram at 10 PM:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"hey bro need website for my bakery in dehradun with online menu, photo gallery, online order enquiry form connected to whatsapp, and google maps location. we have logo ready. how much will this cost and can we get it before diwali? also need 3 revisions and basic seo."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Responding takes &lt;strong&gt;30 to 60 minutes&lt;/strong&gt; of tedious work:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Translating messy thoughts into clear deliverables&lt;/li&gt;
&lt;li&gt;Estimating realistic days and pricing&lt;/li&gt;
&lt;li&gt;Setting milestones and advance deposit terms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setting boundaries against scope creep&lt;/strong&gt; (so you don't end up doing unpaid extra work!)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Because writing…&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/VIKRAM-009/quotecraft" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The entire app is &lt;strong&gt;one Python file&lt;/strong&gt; (&lt;code&gt;app.py&lt;/code&gt;), using only Flask and Python's standard library (&lt;code&gt;urllib&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt;, &lt;code&gt;re&lt;/code&gt;). It requires &lt;strong&gt;zero API keys&lt;/strong&gt; and zero external services.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;The stack:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;What I used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Brain / Extraction &amp;amp; Pricing&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Llama 3.2 (3B)&lt;/strong&gt; running &lt;strong&gt;locally&lt;/strong&gt; via &lt;a href="https://ollama.ai" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web Application&lt;/td&gt;
&lt;td&gt;Python 3.10 + Flask (single file, lightweight)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structured Output&lt;/td&gt;
&lt;td&gt;Strict JSON schema enforced by Ollama's &lt;code&gt;format&lt;/code&gt; parameter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI &amp;amp; Offline Export&lt;/td&gt;
&lt;td&gt;Clean vanilla HTML5, CSS3 responsive grid, print stylesheet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local Storage&lt;/td&gt;
&lt;td&gt;Local &lt;code&gt;quotes.json&lt;/code&gt; file for private history log&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I built and tested all of it on a normal laptop: &lt;strong&gt;Ubuntu, 15 GB RAM, and no GPU.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Enforcing Strict JSON Schemas
&lt;/h3&gt;

&lt;p&gt;Smaller open models can sometimes add conversational chatter (&lt;em&gt;"Sure, here is your quotation:"&lt;/em&gt;) or hallucinate keys. To make the UI 100% reliable, I used Ollama's structured output format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama3.2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SYSTEM_PROMPT&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;QUOTE_SCHEMA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Enforces exact JSON keys
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;options&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setting &lt;code&gt;temperature: 0.2&lt;/code&gt; keeps the pricing estimates and deliverable breakdown consistent and grounded.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Protecting Against Scope Creep by Design
&lt;/h3&gt;

&lt;p&gt;In the system prompt, I made "Out of Scope" a mandatory output field. If the client asked for a website, Llama 3.2 proactively flags domain hosting, photo shoots, and extra revisions as out of scope. That single design decision transforms the app from a generic text generator into a real business tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Problems I Hit (and What I Learned):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ollama CPU cold starts&lt;/strong&gt;: When Llama 3.2 first loads from disk into RAM on a CPU laptop, it took ~35 seconds. I set &lt;code&gt;timeout=300&lt;/code&gt; on the HTTP request so it never aborts prematurely during the first load. Once in memory, subsequent queries run much faster (~15-20s).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown fence leaks&lt;/strong&gt;: Even with &lt;code&gt;format: json&lt;/code&gt;, some model variations wrap output in

&lt;code&gt;```json ... ```&lt;/code&gt;

. I added a small regex cleaner to strip markdown code blocks before calling &lt;code&gt;json.loads()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-cost, responsive UI&lt;/strong&gt;: Instead of loading heavy CSS frameworks from external CDNs (which fail when you have no internet), I wrote a clean vanilla CSS stylesheet with a responsive grid and a custom &lt;code&gt;@media print&lt;/code&gt; style. The entire app loads instantly even with airplane mode turned on.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;For QuoteCraft, open-source AI is not just a nice feature — &lt;strong&gt;it is the only reason this tool makes commercial sense&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Client Confidentiality &amp;amp; Privacy (No NDA Breaches)&lt;/strong&gt;:&lt;br&gt;
When freelancers quote for startups or local businesses, clients share unreleased product details, secret business ideas, customer figures, and personal phone numbers. Uploading that to third-party cloud AI APIs creates legal and privacy risks. With open weights running locally, &lt;strong&gt;not a single byte leaves the freelancer's machine&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;$0.00 Running Cost Makes the Side Hustle Viable&lt;/strong&gt;:&lt;br&gt;
Closed quoting platforms charge \$20 to \$50 per month. If a freelancer is just starting out or only bids on 3 projects a month, paying \$300+/year in SaaS fees is painful. Open models like Llama 3.2 cost &lt;strong&gt;nothing to run&lt;/strong&gt;. 1 quote or 1,000 quotes costs \$0.00.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Total Independence from Cloud Pricing &amp;amp; Changes&lt;/strong&gt;:&lt;br&gt;
Closed API providers frequently deprecate model versions, hike pricing, or impose rate limits. Open-weight models are permanent assets: they will run on this laptop today, tomorrow, or 5 years from now.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;100% Offline Capability&lt;/strong&gt;:&lt;br&gt;
Freelancers frequently work from trains, cafés, or places with spotty internet. Because Llama 3.2 runs locally through Ollama, QuoteCraft works with zero internet connection.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;Clone the repo, run &lt;code&gt;python3 app.py&lt;/code&gt;, and test it with your own messy client chats:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/VIKRAM-009/quotecraft" rel="noopener noreferrer"&gt;GitHub Repository: VIKRAM-009/quotecraft&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Thanks for reading! If you have ever lost a weekend to client scope creep, give local open-weight AI a shot. 🚀&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>A tiny daily side quest that sends you outside.</title>
      <dc:creator>Vikram Rautela</dc:creator>
      <pubDate>Fri, 09 Oct 2026 12:15:00 +0000</pubDate>
      <link>https://dev.to/vikram_rautela_vr/a-tiny-daily-side-quest-that-sends-you-outside-1c4h</link>
      <guid>https://dev.to/vikram_rautela_vr/a-tiny-daily-side-quest-that-sends-you-outside-1c4h</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I'm a developer, and most of my day looks like this: laptop at work, phone on the way home, laptop again at night. I &lt;em&gt;know&lt;/em&gt; I should go outside more. The problem is never time. The problem is that "go outside" is too vague, so I never do it.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Grass Quest&lt;/strong&gt;: a small web app that gives you &lt;strong&gt;one short outdoor mission every day&lt;/strong&gt;, written for &lt;strong&gt;today's real weather&lt;/strong&gt; in your city.&lt;/p&gt;

&lt;p&gt;Here's how it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You tell it your city once.&lt;/li&gt;
&lt;li&gt;It checks the real weather: temperature, rain chance, wind and sunset time.&lt;/li&gt;
&lt;li&gt;An open-weight AI model writes a 15 to 45 minute mission that fits that weather. On a rainy day, you get a short, safe walk, not a hike.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You put the phone away and go outside.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You come back with 1 to 3 photos. An open-weight &lt;strong&gt;vision&lt;/strong&gt; model looks at them, checks that you really did the mission, and gives points out of 10.&lt;/li&gt;
&lt;li&gt;Points and a daily streak make you want to come back tomorrow... and go outside again.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The app is designed so you spend as &lt;strong&gt;little&lt;/strong&gt; time on the screen as possible. You read the mission in about 20 seconds, and you only come back to upload photos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who is it for?&lt;/strong&gt; People like me: developers, students and remote workers who spend the whole day on screens and need a small, concrete push to go outside. It's not a fitness app. It doesn't count steps. It just gives you a reason to go.&lt;/p&gt;

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

&lt;p&gt;Here's today's quest for Dehradun. It was drizzling, 22°C with a 93% chance of rain, so the AI gave me a short "Rainy Rush" walk with an umbrella instead of a long trek:&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%2Fewr4g9bvaunza04qwpol.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%2Fewr4g9bvaunza04qwpol.png" alt=" " width="800" height="505"&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%2Fy3l0607f2tms8wvtntnj.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%2Fy3l0607f2tms8wvtntnj.png" alt=" " width="800" height="2057"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The checker is friendly, but it's not easy to fool. Here's a test where I uploaded two photos for the "Rainy Rush" quest: a raindrop on a leaf, and a keyboard (the thing I was trying to escape). Gemma 4 checked both in about 4 seconds:&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%2F3n7nqdor7smgs8ndi9f8.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%2F3n7nqdor7smgs8ndi9f8.png" alt=" " width="800" height="2157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The leaf gets &lt;strong&gt;10/10&lt;/strong&gt;. The keyboard gets &lt;strong&gt;0/10&lt;/strong&gt;, with a polite note to go and find the rain. Also, any photo taken indoors can get &lt;strong&gt;at most 2 points&lt;/strong&gt;, whatever the AI thinks.&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/VIKRAM-009" rel="noopener noreferrer"&gt;
        VIKRAM-009
      &lt;/a&gt; / &lt;a href="https://github.com/VIKRAM-009/grass-quest" rel="noopener noreferrer"&gt;
        grass-quest
      &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&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌿 Grass Quest&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A tiny daily side quest that sends you outside.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Real weather → an AI-written outdoor mission → you go outside → an AI checks your photos → points and streaks.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/aa310a519d421027705c2a5553e301bdea1fa6e331b3cd73e02a9ba368f077d3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d332e31302b2d3337373641423f6c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/aa310a519d421027705c2a5553e301bdea1fa6e331b3cd73e02a9ba368f077d3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d332e31302b2d3337373641423f6c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465" alt="Python"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/932950c432dacf648537d94f1b1909ec708f8601b7b11192a54ffa2641fa0107/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466c61736b2d7765622532306170702d3030303030303f6c6f676f3d666c61736b266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/932950c432dacf648537d94f1b1909ec708f8601b7b11192a54ffa2641fa0107/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466c61736b2d7765622532306170702d3030303030303f6c6f676f3d666c61736b266c6f676f436f6c6f723d7768697465" alt="Flask"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/93f8696fb6cf3d8bc91842ddbc9f20718b4d8f19d06a23bf669e727e7cfcccaa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4f6c6c616d612d6f70656e2d2d7765696768742532306d6f64656c732d77686974653f6c6f676f3d6f6c6c616d61266c6f676f436f6c6f723d626c61636b"&gt;&lt;img src="https://camo.githubusercontent.com/93f8696fb6cf3d8bc91842ddbc9f20718b4d8f19d06a23bf669e727e7cfcccaa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4f6c6c616d612d6f70656e2d2d7765696768742532306d6f64656c732d77686974653f6c6f676f3d6f6c6c616d61266c6f676f436f6c6f723d626c61636b" alt="Ollama"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b7fc39cc9fed7adecaf20b0f192da20a17222ce9ef3ad2b84a4bc553111b60d6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d384132424532"&gt;&lt;img src="https://camo.githubusercontent.com/b7fc39cc9fed7adecaf20b0f192da20a17222ce9ef3ad2b84a4bc553111b60d6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d384132424532" alt="Hacktoberfest 2026"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1a5f42c77263092516939453fe5e3849397107780af860e4a04ec19b35c02670/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4150492532306b6579732d6e6f6e652532306e65656465642d326561343466"&gt;&lt;img src="https://camo.githubusercontent.com/1a5f42c77263092516939453fe5e3849397107780af860e4a04ec19b35c02670/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4150492532306b6579732d6e6f6e652532306e65656465642d326561343466" alt="No API keys"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/VIKRAM-009/grass-quest/docs/1-setup.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FVIKRAM-009%2Fgrass-quest%2FHEAD%2Fdocs%2F1-setup.png" alt="Pick your city" width="260"&gt;&lt;/a&gt;
  &amp;nbsp;&amp;nbsp;
  &lt;a rel="noopener noreferrer" href="https://github.com/VIKRAM-009/grass-quest/docs/2-quest.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FVIKRAM-009%2Fgrass-quest%2FHEAD%2Fdocs%2F2-quest.png" alt="Today's weather-aware quest" width="260"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;i&gt;Pick your city once → get a quest that fits today's real weather (here: light drizzle in Dehradun).&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/VIKRAM-009/grass-quest/docs/3-check.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FVIKRAM-009%2Fgrass-quest%2FHEAD%2Fdocs%2F3-check.png" alt="Photo check: leaf 10/10, keyboard 0/10" width="260"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;i&gt;The photo check: a raindrop on a leaf passes, a keyboard does not.&lt;br&gt;
Test photos from Wikimedia Commons: &lt;a href="https://commons.wikimedia.org/wiki/File:Leaf-rain-raindrops-drop-of-water_(24217414932).jpg" rel="nofollow noopener noreferrer"&gt;leaf&lt;/a&gt; (CC0), &lt;a href="https://commons.wikimedia.org/wiki/File:Backlit_keyboard.jpg" rel="nofollow noopener noreferrer"&gt;keyboard&lt;/a&gt; by Colin (CC BY-SA 4.0).&lt;/i&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🤔 Why?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;We all know we should "go touch grass." The hard part is having a reason to go. &lt;strong&gt;Grass Quest gives you one small reason each day.&lt;/strong&gt; It's short, it's free, it's close to home, and it fits today's weather.&lt;/p&gt;
&lt;p&gt;The app is built to keep your screen time low. You open it, read the mission, put the phone away and go. You only come back to upload a few photos.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨&lt;/h2&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/VIKRAM-009/grass-quest" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;&lt;strong&gt;The stack:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;What I used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Weather and city lookup&lt;/td&gt;
&lt;td&gt;Open-Meteo: free, open data, no key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Writing the daily quest&lt;/td&gt;
&lt;td&gt;Llama 3.2 (3B), running locally with Ollama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checking photos&lt;/td&gt;
&lt;td&gt;Gemma 4 (open-weight vision model) on Ollama Cloud, or Qwen2.5-VL 3B fully offline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web app&lt;/td&gt;
&lt;td&gt;Python + Flask, one file, phone-friendly page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;One local JSON file: points, streak and history&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I built and tested all of it on a normal laptop: &lt;strong&gt;Ubuntu, 15 GB of RAM and no GPU.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The quest writer.&lt;/strong&gt; The app sends Llama 3.2 the real weather and a short list of my recent missions, so it doesn't repeat itself. I ask for JSON with a fixed schema (title, steps, what to photograph, best time, a safety tip), and Ollama's structured output makes the model follow it. The prompt also has a few rules. For example, rainy or very hot days get short, safe missions, and a mission never asks for photos of people's faces or private property.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The photo checker.&lt;/strong&gt; Phone photos are huge, so Pillow shrinks them to 768px before the AI sees them. The vision model answers in JSON too: what it sees, whether the photo is outdoors, whether it matches the mission, and a score from 0 to 10. My code then adds its own rules on top. Scores are clamped to 0-10, and an indoor photo can never get more than 2 points.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Problems I hit (the honest part):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;My laptop ran out of memory.&lt;/strong&gt; At first, everything ran 100% locally, with Qwen2.5-VL checking the photos. It worked: a leaf got 10/10 and a keyboard got 0/10. But each photo took &lt;strong&gt;about 45 seconds&lt;/strong&gt;, and the model needs &lt;strong&gt;about 10 GB of free RAM&lt;/strong&gt;. One day I had a browser with too many tabs open, plus Teams and VS Code, and the photo check just crashed. Ollama's log said: &lt;em&gt;"model requires more system memory (10.1 GiB) than is available (10.0 GiB)"&lt;/em&gt;. I was short by 0.1 GB!&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The fix: open models give you a choice.&lt;/strong&gt; I tried some open-weight vision models on Ollama Cloud. Most needed a paid plan, but &lt;strong&gt;Gemma 4 (31B)&lt;/strong&gt; worked on the free plan. Now photo checks take &lt;strong&gt;about 1 second instead of 45&lt;/strong&gt;, and they use almost no RAM on my laptop. Because both are open models behind the same Ollama API, switching was &lt;strong&gt;one line of code&lt;/strong&gt;. The offline model is still there for anyone who wants it:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;VISION_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;qwen2.5vl:3b python3 app.py

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gemma wrapped its JSON in Markdown.&lt;/strong&gt; It answered with&lt;br&gt;
&lt;br&gt;
&lt;code&gt;json ...&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
around the JSON, so my parser broke. I fixed it with one small regex that removes the fences.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Small models leak.&lt;/strong&gt; Once, Llama 3.2 put a piece of its own JSON (&lt;code&gt;photo_goal): "A collection of..."&lt;/code&gt;) inside step 4 of a quest. Now the app filters out any step that looks like a leaked JSON key.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Grass Quest, open models weren't just a nice extra. They made the project possible.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;I could start with zero budget.&lt;/strong&gt; No API keys, no credit card and no rate limits while I was testing again and again. The weather data is open too. For a weekend side project, that matters a lot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I chose where the AI runs.&lt;/strong&gt; When my laptop didn't have enough RAM, I didn't have to rewrite anything. I moved the vision model from my laptop to the cloud by changing one line. If Ollama Cloud changes its plans tomorrow, I can move it back. With a closed API, I would be stuck with whatever the company decides.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy is a real choice, not a promise.&lt;/strong&gt; Photos from your walk show where you live. With open models, anyone can run Grass Quest &lt;strong&gt;fully offline&lt;/strong&gt;, and then no photo ever leaves their laptop. A closed API can only &lt;em&gt;promise&lt;/em&gt; to protect your photos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone can make it their own.&lt;/strong&gt; Because the models and the code are open, someone can fork it for their school, their running club or their city, or swap in a better model next month. I already saw this happen: one cloud model I tested was retired, and I just used another open model instead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The irony is not lost on me: I used AI, the thing that keeps us on screens, to get people &lt;em&gt;off&lt;/em&gt; screens. Open models made that possible on an ordinary laptop. That feels like the right way to build it.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Interview Buddy: An Offline AI Mock-Interview Partner I Built for My Friend</title>
      <dc:creator>Vikram Rautela</dc:creator>
      <pubDate>Mon, 05 Oct 2026 05:56:58 +0000</pubDate>
      <link>https://dev.to/vikram_rautela_vr/interview-buddy-an-offline-ai-mock-interview-partner-i-built-for-my-friend-8el</link>
      <guid>https://dev.to/vikram_rautela_vr/interview-buddy-an-offline-ai-mock-interview-partner-i-built-for-my-friend-8el</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;My friend Jagdish is preparing for Python developer interviews. They know the material, but they freeze when they have to &lt;em&gt;say&lt;/em&gt; answers out loud, and there's nobody around to practise with at 11 PM.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Interview Buddy&lt;/strong&gt;: a small terminal app that acts like a patient interviewer.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You tell it the role and your level (fresher / junior / senior).&lt;/li&gt;
&lt;li&gt;It asks one question at a time, a mix of technical, problem-solving and behavioural questions.&lt;/li&gt;
&lt;li&gt;After each answer, it gives a &lt;strong&gt;score out of 10&lt;/strong&gt;, what was good, what to improve, and a short &lt;strong&gt;better answer&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;At the end it writes a &lt;strong&gt;final report&lt;/strong&gt; with strengths and what to practise next, and saves the whole session to a Markdown file so you can review it later.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It runs &lt;strong&gt;completely on a laptop&lt;/strong&gt; with a local open-weight model. No account, no API key, no internet.&lt;/p&gt;

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

&lt;p&gt;image uploded with post&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/VIKRAM-009" rel="noopener noreferrer"&gt;
        VIKRAM-009
      &lt;/a&gt; / &lt;a href="https://github.com/VIKRAM-009/interview-buddy" rel="noopener noreferrer"&gt;
        interview-buddy
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Main file: &lt;a href="https://github.com/VIKRAM-009/interview-buddy/blob/main/interview_buddy.py" rel="noopener noreferrer"&gt;interview_buddy.py&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Meta's open-weight &lt;strong&gt;Llama 3.2 (3B)&lt;/strong&gt;, running locally through &lt;strong&gt;Ollama&lt;/strong&gt;. It's small enough (about 2 GB) to run on an ordinary laptop CPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two roles, two prompts:&lt;/strong&gt; the &lt;em&gt;interviewer&lt;/em&gt; keeps the full conversation history so it doesn't repeat questions, while the &lt;em&gt;coach&lt;/em&gt; only sees one question and answer at a time and gives feedback in a fixed format (Score / Good / Improve / Better answer). Splitting them kept the feedback focused.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero dependencies:&lt;/strong&gt; just Python's &lt;code&gt;urllib&lt;/code&gt; and &lt;code&gt;json&lt;/code&gt;, so my friend doesn't have to install packages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swappable model:&lt;/strong&gt; &lt;code&gt;--model qwen2.5&lt;/code&gt; or any other Ollama model works with one flag.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; a small 3B model is fine at asking questions, but it sometimes gives confident wrong "better answers" (in one test it suggested &lt;code&gt;pop(0)&lt;/code&gt; for a stack, which is wrong because a stack should pop from the end). Because the model is open and local, I can switch to a bigger model like Qwen 2.5 7B for better feedback without changing any code. I also added a rule so skipped answers score 0 instead of getting free points.&lt;br&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%2Fxtfz184sqlbp6tr58dn1.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%2Fxtfz184sqlbp6tr58dn1.png" alt=" " width="799" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It works offline.&lt;/strong&gt; My friend can practise anywhere, even with bad internet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run.&lt;/strong&gt; No subscription and no per-message API bill, so they can practise 100 questions a day if they want.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Their answers stay private.&lt;/strong&gt; Practice answers include nervous, half-wrong attempts. With a local model, none of that leaves their laptop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I control the model.&lt;/strong&gt; If one model's feedback isn't good enough, I swap it. With a closed API I'd be stuck with whatever the provider decides.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I built this with help from an AI coding agent (Claude Code), which wrote the first version of the script and tested it against my local Ollama models. I then tried it myself and tuned the prompts.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
