<?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: Shanaya Carvalho</title>
    <description>The latest articles on DEV Community by Shanaya Carvalho (@shanaya_31).</description>
    <link>https://dev.to/shanaya_31</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%2F4155651%2F86f298e9-4499-40b3-8f4e-e9c8f6ab24e7.png</url>
      <title>DEV Community: Shanaya Carvalho</title>
      <link>https://dev.to/shanaya_31</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shanaya_31"/>
    <language>en</language>
    <item>
      <title>Khoj: A Little AI Companion That Helps You Rediscover the World</title>
      <dc:creator>Shanaya Carvalho</dc:creator>
      <pubDate>Sat, 31 Oct 2026 10:02:37 +0000</pubDate>
      <link>https://dev.to/shanaya_31/khoj-a-little-ai-companion-that-helps-you-rediscover-the-world-2370</link>
      <guid>https://dev.to/shanaya_31/khoj-a-little-ai-companion-that-helps-you-rediscover-the-world-2370</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;Khoj&lt;/strong&gt;, an open-source, offline-first exploration companion designed to encourage people to step outside, explore their surroundings, and rediscover the world around them.&lt;/p&gt;

&lt;p&gt;The idea is simple: choose how much time you have and what interests you, receive a curiosity-driven exploration mission, go outside and record your observations, and turn those experiences into a personal field journal.&lt;/p&gt;

&lt;p&gt;I wanted to create something that makes everyday exploration feel a little more meaningful.&lt;/p&gt;

&lt;p&gt;For this week's theme, I wanted to highlight how AI can act as a companion to human curiosity rather than simply generating answers.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://khoj-37vp.onrender.com/" rel="noopener noreferrer"&gt;https://khoj-37vp.onrender.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: The hosted demo currently uses curated missions and fallback functionality. Local Gemma inference is available through the project's Ollama integration.&lt;/p&gt;

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

&lt;p&gt;GitHub Repository: &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/Shanaya31" rel="noopener noreferrer"&gt;
        Shanaya31
      &lt;/a&gt; / &lt;a href="https://github.com/Shanaya31/Khoj" rel="noopener noreferrer"&gt;
        Khoj
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Open-source, offline-first AI exploration companion that turns city walks into curiosity-driven missions and a personal field journal.
    &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;Khoj (खोज)&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Don't follow the map. Follow your curiosity.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Khoj&lt;/strong&gt; is an open-source, offline-first AI exploration companion for discovering the city around you. Starting with Mumbai, it offers curiosity-driven missions, lets you record what you notice, and helps you turn those observations into a personal field journal.&lt;/p&gt;
&lt;p&gt;Built for the &lt;strong&gt;Hacktoberfest 2026 Open-Source AI Challenge, Week 1: Touch Grass&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://khoj-37vp.onrender.com/" rel="nofollow noopener noreferrer"&gt;Live Demo&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://github.com/Shanaya31/Khoj" rel="noopener noreferrer"&gt;Source Code&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Khoj doesn't tell you where to go. It gives you reasons to look around.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#see-khoj-in-action" rel="noopener noreferrer"&gt;See Khoj in Action&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#how-it-works" rel="noopener noreferrer"&gt;How It Works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#offline-first-design" rel="noopener noreferrer"&gt;Offline-First Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#ai-and-fallback-behavior" rel="noopener noreferrer"&gt;AI and Fallback Behavior&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#run-locally" rel="noopener noreferrer"&gt;Run Locally&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#technical-architecture" rel="noopener noreferrer"&gt;Technical Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#api-reference" rel="noopener noreferrer"&gt;API Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#current-limitations" rel="noopener noreferrer"&gt;Current Limitations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#contributing" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;See Khoj in Action&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The following screenshots show the application and its exploration experience.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot.png" alt="Khoj application"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot%20%281%29.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot%2520%25281%2529.png" alt="Khoj exploration screen"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot%20%282%29.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot%2520%25282%2529.png" alt="Khoj mission experience"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot%20%283%29.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot%2520%25283%2529.png" alt="Khoj exploration interface"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot%20%284%29.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot%2520%25284%2529.png" alt="Khoj mission in progress"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot%20%285%29.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot%2520%25285%2529.png" alt="Khoj observation experience"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot%20%286%29.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot%2520%25286%2529.png" alt="Khoj field journal"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot%20%287%29.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot%2520%25287%2529.png" alt="Khoj offline experience"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How It Works&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Choose:&lt;/strong&gt; Select an exploration duration and an interest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discover:&lt;/strong&gt; Receive a mission with prompts that encourage curiosity about your surroundings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explore:&lt;/strong&gt; Head outside and record observations and notes.&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Shanaya31/Khoj" 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;The project uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python and FastAPI&lt;/strong&gt; for the backend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React, Vite and Tailwind CSS&lt;/strong&gt; for the frontend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite&lt;/strong&gt; for data storage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama with Gemma 3 (4B)&lt;/strong&gt; for locally running open-weight AI.&lt;/li&gt;
&lt;li&gt;Curated city information and validation mechanisms to keep generated missions grounded.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The local AI integration generates structured exploration missions. The backend validates the generated output and provides curated fallbacks when needed.&lt;/p&gt;

&lt;p&gt;The application also incorporates offline-first functionality, allowing users to preserve their exploration progress and journal entries without depending on continuous internet connectivity.&lt;/p&gt;

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

&lt;p&gt;For Khoj, open innovation is about ownership, accessibility and control.&lt;/p&gt;

&lt;p&gt;Using an open-weight model through Ollama means I can experiment with local inference rather than making a closed AI API the only way to power the application.&lt;/p&gt;

&lt;p&gt;It also gives me the flexibility to experiment with different models, control how prompts and outputs are handled, and keep local AI processing on the user's machine.&lt;/p&gt;

&lt;p&gt;The offline-first architecture complements this approach by allowing exploration and journaling to continue even when connectivity is unreliable.&lt;/p&gt;

&lt;p&gt;I particularly like that these ideas can work together: local AI experimentation, open-source software and an application that does not have to depend entirely on a hosted service.&lt;/p&gt;

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

&lt;p&gt;Sometimes we become so occupied with screens that we forget to notice the world around us.&lt;/p&gt;

&lt;p&gt;Khoj was built around a small idea: technology should occasionally encourage us to disconnect, explore, observe and reconnect with our surroundings.&lt;/p&gt;

&lt;p&gt;Not every meaningful discovery needs to come from a search engine. Sometimes, it starts with simply stepping outside.&lt;/p&gt;




&lt;p&gt;Thanks for checking out Khoj!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I Built SlothBank Using Gemma 3 and Mastra to Catch Unexpected Bills with AI 🦥</title>
      <dc:creator>Shanaya Carvalho</dc:creator>
      <pubDate>Mon, 26 Oct 2026 00:03:43 +0000</pubDate>
      <link>https://dev.to/shanaya_31/i-built-slothbank-using-gemma-3-and-mastra-to-catch-unexpected-bills-with-ai-5g02</link>
      <guid>https://dev.to/shanaya_31/i-built-slothbank-using-gemma-3-and-mastra-to-catch-unexpected-bills-with-ai-5g02</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;
  
  
  SlothBank: Let the AI Read the Bill. Let Code Check the Numbers. 🦥
&lt;/h1&gt;

&lt;p&gt;Bills are easy to ignore until something changes.&lt;/p&gt;

&lt;p&gt;A subscription becomes more expensive. An insurance premium increases. An internet bill arrives with a charge that looks slightly different from last month. Individually, these changes can seem small. Finding them means opening bills, comparing amounts, checking historical records, and deciding whether something deserves attention.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;SlothBank&lt;/strong&gt;, a local-first AI bill-monitoring project that helps make that process less tedious.&lt;/p&gt;

&lt;p&gt;The idea is simple: let AI handle the repetitive reading, let deterministic code check the numbers, and let a human make the final decision.&lt;/p&gt;

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

&lt;p&gt;SlothBank is an AI-assisted bill-monitoring prototype designed to help people review recurring bills, identify unusual changes, and prepare follow-up emails without handing the final decision over to an AI model.&lt;/p&gt;

&lt;p&gt;The workflow brings together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bill extraction:&lt;/strong&gt; Use an open-weight language model to extract structured information from bills.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation:&lt;/strong&gt; Check extracted data and financial relationships with deterministic code rather than trusting model output blindly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anomaly detection:&lt;/strong&gt; Compare bill amounts with historical expectations and flag unusual differences for review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forecasting:&lt;/strong&gt; Estimate upcoming expenses using a baseline forecasting approach.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human-reviewed follow-up:&lt;/strong&gt; Prepare draft emails that users can inspect and edit before sending.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard:&lt;/strong&gt; Bring the results together in one place so users can review their bills and potential anomalies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't to declare every unusual bill incorrect. A higher charge might reflect a legitimate price change, a new service, or a different billing period. SlothBank highlights what deserves a closer look; it doesn't automatically accuse a provider of making an error.&lt;/p&gt;

&lt;h3&gt;
  
  
  How the workflow fits together
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bills / Historical Records
          |
          v
  Gemma 3 4B via Ollama
          |
          v
  Structured Extraction
          |
          v
  Deterministic Validation
          |
          v
  Anomaly Detection + Forecasting
          |
          v
     Dashboard
          |
          v
  Human-Reviewed Email Drafts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Testing what the model actually gets right
&lt;/h3&gt;

&lt;p&gt;I didn't want to rely on a demo that merely looked convincing. I also evaluated extraction on a small set of 20 synthetic bills.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Single-shot run&lt;/th&gt;
&lt;th&gt;Validation-enabled run&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Merchant exact-match accuracy&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;85%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Billing-date accuracy&lt;/td&gt;
&lt;td&gt;95%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total-due accuracy&lt;/td&gt;
&lt;td&gt;95%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Line-item accuracy&lt;/td&gt;
&lt;td&gt;95%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All fields exactly correct&lt;/td&gt;
&lt;td&gt;80% (16/20)&lt;/td&gt;
&lt;td&gt;85% (17/20)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failed validations&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The all-field exact-match result increased by &lt;strong&gt;5 percentage points&lt;/strong&gt;, from 16 to 17 correctly extracted bills out of 20.&lt;/p&gt;

&lt;p&gt;These are preliminary results on a small synthetic dataset, not proof of production-level accuracy. Both runs averaged one attempt per bill, so I can't attribute the improvement to retries. The experiment does, however, reinforce why structured validation and evaluation matter when language models handle financial information.&lt;/p&gt;
&lt;h3&gt;
  
  
  An example of an anomaly
&lt;/h3&gt;

&lt;p&gt;In one synthetic example, Shellter Home Insurance was billed &lt;strong&gt;$171.56&lt;/strong&gt;, compared with an expected amount of &lt;strong&gt;$146.00&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Difference: $25.56&lt;/li&gt;
&lt;li&gt;Increase: approximately 17.5%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a useful signal to investigate, not proof that the bill is wrong. The user still needs to inspect the original bill and determine whether the difference is justified.&lt;/p&gt;
&lt;h3&gt;
  
  
  Being honest about forecasting
&lt;/h3&gt;

&lt;p&gt;SlothBank also experiments with forecasting upcoming expenses. In one small backtest with eight observations, the baseline model had a mean absolute error (MAE) of $13.52, while a naive last-value benchmark had an MAE of $8.01.&lt;/p&gt;

&lt;p&gt;The baseline did not outperform that simple benchmark. I am keeping that result visible rather than presenting forecasting as a solved problem. A meaningful next step is to improve the evaluation, compare suitable models, and establish when a more complex approach is actually worthwhile.&lt;/p&gt;
&lt;h2&gt;
  
  
  SlothBank in Action
&lt;/h2&gt;

&lt;p&gt;The extraction evaluation below uses a separate fixed set of 20 synthetic bills; the bill count shown in the live dashboard reflects its current demo dataset.&lt;/p&gt;
&lt;h3&gt;
  
  
  Dashboard Overview
&lt;/h3&gt;

&lt;p&gt;The dashboard brings spending history, merchant-level forecasts, and a concise summary into one place.&lt;/p&gt;

&lt;p&gt;![SlothBank dashboard overview]&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://raw.githubusercontent.com/Shanaya31/slothbank/main/evidence/Dashboard.png" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;raw.githubusercontent.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;h3&gt;
  
  
  Anomaly Review
&lt;/h3&gt;

&lt;p&gt;Unusual amounts are highlighted for investigation. An anomaly is a signal to review the bill, not proof that the provider made a mistake.&lt;/p&gt;

&lt;p&gt;![SlothBank anomaly review]&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://raw.githubusercontent.com/Shanaya31/slothbank/main/evidence/Dashboard_Anomaly_Review.png" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;raw.githubusercontent.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Expense Forecasting
&lt;/h3&gt;

&lt;p&gt;Merchant-level estimates help users understand expected upcoming expenses. These forecasts are experimental and should be interpreted alongside their evaluation results.&lt;/p&gt;

&lt;p&gt;![SlothBank expense forecasting]&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://raw.githubusercontent.com/Shanaya31/slothbank/main/evidence/Forecasting.png" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;raw.githubusercontent.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://slothbank-demo.onrender.com/" rel="noopener noreferrer"&gt;SlothBank&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The deployed public demo presents synthetic example data in read-only mode. Audit execution is disabled in this mode, allowing visitors to explore the example output without triggering the local processing workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshots:&lt;/strong&gt; &lt;a href="https://github.com/Shanaya31/slothbank/tree/main/evidence" rel="noopener noreferrer"&gt;View the evidence folder on GitHub&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&gt; [Slothbank]&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/Shanaya31" rel="noopener noreferrer"&gt;
        Shanaya31
      &lt;/a&gt; / &lt;a href="https://github.com/Shanaya31/slothbank" rel="noopener noreferrer"&gt;
        slothbank
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A local-first AI bill monitoring prototype with cost forecasting, anomaly explanations, and human-reviewed email drafts.
    &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;SlothBank — Slow and Steady&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;SlothBank is a local-first bill-monitoring prototype that tracks spending, estimates future costs, flags unusual bills, explains line-item changes, and drafts emails for human review.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Demo-data notice:&lt;/strong&gt; Included bills and ground truth are synthetic. Forecasts and anomaly flags are estimates, not proof of overcharging. Draft emails are never sent automatically.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Screenshots&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;These screenshots show the local dashboard using the project's synthetic sample data.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Anomaly review&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/slothbank/evidence/dashboard-anomaly-review.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%2FShanaya31%2Fslothbank%2FHEAD%2Fevidence%2Fdashboard-anomaly-review.png" alt="SlothBank anomaly review dashboard"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Forecasts and spending history&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/slothbank/evidence/dashboard-forecasts.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%2FShanaya31%2Fslothbank%2FHEAD%2Fevidence%2Fdashboard-forecasts.png" alt="SlothBank forecast dashboard"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Bills enter the local processing workflow.&lt;/li&gt;
&lt;li&gt;Mastra orchestrates bill processing and weekly audits.&lt;/li&gt;
&lt;li&gt;A forecasting engine estimates costs and checks for unusual bills.&lt;/li&gt;
&lt;li&gt;Explanations, email drafts, and a deterministic digest are generated.&lt;/li&gt;
&lt;li&gt;The local interface displays the latest report.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The project supports a baseline forecaster and a TabPFN integration. Real model behavior depends on local configuration and dependencies.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Requirements&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Node.js compatible with the installed dependencies. The current dependency set calls for Node.js 22.22.0 or…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Shanaya31/slothbank" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The repository contains the project implementation, including the application server, dashboard, local processing workflow, and supporting evaluation work.&lt;/p&gt;

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

&lt;p&gt;SlothBank combines open-weight AI with conventional software components. Each part has a specific responsibility.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 4B:&lt;/strong&gt; The open-weight language model used for bill-information extraction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama:&lt;/strong&gt; Runs the model locally, avoiding a mandatory external model-inference API for the local workflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mastra:&lt;/strong&gt; Supports the AI workflow and orchestration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript and Node.js:&lt;/strong&gt; Power the application server and connect the components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python:&lt;/strong&gt; Supports the forecasting and data-processing work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON:&lt;/strong&gt; Stores structured reports and makes the results available to the dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render:&lt;/strong&gt; Hosts the public, read-only demo using synthetic example data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The local application and hosted demo have different responsibilities. The local workflow can use local processing and reports, while the hosted demo is designed to present a fixed synthetic example without exposing personal bills or enabling audit execution.&lt;/p&gt;

&lt;p&gt;I deliberately kept the public demo read-only. A public URL should make it easier to understand the project, not quietly turn a prototype into a service that processes visitors' financial documents.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why combine AI with deterministic code?
&lt;/h3&gt;

&lt;p&gt;Language models are useful for interpreting semi-structured documents, but plausible output isn't necessarily correct output.&lt;/p&gt;

&lt;p&gt;A model can extract the wrong amount, miss a field, or misinterpret a line item. SlothBank therefore separates extraction from validation: the model helps interpret the document, while code checks structured values and flags issues for review.&lt;/p&gt;

&lt;p&gt;This separation is important in financial workflows, where an answer that sounds confident can still be wrong.&lt;/p&gt;

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

&lt;p&gt;Financial documents—utility bills, insurance statements, and subscription invoices—can reveal a lot about a person's life. They contain amounts, billing histories, service details, and sometimes sensitive account information. I wanted to explore how AI could make reviewing these documents easier without making a third-party commercial model API a requirement for the local workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open innovation gave me the flexibility to build around that idea.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More control over privacy:&lt;/strong&gt; SlothBank uses Google's open-weight Gemma 3 4B model through Ollama for local inference. In the local workflow, documents can be processed on the user's own machine rather than automatically being sent to a hosted model API. That offers greater control over sensitive data, although privacy still depends on how the entire application handles files, logs, and storage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fewer dependencies on per-token API pricing:&lt;/strong&gt; Running an open-weight model locally can avoid per-request inference charges from a commercial model provider. It isn't entirely cost-free—hardware, electricity, and maintenance still matter—but it makes experimentation and repeated local testing more accessible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freedom to inspect, evaluate, and improve:&lt;/strong&gt; With Gemma 3, Mastra, and the surrounding application code, I could experiment with structured extraction, add deterministic validation, and measure the results instead of simply trusting a model's output. My small synthetic-bill evaluation also showed why this matters: a model's output needs to be checked, not just accepted because it looks plausible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A practical path to sharing the project:&lt;/strong&gt; Render provides a way to make a public demo accessible without asking everyone to set up the entire development environment. SlothBank's hosted demo uses synthetic example data and read-only interactions, keeping it separate from the local bill-processing workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For me, open innovation isn't just about using an open-weight model. It's about having the freedom to experiment, understand limitations, evaluate results, and design the safeguards around the technology.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The principle behind SlothBank is simple: let AI handle the repetitive work, let code check the numbers, and keep people in control of financial decisions.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;The hoped-for payoff is straightforward: less repetitive bill reading, less manual comparison, and an easier way to identify which charges deserve attention.&lt;/p&gt;

&lt;p&gt;SlothBank brings extraction, historical comparison, anomaly flags, forecasting, and email drafting into one workflow. Instead of starting every review from scratch, a user can begin with a structured summary and investigate the exceptions.&lt;/p&gt;

&lt;p&gt;I haven't measured real-world time savings yet, so I won't claim a specific number of minutes saved. The current work demonstrates the workflow and its early evaluation results; measuring time saved against a manual review process is a valuable next step.&lt;/p&gt;

&lt;p&gt;The principle is &lt;strong&gt;automate the tedious parts, keep the important decisions human&lt;/strong&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — SlothBank uses Google's open-weight Gemma 3 4B model through Ollama for local bill-information extraction, supported by structured validation and evaluation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Mastra&lt;/strong&gt; — Mastra is part of the AI workflow used to connect the model-assisted processing with the wider application.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt; — SlothBank has a deployed public demo that presents synthetic example data in read-only mode. The local bill-processing workflow remains separate from the hosted demo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;SlothBank is a prototype, and there is more work to do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evaluate extraction against a larger and more diverse set of bills.&lt;/li&gt;
&lt;li&gt;Improve source-level traceability so a user can connect extracted fields to the relevant region of the original document.&lt;/li&gt;
&lt;li&gt;Compare forecasting models against appropriate simple baselines.&lt;/li&gt;
&lt;li&gt;Test anomaly detection on legitimate price changes as well as unusual charges.&lt;/li&gt;
&lt;li&gt;Improve the public demo while keeping it synthetic and read-only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most important lesson so far is that useful AI isn't just about getting a model to produce an answer. It's about checking that answer, measuring its limitations, and designing the workflow so a person can make an informed decision.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and happy Hacktoberfest! 🦥&lt;/p&gt;

&lt;h1&gt;
  
  
  devchallenge #hf26challenge
&lt;/h1&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I Built InvoiceLens for a Friend’s Handmade Tote Bag &amp; T-Shirt Business Using AI</title>
      <dc:creator>Shanaya Carvalho</dc:creator>
      <pubDate>Sat, 24 Oct 2026 20:07:09 +0000</pubDate>
      <link>https://dev.to/shanaya_31/i-built-invoicelens-for-a-friends-handmade-tote-bag-t-shirt-business-using-ai-32h</link>
      <guid>https://dev.to/shanaya_31/i-built-invoicelens-for-a-friends-handmade-tote-bag-t-shirt-business-using-ai-32h</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;Sometimes, the best project ideas don't come from brainstorming sessions or trying to use the latest technology. They come from noticing a problem someone close to you deals with every day.&lt;/p&gt;

&lt;p&gt;For this challenge, I built &lt;strong&gt;InvoiceLens&lt;/strong&gt; for a friend who runs a small online business selling handmade tote bags and custom-printed T-shirts.&lt;/p&gt;

&lt;p&gt;Running a small business means juggling a lot of things at once: managing orders, keeping track of expenses, handling suppliers, and making sure the paperwork doesn't pile up. Invoices and receipts are part of that work, but manually reviewing them and entering their details into spreadsheets can be tedious, especially when you're already busy running the business.&lt;/p&gt;

&lt;p&gt;I wanted to explore whether AI could make that process a little easier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;InvoiceLens is an invoice and receipt assistant designed to extract key information from documents and make it easier to review and organize the results.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project focuses on extracting details such as vendor information, invoice numbers, dates, subtotals, taxes, and totals. It also includes validation checks to flag arithmetic inconsistencies and allows extracted records to be reviewed and edited before being exported to CSV.&lt;/p&gt;

&lt;p&gt;One thing I wanted to get right was that AI output shouldn't automatically be treated as correct. A model might read an invoice incorrectly, misinterpret a tax amount, or return an inconsistent total. InvoiceLens separates extraction from validation so that potential problems can be flagged for human review rather than silently accepted.&lt;/p&gt;

&lt;p&gt;I built this as a prototype inspired by my friend's business needs, with the goal of exploring a more manageable invoice workflow for small businesses.&lt;/p&gt;

&lt;p&gt;This project reminded me that building for someone means thinking beyond whether the code works. It also means understanding the person's workflow, the mistakes that matter, and where automation should leave room for human judgment.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://invoicelens-web.onrender.com/" rel="noopener noreferrer"&gt;Try InvoiceLens&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A note about the demo:&lt;/strong&gt; The hosted version currently uses mock extraction, so it does not run the Gemma model on uploaded documents. The local version integrates Gemma 3 4B through Ollama for local inference. The hosted demo is useful for exploring the interface and workflow, but its output should not be interpreted as actual AI extraction from your uploaded invoice.&lt;/p&gt;

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

&lt;p&gt;The project is open source!&lt;/p&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/Shanaya31" rel="noopener noreferrer"&gt;
        Shanaya31
      &lt;/a&gt; / &lt;a href="https://github.com/Shanaya31/InvoiceLens" rel="noopener noreferrer"&gt;
        InvoiceLens
      &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;InvoiceLens&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Your invoices stay yours.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A local-first assistant that turns invoice and receipt images and PDFs into structured, editable
records with validation warnings and a reviewed CSV export. Built for Indian freelancers, small
businesses and small CA practices. Extraction runs on your own machine with an open-weight model
(Gemma 3 4B through Ollama), with Tesseract OCR as a fallback.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Status: working scaffold.&lt;/strong&gt; The full pipeline runs end to end and is covered by automated tests
that use a fake model. It has &lt;strong&gt;not&lt;/strong&gt; yet been measured against real model output; no accuracy
claim is made anywhere in this repository. See &lt;a href="https://github.com/Shanaya31/InvoiceLens#evaluation" rel="noopener noreferrer"&gt;Evaluation&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&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;
&lt;strong&gt;Upload&lt;/strong&gt; JPG, PNG or PDF files (10 MB each, PDFs up to 5 pages).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract&lt;/strong&gt; vendor, GSTIN, invoice number, date, subtotal, discount, CGST/SGST/IGST and total
with Gemma vision. If the answer is unusable, run Tesseract and retry the model &lt;strong&gt;once&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate&lt;/strong&gt; in Python (never…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Shanaya31/InvoiceLens" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Feel free to explore the implementation, suggest improvements, or build on the idea.&lt;/p&gt;

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

&lt;p&gt;InvoiceLens combines an AI extraction workflow with a separate validation and review process.&lt;/p&gt;

&lt;p&gt;The main technologies I used were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 4B via Ollama:&lt;/strong&gt; An open-weight model used in the local version for invoice and receipt extraction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI:&lt;/strong&gt; The Python backend for handling document-processing requests and application logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React, Vite, and JavaScript:&lt;/strong&gt; The frontend for uploading documents, reviewing extracted fields, and working with records.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python validation logic:&lt;/strong&gt; Deterministic checks that compare extracted numerical values and flag inconsistencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSV export:&lt;/strong&gt; Allows reviewed information to be moved into a spreadsheet-based workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the most useful lessons from building InvoiceLens was understanding the difference between extracting information and verifying it.&lt;/p&gt;

&lt;p&gt;During testing with a synthetic invoice, the model correctly identified the subtotal and individual tax amounts but reported the total tax as ₹11,800 instead of ₹1,800. Rather than trusting the model's output, the validation logic flagged the inconsistency.&lt;/p&gt;

&lt;p&gt;That example reinforced an important design principle for me: &lt;strong&gt;AI should assist with repetitive work, but it shouldn't remove the user's ability to question, correct, and verify the result.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;InvoiceLens is still a prototype. Model extraction can be inaccurate, the validation rules cannot detect every possible mistake, and the current hosted demo does not perform real model inference. It isn't a replacement for accounting software or professional tax review.&lt;/p&gt;

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

&lt;p&gt;Open innovation made it possible for me to experiment with a local, open-weight model rather than building the entire project around a proprietary AI API.&lt;/p&gt;

&lt;p&gt;Using Gemma 3 4B through Ollama gave me a way to explore local inference, inspect the model's behavior, and build the surrounding validation logic myself. It also gave me more control over how the local processing workflow is configured.&lt;/p&gt;

&lt;p&gt;For a tool intended to handle financial documents, the ability to explore local processing is particularly interesting. It creates an opportunity to design workflows in which documents can be processed on a user's own machine instead of automatically sending them to a remote model provider.&lt;/p&gt;

&lt;p&gt;Of course, using an open-weight model alone doesn't guarantee privacy, accuracy, or security. Those still depend on how the application is built and deployed.&lt;/p&gt;

&lt;p&gt;For me, open innovation means being able to experiment, understand the limitations, and adapt technology to a real problem without being locked into one provider's ecosystem.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — if this category is available for this challenge.&lt;/p&gt;

&lt;p&gt;Gemma 3 4B is the core model explored in InvoiceLens's local extraction workflow. The project combines it with deterministic validation and human review to investigate how an open-weight model can support a practical small-business task.&lt;/p&gt;




&lt;p&gt;Building InvoiceLens was a reminder that a meaningful project doesn't have to begin with a huge idea. Sometimes, it starts with a small problem faced by someone you know and a question: &lt;em&gt;Can I build something that might make this a little easier?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's what I set out to explore with InvoiceLens. 💚&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>InvoiceLens: A Local AI Assistant for Invoices That Knows When to Ask for Human Review</title>
      <dc:creator>Shanaya Carvalho</dc:creator>
      <pubDate>Mon, 19 Oct 2026 04:19:40 +0000</pubDate>
      <link>https://dev.to/shanaya_31/invoicelens-a-local-ai-assistant-for-invoices-that-knows-when-to-ask-for-human-review-302d</link>
      <guid>https://dev.to/shanaya_31/invoicelens-a-local-ai-assistant-for-invoices-that-knows-when-to-ask-for-human-review-302d</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;Freelancers and small businesses deal with a surprisingly tedious task: turning invoices and receipts into structured records without manually typing every field into a spreadsheet.&lt;/p&gt;

&lt;p&gt;InvoiceLens is a local-AI invoice and receipt assistant built to make that workflow easier. Upload an invoice or receipt, extract the important fields, review the results, correct anything that looks wrong, and export the records to CSV.&lt;/p&gt;

&lt;p&gt;It is specially designed for freelancers, independent bookkeepers, and small businesses that want to reduce repetitive data entry without sending financial documents to a third-party AI inference API.&lt;/p&gt;

&lt;p&gt;InvoiceLens can extract fields such as vendor details, invoice number, date, subtotal, tax amounts, and total. It also runs validation checks and flags suspicious results for human review. Records can be edited before being marked as reviewed.&lt;/p&gt;

&lt;p&gt;Human-in-the-loop verification: Tax identifiers such as GSTIN should be checked against the original invoice before records are relied upon. When a GSTIN is missing or uncertain, the user can review and complete the field manually rather than treating an incomplete extraction as verified.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The important design decision: an AI-generated value is not automatically a trustworthy value.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;During a local test with a synthetic invoice, Gemma correctly read the subtotal and individual tax amounts but incorrectly reported the total tax as ₹11,800 instead of ₹1,800. InvoiceLens flagged both the tax-total mismatch and the invoice-total mismatch. It did not silently correct the model or pretend the result was accurate.&lt;/p&gt;

&lt;p&gt;That is the kind of failure an invoice workflow needs to make visible.&lt;/p&gt;

&lt;p&gt;The potential business model is a lightweight tool for freelancers and small accounting practices: save time on repetitive entry while keeping a person in control of financial records. I have not yet validated willingness to pay with a real customer, so this is a target use case rather than a proven business. &lt;/p&gt;

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

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

&lt;p&gt;The walkthrough demonstrates the invoice-processing workflow, including extracted fields, validation warnings, manual review, and CSV export.&lt;/p&gt;

&lt;p&gt;Hosted demo limitation: The public Render version uses mock extraction and returns synthetic invoice data; it does not run Gemma. The local version integrates Gemma 3 4B through Ollama for on-device inference.&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/Shanaya31" rel="noopener noreferrer"&gt;
        Shanaya31
      &lt;/a&gt; / &lt;a href="https://github.com/Shanaya31/InvoiceLens" rel="noopener noreferrer"&gt;
        InvoiceLens
      &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;InvoiceLens&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Your invoices stay yours.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A local-first assistant that turns invoice and receipt images and PDFs into structured, editable
records with validation warnings and a reviewed CSV export. Built for Indian freelancers, small
businesses and small CA practices. Extraction runs on your own machine with an open-weight model
(Gemma 3 4B through Ollama), with Tesseract OCR as a fallback.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Status: working scaffold.&lt;/strong&gt; The full pipeline runs end to end and is covered by automated tests
that use a fake model. It has &lt;strong&gt;not&lt;/strong&gt; yet been measured against real model output; no accuracy
claim is made anywhere in this repository. See &lt;a href="https://github.com/Shanaya31/InvoiceLens#evaluation" rel="noopener noreferrer"&gt;Evaluation&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&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;
&lt;strong&gt;Upload&lt;/strong&gt; JPG, PNG or PDF files (10 MB each, PDFs up to 5 pages).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract&lt;/strong&gt; vendor, GSTIN, invoice number, date, subtotal, discount, CGST/SGST/IGST and total
with Gemma vision. If the answer is unusable, run Tesseract and retry the model &lt;strong&gt;once&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate&lt;/strong&gt; in Python (never…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Shanaya31/InvoiceLens" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The project includes a React/Vite frontend, a FastAPI backend, local model integration, extraction and validation logic, CSV export, and automated tests.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 4B through Ollama:&lt;/strong&gt; the local vision model used to extract structured fields from invoice images.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI:&lt;/strong&gt; the backend API for document processing, record management, validation, and export.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React, Vite, and JavaScript:&lt;/strong&gt; the interface for uploading documents, reviewing extracted fields, and editing records.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python validation logic:&lt;/strong&gt; arithmetic checks and review flags that operate independently of the model's claims.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSV export:&lt;/strong&gt; a practical bridge between the tool and the spreadsheets freelancers and bookkeepers already use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session-scoped records:&lt;/strong&gt; requests are separated by session identifier, with records held in memory rather than a persistent database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I tested the extraction workflow using synthetic invoice data and verified document uploads, record listing, manual review, CSV export, and separation between two session identifiers. The backend test suite and frontend production build also passed.&lt;/p&gt;

&lt;p&gt;There are limitations. Model extraction can be wrong, and validation checks cannot catch every semantic error. Records are lost when the server restarts. OCR fallback is optional and was not available in my local environment because Tesseract was not installed. InvoiceLens is a working prototype, not accounting software or a guarantee of tax compliance. Extracted values still need to be checked against the source document.&lt;/p&gt;

&lt;h3&gt;
  
  
  Engineering for trust, not just extraction
&lt;/h3&gt;

&lt;p&gt;InvoiceLens separates model-generated values from deterministic validation. The model proposes structured invoice fields; independent checks compare arithmetic relationships and flag inconsistencies for human review. Users can correct extracted values before marking records as reviewed.&lt;/p&gt;

&lt;p&gt;The backend also separates records by session identifier and applies in-memory limits. This is a prototype-level isolation mechanism, not user authentication or a complete multi-tenant security system.&lt;/p&gt;

&lt;p&gt;These design choices reflect the core goal of InvoiceLens: make AI-assisted data entry useful without assuming that AI-generated financial data is correct.&lt;/p&gt;

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

&lt;p&gt;Invoice data can contain names, addresses, tax identifiers, transaction amounts, and other sensitive business information. Sending every document to a hosted AI API introduces a third party into that workflow.&lt;/p&gt;

&lt;p&gt;With an open-weight model running locally through Ollama, InvoiceLens can perform inference on the user's machine without requiring a paid, remote model API for the core extraction step. That gives the user more control over where document contents go and makes experimentation possible without a per-request inference bill.&lt;/p&gt;

&lt;p&gt;Open tooling also makes the system easier to inspect and change. The extraction logic, validation rules, prompts, and review workflow can be modified for different invoice formats or business needs. The model is replaceable, and the validation layer can be tested independently.&lt;/p&gt;

&lt;p&gt;Local inference is not magic: it still needs compatible hardware, and model errors remain possible. That's why the project combines local extraction with explicit validation and human review rather than treating a fluent model response as ground truth.&lt;/p&gt;

&lt;p&gt;For a small side hustle, the goal is simple: make repetitive work less tedious without making private data or blind trust in AI the price of convenience.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma — Gemma 3 4B is used as the core local vision model for invoice extraction.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>hacktoberfest</category>
      <category>ai</category>
    </item>
    <item>
      <title>Khoj: Step Outside With a Question, Come Back With a Story</title>
      <dc:creator>Shanaya Carvalho</dc:creator>
      <pubDate>Mon, 12 Oct 2026 01:36:15 +0000</pubDate>
      <link>https://dev.to/shanaya_31/khoj-step-outside-with-a-question-come-back-with-a-story-n5n</link>
      <guid>https://dev.to/shanaya_31/khoj-step-outside-with-a-question-come-back-with-a-story-n5n</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;
  
  
  Khoj (खोज) — Don't Follow the Map. Follow Your Curiosity.
&lt;/h2&gt;

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

&lt;p&gt;&lt;strong&gt;What if your phone gave you a reason to explore your city instead of another reason to stare at a screen?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We pass the same streets, buildings, markets, and waterfronts every day. We use maps to get from one place to another, but how often do we stop to notice the world around us?&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Khoj (खोज, "search" or "discovery")&lt;/strong&gt;, an open-source, offline-first AI exploration companion that turns a walk around your city into a curiosity-driven adventure.&lt;/p&gt;

&lt;p&gt;Starting with Mumbai, Khoj encourages people to step outside, observe their surroundings, and discover something new through short, guided exploration missions. Instead of simply telling you where to go, it gives you a reason to pay attention once you get there.&lt;/p&gt;

&lt;p&gt;With Khoj, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧭 Choose an exploration duration and area of interest.&lt;/li&gt;
&lt;li&gt;🌿 Get a curiosity-driven mission grounded in a curated Mumbai city knowledge pack.&lt;/li&gt;
&lt;li&gt;👀 Explore the real world and record your own observations, notes, and discoveries.&lt;/li&gt;
&lt;li&gt;📓 Turn those observations into a personal field journal.&lt;/li&gt;
&lt;li&gt;📶 Keep using the cached app when connectivity is unreliable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The idea is simple: &lt;strong&gt;the phone gives you a question. The city gives you the answer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal isn't to keep people chatting with an AI. It's to use AI to give them a reason to leave the screen.&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%2F32er4mom32p1vys9qhg7.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%2F32er4mom32p1vys9qhg7.png" alt="Home Page" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How a Khoj Exploration Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Start with curiosity
&lt;/h3&gt;

&lt;p&gt;Choose an area of Mumbai and decide how much time you want to spend exploring. The experience is built around a manageable mission rather than a rigid itinerary.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Receive a mission
&lt;/h3&gt;

&lt;p&gt;Khoj uses curated city knowledge to generate or select a mission that encourages you to notice something about your surroundings. The aim is to make an ordinary walk feel like an opportunity for discovery.&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%2Fy90oqmcq82gh3x5g15ct.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%2Fy90oqmcq82gh3x5g15ct.png" alt="Mission" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Look up from the screen
&lt;/h3&gt;

&lt;p&gt;This is the most important part. Put the phone away, look around, and pay attention to details you might otherwise miss. When something catches your attention, record it in Khoj.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Keep what you discovered
&lt;/h3&gt;

&lt;p&gt;Your observations become the foundation for a personal field journal. Khoj turns what you've recorded into a reflection without presenting unobserved details as facts about your experience.&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%2F60sw85795fj8hhlmu456.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%2F60sw85795fj8hhlmu456.png" alt="Observations" width="800" height="450"&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%2Fa44jd9h64j5031z8wgt0.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%2Fa44jd9h64j5031z8wgt0.png" alt="Observations" width="800" height="450"&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%2Fxm33ari5clm98udocove.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%2Fxm33ari5clm98udocove.png" alt="Observations" width="800" height="450"&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%2F7lgwciywax4dvj0fu93g.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%2F7lgwciywax4dvj0fu93g.png" alt="Observations" width="800" height="450"&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%2Fb8ht4fiq525go7g9d7f1.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%2Fb8ht4fiq525go7g9d7f1.png" alt="Observations" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The mission provides direction. You provide the curiosity.&lt;/p&gt;

&lt;h3&gt;
  
  
  A mission, start to finish
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Mission:&lt;/strong&gt; [paste a real mission Khoj gave you]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I noticed:&lt;/strong&gt; [2–3 real observations from your walk]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Journal entry:&lt;/strong&gt; [an excerpt of the journal Khoj produced from those observations]&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;[One line on what the video shows, e.g. "A local Gemma-generated mission, the validation step, an observation, and the journal."]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://khoj-37vp.onrender.com/" rel="noopener noreferrer"&gt;Try Khoj on Render&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&gt; [Shanaya31/Khoj]&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/Shanaya31" rel="noopener noreferrer"&gt;
        Shanaya31
      &lt;/a&gt; / &lt;a href="https://github.com/Shanaya31/Khoj" rel="noopener noreferrer"&gt;
        Khoj
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Open-source, offline-first AI exploration companion that turns city walks into curiosity-driven missions and a personal field journal.
    &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;Khoj (खोज)&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Don't follow the map. Follow your curiosity.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Khoj&lt;/strong&gt; is an open-source, offline-first AI exploration companion for discovering the city around you. Starting with Mumbai, it offers curiosity-driven missions, lets you record what you notice, and helps you turn those observations into a personal field journal.&lt;/p&gt;
&lt;p&gt;Built for the &lt;strong&gt;Hacktoberfest 2026 Open-Source AI Challenge, Week 1: Touch Grass&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://khoj-37vp.onrender.com/" rel="nofollow noopener noreferrer"&gt;Live Demo&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://github.com/Shanaya31/Khoj" rel="noopener noreferrer"&gt;Source Code&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Khoj doesn't tell you where to go. It gives you reasons to look around.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#see-khoj-in-action" rel="noopener noreferrer"&gt;See Khoj in Action&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#how-it-works" rel="noopener noreferrer"&gt;How It Works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#offline-first-design" rel="noopener noreferrer"&gt;Offline-First Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#ai-and-fallback-behavior" rel="noopener noreferrer"&gt;AI and Fallback Behavior&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#run-locally" rel="noopener noreferrer"&gt;Run Locally&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#technical-architecture" rel="noopener noreferrer"&gt;Technical Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#api-reference" rel="noopener noreferrer"&gt;API Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#current-limitations" rel="noopener noreferrer"&gt;Current Limitations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#contributing" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shanaya31/Khoj#license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;See Khoj in Action&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The following screenshots show the application and its exploration experience.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot.png" alt="Khoj application"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot%20%281%29.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot%2520%25281%2529.png" alt="Khoj exploration screen"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot%20%282%29.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot%2520%25282%2529.png" alt="Khoj mission experience"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot%20%283%29.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot%2520%25283%2529.png" alt="Khoj exploration interface"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot%20%284%29.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot%2520%25284%2529.png" alt="Khoj mission in progress"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot%20%285%29.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot%2520%25285%2529.png" alt="Khoj observation experience"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot%20%286%29.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot%2520%25286%2529.png" alt="Khoj field journal"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Shanaya31/Khoj/Screenshots/Screenshot%20%287%29.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%2FShanaya31%2FKhoj%2FHEAD%2FScreenshots%2FScreenshot%2520%25287%2529.png" alt="Khoj offline experience"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How It Works&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Choose:&lt;/strong&gt; Select an exploration duration and an interest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discover:&lt;/strong&gt; Receive a mission with prompts that encourage curiosity about your surroundings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explore:&lt;/strong&gt; Head outside and record observations and notes.&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Shanaya31/Khoj" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;An important distinction:&lt;/strong&gt; The hosted demo does not run Gemma inference. It uses the curated fallback experience. Local Gemma inference is supported when running Khoj with Ollama configured, and the video above shows it.&lt;/p&gt;

&lt;p&gt;I tested Khoj's offline behaviour using Chrome DevTools' Offline network setting. After the application had been cached, I could refresh the page and still access the field journal, including the observation saved on the device.&lt;/p&gt;

&lt;p&gt;The screenshot below shows the application remaining accessible while the browser is offline. Some network requests fail as expected, but the cached interface and locally saved observation remain visible.&lt;/p&gt;

&lt;p&gt;![Khoj working offline in Chrome DevTools]&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%2F3387cb9fmsa9sr2ll6mb.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%2F3387cb9fmsa9sr2ll6mb.png" alt="Offline Working" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
For the best offline experience, open the app while online first so its app shell and required assets can be cached. Locally saved observations are stored on the device and are not automatically synced to the server.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;I built Khoj around a simple principle: &lt;strong&gt;AI should help people engage with the real world, not give them another reason to stay online.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;USER: Choose duration + area of interest
                  |
                  v
+-------------------------------------------+
| React + Vite + Tailwind                   |
| Service worker: cache app shell/assets    |
| Browser storage: session + observations   |
+----------------------+--------------------+
                       | API request
                       v
+-------------------------------------------+
| FastAPI Backend                           |
| Curated Mumbai city knowledge pack        |
| Mission prompt + grounding rules          |
+----------------------+--------------------+
                       |
                       v
+-------------------------------------------+
| Mission Generation                        |
|                                           |
| LOCAL: Gemma 3 4B via Ollama              |
| HOSTED: Curated fallback (Render)         |
+----------------------+--------------------+
                       |
                       v
+-------------------------------------------+
| Validation / Fallback                     |
| Check generated mission against rules     |
| Use curated mission when needed           |
+----------------------+--------------------+
                       |
                       v
+-------------------------------------------+
| Frontend displays mission                 |
|                                           |
| Field Journal                             |
| Observations saved in browser storage     |
| Reflection based on saved observations    |
| Cached app + local data available offline |
+-------------------------------------------+&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  A lightweight, open-source stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React, Vite, and Tailwind CSS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python and FastAPI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage:&lt;/strong&gt; SQLite and browser-side storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI:&lt;/strong&gt; Gemma 3 4B through Ollama for local inference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline support:&lt;/strong&gt; Service worker caching and locally available city data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; Docker and Render&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Grounding AI in a real city
&lt;/h3&gt;

&lt;p&gt;Generative AI can produce convincing text, but a convincing mission isn't useful if it sends someone to the wrong place.&lt;/p&gt;

&lt;p&gt;Khoj uses a curated Mumbai city knowledge pack to ground missions in known places and local context. Generated output is validated, and unsupported place or fact references are removed or handled through curated fallback behaviour. [Add one concrete example of what the validator catches, e.g. "a place name that isn't in the city pack."]&lt;/p&gt;

&lt;p&gt;I also refined the mission-generation prompts to reduce irrelevant locations and keep missions aligned with the selected area and duration. [Optional: add one before/after example.]&lt;/p&gt;

&lt;p&gt;The principle is straightforward: &lt;strong&gt;AI can help shape the experience, but it shouldn't invent the map.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Local Gemma, with a fallback path
&lt;/h3&gt;

&lt;p&gt;Khoj supports Gemma 3 4B through Ollama for local mission generation. The model receives city context to help generate relevant exploration missions.&lt;/p&gt;

&lt;p&gt;When generation is unavailable or produces unusable output, Khoj falls back to a curated mission, so the app still works. These are separate execution modes: local inference requires Ollama and the model to be available, while the hosted demo currently uses the fallback experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Offline-first exploration
&lt;/h3&gt;

&lt;p&gt;Connectivity isn't always reliable, especially when you're out exploring.&lt;/p&gt;

&lt;p&gt;Khoj uses service worker caching for the app shell and static assets, alongside browser-side persistence for the active exploration session and observations. I tested the cached experience by switching the browser offline and refreshing the application, so the essential exploration flow stays resilient when the network doesn't cooperate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reflections grounded in real observations
&lt;/h3&gt;

&lt;p&gt;An AI-generated journal can sound polished while quietly adding things a user never experienced. For an exploration companion, that defeats the purpose.&lt;/p&gt;

&lt;p&gt;Khoj's reflection flow is designed to use the observations a person has saved as its source of truth. The intention is to help users reflect on what they noticed, rather than inventing a more interesting story on their behalf.&lt;/p&gt;

&lt;p&gt;During development, I tested the backend, frontend build, and automated tests, and refined the generation and validation logic to improve reliability.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No mandatory hosted API.&lt;/strong&gt; Running the open-weight Gemma model through Ollama means mission generation doesn't have to depend on a paid, remote service. That matters for a project meant to work wherever you are.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything can be inspected.&lt;/strong&gt; Because the whole stack is open, I could see and change how missions are generated, why one is accepted or rejected, and how data is stored. That made it possible to tighten grounding when the model invented details.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilience.&lt;/strong&gt; Cached data and curated fallback missions keep the experience useful when generation or connectivity isn't available.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A city is just data.&lt;/strong&gt; A knowledge pack is separate from the model, so anyone can add their own city without retraining anything. A longer-term direction is a community-built collection of city packs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For me, open innovation isn't only about making the code available. It's about giving people the freedom to understand, adapt, and build on the ideas behind a project.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;The hosted demo runs in curated-fallback mode; Gemma needs a machine with Ollama, so the AI part currently lives on a laptop, not a phone.&lt;/li&gt;
&lt;li&gt;Only Mumbai is supported right now.&lt;/li&gt;
&lt;li&gt;Observations are saved on the device and are not synced.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Building Khoj reinforced a lesson about AI products: generating text is easy compared with generating something genuinely useful.&lt;/p&gt;

&lt;p&gt;The difficult parts include keeping missions grounded in real geography, making short explorations realistic, handling model failures, preserving observations, and making sure reflections don't claim more than users actually recorded. Those constraints shape whether the product deserves the user's trust.&lt;/p&gt;

&lt;p&gt;For Khoj, a smaller, grounded mission is better than an impressive-sounding one that sends someone to the wrong neighbourhood.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Overall Winner:&lt;/strong&gt; Turns city exploration into curiosity-driven missions, with an offline-first design that sends people out of the app and into the city.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma 3 4B through Ollama generates missions locally, with curated Mumbai data, grounding rules, validation, and fallback keeping them tied to real places.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render:&lt;/strong&gt; The live demo is deployed on Render (running curated fallback missions; local Gemma is supported through Ollama).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Khoj started with a simple question: can AI help us pay more attention to the world instead of keeping us glued to a screen?&lt;/p&gt;

&lt;p&gt;I built it as a small step toward making everyday exploration more intentional: one area, one mission, and one observation at a time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Khoj isn't about seeing more of your phone. It's about seeing more of your city.&lt;/strong&gt; 🌿🏙️&lt;/p&gt;

&lt;p&gt;What's something in your city you walk past every day and have never really looked at?&lt;/p&gt;

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