<?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: Mahasvan Mohan</title>
    <description>The latest articles on DEV Community by Mahasvan Mohan (@mahasvan).</description>
    <link>https://dev.to/mahasvan</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%2F4164411%2F3dff6100-7980-478d-ac0d-301f7e35055d.png</url>
      <title>DEV Community: Mahasvan Mohan</title>
      <link>https://dev.to/mahasvan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mahasvan"/>
    <language>en</language>
    <item>
      <title>Hacktoberfest Week 4 - Excavate deleted files</title>
      <dc:creator>Mahasvan Mohan</dc:creator>
      <pubDate>Sat, 31 Oct 2026 04:29:06 +0000</pubDate>
      <link>https://dev.to/mahasvan/hacktoberfest-week-4-excavate-deleted-files-34a1</link>
      <guid>https://dev.to/mahasvan/hacktoberfest-week-4-excavate-deleted-files-34a1</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;Every long-lived repository has a graveyard hidden inside &lt;code&gt;.git/objects&lt;/code&gt;: thousands of lines of deleted functions, retired modules, and hard-won edge-case fixes that were swept away during a "clean v2 rewrite"—often taking the institutional memory of why they existed with them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;git-seance&lt;/code&gt;&lt;/strong&gt; is a zero-dependency, single-file Python CLI that bridges both halves of the &lt;em&gt;Ghost in the Machine&lt;/em&gt; theme:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Spooky Git Séance (Halloween):&lt;/strong&gt; Excavates deleted files and major code removals from Git history (&lt;code&gt;git log --diff-filter=D&lt;/code&gt; and historical diffs) and channels them through a local open-weight LLM (&lt;code&gt;llama3.2&lt;/code&gt;, &lt;code&gt;qwen2.5-coder&lt;/code&gt;, or &lt;code&gt;deepseek-r1&lt;/code&gt; via Ollama / &lt;code&gt;llama.cpp&lt;/code&gt;). The deleted code speaks from beyond the grave in first person—grounded in its actual deleted source code, commit epitaph, creation history, and deletion date—so you can ask it &lt;em&gt;why&lt;/em&gt; it was written and what production bug is about to happen now that it's gone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Code Ofrenda (&lt;code&gt;--ofrenda&lt;/code&gt;, Día de los Muertos):&lt;/strong&gt; Renders a marigold-and-candlelight terminal &lt;em&gt;Ofrenda de Código&lt;/em&gt; that honors departed modules and the original contributors who crafted them, complete with an AI-generated remembrance blessing.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Run &lt;code&gt;git-seance&lt;/code&gt; immediately on any machine with Python 3 and Git (includes a built-in &lt;code&gt;--haunt-demo&lt;/code&gt; mode that conjures a temporary haunted repository so you can test it in one command):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Build a Día de los Muertos Code Ofrenda&lt;/span&gt;
python3 git_seance.py &lt;span class="nt"&gt;--haunt-demo&lt;/span&gt; &lt;span class="nt"&gt;--ofrenda&lt;/span&gt;

&lt;span class="c"&gt;# 2. Hold an interactive séance with Spirit #2 (legacy_rate_shield.py)&lt;/span&gt;
python3 git_seance.py &lt;span class="nt"&gt;--haunt-demo&lt;/span&gt; &lt;span class="nt"&gt;--spirit&lt;/span&gt; 2

&lt;span class="c"&gt;# 3. Ask a deleted module a single question from the command line&lt;/span&gt;
python3 git_seance.py &lt;span class="nt"&gt;--haunt-demo&lt;/span&gt; &lt;span class="nt"&gt;--spirit&lt;/span&gt; 2 &lt;span class="nt"&gt;--ask&lt;/span&gt; &lt;span class="s2"&gt;"Why do our workers crash every midnight after you were deleted?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sample Terminal Output (&lt;code&gt;--haunt-demo --ofrenda&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  ✿ 🕯️  ═══════════════════════════════════════════════════════════ 🕯️  ✿
         OFRENDA DE CÓDIGO — HONORING THE CODE THAT CAME BEFORE
  ✿ 🕯️  ═══════════════════════════════════════════════════════════ 🕯️  ✿

  ✿ Marigolds laid for 2 departed modules (20 lines of ancestral logic)
  🕯️ Ancestral builders honored: Elena Vance, Mateo Cruz

  ┌─ 🕯️  Spirit #1: zombie_reaper.py (commit 71d038d)
  │  Crafted by : Mateo Cruz  |  Departed: 2025-11-02 (by Chad Dev)
  │  Epitaph    : "Remove zombie_reaper.py - cloud auto-heals right?" (10 lines lost)
  │  Relic      : def reap_orphan_sockets(active_pids: list[int]) -&amp;gt; int:
  └──────────────────────────────────────────────────────────────
  ┌─ 🕯️  Spirit #2: legacy_rate_shield.py (commit d5654bc)
  │  Crafted by : Elena Vance  |  Departed: 2024-10-31 (by Chad Dev)
  │  Epitaph    : "Nuke legacy_rate_shield.py in v2 cleanup (YOLO)" (10 lines lost)
  │  Relic      : def verify_midnight_token(token: str, clock_skew_ms: int = 300) -&amp;gt; b
  └──────────────────────────────────────────────────────────────
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;The entire tool is open source and available here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repo:&lt;/strong&gt; &lt;a href="https://github.com/Mahasvan/hacktoberfest-submission" rel="noopener noreferrer"&gt;&lt;code&gt;Mahasvan/hacktoberfest-submission&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is implemented as a single, dependency-free script (&lt;code&gt;git_seance.py&lt;/code&gt;) using only the Python standard library (&lt;code&gt;subprocess&lt;/code&gt;, &lt;code&gt;urllib.request&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt;, &lt;code&gt;argparse&lt;/code&gt;) + Git + local open-weight inference.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Git Graveyard Excavator:&lt;/strong&gt; Uses subprocess pipelines (&lt;code&gt;git log --diff-filter=D&lt;/code&gt;, &lt;code&gt;git log --format=%an &amp;lt;commit&amp;gt;~1 -- &amp;lt;path&amp;gt;&lt;/code&gt;, and &lt;code&gt;git show&lt;/code&gt;) to recover the exact deleted lines, the commit epitaph that killed the code, the person who deleted it, and the original author who wrote it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-Weight Local Inference Core:&lt;/strong&gt; Connects directly to &lt;strong&gt;Ollama&lt;/strong&gt; (&lt;code&gt;http://localhost:11434/api/chat&lt;/code&gt;) or any local &lt;strong&gt;OpenAI-compatible server&lt;/strong&gt; (&lt;code&gt;llama.cpp&lt;/code&gt;, &lt;code&gt;vLLM&lt;/code&gt;, &lt;code&gt;LM Studio&lt;/code&gt; via &lt;code&gt;/v1/chat/completions&lt;/code&gt;) using standard-library HTTP calls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grounded Spirit Persona:&lt;/strong&gt; Each spirit's system prompt is dynamically assembled from its resurrected diff, author lineage, and commit metadata so the open-weight model answers technical archaeology questions in character without hallucinating outside the diff. Inside an interactive séance, typing &lt;code&gt;resurrect&lt;/code&gt; prints the raw deleted source code back to the terminal.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Private Codebases &amp;amp; Zero Data Leakage:&lt;/strong&gt; The most haunted repositories are legacy enterprise or proprietary codebases where years of commits contain sensitive business logic, internal architecture, or accidentally deleted security guards. Running an open-weight model locally (&lt;code&gt;qwen2.5-coder&lt;/code&gt; or &lt;code&gt;llama3.2&lt;/code&gt; on a laptop with no internet) means you can interrogate your entire &lt;code&gt;.git&lt;/code&gt; history without ever sending private diffs to a closed cloud API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Marginal Cost for Deep Git Archaeology:&lt;/strong&gt; Scanning historical diffs across dozens of deleted modules would burn through cloud API tokens rapidly. Local inference on consumer hardware costs $0.00 per séance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Freedom &amp;amp; Permanence:&lt;/strong&gt; Just as Git preserves history locally forever, open-weight models ensure you can swap between small fast models (&lt;code&gt;llama3.2:3b&lt;/code&gt;) or code-specialized models (&lt;code&gt;qwen2.5-coder:7b&lt;/code&gt;) offline, without worrying about a vendor deprecating an endpoint.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Software engineering often treats old code as embarrassing technical debt to be deleted and forgotten. Framing deleted code as an &lt;strong&gt;Ofrenda de Código&lt;/strong&gt; shifts that perspective: the ugly 15-line workaround written four years ago by an engineer who has since left the company was usually protecting the system from a very real production scar. Honoring those past builders—and giving their deleted code a voice to explain &lt;em&gt;why&lt;/em&gt; it stood watch—turns &lt;code&gt;git blame&lt;/code&gt; into gratitude.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Spending Tracker - Hacktoberfest Week 3</title>
      <dc:creator>Mahasvan Mohan</dc:creator>
      <pubDate>Wed, 21 Oct 2026 17:11:28 +0000</pubDate>
      <link>https://dev.to/mahasvan/spending-tracker-hacktoberfest-week-3-1b3m</link>
      <guid>https://dev.to/mahasvan/spending-tracker-hacktoberfest-week-3-1b3m</guid>
      <description>&lt;p&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;/p&gt;

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

&lt;p&gt;I built a &lt;strong&gt;Smart Spending Tracker&lt;/strong&gt; that completely eliminates the dreaded chore of manual budgeting. Let’s face it: manually entering expenses into spreadsheets—picking categories, inputting dates, and typing out exact amounts—is tedious. It’s exactly the kind of task we procrastinate on.&lt;/p&gt;

&lt;p&gt;To channel my inner sloth, I created a tracker that rewards laziness. Instead of navigating menus, you just brain-dump your expenses in plain text (e.g., &lt;em&gt;"Spent 15 bucks on a burrito for lunch and 40 on gas"&lt;/em&gt;). The underlying open-source AI instantly parses your messy input, extracts the amount, assigns the correct category, dates it, and logs it for you. You get to be incredibly lazy, but your finances stay perfectly organized.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;(Insert a link to your live demo, or drop in a YouTube/Loom video link showing how easy it is to log an expense!)&lt;/em&gt;&lt;/p&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Mahasvan" rel="noopener noreferrer"&gt;
        Mahasvan
      &lt;/a&gt; / &lt;a href="https://github.com/Mahasvan/SpendingTracker" rel="noopener noreferrer"&gt;
        SpendingTracker
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Spending Tracker
    &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;Spending Tracker&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A personal macOS spending tracker with an AI chatbot that reads and modifies your finances using natural language.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dashboard&lt;/strong&gt; - income/expense summary, spending trends, top categories, budget progress, payment method distribution, recent transactions, largest expense, and month-over-month comparisons&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transactions&lt;/strong&gt; — full CRUD with list view, inline rows, and editor sheet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Search&lt;/strong&gt; — filter by text, date range, type, amount, and category/payment-method chips&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budget Tracking&lt;/strong&gt; - per-category monthly budgets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Chatbot&lt;/strong&gt; - Currently Supports Ollama and Apple Intelligence. Add, update, delete transactions; search data; generate summaries - all in natural language (e.g., "Add ₹250 lunch paid by UPI"). Supports visual inputs, using LLM Vision capabilities, or using the macOS Vision API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Category &amp;amp; Payment Methods&lt;/strong&gt; - customize names, colors, icons; archive unused items&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup &amp;amp; Restore&lt;/strong&gt; - JSON backup with merge or replace modes&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Tech Stack&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Swift 6 · SwiftUI · SwiftData · Swift Charts · &lt;a href="https://github.com/gonzalezreal/swift-markdown-ui" rel="noopener noreferrer"&gt;swift-markdown-ui&lt;/a&gt;…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Mahasvan/SpendingTracker" 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;My project is built around &lt;strong&gt;open-weight models and local inference&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Instead of writing complex Regex to parse human text, I integrated an open-source AI model [Note: e.g., Llama 3.2 / Mistral running locally via Ollama / Transformers.js] as the core engine. When the user submits a messy string of text, the prompt is passed to the local model which is instructed to extract the &lt;code&gt;item_name&lt;/code&gt;, &lt;code&gt;amount&lt;/code&gt;, and &lt;code&gt;category&lt;/code&gt;, returning it purely as structured JSON. &lt;/p&gt;

&lt;p&gt;The frontend/backend [Note: mention your framework, e.g., Next.js, Python/Flask, etc.] captures this JSON and instantly logs it to the database. The AI does all the heavy lifting of categorizing and structuring the data, so the user doesn't have to.&lt;/p&gt;

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

&lt;p&gt;When it comes to personal finance, &lt;strong&gt;privacy is everything&lt;/strong&gt;. Open innovation is the only reason a project like this can exist securely. &lt;/p&gt;

&lt;p&gt;Because this project uses open-weight models and local inference, it can run entirely offline on a laptop. Users don't have to send their daily habits, sensitive financial data, or location history to a closed-source, third-party API server (like OpenAI) that they don't control. Their financial data stays strictly on their own machine. Furthermore, because it relies on open-source AI, there are zero subscription fees to keep the automated tracking running. It’s private, free, and completely under the user's control.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;(If you used DevRelay to help build this, embed your session here! Otherwise, you can safely delete this section.)&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I usually put off budgeting until the end of the month, at which point I'm forced to sift through dozens of bank statements and receipts—a chore that usually takes over an hour. &lt;/p&gt;

&lt;p&gt;By building this tracker, I've turned a dreaded monthly chore into a 5-second brain dump whenever I buy something. It saves me hours of tedious spreadsheet management every month. More importantly, because it requires almost zero friction or mental energy, I actually &lt;em&gt;stick&lt;/em&gt; to tracking my money now. I let the AI do the work so I can get back to relaxing.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WasmEdge / LlamaEdge&lt;/strong&gt; &lt;em&gt;(Leave this if you used WasmEdge/LlamaEdge)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neon&lt;/strong&gt; &lt;em&gt;(Leave this if you used Neon for your database)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comet&lt;/strong&gt; &lt;em&gt;(Leave this if you used Comet to track your prompts)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pinata&lt;/strong&gt; &lt;em&gt;(Leave this if you used Pinata)&lt;/em&gt;
&amp;lt;!-- Remove any partners above that you didn't use! --&amp;gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>W2 Dev Challenge - MUNHelper</title>
      <dc:creator>Mahasvan Mohan</dc:creator>
      <pubDate>Thu, 15 Oct 2026 02:47:03 +0000</pubDate>
      <link>https://dev.to/mahasvan/w2-dev-challenge-munhelper-14h0</link>
      <guid>https://dev.to/mahasvan/w2-dev-challenge-munhelper-14h0</guid>
      <description>&lt;p&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;/p&gt;

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

&lt;p&gt;&lt;strong&gt;MUNHelper&lt;/strong&gt; is a specialized preparation assistant built for Model United Nations (MUN) delegates, specifically tailored for committees under the Economic and Social Council (ECOSOC).&lt;/p&gt;

&lt;p&gt;Model UN delegates spend dozens of hours combing through dense, historical UN resolutions, past reports, and complex policy documents to find precise clauses, legal precedents, and actionable wording for their position papers and draft resolutions. MUNHelper solves this information-overload problem by running a Retrieval-Augmented Generation (RAG) pipeline across comprehensive ECOSOC resolutions, combined with an open-weight LLM layer to answer delegate queries instantly with exact contextual citations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who would pay for it?&lt;/strong&gt; Competitive high school and university MUN delegates, as well as MUN coaching academies and school clubs, who are willing to pay for a tool that cuts research time in half and gives them a competitive edge during conferences.&lt;/p&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Mahasvan" rel="noopener noreferrer"&gt;
        Mahasvan
      &lt;/a&gt; / &lt;a href="https://github.com/Mahasvan/MunHelper" rel="noopener noreferrer"&gt;
        MunHelper
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Fully offline Model United Nations Research Helper
    &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;MunHelper&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Context-based UN Resolution lookup. &lt;br&gt;
Searches through every existing ECOSOC resolution and shows relevant data and extracts.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;OpenAPI-compatible API using FastAPI&lt;/li&gt;
&lt;li&gt;Website using Streamlit&lt;/li&gt;
&lt;li&gt;Instant ECOSOC Resolution lookup with semantic search&lt;/li&gt;
&lt;li&gt;Ability to update documents with latest resolutions&lt;/li&gt;
&lt;li&gt;Integration with Ollama for inference from resolution extracts&lt;/li&gt;
&lt;li&gt;Docker Containerization&lt;/li&gt;
&lt;li&gt;Auto Update (coming soon)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation with Docker&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Install &lt;a href="https://www.docker.com/products/docker-desktop/" rel="nofollow noopener noreferrer"&gt;Docker Desktop&lt;/a&gt; and make sure &lt;a href="https://docs.docker.com/compose/install/" rel="nofollow noopener noreferrer"&gt;Docker Compose&lt;/a&gt; is present.
&lt;ul&gt;
&lt;li&gt;If you want to use your GPU, follow &lt;a href="https://ollama.com/blog/ollama-is-now-available-as-an-official-docker-image" rel="nofollow noopener noreferrer"&gt;Ollama's instructions&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Start the Docker Engine
&lt;ul&gt;
&lt;li&gt;Windows/macOS - Open the app.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/config/daemon/start/" rel="nofollow noopener noreferrer"&gt;Linux instructions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to the project directory
&lt;ul&gt;
&lt;li&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;cd&lt;/span&gt; MunHelper&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Start the containers in detached mode using docker-compose
&lt;ul&gt;
&lt;li&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt; docker-compose -f docker-compose.yml up -d&lt;/pre&gt;

&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;API is served at &lt;code&gt;http://localhost:5000/docs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Frontend is served at &lt;code&gt;http://localhost:3000&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Before using anything, update the ChromaDB database
&lt;ul&gt;
&lt;li&gt;Visit the API Documentation at &lt;code&gt;http://localhost:5000/docs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run the &lt;code&gt;/manage/update-chromadb&lt;/code&gt; endpoint.&lt;/li&gt;
&lt;li&gt;If using the Frontend
&lt;ul&gt;
&lt;li&gt;Hold on, I'm working on something.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Otherwise…&lt;/li&gt;
&lt;/ul&gt;
&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/Mahasvan/MunHelper" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;You can explore the complete codebase and setup instructions directly on GitHub:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/mahasvan/munhelper
&lt;span class="nb"&gt;cd &lt;/span&gt;munhelper

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

&lt;/div&gt;



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

&lt;p&gt;MUNHelper is built entirely around open-source AI tooling to ensure precision, privacy, and low operational overhead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-Weight Models:&lt;/strong&gt; Utilizes local open-weight instruction-tuned models for text generation and summarization without depending on proprietary cloud endpoints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-Source Orchestration &amp;amp; RAG:&lt;/strong&gt; Built using open-source frameworks for document parsing, text chunking, and vector embedding generation (such as FAISS/Chroma for local vector storage and LangChain/LlamaIndex components).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Inference:&lt;/strong&gt; The pipeline runs locally via lightweight runtime wrappers, allowing delegates to execute complex searches and context retrieval right on their laptops.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Open innovation was non-negotiable for building MUNHelper for several key reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Offline Conference Access:&lt;/strong&gt; MUN conference venues notoriously have terrible Wi-Fi or restricted networks. Because MUNHelper runs locally with open-weight models, delegates can use it right up until committee session starts, even with zero internet connectivity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Per-Token API Costs:&lt;/strong&gt; Commercial APIs charge per token, making a consumer-facing SaaS tool for students economically unviable. Running open-weight models locally keeps operating costs at zero, allowing for sustainable pricing models.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy and Strategy Security:&lt;/strong&gt; Delegates often input draft strategy notes and custom policy arguments alongside official documents. Keeping data processing local ensures that proprietary team strategies never leak onto third-party servers controlled by major tech companies.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Feedback
&lt;/h2&gt;

&lt;p&gt;I tested MUNHelper with friends in a local college MUN team&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What they said:&lt;/strong&gt; They used it to cross-reference past resolutions on sustainable economic development and noted that it saved them hours of manual skimming through PDF archives. They especially liked that it worked offline during a mock committee session at a school where cell service was blocked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Would they pay?&lt;/strong&gt; They confirmed they would gladly pay a small one-time fee or seasonal subscription during conference season (September to January) to have access to a fast, reliable, offline policy research assistant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What they asked for next:&lt;/strong&gt; Exporting generated clause comparisons directly into a formatted Word or Google Doc template for draft resolutions.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Open-Source AI Challenge Week 2: Side Hustle&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Hacktoberfest Week 1 - Anti-Router</title>
      <dc:creator>Mahasvan Mohan</dc:creator>
      <pubDate>Thu, 08 Oct 2026 05:53:15 +0000</pubDate>
      <link>https://dev.to/mahasvan/hacktoberfest-week-1-anti-router-1oe8</link>
      <guid>https://dev.to/mahasvan/hacktoberfest-week-1-anti-router-1oe8</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;touch-grass&lt;/strong&gt; is the Anti-Router: an offline-first wanderlust agent that plans exploratory pedestrian &lt;em&gt;dérives&lt;/em&gt; — scavenger-hunt walks optimized for discovery, not speed.&lt;/p&gt;

&lt;p&gt;Instead of telling you "turn left in 100 feet," it generates navigational &lt;strong&gt;riddles&lt;/strong&gt;: &lt;em&gt;"Face north. Somewhere north-west of here waits a fountain — follow the quietest path you can find, and let me know when you arrive."&lt;/em&gt; You have to actually look at the world — buildings, trees, water, art — to orient yourself. The phone stays in your pocket.&lt;/p&gt;

&lt;p&gt;It's for anyone who walks the same three blocks every day and wants their own neighborhood to feel foreign again.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;uv run touch-grass derive &lt;span class="s2"&gt;"Carmel-by-the-Sea, California"&lt;/span&gt; &lt;span class="nt"&gt;--minutes&lt;/span&gt; 45
&lt;span class="go"&gt;Dérive: 2 waypoints, ~2.70 mi (budget 2.25 mi).
  - a tree @ (36.54186, -121.92063)
  - a tree @ (36.54569, -121.92933)

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;uv run touch-grass track   &lt;span class="c"&gt;# feed "lat,lon" GPS fixes on stdin&lt;/span&gt;
&lt;span class="go"&gt;You found a tree. Face north. Somewhere north-west of here waits a tree —
turn toward the north-west, follow the quietest path you can find...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;On macOS, &lt;code&gt;track&lt;/code&gt; also speaks each riddle aloud via &lt;code&gt;say&lt;/code&gt;. A fully offline &lt;code&gt;touch-grass demo&lt;/code&gt; simulates the whole loop — graph, routing, geofences, riddles — on a synthetic city.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Mahasvan" rel="noopener noreferrer"&gt;
        Mahasvan
      &lt;/a&gt; / &lt;a href="https://github.com/Mahasvan/touch-grass" rel="noopener noreferrer"&gt;
        touch-grass
      &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;touch-grass — the Anti-Router&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Offline-first wanderlust agent: plans exploratory pedestrian dérives
(scavenger-hunt walks) from cached OpenStreetMap data, then narrates
navigational riddles instead of turn-by-turn directions.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Setup&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;uv sync                    &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; core deps (osmnx only — stays light)&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;For LLM riddles, run &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt; separately and set
&lt;code&gt;TOUCH_GRASS_MODEL&lt;/code&gt; (e.g. &lt;code&gt;qwen3:4b&lt;/code&gt;). The daemon holds the weights; this
package only talks HTTP to localhost — no heavy deps, no model in RAM.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;uv run touch-grass demo                       &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; offline sim, synthetic city&lt;/span&gt;
uv run touch-grass derive &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;Portland, Oregon&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; --minutes 45&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;code&gt;derive&lt;/code&gt; downloads the walk graph + POIs once, caches them under
&lt;code&gt;~/.cache/touch-grass/&lt;/code&gt;, then works fully offline.&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;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spatial.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cached OSMnx walk graph + POI tag extraction; radius from time budget&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;router.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Anti-cost routing: penalizes arterials, rewards footways/alleys + jitter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;persona.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Turns bearings/POIs into riddles; template by default, GGUF LLM via &lt;code&gt;TOUCH_GRASS_MODEL&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;state.py&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Geofenced waypoint state machine —&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Mahasvan/touch-grass" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;spatial.py&lt;/code&gt; — caches a pedestrian-only OSMnx walk graph + POI tags (&lt;code&gt;historic=*&lt;/code&gt;, &lt;code&gt;natural=*&lt;/code&gt;, &lt;code&gt;leisure=park&lt;/code&gt;...) locally before you go offline&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;router.py&lt;/code&gt; — the Anti-Router: Dijkstra where arterials cost up to 50× and footways/alleys are discounted, plus seeded jitter so no two dérives repeat&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;persona.py&lt;/code&gt; — turns bearings and POI metadata into riddles via local Ollama (stdlib &lt;code&gt;urllib&lt;/code&gt;, zero SDK), with a template fallback when no model is running&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;state.py&lt;/code&gt; — a 15 m geofence state machine: the LLM only wakes when you physically arrive&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Everything runs at the edge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-weight LLM&lt;/strong&gt;: any Ollama-pulled model (e.g. &lt;code&gt;qwen3:4b&lt;/code&gt;) served by a local Ollama daemon — &lt;code&gt;TOUCH_GRASS_MODEL&lt;/code&gt; selects it, &lt;code&gt;keep_alive: 5m&lt;/code&gt; drops weights between waypoints to save battery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open data&lt;/strong&gt;: OpenStreetMap via OSMnx — &lt;code&gt;network_type="walk"&lt;/code&gt; graphs cached as GraphML, POIs pickled; after one fetch the app never touches the network&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No agent framework&lt;/strong&gt;: LangGraph/Smolagents were in the spec, but a 4-module pipeline didn't need them — plain functions won&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built with &lt;code&gt;uv&lt;/code&gt;, testable headless (&lt;code&gt;uv run pytest&lt;/code&gt; — no network, no model required).&lt;/p&gt;

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

&lt;p&gt;The entire premise — &lt;em&gt;data sovereignty for where your feet go&lt;/em&gt; — only works because the stack is open. Google Maps can't power an app whose selling point is that no one logs your route. OSM gave me the graph, open-weight models gave me the voice, and Ollama gave me inference that works in airplane mode. A closed API would have made this project self-defeating: the agent's value is that it knows where you walked and &lt;em&gt;tells no one&lt;/em&gt;.&lt;/p&gt;

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

&lt;p&gt;Built with Devin (SWE-2). Notable: the agent hit two real bugs on first live run — geopandas demanding pyarrow for a parquet cache (fixed by switching to stdlib pickle), and &lt;code&gt;ox.nearest_nodes&lt;/code&gt; requiring scikit-learn on unprojected graphs (replaced with a 3-line equirectangular scan). Both fixes made the dependency tree &lt;em&gt;lighter&lt;/em&gt; — staying honest to "offline-first" meant fewer deps, not more.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Best use of open-weight models / local inference&lt;/li&gt;
&lt;li&gt;Best offline-first / privacy-preserving project&lt;/li&gt;
&lt;/ul&gt;

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