<?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: Ansh Rajpoot</title>
    <description>The latest articles on DEV Community by Ansh Rajpoot (@ansh_rajpoot_e66cde52a456).</description>
    <link>https://dev.to/ansh_rajpoot_e66cde52a456</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%2F4152552%2F726385cc-b451-4130-826d-8af949912bc8.png</url>
      <title>DEV Community: Ansh Rajpoot</title>
      <link>https://dev.to/ansh_rajpoot_e66cde52a456</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ansh_rajpoot_e66cde52a456"/>
    <language>en</language>
    <item>
      <title>Lazy Notes: Let Local AI Do the Reading for You</title>
      <dc:creator>Ansh Rajpoot</dc:creator>
      <pubDate>Mon, 26 Oct 2026 04:43:22 +0000</pubDate>
      <link>https://dev.to/ansh_rajpoot_e66cde52a456/lazy-notes-let-local-ai-do-the-reading-for-you-a72</link>
      <guid>https://dev.to/ansh_rajpoot_e66cde52a456/lazy-notes-let-local-ai-do-the-reading-for-you-a72</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;Ever opened a long meeting transcript or a pile of lecture notes and wished someone would just tell you what matters?&lt;/p&gt;

&lt;p&gt;That's why I built &lt;strong&gt;Lazy Notes&lt;/strong&gt; — a lightweight AI-powered note summarizer that helps people spend less time reading and more time doing.&lt;/p&gt;

&lt;p&gt;Users can paste their notes or upload a text file and generate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quick Summary:&lt;/strong&gt; Understand the main idea without reading every line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key Takeaways:&lt;/strong&gt; Get the important points in bullet form.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action Items:&lt;/strong&gt; Identify tasks and deadlines mentioned in the notes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two-Line Recap:&lt;/strong&gt; Get the essential information at a glance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The idea is simple: let AI handle the repetitive reading so you don't have to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&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%2Fld3pghiqndgm8tp2sqvo.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%2Fld3pghiqndgm8tp2sqvo.png" alt=" " width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;💻 &lt;strong&gt;GitHub Repository:&lt;/strong&gt;  &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/ansh-rajpoot" rel="noopener noreferrer"&gt;
        ansh-rajpoot
      &lt;/a&gt; / &lt;a href="https://github.com/ansh-rajpoot/lazy-noted" rel="noopener noreferrer"&gt;
        lazy-noted
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The project is built with Python and Streamlit, with Ollama powering local AI inference.&lt;/p&gt;

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

&lt;p&gt;I used &lt;strong&gt;Python, Streamlit, and Ollama&lt;/strong&gt; to build Lazy Notes.&lt;/p&gt;

&lt;p&gt;Streamlit provides the user interface, while Ollama runs an open-weight language model locally to process the notes and generate structured summaries.&lt;/p&gt;

&lt;p&gt;The workflow is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user pastes notes or uploads a supported text file.&lt;/li&gt;
&lt;li&gt;The application sends the text to the locally running Ollama model.&lt;/li&gt;
&lt;li&gt;The model generates a summary, key takeaways, and action items.&lt;/li&gt;
&lt;li&gt;The results are displayed in a clean interface that is easy to read and use.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I kept the architecture simple and focused on building a useful tool rather than adding unnecessary complexity.&lt;/p&gt;

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

&lt;p&gt;For a tool that processes personal notes, meeting discussions, and study material, where the data goes matters.&lt;/p&gt;

&lt;p&gt;Using a locally running open-weight model means Lazy Notes can process text without relying on a paid, third-party AI API.&lt;/p&gt;

&lt;p&gt;This approach offers several advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More control over data:&lt;/strong&gt; Notes can remain on the user's machine when Ollama is configured locally and no other external services are used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model flexibility:&lt;/strong&gt; Users can experiment with different compatible models instead of being locked into one hosted AI provider.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lower ongoing costs:&lt;/strong&gt; Local inference does not require paying a per-request AI API fee, although hardware and electricity still have costs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More independence:&lt;/strong&gt; The core summarization workflow can run without an internet connection once the required model is installed, provided the local setup is working.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open innovation makes it possible to build a practical AI tool that users can run and control themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;The goal of Lazy Notes is to reduce the effort involved in reviewing long notes.&lt;/p&gt;

&lt;p&gt;Instead of manually searching for the main ideas, users can start with a concise summary and review the details that matter to them.&lt;/p&gt;

&lt;p&gt;I designed this project around one question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if getting the gist of your notes took less effort than reading them all?&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;[Add only the partner prize categories that your project genuinely qualifies for, based on the official challenge rules.]&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>The Cheapest Supplier Wasn't Actually the Cheapest — So I Built QuoteDiff with Local AI</title>
      <dc:creator>Ansh Rajpoot</dc:creator>
      <pubDate>Sat, 17 Oct 2026 14:44:47 +0000</pubDate>
      <link>https://dev.to/ansh_rajpoot_e66cde52a456/the-cheapest-supplier-wasnt-actually-the-cheapest-so-i-built-quotediff-with-local-ai-gh8</link>
      <guid>https://dev.to/ansh_rajpoot_e66cde52a456/the-cheapest-supplier-wasnt-actually-the-cheapest-so-i-built-quotediff-with-local-ai-gh8</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;Imagine you're running a small business and need to buy materials from three different suppliers.&lt;/p&gt;

&lt;p&gt;One sends a PDF quotation. Another sends an Excel sheet. The third sends a quotation with different product descriptions, delivery charges, and tax details.&lt;/p&gt;

&lt;p&gt;At first glance, one supplier looks cheaper. But does that price include GST? Is delivery included? Are the products actually the same grade, size, and quantity?&lt;/p&gt;

&lt;p&gt;Comparing quotations manually can be time-consuming, and overlooking one small detail can turn a seemingly good deal into an expensive mistake.&lt;/p&gt;

&lt;p&gt;That's the problem I wanted to tackle with &lt;strong&gt;QuoteDiff&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;QuoteDiff is a local-first, AI-powered supplier quotation comparison tool designed for small businesses, contractors, and procurement teams.&lt;/p&gt;

&lt;p&gt;It aims to help users:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload supplier quotations in supported document formats.&lt;/li&gt;
&lt;li&gt;Extract supplier details, product descriptions, prices, quantities, taxes, and delivery charges.&lt;/li&gt;
&lt;li&gt;Compare products while highlighting differences in specifications and units.&lt;/li&gt;
&lt;li&gt;Flag missing information, uncertain matches, and incompatible quotations.&lt;/li&gt;
&lt;li&gt;Calculate comparable costs using deterministic Python logic rather than asking an AI model to do the arithmetic.&lt;/li&gt;
&lt;li&gt;Export a comparison report to support purchasing decisions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't simply to find the lowest number. It's to help users understand whether they're comparing equivalent offers in the first place.&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/sCmaehXuBbw" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&gt; &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/ansh-rajpoot" rel="noopener noreferrer"&gt;
        ansh-rajpoot
      &lt;/a&gt; / &lt;a href="https://github.com/ansh-rajpoot/quotebot" rel="noopener noreferrer"&gt;
        quotebot
      &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;QuoteDiff&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Local-first AI app that compares supplier quotations for small businesses.&lt;/p&gt;
&lt;p&gt;Inference runs on your machine through &lt;strong&gt;Ollama + Gemma&lt;/strong&gt;. No paid APIs, no cloud database, no authentication. Document parsing, AI extraction, matching, calculations, UI, and exports are separate modules. &lt;strong&gt;Calculations are always deterministic Python&lt;/strong&gt; — the model never invents prices, taxes, or specs.&lt;/p&gt;
&lt;p&gt;Designed for an &lt;strong&gt;Apple Silicon Mac with 8 GB RAM&lt;/strong&gt; using a small local model (&lt;code&gt;gemma2:2b&lt;/code&gt; by default).&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;macOS setup&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Prerequisites&lt;/h3&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;macOS on Apple Silicon&lt;/li&gt;
&lt;li&gt;Python &lt;strong&gt;3.11+&lt;/strong&gt; (&lt;code&gt;python3 --version&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt; for local inference&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Install Ollama (pick one):&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Homebrew&lt;/span&gt;
brew install ollama

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Or download the macOS app from https://ollama.com/download&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;2. Start Ollama and download the model&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Start the local server (leave this running)&lt;/span&gt;
ollama serve&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;In a &lt;strong&gt;second&lt;/strong&gt; terminal:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Small Gemma build suitable for ~8 GB unified memory&lt;/span&gt;
ollama pull gemma2:2b

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Confirm it is installed&lt;/span&gt;
ollama list&lt;/pre&gt;

&lt;/div&gt;
&lt;p&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/ansh-rajpoot/quotebot" 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;QuoteDiff is designed around open-source tools and local AI inference.&lt;/p&gt;

&lt;p&gt;The planned technology stack includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt; for the application and comparison engine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streamlit&lt;/strong&gt; for the user interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama + Gemma&lt;/strong&gt; for local AI-powered extraction and interpretation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pydantic&lt;/strong&gt; for validating extracted data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pandas, PyMuPDF, and openpyxl&lt;/strong&gt; for working with structured data and supported document formats.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pytest&lt;/strong&gt; for automated testing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One important design decision is separating AI interpretation from financial calculations.&lt;/p&gt;

&lt;p&gt;An AI model can help interpret inconsistent product descriptions and extract information from quotations. However, totals, discounts, tax calculations, and cost comparisons should be handled by deterministic code, with missing or uncertain values clearly flagged for human review.&lt;/p&gt;

&lt;p&gt;The project is intended to run locally on a personal computer, without requiring a paid AI API.&lt;/p&gt;

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

&lt;p&gt;For a tool that processes business quotations, privacy and cost matter.&lt;/p&gt;

&lt;p&gt;Small businesses may not want to upload supplier prices, purchasing volumes, or commercial terms to an external AI service. They may also find recurring API costs difficult to justify for an occasional task.&lt;/p&gt;

&lt;p&gt;Using open-weight models with local inference makes a different approach possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy:&lt;/strong&gt; documents can be processed locally without sending their contents to a cloud AI API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost control:&lt;/strong&gt; there is no per-request fee from a paid AI inference API, although hardware and electricity still have costs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexibility:&lt;/strong&gt; the model can potentially be replaced with another compatible open-weight model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparency:&lt;/strong&gt; calculations can be implemented and tested in ordinary Python instead of relying on an AI-generated answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility:&lt;/strong&gt; the goal is to make useful procurement assistance more accessible to smaller businesses, not just large companies with enterprise software budgets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open innovation is valuable here because it gives developers the freedom to adapt the technology to a practical business problem while retaining control over data and costs.&lt;/p&gt;

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

&lt;p&gt;I used Cursor to help develop the project in stages, with an emphasis on modular code, deterministic calculations, and tests for edge cases.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma:&lt;/strong&gt; planned local inference using the Gemma family of open-weight models.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Touch Grass Garden Coach: A Local LLM That Tells You What to Plant This Week</title>
      <dc:creator>Ansh Rajpoot</dc:creator>
      <pubDate>Sun, 11 Oct 2026 17:03:23 +0000</pubDate>
      <link>https://dev.to/ansh_rajpoot_e66cde52a456/touch-grass-garden-coach-a-local-llm-that-tells-you-what-to-plant-this-week-f79</link>
      <guid>https://dev.to/ansh_rajpoot_e66cde52a456/touch-grass-garden-coach-a-local-llm-that-tells-you-what-to-plant-this-week-f79</guid>
      <description>&lt;p&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;/p&gt;

&lt;h2&gt;
  
  
  The problem: gardening apps want you on your phone
&lt;/h2&gt;

&lt;p&gt;Every gardening app I tried wanted me to scroll more: feeds, tips, notifications, "community". But the whole point of a garden is to be in it. The question I actually have on a Saturday morning is tiny:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should I do outside this week?&lt;/strong&gt;&lt;br&gt;
The answer depends on one boring, very local fact: your frost dates. Tomatoes go out about a week after the last spring frost, and garlic goes in a few weeks before the first fall frost. Most people don't know their frost dates, and most apps hardcode a "zone" that may be off by weeks for your exact town.&lt;/p&gt;

&lt;p&gt;So I built Touch Grass Garden Coach: type your town and get one short page you can glance at before heading outside.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I built
&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%2Fz3ohp79xhy49lmdojjad.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%2Fz3ohp79xhy49lmdojjad.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
Type a place (e.g. Boston) and you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Your frost dates, computed rather than looked up. I pull the last 10 full years of daily minimum temperatures for that exact spot, find the last spring frost and first fall frost of each year (min ≤ 0 °C), and take the median.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Plant this week. What to start indoors, sow, transplant or plant right now, with the date each window closes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Care &amp;amp; harvest. What's ready to pick, what's coming up, and age-based care like "Thin carrots to 5 cm apart" or "Stake or cage tomatoes". Tender crops stop at first frost.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Frost &amp;amp; rain warnings from the 7-day forecast, plus the best day to get outside (the warmest dry day).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"This week outside": a checklist of at most 6 items written by a local open-weight model.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also has a My garden tab (log what you actually planted, and get progress bars and exact harvest dates) and a Season tab (a 12-month timeline of every crop's windows, with today and your frost dates marked).&lt;/p&gt;

&lt;p&gt;For Boston this week, it says: sow fall lettuce, spinach and radish, plant garlic and tulip bulbs, pick the last tomatoes, skip watering on Sunday, Monday and Friday, and go outside on Wednesday (dry, 25 °C).&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%2Fq7j2u9el6p2lgoevma5q.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%2Fq7j2u9el6p2lgoevma5q.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why the model runs locally
&lt;/h2&gt;

&lt;p&gt;The checklist is written by Qwen 2.5 1.5B running through Ollama on localhost. There's no hosted AI API, no API key and no account. The weather comes from Open-Meteo, which is free and also needs no key.&lt;/p&gt;

&lt;p&gt;I deliberately kept the model's job small. It never decides when to plant. All of that is plain, tested Python. The model only gets structured facts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"place"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Boston, Massachusetts, US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"last_spring_frost"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"first_fall_frost"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-11-07"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"this_week_crops"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Sow lettuce (fall crop)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Plant garlic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ready_to_harvest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"tomato"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"care_tasks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Pinch tomato side shoots and tie in stems"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"forecast_tips"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Rain on Mon Oct 12: skip watering"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"best_day_outside"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Wed Oct 14"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…and turns them into a friendly checklist. That design makes a 1.5B model genuinely useful: it can't invent a planting date, because it never has to work one out. Two small guardrails help too:&lt;/p&gt;

&lt;p&gt;Lines mentioning a crop that isn't in the facts are dropped, since small models like to improvise.&lt;br&gt;
Frost and harvest reminders are always kept, even if the model forgets them.&lt;br&gt;
And if Ollama isn't running, the app doesn't break. It shows a rule-based checklist built from the same facts, with a small note: "Local model offline — showing rule-based plan."&lt;/p&gt;

&lt;p&gt;Want a different model? OLLAMA_MODEL=gemma2:2b python server.py works with anything you've pulled.&lt;/p&gt;
&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The whole thing is Python 3.12 standard library only: http.server, urllib, json and statistics. There are no pip dependencies. The frontend is one HTML page and a plain ES module.&lt;/p&gt;

&lt;p&gt;The core frost logic is ordinary, testable code:&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;readings&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;by_year&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
    &lt;span class="n"&gt;july1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;frosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;readings&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;spring&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;frosts&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;july1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="c1"&gt;# last one = last spring frost
&lt;/span&gt;    &lt;span class="n"&gt;fall&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;frosts&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;july1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;    &lt;span class="c1"&gt;# first one = first fall frost
&lt;/span&gt;    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;last_frost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;statistics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;median&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spring_doys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few details I'm happy with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Southern hemisphere&lt;/strong&gt;: Melbourne's winter is in July, so the data is shifted half a year, run through the same logic, and shifted back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Frost-free places :&lt;/strong&gt;(frost in fewer than half the years, like Miami or Mumbai) get approximate anchors that are clearly labelled as such.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Crop calendar as data:&lt;/strong&gt; each crop is a window in weeks relative to last or first frost, e.g. tomato transplant LF+1..LF+3, garlic FF-4..FF+2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Offline after the first lookup:&lt;/strong&gt; frost history is cached on disk (it barely changes), so the calendar keeps working with no internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- 35 unit tests:&lt;/strong&gt; fully offline, using synthetic temperature data for northern, southern and frost-free locations, plus the care and harvest logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# optional, for the AI-written checklist&lt;/span&gt;
ollama pull qwen2.5:1.5b

python server.py          &lt;span class="c"&gt;# http://localhost:8000&lt;/span&gt;
python cli.py &lt;span class="s2"&gt;"Boston"&lt;/span&gt;    &lt;span class="c"&gt;# same plan in the terminal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why open matters here
&lt;/h2&gt;

&lt;p&gt;A closed API could write the same six sentences. But a garden coach knows where you live and what you grow, and none of that needs to leave your laptop. With an open-weight model:&lt;/p&gt;

&lt;p&gt;1.It runs locally, so your garden data stays on your machine.&lt;br&gt;
2.There are no API keys and no cost, and nothing to sign up for.&lt;br&gt;
3.You can swap any open model with one environment variable.&lt;br&gt;
4.You can inspect everything: the prompt, the facts the model sees, and the rules that decide what's in season.&lt;/p&gt;

&lt;p&gt;For a tool whose whole goal is getting you off the screen, that feels right: a small model quietly does its job on your laptop, then gets out of the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd build next
&lt;/h2&gt;

&lt;p&gt;1.Soil temperature from the forecast (great for bean and corn timing)&lt;br&gt;
2.Succession reminders like "sow another row of lettuce"&lt;br&gt;
3.Exporting the season as a calendar file to put on the fridge&lt;br&gt;
4.Measuring whether people actually go outside more, rather than how long they spend in the app&lt;/p&gt;

&lt;p&gt;For now, it has one job: tell you what to do in the garden this week, then send you outside.&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Would love to hear your suggestions on this! What features or improvements do you think I should add next? Feel free to point out anything that could be better 👀</title>
      <dc:creator>Ansh Rajpoot</dc:creator>
      <pubDate>Sat, 03 Oct 2026 14:06:07 +0000</pubDate>
      <link>https://dev.to/ansh_rajpoot_e66cde52a456/would-love-to-hear-your-suggestions-on-this-what-features-or-improvements-do-you-think-i-should-kjk</link>
      <guid>https://dev.to/ansh_rajpoot_e66cde52a456/would-love-to-hear-your-suggestions-on-this-what-features-or-improvements-do-you-think-i-should-kjk</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/ansh_rajpoot_e66cde52a456/scamcheck-investigate-the-message-not-just-the-sender-built-for-my-scam-prone-friend-2033" class="crayons-story__hidden-navigation-link"&gt;ScamCheck: Investigate the Message, Not Just the Sender — Built for My Scam-Prone Friend&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/ansh_rajpoot_e66cde52a456/scamcheck-investigate-the-message-not-just-the-sender-built-for-my-scam-prone-friend-2033" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Hacktoberfest: Maintainer Spotlight&lt;/p&gt;

&lt;/a&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/ansh_rajpoot_e66cde52a456" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F4152552%2F726385cc-b451-4130-826d-8af949912bc8.png" alt="ansh_rajpoot_e66cde52a456 profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/ansh_rajpoot_e66cde52a456" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Ansh Rajpoot
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Ansh Rajpoot
                
                
              
              &lt;div id="story-author-preview-content-4792265" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/ansh_rajpoot_e66cde52a456" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F4152552%2F726385cc-b451-4130-826d-8af949912bc8.png" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Ansh Rajpoot&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/ansh_rajpoot_e66cde52a456/scamcheck-investigate-the-message-not-just-the-sender-built-for-my-scam-prone-friend-2033" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 3&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/ansh_rajpoot_e66cde52a456/scamcheck-investigate-the-message-not-just-the-sender-built-for-my-scam-prone-friend-2033" id="article-link-4792265"&gt;
          ScamCheck: Investigate the Message, Not Just the Sender — Built for My Scam-Prone Friend
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/hacktoberfest"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;hacktoberfest&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/hf26challenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;hf26challenge&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/ansh_rajpoot_e66cde52a456/scamcheck-investigate-the-message-not-just-the-sender-built-for-my-scam-prone-friend-2033" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/ansh_rajpoot_e66cde52a456/scamcheck-investigate-the-message-not-just-the-sender-built-for-my-scam-prone-friend-2033#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              5&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>cybersecurity</category>
      <category>security</category>
      <category>showdev</category>
    </item>
    <item>
      <title>ScamCheck: Investigate the Message, Not Just the Sender — Built for My Scam-Prone Friend</title>
      <dc:creator>Ansh Rajpoot</dc:creator>
      <pubDate>Sat, 03 Oct 2026 13:55:28 +0000</pubDate>
      <link>https://dev.to/ansh_rajpoot_e66cde52a456/scamcheck-investigate-the-message-not-just-the-sender-built-for-my-scam-prone-friend-2033</link>
      <guid>https://dev.to/ansh_rajpoot_e66cde52a456/scamcheck-investigate-the-message-not-just-the-sender-built-for-my-scam-prone-friend-2033</guid>
      <description>&lt;h1&gt;
  
  
  devchallenge #weekendchallenge #hf26challenge
&lt;/h1&gt;

&lt;p&gt;Hacktoberfest Weekend Challenge: Build for a Friend 🤝**&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Built&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built ScamCheck for a friend who regularly receives suspicious bank, KYC, delivery, payment and account-warning messages and usually asks me:&lt;/p&gt;

&lt;p&gt;GitHub:&lt;a href=""&gt; github.com/ansh-rajpoot/scamcheck&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Is this real or a scam?"&lt;/p&gt;

&lt;p&gt;The problem is that simply asking an AI chatbot isn't enough.&lt;/p&gt;

&lt;p&gt;A chatbot can confidently say "this looks like a scam", but that doesn't tell you why, what can actually be verified, or what is still unknown.&lt;/p&gt;

&lt;p&gt;So I built something different.&lt;/p&gt;

&lt;p&gt;ScamCheck investigates the message and shows the evidence.&lt;/p&gt;

&lt;p&gt;Paste a suspicious SMS, WhatsApp message, email, or URL and ScamCheck breaks it into:&lt;/p&gt;

&lt;p&gt;suspicious signals it directly observed&lt;br&gt;
organizations and claims mentioned in the message&lt;br&gt;
URLs and domains&lt;br&gt;
external evidence found through web search&lt;br&gt;
things that could not be verified&lt;br&gt;
safe next steps&lt;/p&gt;

&lt;p&gt;The AI doesn't get to invent evidence or blindly decide the answer.&lt;/p&gt;

&lt;p&gt;How it works&lt;br&gt;
&lt;em&gt;&lt;strong&gt;DEMO&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjm2ek3lx3gpcl4uzkenm.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%2Fjm2ek3lx3gpcl4uzkenm.png" alt=" " width="800" height="873"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The result looks more like a security investigation than a chatbot:&lt;/li&gt;
&lt;li&gt;Suspicious signals found&lt;/li&gt;
&lt;li&gt;Observed: "Your account will be blocked today"&lt;/li&gt;
&lt;li&gt;Observed: OTP requested&lt;/li&gt;
&lt;li&gt;Claimed organization: SBI&lt;/li&gt;
&lt;li&gt;External evidence: relevant official/public source&lt;/li&gt;
&lt;li&gt;Unverified: sender identity&lt;/li&gt;
&lt;li&gt;Recommended action: don't share the OTP; verify through the organization's official website/app instead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is deliberately no arbitrary "87% scam" score.&lt;/p&gt;

&lt;p&gt;Evidence should be explainable, not a number invented by an LLM.&lt;/p&gt;

&lt;p&gt;Why Local AI?&lt;/p&gt;

&lt;p&gt;Scam messages can contain extremely sensitive information:&lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;- bank details&lt;/li&gt;
&lt;li&gt;- account suffixes&lt;/li&gt;
&lt;li&gt;- phone numbers&lt;/li&gt;
&lt;li&gt;- transaction information&lt;/li&gt;
&lt;li&gt;- names&lt;/li&gt;
&lt;li&gt;- addresses&lt;/li&gt;
&lt;li&gt;- payment information
**&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ScamCheck uses **Gemma 3 4B **through Ollama, so the AI analysis can run locally on the user's machine.&lt;/p&gt;

&lt;p&gt;The entire private message doesn't need to be sent to an AI API just to understand it.&lt;/p&gt;

&lt;p&gt;When external verification is useful, ScamCheck sends a minimal search query rather than the complete private message.&lt;/p&gt;

&lt;p&gt;That's the part of open-weight AI that mattered to me: the user can actually keep the core analysis at home.&lt;/p&gt;

&lt;p&gt;_**Why not just use an LLM?&lt;/p&gt;

&lt;p&gt;Because an LLM shouldn't be trusted with facts it can determine more reliably using normal code.&lt;br&gt;
**_&lt;br&gt;
For example:&lt;/p&gt;

&lt;p&gt;"Enter your OTP immediately"&lt;/p&gt;

&lt;p&gt;can be detected deterministically.&lt;/p&gt;

&lt;p&gt;So can:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://example.com/login" rel="noopener noreferrer"&gt;https://example.com/login&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gemma is then used for the parts where language understanding is useful:&lt;/p&gt;

&lt;p&gt;extracting claims&lt;br&gt;
identifying claimed organizations&lt;br&gt;
understanding requested actions&lt;br&gt;
structuring the investigation&lt;/p&gt;

&lt;p&gt;External search provides another layer of evidence.&lt;/p&gt;

&lt;p&gt;The final report keeps those sources separate.&lt;/p&gt;

&lt;p&gt;The Friend Test&lt;/p&gt;

&lt;p&gt;The real test isn't whether ScamCheck produces a clever AI response.&lt;/p&gt;

&lt;p&gt;It's whether my friend can paste a suspicious message and understand:&lt;/p&gt;

&lt;p&gt;"What exactly is suspicious here, what was actually verified, and what should I do next?"&lt;/p&gt;

&lt;p&gt;That's what I built it for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;p&gt;*&lt;em&gt;Python&lt;br&gt;
FastAPI&lt;br&gt;
HTML/CSS/JavaScript&lt;br&gt;
Ollama&lt;br&gt;
Gemma 3 4B&lt;br&gt;
SerpApi&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
The application runs locally, with the browser communicating with a local FastAPI server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source AI
&lt;/h2&gt;

&lt;p&gt;The core AI runs through an open-weight model rather than requiring a proprietary hosted model for the analysis.&lt;/p&gt;

&lt;p&gt;That means the model can be:&lt;/p&gt;

&lt;p&gt;run locally&lt;br&gt;
swapped for another open model&lt;br&gt;
inspected and controlled by the developer&lt;br&gt;
used without sending every private message to a third-party AI API&lt;/p&gt;

&lt;p&gt;For a tool dealing with potentially sensitive messages, that difference matters.&lt;/p&gt;

&lt;p&gt;What I Learned&lt;/p&gt;

&lt;p&gt;The biggest lesson was that AI should not be the entire security system.&lt;/p&gt;

&lt;p&gt;The useful architecture turned out to be:&lt;/p&gt;

&lt;p&gt;deterministic code + local AI + external evidence&lt;/p&gt;

&lt;p&gt;rather than:&lt;/p&gt;

&lt;p&gt;send everything to an LLM and trust its verdict.&lt;/p&gt;

&lt;p&gt;That made ScamCheck both more explainable and more useful.&lt;/p&gt;

&lt;p&gt;Limitations&lt;/p&gt;

&lt;p&gt;ScamCheck cannot guarantee that a message is legitimate or fraudulent.&lt;/p&gt;

&lt;p&gt;External search results are evidence, not absolute proof.&lt;/p&gt;

&lt;p&gt;It also does not automatically access WhatsApp, Gmail, Telegram, or other private accounts, and it does not automatically open suspicious URLs.&lt;/p&gt;

&lt;p&gt;The goal is to help a person investigate safely—not pretend that an AI can know everything.&lt;/p&gt;

&lt;p&gt;Prize Categories&lt;/p&gt;

&lt;p&gt;Gemma — Best Use of Gemma&lt;/p&gt;

&lt;p&gt;SerpApi — Best Use of SerpApi&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hacktoberfest</category>
      <category>security</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
