<?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: rishabh-hasija</title>
    <description>The latest articles on DEV Community by rishabh-hasija (@rishabhhasija).</description>
    <link>https://dev.to/rishabhhasija</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%2F4189648%2F02a62451-fc0f-43cf-9971-16607e126c41.png</url>
      <title>DEV Community: rishabh-hasija</title>
      <link>https://dev.to/rishabhhasija</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rishabhhasija"/>
    <language>en</language>
    <item>
      <title>SpecterLAN: Find the Ghosts on Your Network</title>
      <dc:creator>rishabh-hasija</dc:creator>
      <pubDate>Sat, 31 Oct 2026 11:23:40 +0000</pubDate>
      <link>https://dev.to/rishabhhasija/specterlan-find-the-ghosts-on-your-network-1208</link>
      <guid>https://dev.to/rishabhhasija/specterlan-find-the-ghosts-on-your-network-1208</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;SpecterLAN&lt;/strong&gt;, a local-first network monitor that helps you understand which devices are connected to your network and what changed between scans.&lt;/p&gt;

&lt;p&gt;SpecterLAN can show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New devices&lt;/li&gt;
&lt;li&gt;Devices that went offline&lt;/li&gt;
&lt;li&gt;Devices that returned&lt;/li&gt;
&lt;li&gt;IP address changes&lt;/li&gt;
&lt;li&gt;Devices that still need review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the &lt;strong&gt;Ghost in the Machine&lt;/strong&gt; theme, unfamiliar or forgotten devices become the "ghosts" on your network.&lt;/p&gt;

&lt;p&gt;SpecterLAN does not assume an unknown device is dangerous. It shows what changed and lets you identify the device yourself.&lt;/p&gt;

&lt;p&gt;It also includes &lt;strong&gt;Ask the Ghost&lt;/strong&gt;, where a local AI model explains network changes using evidence collected by SpecterLAN.&lt;/p&gt;

&lt;p&gt;Everything runs locally on your device.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://drive.google.com/file/d/1kaFZAq3aaLdVW46Igli41Jcqt9QSicUC/view?usp=drive_link" rel="noopener noreferrer"&gt;Watch the SpecterLAN demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A baseline network scan&lt;/li&gt;
&lt;li&gt;A new device appearing&lt;/li&gt;
&lt;li&gt;SpecterLAN detecting the change&lt;/li&gt;
&lt;li&gt;Ask the Ghost explaining the change with local AI&lt;/li&gt;
&lt;li&gt;A device changing IP while keeping the same identity&lt;/li&gt;
&lt;li&gt;Another device going offline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SpecterLAN also includes &lt;strong&gt;Demo Séance&lt;/strong&gt;, which uses simulated network data so people can test the full experience without exposing their real network.&lt;/p&gt;

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

&lt;p&gt;GitHub repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rishabh-hasija/spectarlan" rel="noopener noreferrer"&gt;https://github.com/rishabh-hasija/spectarlan&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SpecterLAN is open source and released under the MIT License.&lt;/p&gt;

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

&lt;p&gt;SpecterLAN is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Streamlit&lt;/li&gt;
&lt;li&gt;SQLite&lt;/li&gt;
&lt;li&gt;Ollama&lt;/li&gt;
&lt;li&gt;Gemma 3 4B as the default local AI model&lt;/li&gt;
&lt;li&gt;Pydantic&lt;/li&gt;
&lt;li&gt;Nmap when available, with a local fallback when it is not&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Network scanning happens on the user's own device.&lt;/p&gt;

&lt;p&gt;Scan history, device names, trust labels, and other information are stored locally in SQLite.&lt;/p&gt;

&lt;p&gt;For AI analysis, SpecterLAN sends structured evidence only to the locally running Ollama service.&lt;/p&gt;

&lt;p&gt;The default model is &lt;code&gt;gemma3:4b&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;SpecterLAN also detects other compatible Ollama models already installed on the device and lets the user select one from a dropdown.&lt;/p&gt;

&lt;p&gt;Ask the Ghost does not decide whether a device is malicious.&lt;/p&gt;

&lt;p&gt;Instead, SpecterLAN creates evidence records, checks the evidence referenced by the model, and removes unsupported AI output.&lt;/p&gt;

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

&lt;p&gt;Network information is private.&lt;/p&gt;

&lt;p&gt;A network scan can contain device names, local addresses, hardware details, and information about devices inside someone's home.&lt;/p&gt;

&lt;p&gt;I did not want SpecterLAN to send that information to an external AI API.&lt;/p&gt;

&lt;p&gt;Using Ollama and an open-weight model means the AI runs on the same device as SpecterLAN.&lt;/p&gt;

&lt;p&gt;There is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No cloud AI&lt;/li&gt;
&lt;li&gt;No API key&lt;/li&gt;
&lt;li&gt;No SpecterLAN account&lt;/li&gt;
&lt;li&gt;No registration&lt;/li&gt;
&lt;li&gt;No shared database&lt;/li&gt;
&lt;li&gt;No network history uploaded to a SpecterLAN server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Users can also switch to another compatible local Ollama model.&lt;/p&gt;

&lt;p&gt;Even without AI, device discovery, tracking, and scan history continue to work.&lt;/p&gt;

&lt;p&gt;This open and local approach keeps the user's network data under their control.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Spirit of It
&lt;/h2&gt;

&lt;p&gt;Devices appear, disappear, return, and sometimes change addresses.&lt;/p&gt;

&lt;p&gt;SpecterLAN treats those changes like apparitions on your network.&lt;/p&gt;

&lt;p&gt;A forgotten device might suddenly appear again. A new device might show up without a recognizable name. Ask the Ghost helps explain what SpecterLAN observed.&lt;/p&gt;

&lt;p&gt;The Halloween theme is part of the experience, while the findings remain evidence-based.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unknown does not mean malicious.&lt;/strong&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;SpecterLAN uses &lt;strong&gt;Gemma 3 4B&lt;/strong&gt; through Ollama as its default local AI model.&lt;/p&gt;

&lt;p&gt;Gemma powers &lt;strong&gt;Ask the Ghost&lt;/strong&gt;, which explains changes between saved network scans using structured local evidence.&lt;/p&gt;

&lt;p&gt;The model runs on the user's own device, so private network information does not need to be sent to a hosted AI provider.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>gemma</category>
    </item>
    <item>
      <title>LazyResearch OS: The AI That Reads What I’m Too Lazy to Read</title>
      <dc:creator>rishabh-hasija</dc:creator>
      <pubDate>Mon, 26 Oct 2026 02:23:30 +0000</pubDate>
      <link>https://dev.to/rishabhhasija/lazyresearch-os-the-ai-that-reads-what-im-too-lazy-to-read-5ca</link>
      <guid>https://dev.to/rishabhhasija/lazyresearch-os-the-ai-that-reads-what-im-too-lazy-to-read-5ca</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;h1&gt;
  
  
  LazyResearch OS — Save the reading. Find what matters. Keep the evidence.
&lt;/h1&gt;

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

&lt;p&gt;I built &lt;strong&gt;LazyResearch OS&lt;/strong&gt;, a tool for people who keep saving things they intend to read later — PDFs, articles, notes, quotes, meeting notes, emails copied as text — and then never get around to organizing or acting on them.&lt;/p&gt;

&lt;p&gt;The basic idea is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give LazyResearch the things you were too lazy to read, organize, or research. It finds what matters, keeps the evidence, and tells you what may actually need your attention.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A user can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add URLs, PDFs, TXT/Markdown files, or pasted text.&lt;/li&gt;
&lt;li&gt;Let an open-weight Gemma model analyze each source.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;What Matters&lt;/strong&gt; to see which saved items deserve attention.&lt;/li&gt;
&lt;li&gt;Give simple feedback so LazyResearch can learn their preferences over time.&lt;/li&gt;
&lt;li&gt;Ask a research question across a specific collection of saved material.&lt;/li&gt;
&lt;li&gt;Get a cited research brief showing exactly which saved sources support the answer.&lt;/li&gt;
&lt;li&gt;Review source-backed actions such as deadlines, follow-ups, or things that need verification.&lt;/li&gt;
&lt;li&gt;Accept, edit, complete, dismiss, or reopen those actions.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  A real example from my testing
&lt;/h3&gt;

&lt;p&gt;I added a short meeting note comparing three project-management tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tool A costs €12/user/month and includes time tracking.&lt;/li&gt;
&lt;li&gt;Tool B costs €9/user/month but does not include time tracking.&lt;/li&gt;
&lt;li&gt;Tool C costs €15/user/month and includes automation.&lt;/li&gt;
&lt;li&gt;The team has to decide before 15 November 2026.&lt;/li&gt;
&lt;li&gt;Before choosing, Tool B's SSO support and Tool C's data-export capability need to be confirmed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LazyResearch automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;summarized the note,&lt;/li&gt;
&lt;li&gt;detected the decision deadline,&lt;/li&gt;
&lt;li&gt;classified it under &lt;strong&gt;Action required&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;proposed:

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Confirm Tool B SSO support&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm Tool C data export capability&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;let me ask:
&amp;gt; “What should we verify before choosing office software?”&lt;/li&gt;
&lt;li&gt;created a research brief using only the selected &lt;strong&gt;Office software&lt;/strong&gt; collection,&lt;/li&gt;
&lt;li&gt;cited the original note as evidence,&lt;/li&gt;
&lt;li&gt;disclosed that the answer had &lt;strong&gt;partial coverage&lt;/strong&gt; because only one personal source was available,&lt;/li&gt;
&lt;li&gt;and preserved the action provenance all the way back to the original text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point is not just summarization. The goal is to turn saved information into &lt;strong&gt;priorities, evidence-backed research, and things worth doing&lt;/strong&gt;.&lt;/p&gt;




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

&lt;p&gt;&lt;a href="https://drive.google.com/file/d/1SagYAnFA1xU-WO0xATvf1m8Ft8txGRIJ/view?usp=drive_link" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1SagYAnFA1xU-WO0xATvf1m8Ft8txGRIJ/view?usp=drive_link&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Live demo
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://lazyresearch-os-demo.onrender.com/" rel="noopener noreferrer"&gt;https://lazyresearch-os-demo.onrender.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The public deployment is intentionally a &lt;strong&gt;synthetic shared demo workspace&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Please do not upload personal or private information. The current challenge demo has no authentication and stores demo data persistently in PostgreSQL rather than temporary browser storage.&lt;/p&gt;

&lt;p&gt;Some research/analysis features depend on a separately supervised worker and local model host, so they may not be continuously available.&lt;/p&gt;

&lt;h3&gt;
  
  
  Demo flow
&lt;/h3&gt;

&lt;p&gt;For the final video I will demonstrate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add a new source.&lt;/li&gt;
&lt;li&gt;Put it in a collection.&lt;/li&gt;
&lt;li&gt;Analyze it with Gemma.&lt;/li&gt;
&lt;li&gt;See it appear under &lt;strong&gt;What Matters&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Give explicit relevance feedback.&lt;/li&gt;
&lt;li&gt;Start a research mission limited to that collection.&lt;/li&gt;
&lt;li&gt;Inspect the generated brief.&lt;/li&gt;
&lt;li&gt;Open the exact evidence used by the answer.&lt;/li&gt;
&lt;li&gt;Review the generated source-backed actions.&lt;/li&gt;
&lt;li&gt;Accept one of those actions.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rishabh-hasija/lazyresearch-os" rel="noopener noreferrer"&gt;https://github.com/rishabh-hasija/lazyresearch-os&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is released under the &lt;strong&gt;MIT License&lt;/strong&gt;.&lt;/p&gt;




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

&lt;p&gt;LazyResearch OS is a Python modular monolith backed by PostgreSQL.&lt;/p&gt;

&lt;p&gt;The architecture deliberately keeps original sources, AI-generated analysis, evidence, research history, user feedback, and actions separate instead of treating an AI response as disposable chat output.&lt;/p&gt;

&lt;h3&gt;
  
  
  The simple version
&lt;/h3&gt;

&lt;p&gt;The flow looks like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You provide&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URLs&lt;/li&gt;
&lt;li&gt;PDFs&lt;/li&gt;
&lt;li&gt;TXT / Markdown files&lt;/li&gt;
&lt;li&gt;pasted notes or email text&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LazyResearch&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;saves the original material,&lt;/li&gt;
&lt;li&gt;extracts readable content,&lt;/li&gt;
&lt;li&gt;analyzes it,&lt;/li&gt;
&lt;li&gt;learns what you care about,&lt;/li&gt;
&lt;li&gt;searches your saved material,&lt;/li&gt;
&lt;li&gt;performs longer research jobs,&lt;/li&gt;
&lt;li&gt;keeps evidence attached to generated claims.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You receive&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;What Matters&lt;/strong&gt; priority view,&lt;/li&gt;
&lt;li&gt;cited research briefs,&lt;/li&gt;
&lt;li&gt;preserved research history,&lt;/li&gt;
&lt;li&gt;coverage limitations,&lt;/li&gt;
&lt;li&gt;source-backed actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What happens technically
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What the user sees&lt;/th&gt;
&lt;th&gt;What happens behind the scenes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Add Sources&lt;/td&gt;
&lt;td&gt;Upload or paste material&lt;/td&gt;
&lt;td&gt;Original source and extracted content are stored in PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analyze&lt;/td&gt;
&lt;td&gt;Summary, topics, deadlines, actions&lt;/td&gt;
&lt;td&gt;Gemma analyzes bounded source content through Ollama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What Matters&lt;/td&gt;
&lt;td&gt;Read now / Useful later / Action required / Low priority&lt;/td&gt;
&lt;td&gt;Deterministic baseline first, then TabPFN personalization only after enough explicit feedback and evaluation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search saved material&lt;/td&gt;
&lt;td&gt;Relevant evidence&lt;/td&gt;
&lt;td&gt;PostgreSQL lexical retrieval plus pgvector semantic retrieval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Research&lt;/td&gt;
&lt;td&gt;Cited brief&lt;/td&gt;
&lt;td&gt;Temporal coordinates a durable research workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence&lt;/td&gt;
&lt;td&gt;Exact source text and provenance&lt;/td&gt;
&lt;td&gt;Frozen evidence remains tied to the immutable research result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Actions&lt;/td&gt;
&lt;td&gt;Things worth doing&lt;/td&gt;
&lt;td&gt;Source-backed proposals keep their provenance, deadline and revision history&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Gemma
&lt;/h3&gt;

&lt;p&gt;I use &lt;strong&gt;Gemma&lt;/strong&gt; locally through Ollama for source analysis and research synthesis.&lt;/p&gt;

&lt;p&gt;It extracts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;summaries,&lt;/li&gt;
&lt;li&gt;topics,&lt;/li&gt;
&lt;li&gt;claims,&lt;/li&gt;
&lt;li&gt;uncertainty,&lt;/li&gt;
&lt;li&gt;candidate deadlines,&lt;/li&gt;
&lt;li&gt;source-backed actions,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and later synthesizes structured research briefs from selected evidence.&lt;/p&gt;

&lt;p&gt;The project does not assume that model output is automatically trustworthy. Citations are validated against the evidence selected for the mission, and partial coverage is disclosed instead of pretending the system knows more than it does.&lt;/p&gt;

&lt;h3&gt;
  
  
  Embeddings and pgvector
&lt;/h3&gt;

&lt;p&gt;Saved source text is split into deterministic chunks.&lt;/p&gt;

&lt;p&gt;I use &lt;code&gt;qwen3-embedding&lt;/code&gt; to create semantic embeddings, which are stored with &lt;strong&gt;pgvector&lt;/strong&gt; in PostgreSQL.&lt;/p&gt;

&lt;p&gt;LazyResearch combines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL full-text search for lexical/exact retrieval, and&lt;/li&gt;
&lt;li&gt;semantic/vector retrieval for meaning-based matching.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A deterministic Reciprocal Rank Fusion step combines the two.&lt;/p&gt;

&lt;p&gt;Lexical retrieval remains available as a fallback.&lt;/p&gt;

&lt;h3&gt;
  
  
  Temporal
&lt;/h3&gt;

&lt;p&gt;Long research jobs run through &lt;strong&gt;Temporal&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A Research Mission is not just a large function call. It moves through durable stages such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;personal-source retrieval,&lt;/li&gt;
&lt;li&gt;evidence selection,&lt;/li&gt;
&lt;li&gt;evidence freezing,&lt;/li&gt;
&lt;li&gt;synthesis,&lt;/li&gt;
&lt;li&gt;citation validation,&lt;/li&gt;
&lt;li&gt;result publication.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;During the challenge I explicitly tested worker restart and recovery. An in-flight mission survived worker interruption without producing a duplicate publication.&lt;/p&gt;

&lt;p&gt;Research results are immutable: rerunning a topic creates another version instead of overwriting the previous answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  TabPFN
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;TabPFN&lt;/strong&gt; powers the personalized relevance path behind &lt;strong&gt;What Matters&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The important part is the cold start.&lt;/p&gt;

&lt;p&gt;LazyResearch does &lt;strong&gt;not&lt;/strong&gt; claim to know the user immediately.&lt;/p&gt;

&lt;p&gt;At first it shows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Learning your preferences&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The baseline ranking uses transparent signals such as recency, deadlines and source-backed actions.&lt;/p&gt;

&lt;p&gt;Users then give explicit feedback such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read now&lt;/li&gt;
&lt;li&gt;Useful later&lt;/li&gt;
&lt;li&gt;Action required&lt;/li&gt;
&lt;li&gt;Low priority&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only after enough labeled examples exist, and only if the personalized model passes the evaluation gate against the baseline, can the UI honestly switch to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Personalized for you&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My synthetic held-out benchmark produced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TabPFN macro-F1: &lt;strong&gt;1.000&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;baseline macro-F1: &lt;strong&gt;0.544&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That proves the integration works on the benchmark, not that real-user ranking quality has already been solved. Real-user personalization remains something to validate further.&lt;/p&gt;

&lt;h3&gt;
  
  
  Render
&lt;/h3&gt;

&lt;p&gt;The public Streamlit demo runs on &lt;strong&gt;Render&lt;/strong&gt; using a Docker web service.&lt;/p&gt;

&lt;p&gt;The hosted application connects to the database through the provider-neutral &lt;code&gt;DATABASE_URL&lt;/code&gt; configuration.&lt;/p&gt;

&lt;p&gt;Render hosts the public web interface, while the supervised research worker and local inference stay separate for this challenge demo.&lt;/p&gt;

&lt;h3&gt;
  
  
  PostgreSQL / Neon
&lt;/h3&gt;

&lt;p&gt;Neon PostgreSQL is the canonical durable store for the hosted demo.&lt;/p&gt;

&lt;p&gt;It holds things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;source captures,&lt;/li&gt;
&lt;li&gt;extracted content,&lt;/li&gt;
&lt;li&gt;analyses,&lt;/li&gt;
&lt;li&gt;chunks,&lt;/li&gt;
&lt;li&gt;vector embeddings,&lt;/li&gt;
&lt;li&gt;collections,&lt;/li&gt;
&lt;li&gt;feedback,&lt;/li&gt;
&lt;li&gt;research topics,&lt;/li&gt;
&lt;li&gt;missions,&lt;/li&gt;
&lt;li&gt;immutable research results,&lt;/li&gt;
&lt;li&gt;citations/evidence,&lt;/li&gt;
&lt;li&gt;actions and revisions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The original source and AI-generated analysis are kept separately.&lt;/p&gt;

&lt;p&gt;This also means the public demo is &lt;strong&gt;not temporary browser storage&lt;/strong&gt;. Because the challenge demo is one shared workspace without authentication, it is explicitly restricted to synthetic/demo material.&lt;/p&gt;

&lt;h3&gt;
  
  
  Public web search
&lt;/h3&gt;

&lt;p&gt;LazyResearch also contains a provider abstraction and implementation for public-web research through SerpApi.&lt;/p&gt;

&lt;p&gt;However, I did &lt;strong&gt;not&lt;/strong&gt; use a live SerpApi key in the final hosted verification, so I am not claiming live SerpApi use in this submission.&lt;/p&gt;

&lt;p&gt;The saved-source research path is the one demonstrated and verified end-to-end.&lt;/p&gt;




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

&lt;p&gt;Open innovation is central to this project rather than an add-on.&lt;/p&gt;

&lt;p&gt;The part of LazyResearch that actually reads and synthesizes a user's material runs through an &lt;strong&gt;open-weight model that I control&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That gave me several useful properties during development.&lt;/p&gt;

&lt;h3&gt;
  
  
  I could run inference locally
&lt;/h3&gt;

&lt;p&gt;Gemma and the embedding model run through Ollama on my own machine.&lt;/p&gt;

&lt;p&gt;I did not have to design the application around one proprietary model API before I even knew whether the product idea worked.&lt;/p&gt;

&lt;h3&gt;
  
  
  Models are replaceable
&lt;/h3&gt;

&lt;p&gt;The domain and application layers depend on provider-neutral ports rather than a specific model vendor.&lt;/p&gt;

&lt;p&gt;Gemma is the current implementation, but the architecture does not require rebuilding the product around a different API if the inference model changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  I could inspect and constrain the pipeline
&lt;/h3&gt;

&lt;p&gt;The system separates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;original source,&lt;/li&gt;
&lt;li&gt;extraction,&lt;/li&gt;
&lt;li&gt;model analysis,&lt;/li&gt;
&lt;li&gt;evidence,&lt;/li&gt;
&lt;li&gt;research synthesis,&lt;/li&gt;
&lt;li&gt;user decisions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That made it possible to test failures honestly.&lt;/p&gt;

&lt;p&gt;For example, during my own end-to-end walkthrough, a research mission failed because strict lexical retrieval returned zero evidence. Instead of weakening the evidence invariant and allowing the model to answer anyway, I fixed the retrieval path so an explicitly selected collection could provide bounded fallback context and the final result was marked &lt;strong&gt;Partial coverage&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That behavior is much closer to what I want from personal research software:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When evidence is weak, say so.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Open tools let the pieces cooperate
&lt;/h3&gt;

&lt;p&gt;The project combines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gemma for reasoning/synthesis,&lt;/li&gt;
&lt;li&gt;Ollama for local inference,&lt;/li&gt;
&lt;li&gt;qwen embeddings,&lt;/li&gt;
&lt;li&gt;PostgreSQL + pgvector,&lt;/li&gt;
&lt;li&gt;Temporal for durable workflows,&lt;/li&gt;
&lt;li&gt;TabPFN for personal relevance learning,&lt;/li&gt;
&lt;li&gt;Streamlit for the application UI,&lt;/li&gt;
&lt;li&gt;Render for public hosting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because those pieces can be inspected, replaced and composed, I could build around the product behavior I wanted instead of around the limitations of one closed AI endpoint.&lt;/p&gt;




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

&lt;p&gt;I used coding agents heavily while building LazyResearch OS.&lt;/p&gt;

&lt;p&gt;Rather than keeping one enormous agent conversation, I split development into small roadmap slices such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;domain foundation,&lt;/li&gt;
&lt;li&gt;persistent intake,&lt;/li&gt;
&lt;li&gt;Gemma analysis,&lt;/li&gt;
&lt;li&gt;retrieval,&lt;/li&gt;
&lt;li&gt;Temporal Research Missions,&lt;/li&gt;
&lt;li&gt;TabPFN ranking,&lt;/li&gt;
&lt;li&gt;Streamlit application,&lt;/li&gt;
&lt;li&gt;deployment,&lt;/li&gt;
&lt;li&gt;final UX walkthrough fixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each fresh agent session reconstructed the project from repository documentation such as &lt;code&gt;AGENTS.md&lt;/code&gt;, &lt;code&gt;STATUS.md&lt;/code&gt;, &lt;code&gt;NEXT.md&lt;/code&gt;, architecture docs and ADRs.&lt;/p&gt;

&lt;p&gt;That turned out to be especially useful during the final manual walkthrough.&lt;/p&gt;

&lt;p&gt;Instead of assuming that passing tests meant the product was finished, I used the application myself from scratch and found several real usability and workflow problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;collection creation failed in a stale Streamlit session,&lt;/li&gt;
&lt;li&gt;“Analyze next source” could process refresh jobs before a new source,&lt;/li&gt;
&lt;li&gt;feedback saved successfully but its confirmation appeared offscreen,&lt;/li&gt;
&lt;li&gt;collection context initially did not carry consistently into Research or Actions,&lt;/li&gt;
&lt;li&gt;strict lexical retrieval caused a real Temporal mission to fail with no evidence,&lt;/li&gt;
&lt;li&gt;completed partial research existed but could not initially be opened from the UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those issues were found by manually acting like a real user, then giving the agent a minimal reproducible case and requiring it to fix the root cause rather than hide the error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DevRelay session:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;To be added if I export one before submission.&lt;/em&gt;&lt;/p&gt;




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

&lt;p&gt;I built LazyResearch because my own pattern is very simple:&lt;/p&gt;

&lt;p&gt;I save things because they seem important.&lt;/p&gt;

&lt;p&gt;Then I don't read them.&lt;/p&gt;

&lt;p&gt;Or I read them once and forget why I saved them.&lt;/p&gt;

&lt;p&gt;Or something in the document requires an action later, and that action disappears into the pile.&lt;/p&gt;

&lt;p&gt;LazyResearch tries to remove those steps.&lt;/p&gt;

&lt;p&gt;In the Office Software walkthrough, I only entered a short meeting note.&lt;/p&gt;

&lt;p&gt;From that one source, the system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;preserved the original,&lt;/li&gt;
&lt;li&gt;summarized it,&lt;/li&gt;
&lt;li&gt;identified the decision deadline,&lt;/li&gt;
&lt;li&gt;surfaced it as requiring action,&lt;/li&gt;
&lt;li&gt;proposed two things that need verification,&lt;/li&gt;
&lt;li&gt;accepted explicit feedback about its relevance,&lt;/li&gt;
&lt;li&gt;researched a question across only that collection,&lt;/li&gt;
&lt;li&gt;disclosed that the research had limited coverage,&lt;/li&gt;
&lt;li&gt;cited the original note,&lt;/li&gt;
&lt;li&gt;and turned one of those proposals into an accepted task.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am deliberately not claiming a precise “X hours saved” figure yet.&lt;/p&gt;

&lt;p&gt;The payoff is simpler:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I should not need to repeatedly reread everything I saved just to rediscover what mattered.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the kind of laziness this project is built to reward.&lt;/p&gt;




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

&lt;p&gt;I am entering the categories the project uses and has verified meaningfully:&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;Gemma is the core open-weight model for source analysis and cited research synthesis.&lt;/p&gt;

&lt;p&gt;It was exercised through real local inference during both benchmarks and the manual end-to-end walkthrough.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of TabPFN
&lt;/h3&gt;

&lt;p&gt;TabPFN powers the evaluated personalized relevance path for &lt;strong&gt;What Matters&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The product begins with an honest deterministic baseline and only activates personalization after explicit user feedback and evaluation justify it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Temporal
&lt;/h3&gt;

&lt;p&gt;Temporal coordinates durable Research Missions.&lt;/p&gt;

&lt;p&gt;The project includes real Temporal Cloud execution, retries, failure handling, worker-restart recovery and immutable publication behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Render
&lt;/h3&gt;

&lt;p&gt;The public LazyResearch OS demo is deployed as a Docker-based Streamlit service on Render and uses the live Neon-backed application state.&lt;/p&gt;




&lt;h2&gt;
  
  
  Current Limitations
&lt;/h2&gt;

&lt;p&gt;This is a challenge build, not a production personal-data service.&lt;/p&gt;

&lt;p&gt;Current limitations include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the public demo uses one shared synthetic workspace,&lt;/li&gt;
&lt;li&gt;no authentication,&lt;/li&gt;
&lt;li&gt;users must not upload personal/private information,&lt;/li&gt;
&lt;li&gt;research/model processing depends on a separately supervised worker,&lt;/li&gt;
&lt;li&gt;public SerpApi research is implemented but not live-verified,&lt;/li&gt;
&lt;li&gt;Gmail/RSS connectors are not implemented,&lt;/li&gt;
&lt;li&gt;TabPFN's benchmark is synthetic and real-user personalization still needs validation,&lt;/li&gt;
&lt;li&gt;research can disclose partial coverage when evidence is insufficient,&lt;/li&gt;
&lt;li&gt;OCR is not implemented.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I prefer listing those limitations rather than making the demo look more production-ready than it is.&lt;/p&gt;




&lt;p&gt;LazyResearch OS started with a very lazy question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What if I could save something once and never have to remember why it mattered?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer turned into a system that preserves the source, finds the evidence, tells me what deserves attention, and still lets me inspect where every important conclusion came from.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>gemma</category>
    </item>
    <item>
      <title>StockEntry Guard: Local Gemma-Powered Product Onboarding for Small Retailers</title>
      <dc:creator>rishabh-hasija</dc:creator>
      <pubDate>Sun, 18 Oct 2026 21:34:16 +0000</pubDate>
      <link>https://dev.to/rishabhhasija/stockentry-guard-local-gemma-powered-product-onboarding-for-small-retailers-4el7</link>
      <guid>https://dev.to/rishabhhasija/stockentry-guard-local-gemma-powered-product-onboarding-for-small-retailers-4el7</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;Adding products to an inventory sounds simple until catalogs grow. The same item often gets entered multiple times with slightly different names, pack sizes, or variants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;StockEntry Guard&lt;/strong&gt; uses local Gemma 3 vision to extract product details, detect possible duplicates, and keep final inventory decisions with the retailer.&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%2F9kmf4nukhyxvg67ni2a6.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%2F9kmf4nukhyxvg67ni2a6.png" width="800" alt="StockEntry Guard duplicate review" height="400"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coca-Cola Zero 330ml&lt;/li&gt;
&lt;li&gt;Coke Zero Sugar 330 ml&lt;/li&gt;
&lt;li&gt;Coca-Cola Zero 500ml&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A normal product-entry form will happily create three unrelated records unless someone notices the duplication.&lt;/p&gt;

&lt;p&gt;StockEntry Guard helps a retailer to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Import an existing inventory CSV.&lt;/li&gt;
&lt;li&gt;Upload a product photo.&lt;/li&gt;
&lt;li&gt;Extract product details locally with Gemma 3.&lt;/li&gt;
&lt;li&gt;Review and edit the extracted fields.&lt;/li&gt;
&lt;li&gt;Compare the product against the existing catalog.&lt;/li&gt;
&lt;li&gt;See whether there is no match, a possible match, or likely a duplicate.&lt;/li&gt;
&lt;li&gt;Create a new product or update an existing one only after explicit human approval.&lt;/li&gt;
&lt;li&gt;Export the updated inventory back to CSV.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The target user is a small retailer, independent shop, reseller, or anyone maintaining product data without a large inventory-management system.&lt;/p&gt;

&lt;h3&gt;
  
  
  How a retailer would use it
&lt;/h3&gt;

&lt;p&gt;The current hackathon MVP runs locally and stores the retailer's catalog in a SQLite database.&lt;/p&gt;

&lt;p&gt;A retailer imports their existing catalog once using CSV. After the import, the products are stored locally and remain available between application sessions.&lt;/p&gt;

&lt;p&gt;From then on, new products can be added through the image workflow without re-importing the CSV.&lt;/p&gt;

&lt;p&gt;The intended production experience is a Windows installer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install StockEntry Guard.&lt;/li&gt;
&lt;li&gt;Launch the desktop shortcut.&lt;/li&gt;
&lt;li&gt;Import an existing inventory CSV, or download the sample template.&lt;/li&gt;
&lt;li&gt;Add future products by photographing them.&lt;/li&gt;
&lt;li&gt;Export the catalog whenever needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For the hackathon MVP, the application still requires the local Python/Ollama setup described in the repository. Packaging it as a one-click Windows installer is the next deployment step.&lt;/p&gt;

&lt;p&gt;The value is simple: reduce repetitive data entry and prevent messy catalogs from accumulating duplicate products.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Video demo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://drive.google.com/file/d/1GFhMoctpGnEdRfjUzeXzUT5H6zm5rnn3/view?usp=sharing" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1GFhMoctpGnEdRfjUzeXzUT5H6zm5rnn3/view?usp=sharing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;StockEntry Guard currently runs locally through Streamlit and uses Gemma 3 4B through Ollama for product-image extraction.&lt;/p&gt;

&lt;p&gt;The demo shows the complete retailer workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Import an existing inventory CSV.&lt;/li&gt;
&lt;li&gt;Upload a product image.&lt;/li&gt;
&lt;li&gt;Extract structured product details locally with Gemma.&lt;/li&gt;
&lt;li&gt;Review and edit the extracted fields.&lt;/li&gt;
&lt;li&gt;Check the product against the existing inventory for possible duplicates.&lt;/li&gt;
&lt;li&gt;Approve the product.&lt;/li&gt;
&lt;li&gt;Save it into the local inventory database.&lt;/li&gt;
&lt;li&gt;Export the updated inventory back to CSV.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For the demo, I used a Hershey's Milk Chocolate bar.&lt;/p&gt;

&lt;p&gt;The product image contains clear packaging information including the Hershey's brand, Milk Chocolate product type, and visible package weight.&lt;/p&gt;

&lt;p&gt;Gemma analyzes the image locally and returns structured candidate data such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;product name&lt;/li&gt;
&lt;li&gt;brand&lt;/li&gt;
&lt;li&gt;category&lt;/li&gt;
&lt;li&gt;variant&lt;/li&gt;
&lt;li&gt;size&lt;/li&gt;
&lt;li&gt;SKU&lt;/li&gt;
&lt;li&gt;barcode&lt;/li&gt;
&lt;li&gt;description&lt;/li&gt;
&lt;li&gt;confidence&lt;/li&gt;
&lt;li&gt;uncertain fields&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The extracted result is never written directly to inventory.&lt;/p&gt;

&lt;p&gt;The retailer reviews the fields first, then runs StockEntry Guard's deterministic duplicate check.&lt;/p&gt;

&lt;p&gt;The duplicate engine compares the candidate against existing inventory using product name, brand, variant, size, category, barcode, and SKU evidence.&lt;/p&gt;

&lt;p&gt;The UI translates the result into simple messages such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No matching product found&lt;/li&gt;
&lt;li&gt;Possible match found&lt;/li&gt;
&lt;li&gt;Likely already in inventory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The retailer then explicitly chooses whether to create a new product, update an existing one, or discard the result.&lt;/p&gt;

&lt;p&gt;After approval, the product is stored in the local SQLite inventory database and stays available in future application sessions.&lt;/p&gt;

&lt;p&gt;The retailer can export the updated inventory back to CSV at any time.&lt;/p&gt;

&lt;p&gt;This demonstrates the main goal of StockEntry Guard:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use local AI to reduce manual product entry while keeping duplicate prevention and final inventory decisions under human control.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Video demo:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://drive.google.com/file/d/1GFhMoctpGnEdRfjUzeXzUT5H6zm5rnn3/view?usp=sharing" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1GFhMoctpGnEdRfjUzeXzUT5H6zm5rnn3/view?usp=sharing&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;GitHub repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rishabh-hasija/stockentry-guard" rel="noopener noreferrer"&gt;https://github.com/rishabh-hasija/stockentry-guard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.12&lt;/li&gt;
&lt;li&gt;Streamlit&lt;/li&gt;
&lt;li&gt;Gemma 3 4B&lt;/li&gt;
&lt;li&gt;Ollama&lt;/li&gt;
&lt;li&gt;SQLAlchemy&lt;/li&gt;
&lt;li&gt;SQLite&lt;/li&gt;
&lt;li&gt;Alembic&lt;/li&gt;
&lt;li&gt;Pydantic&lt;/li&gt;
&lt;li&gt;pytest&lt;/li&gt;
&lt;li&gt;Ruff&lt;/li&gt;
&lt;li&gt;mypy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repository also contains architecture documentation, sample inventory data, automated tests, and a downloadable sample CSV for new users.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;I wanted the hackathon MVP to stay small enough to finish, but I did not want the codebase to become a one-file Streamlit prototype that would need to be replaced later.&lt;/p&gt;

&lt;p&gt;I used a modular monolith with clear boundaries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Streamlit UI
     |
Application use cases
     |
Domain + ports
     |
Infrastructure adapters
     |
SQLite / Ollama / CSV / similarity engine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Open-source AI is important to StockEntry Guard because the product is designed for small retailers who may not want product images, barcodes, catalog information, and internal inventory data sent to an external AI service.&lt;/p&gt;

&lt;p&gt;StockEntry Guard runs Gemma 3 locally through Ollama.&lt;/p&gt;

&lt;p&gt;That gives the retailer several practical benefits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Product data stays local
&lt;/h3&gt;

&lt;p&gt;Product photographs can contain packaging information, SKUs, barcodes, variants, and internal catalog details.&lt;/p&gt;

&lt;p&gt;With local inference, the image can be processed on the retailer's own computer instead of being uploaded to a hosted AI API.&lt;/p&gt;

&lt;h3&gt;
  
  
  No per-product AI API bill
&lt;/h3&gt;

&lt;p&gt;A retailer may eventually process hundreds or thousands of products.&lt;/p&gt;

&lt;p&gt;A local open-weight model removes the need to pay for every image extraction request. The main requirement becomes local computing resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  The model is replaceable
&lt;/h3&gt;

&lt;p&gt;StockEntry Guard does not make the rest of the application depend directly on Gemma.&lt;/p&gt;

&lt;p&gt;The AI layer implements an &lt;code&gt;AIProductExtractor&lt;/code&gt; interface.&lt;/p&gt;

&lt;p&gt;This means another local vision model could replace Gemma later without rewriting inventory management, duplicate detection, persistence, or the user interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  I could control the extraction rules
&lt;/h3&gt;

&lt;p&gt;For inventory data, a confident-looking wrong answer is worse than an empty field.&lt;/p&gt;

&lt;p&gt;The extraction prompt therefore tells the model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;do not guess SKUs&lt;/li&gt;
&lt;li&gt;do not guess barcodes&lt;/li&gt;
&lt;li&gt;do not guess unreadable pack sizes&lt;/li&gt;
&lt;li&gt;distinguish the brand from the product name&lt;/li&gt;
&lt;li&gt;separate meaningful variants from marketing slogans&lt;/li&gt;
&lt;li&gt;return &lt;code&gt;null&lt;/code&gt; when information is uncertain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open models and local inference made this combination of privacy, control, and low operating cost practical for the project.&lt;/p&gt;

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

&lt;p&gt;I used Codex as a development agent throughout the project, but built the application in small, reviewable slices instead of asking the agent to generate the entire project in one pass.&lt;/p&gt;

&lt;p&gt;The main development stages were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;system architecture and repository structure&lt;/li&gt;
&lt;li&gt;domain model and persistence&lt;/li&gt;
&lt;li&gt;Ollama/Gemma image extraction&lt;/li&gt;
&lt;li&gt;normalization and duplicate detection&lt;/li&gt;
&lt;li&gt;CSV import/export and application workflows&lt;/li&gt;
&lt;li&gt;Streamlit UI&lt;/li&gt;
&lt;li&gt;retailer-facing UX refinement&lt;/li&gt;
&lt;li&gt;regression testing and documentation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One of the most useful parts of this workflow happened during real Gemma testing.&lt;/p&gt;

&lt;p&gt;All automated extraction tests were passing, but a real product image failed with:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;MissingProductNameError&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I tested Gemma directly with the same image and confirmed that its vision capability correctly identified the product as Heineken Lager Beer.&lt;/p&gt;

&lt;p&gt;I then inspected the raw structured response produced through the application.&lt;/p&gt;

&lt;p&gt;Gemma was returning only:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;confidence&lt;/li&gt;
&lt;li&gt;uncertain_fields&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The issue was not the model or image.&lt;/p&gt;

&lt;p&gt;The generated JSON Schema treated product fields such as &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;brand&lt;/code&gt;, and &lt;code&gt;variant&lt;/code&gt; as optional because they had default &lt;code&gt;None&lt;/code&gt; values.&lt;/p&gt;

&lt;p&gt;Gemma therefore followed the schema correctly and omitted them.&lt;/p&gt;

&lt;p&gt;I changed the schema so every product key is required but nullable.&lt;/p&gt;

&lt;p&gt;After the fix, the same real image produced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: Heineken Lager Beer&lt;/li&gt;
&lt;li&gt;Brand: Heineken&lt;/li&gt;
&lt;li&gt;Category: Beer&lt;/li&gt;
&lt;li&gt;Variant: City Edition&lt;/li&gt;
&lt;li&gt;Confidence: 0.95&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unreadable SKU, barcode, and size values remained empty.&lt;/p&gt;

&lt;p&gt;This was a useful reminder that passing mocked tests is not enough when integrating an AI model. I repeatedly tested the actual model between implementation slices and used those results to guide the next agent task.&lt;/p&gt;

&lt;p&gt;The finished project currently has 238 automated tests covering the domain, persistence, migrations, extraction validation, duplicate detection, CSV workflows, transactions, idempotency, and Streamlit behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  My First User
&lt;/h2&gt;

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

&lt;h3&gt;
  
  
  Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;StockEntry Guard uses Gemma 3 4B as its local multimodal model.&lt;/p&gt;

&lt;p&gt;Gemma analyzes retail product photographs and returns structured candidate information including product name, brand, category, variant, size, SKU, and barcode when those values are visible.&lt;/p&gt;

&lt;p&gt;The model runs locally through Ollama.&lt;/p&gt;

&lt;p&gt;AI output never writes directly to inventory. The retailer reviews the extracted information, StockEntry Guard independently performs deterministic duplicate detection, and the retailer explicitly approves the final inventory action.&lt;/p&gt;

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