<?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: Ravi Teja Bhagavatula</title>
    <description>The latest articles on DEV Community by Ravi Teja Bhagavatula (@ravi_tejabhagavatula_a08).</description>
    <link>https://dev.to/ravi_tejabhagavatula_a08</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%2F3781693%2F3da3ecdd-45c8-4889-be0a-a581f68b1d0a.png</url>
      <title>DEV Community: Ravi Teja Bhagavatula</title>
      <link>https://dev.to/ravi_tejabhagavatula_a08</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ravi_tejabhagavatula_a08"/>
    <language>en</language>
    <item>
      <title>The Last Commit 👻: Giving Abandoned Open-Source Projects a Voice</title>
      <dc:creator>Ravi Teja Bhagavatula</dc:creator>
      <pubDate>Sat, 31 Oct 2026 15:53:20 +0000</pubDate>
      <link>https://dev.to/ravi_tejabhagavatula_a08/the-last-commit-giving-abandoned-open-source-projects-a-voice-8ok</link>
      <guid>https://dev.to/ravi_tejabhagavatula_a08/the-last-commit-giving-abandoned-open-source-projects-a-voice-8ok</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;What happens when a software project is abandoned?&lt;/p&gt;

&lt;p&gt;The developer stops committing code. Issues remain unanswered. TODO comments stay buried in source files. Eventually, the repository becomes another forgotten corner of GitHub.&lt;/p&gt;

&lt;p&gt;But what if that project could tell us its story?&lt;/p&gt;

&lt;p&gt;Introducing &lt;strong&gt;The Last Commit&lt;/strong&gt; — an AI-powered digital archaeologist that brings abandoned software repositories back to life.&lt;/p&gt;

&lt;p&gt;The idea is simple: every repository has a history, and every history has a story.&lt;/p&gt;

&lt;p&gt;You provide a local Git repository, and The Last Commit examines its commit history, README, source code, and unfinished TODOs. It then creates an interactive ghost persona that you can talk to.&lt;/p&gt;

&lt;p&gt;You can ask questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Who created you?"&lt;/li&gt;
&lt;li&gt;"What were you originally supposed to do?"&lt;/li&gt;
&lt;li&gt;"What happened during your final days?"&lt;/li&gt;
&lt;li&gt;"Why did development stop?"&lt;/li&gt;
&lt;li&gt;"What was left unfinished?"&lt;/li&gt;
&lt;li&gt;"How can I bring you back?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The ghost uses actual repository information to answer questions, rather than simply inventing a spooky story.&lt;/p&gt;

&lt;p&gt;The project interprets &lt;em&gt;Ghost in the Machine&lt;/em&gt; quite literally: the ghost is the history of software that nobody remembers anymore.&lt;/p&gt;

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

&lt;p&gt;I wanted the AI to be more than a chatbot with a Halloween-themed interface. The actual intelligence and functionality needed to come from open technology.&lt;/p&gt;

&lt;p&gt;Here's the stack I'm using:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Repository analysis and backend logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FastAPI&lt;/td&gt;
&lt;td&gt;Backend API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;React + Vite&lt;/td&gt;
&lt;td&gt;Interactive frontend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;td&gt;Local model inference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3 1.7B&lt;/td&gt;
&lt;td&gt;Open-weight language model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git&lt;/td&gt;
&lt;td&gt;Repository history extraction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQLite&lt;/td&gt;
&lt;td&gt;Local data storage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  1. Understanding the repository
&lt;/h3&gt;

&lt;p&gt;The backend uses Git to examine a repository's history.&lt;/p&gt;

&lt;p&gt;It extracts information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commit messages and timestamps.&lt;/li&gt;
&lt;li&gt;Development activity.&lt;/li&gt;
&lt;li&gt;README content.&lt;/li&gt;
&lt;li&gt;TODO and FIXME comments.&lt;/li&gt;
&lt;li&gt;Relevant source-code information.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This information becomes the ghost's memories.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Giving the repository a voice
&lt;/h3&gt;

&lt;p&gt;I'm using Qwen3 through Ollama to power the ghost.&lt;/p&gt;

&lt;p&gt;Instead of sending repository information to an external AI API, the application communicates with a locally running model.&lt;/p&gt;

&lt;p&gt;The model receives repository context and responds in the personality of the abandoned project.&lt;/p&gt;

&lt;p&gt;For example, a repository with years of development history followed by a sudden stop might respond:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"I remember when everything was moving so quickly. New features every week, bugs disappearing, and plans for the future. Then came my final commit. Nobody returned after that."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The personality is generated by the model, while the underlying memories are grounded in repository evidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Building the experience
&lt;/h3&gt;

&lt;p&gt;The frontend provides a haunted terminal-inspired interface where users can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summon a repository.&lt;/li&gt;
&lt;li&gt;Talk to its ghost.&lt;/li&gt;
&lt;li&gt;Explore its development timeline.&lt;/li&gt;
&lt;li&gt;Inspect repository evidence.&lt;/li&gt;
&lt;li&gt;Generate a resurrection roadmap.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to make software archaeology feel like an interactive experience rather than reading Git logs.&lt;/p&gt;

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

&lt;p&gt;This is probably the most important part of the project.&lt;/p&gt;

&lt;p&gt;I could have connected a commercial AI API and built a chatbot around it. That would have been easier in some ways, but it would have missed the point.&lt;/p&gt;

&lt;p&gt;I wanted the project to be independent of a closed AI service.&lt;/p&gt;

&lt;p&gt;Using an open-weight model and local inference makes several things possible:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Privacy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Source code can contain sensitive information. Keeping repository analysis and inference on the user's own machine means the application doesn't need to upload that code to an external inference provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Offline operation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once the model and dependencies are downloaded, the intended workflow can run without an internet connection. You can explore a repository and talk to its ghost without depending on a cloud AI service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Freedom to experiment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I can replace Qwen3 with another compatible open-weight model, experiment with different prompts, and change the ghost's personality without rebuilding the entire application around a proprietary API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Accessibility&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is no required per-request commercial inference API fee. Users can run the model using their own hardware.&lt;/p&gt;

&lt;p&gt;For me, open innovation isn't simply about using free software. It's about being able to understand, modify, control, and preserve the technology that powers something you build.&lt;/p&gt;

&lt;p&gt;A project about preserving forgotten software should itself be built using technology that people can preserve and modify.&lt;/p&gt;

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

&lt;p&gt;There is something interesting about abandoned software.&lt;/p&gt;

&lt;p&gt;A repository can contain thousands of lines of code, hundreds of commits, and months or years of someone's effort. Yet one day, nobody remembers why it was created.&lt;/p&gt;

&lt;p&gt;The code remains. The commit history remains. The comments remain.&lt;/p&gt;

&lt;p&gt;But the voice behind the project disappears.&lt;/p&gt;

&lt;p&gt;I wanted to build something that gives that history a voice again.&lt;/p&gt;

&lt;p&gt;Maybe the project was abandoned because its developer ran out of time. Maybe the original idea became irrelevant. Maybe there was simply nobody left to maintain it.&lt;/p&gt;

&lt;p&gt;The Last Commit doesn't claim to know why someone disappeared. Instead, it helps us discover what they left behind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every repository has a last commit. But does that really have to be the end of its story?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>ScopeShield: A Local-First AI Agent That Turns Client Scope Creep Into Paid Change Orders (Gemma + TabPFN-3.5)</title>
      <dc:creator>Ravi Teja Bhagavatula</dc:creator>
      <pubDate>Sun, 18 Oct 2026 17:03:23 +0000</pubDate>
      <link>https://dev.to/ravi_tejabhagavatula_a08/scopeshield-a-local-first-ai-agent-that-turns-client-scope-creep-into-paid-change-orders-gemma--4p13</link>
      <guid>https://dev.to/ravi_tejabhagavatula_a08/scopeshield-a-local-first-ai-agent-that-turns-client-scope-creep-into-paid-change-orders-gemma--4p13</guid>
      <description>&lt;h2&gt;
  
  
  Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle
&lt;/h2&gt;

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

&lt;p&gt;Every freelance developer and designer knows the dread of the "quick favor" message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hey! Loving the staging build. Can we just add a quick role-based export button and tweak the webhook payload before Friday? Should only take 15 minutes!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Saying yes destroys your hourly rate; saying no feels confrontational. According to freelance industry surveys, independent contractors lose &lt;strong&gt;18% to 25% of their annual revenue&lt;/strong&gt; to unbilled scope creep simply because diagnosing the contract violation, estimating the real effort, and writing a polite pushback email takes too much mental energy in the middle of a sprint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ScopeShield&lt;/strong&gt; is a local-first AI Contract &amp;amp; Change-Order Agent built specifically for independent freelancers and micro-agencies.&lt;/p&gt;

&lt;p&gt;Instead of acting like a generic chat wrapper, ScopeShield performs a deterministic 4-stage workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Contract Clause Auditing (Gemma 3):&lt;/strong&gt; Ingests your signed Statement of Work (SOW) PDF and incoming client messages (Slack/Email/WhatsApp) locally, identifying the exact deliverables clause being stretched.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Historical Effort Forecasting (TabPFN-3.5):&lt;/strong&gt; Looks at your CSV of past completed tickets/projects and predicts the &lt;strong&gt;actual hours required&lt;/strong&gt; and &lt;strong&gt;schedule slip probability&lt;/strong&gt; (because a "15-minute tweak" historically takes 4.2 hours once QA and deployment are factored in).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Market Rate Benchmarking (SerpApi):&lt;/strong&gt; Pulls current freelance market rates and comparable specialized task pricing so you don't undercharge on the addendum.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Friction Change Order Generation:&lt;/strong&gt; Outputs a polite, psychologically calibrated client response paired with a 1-click PDF Change Order addendum.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Who pays for this?&lt;/strong&gt; Freelance full-stack developers, UI/UX designers, and boutique 2–5 person dev shops billing $40–$150/hr. Recovering just &lt;strong&gt;one&lt;/strong&gt; unbilled 3-hour "quick tweak" a month pays for a $19/month tool ten times over.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pipeline in Action
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;ScopeShield Dashboard Screenshot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Above: ScopeShield flagging a "minor webhook adjustment" against Section 3.2 of the original SOW, alongside TabPFN-3.5's prediction of 4.6 actual engineering hours.&lt;/em&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Core Repository Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scopeshield/
├── agent/                  # Mastra agent orchestration &amp;amp; tool definitions
│   ├── workflows/          # Multi-step SOW audit + TabPFN forecasting pipeline
│   └── tools/              # SerpApi rate lookup &amp;amp; PDF parser tools
├── backend/                # FastAPI inference bridge + TabPFN-3.5 client
├── frontend/               # React + Tailwind UI (hosted on Render)
├── sample_data/            # Pre-loaded historical ticket CSVs &amp;amp; sample SOW PDFs
└── render.yaml             # Infrastructure-as-Code for 1-click Render deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;ScopeShield is architected around an open-source reasoning core combined with specialized tabular foundation models and full observability:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Signed SOW PDF] + [Client Message]
         │
         ▼
┌─────────────────────────────────────────────────────────┐
│             Mastra Agent Orchestrator                   │
│  (Instrumented end-to-end with Sentry Agent Tracing)    │
└────────┬───────────────────────┬────────────────────────┘
         │                       │
         ▼                       ▼
┌─────────────────────┐ ┌─────────────────────────────────┐
│   Gemma (Local/vLLM)│ │  TabPFN-3.5 (Prior Labs API)    │
│ Semantic SOW diff &amp;amp; │ │  Reads historical_tasks.csv to  │
│ clause extraction   │ │  predict real hours &amp;amp; overrun % │
└────────┬────────────┘ └────────┬────────────────────────┘
         │                       │
         ▼                       ▼
┌─────────────────────────────────────────────────────────┐
│   SerpApi Live Market Benchmark                         │
│   Grounds change-order hourly pricing in live comps     │
└────────┬────────────────────────────────────────────────┘
         │
         ▼
[Polite Pushback Email + Itemized Change Order PDF]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open-Weight Reasoning Core (&lt;code&gt;Gemma&lt;/code&gt;):&lt;/strong&gt; We use Google's open-weight &lt;strong&gt;Gemma&lt;/strong&gt; model (running locally via Ollama for strict offline NDA mode, and served via containerized runtime for our public demo) to perform structured semantic comparison between the signed SOW sections and the unstructured client request. Gemma outputs strict JSON containing &lt;code&gt;violated_clause_id&lt;/code&gt;, &lt;code&gt;scope_delta_summary&lt;/code&gt;, and &lt;code&gt;severity_score&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tabular Foundation Model (&lt;code&gt;TabPFN-3.5&lt;/code&gt;):&lt;/strong&gt; LLMs are notoriously bad at doing regression math over historical spreadsheets. Instead of asking an LLM to guess how long a task will take, we pass the freelancer's &lt;code&gt;historical_projects.csv&lt;/code&gt; (task category, complexity, client revision count, stack, actual vs. estimated hours) directly to &lt;strong&gt;Prior Labs' TabPFN-3.5&lt;/strong&gt;. With zero training wait time, TabPFN predicts the realistic hour distribution and overrun risk.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agent Harness (&lt;code&gt;Mastra&lt;/code&gt;):&lt;/strong&gt; Orchestrates the deterministic handoff between document parsing, Gemma's semantic extraction, SerpApi's rate check, and TabPFN's tabular inference.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Observability (&lt;code&gt;Sentry Agent Tracing&lt;/code&gt;):&lt;/strong&gt; Every tool call, prompt token count, and latency span is tracked via Sentry.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Debugging with Sentry Agent Tracing
&lt;/h3&gt;

&lt;p&gt;During early testing, our end-to-end change-order generation was taking &lt;strong&gt;8.4 seconds&lt;/strong&gt;. Looking at our &lt;strong&gt;Sentry Agent Tracing&lt;/strong&gt; waterfall immediately revealed the culprit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sentry Agent Trace Screenshot&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What we found:&lt;/strong&gt; Our &lt;code&gt;SerpApi&lt;/code&gt; tool was passing raw, unstripped search snippet metadata directly into Gemma's context window (burning 2,140 extra input tokens per run), and &lt;code&gt;TabPFN&lt;/code&gt; was being called sequentially &lt;em&gt;after&lt;/em&gt; &lt;code&gt;SerpApi&lt;/code&gt; despite having zero dependency on it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The fix:&lt;/strong&gt; We parallelized the &lt;code&gt;TabPFN-3.5&lt;/code&gt; and &lt;code&gt;SerpApi&lt;/code&gt; tool calls inside our Mastra workflow and stripped the SerpApi payload down to top-5 structured rate cards. Total pipeline latency dropped from &lt;strong&gt;8.4s to 2.9s (-65%)&lt;/strong&gt;, and token consumption dropped by &lt;strong&gt;71%&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;When I talked to freelancers about why they don't paste client contracts and Slack arguments into ChatGPT or Claude, two hard blockers came up immediately: &lt;strong&gt;NDA Legal Liability&lt;/strong&gt; and &lt;strong&gt;Unit Economics&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strict NDA &amp;amp; Data Privacy Compliance:&lt;/strong&gt; Standard freelance MSA/SOW contracts contain strict non-disclosure clauses prohibiting contractors from uploading proprietary architecture specs, pricing tables, and internal correspondence to third-party closed SaaS APIs that retain data. Because ScopeShield runs &lt;strong&gt;Gemma&lt;/strong&gt; locally on the freelancer's laptop, confidential client PDFs never leave &lt;code&gt;localhost&lt;/code&gt;. Open weights make this product &lt;em&gt;legally usable&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Right-Sized Models Beat Monolithic APIs:&lt;/strong&gt; By pairing a compact, fast open-weight language model (&lt;strong&gt;Gemma&lt;/strong&gt;) for text extraction with a specialized tabular foundation model (&lt;strong&gt;TabPFN-3.5&lt;/strong&gt;) for numerical hour prediction, we outperform a massive closed frontier LLM on both accuracy and cost.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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;Closed Frontier LLM Wrapper&lt;/th&gt;
&lt;th&gt;ScopeShield Open Stack (Gemma + TabPFN-3.5)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NDA / Offline Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fails strict agency NDAs (cloud data retention)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;100% compliant&lt;/strong&gt; (runs locally on laptop)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Effort Estimation Method&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hallucinates numbers via text token prediction&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;True tabular regression&lt;/strong&gt; on historical CSVs via TabPFN-3.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Marginal Cost per 1,000 Audits&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$18.50 (multi-page PDF context + reasoning)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$0.00 local&lt;/strong&gt; (or &amp;lt;$0.80 on self-hosted cloud)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Schema Lock-in&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vulnerable to silent model deprecations&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Full weight control&lt;/strong&gt; &amp;amp; fine-tunable on domain SOWs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;To put the "Side Hustle" prompt to the test, I gave ScopeShield to &lt;strong&gt;Kumar&lt;/strong&gt;, a freelance full-stack React/Node developer who builds MVP web portals for local businesses.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Real Test:&lt;/strong&gt; He uploaded a real 4-page SOW from a current project and pasted a WhatsApp message where his client asked to &lt;em&gt;"quickly add multi-branch role filtering and WhatsApp invoice alerts"&lt;/em&gt;—claiming it was already implied under "Dashboard Views."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What Happened:&lt;/strong&gt; ScopeShield pinpointed &lt;strong&gt;Section 2.4 (Single-Tenant Admin Scope)&lt;/strong&gt; in 3 seconds, ran his past 40 Jira ticket exports through &lt;strong&gt;TabPFN-3.5&lt;/strong&gt;, and showed him that similar "notification + role" requests previously took him &lt;strong&gt;6.5 hours&lt;/strong&gt; (not the 1 hour he was about to quote). It drafted a friendly reply offering to bundle it as a Phase 1.1 mini-addendum for ₹8,500 (~$100).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Did they pay / Would they pay?&lt;/strong&gt; He sent the generated reply with almost zero edits—and the client approved the paid addendum that same evening! He told me:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;"Honestly, having the breakdown table showing why it's 6.5 hours based on past sprints gave me the confidence not to cave. I'd easily pay $15/month if this had a Chrome extension that sits right inside Gmail and WhatsApp Web."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What he asked for next:&lt;/strong&gt; A direct Razorpay/Stripe payment link generator embedded directly inside the exported Change Order PDF so clients can approve and pay the deposit in one click.&lt;/li&gt;
&lt;/ul&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; Uses Google's open-weight Gemma model as the core semantic contract auditor and structured JSON change-order generator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of TabPFN:&lt;/strong&gt; Uses Prior Labs' &lt;strong&gt;TabPFN-3.5&lt;/strong&gt; inside our prediction agent to forecast realistic task hours and schedule overrun probabilities directly from the freelancer's historical project CSVs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render:&lt;/strong&gt; Hosted the full-stack ScopeShield web application and FastAPI agent bridge on Render via Blueprint (&lt;code&gt;render.yaml&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Mastra:&lt;/strong&gt; Orchestrates the multi-step agent workflow, parallel tool execution, and state transitions across Gemma, TabPFN, and SerpApi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Sentry Agent Tracing:&lt;/strong&gt; Instrumented the agent pipeline with Sentry Agent Tracing to inspect token burn, debug sequential tool bottlenecks, and cut latency by 65%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of SerpApi:&lt;/strong&gt; Grounds every generated Change Order in live freelance market rate comps fetched via SerpApi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of a .tech Domain:&lt;/strong&gt; Deployed live on a &lt;code&gt;.tech&lt;/code&gt; domain claimed via the Hacktoberfest promo.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>touchgrass — an offline, open-weight agent whose only job is to make you stop using it.</title>
      <dc:creator>Ravi Teja Bhagavatula</dc:creator>
      <pubDate>Sun, 11 Oct 2026 12:01:45 +0000</pubDate>
      <link>https://dev.to/ravi_tejabhagavatula_a08/touchgrass-an-offline-open-weight-agent-whose-only-job-is-to-make-you-stop-using-it-2l1d</link>
      <guid>https://dev.to/ravi_tejabhagavatula_a08/touchgrass-an-offline-open-weight-agent-whose-only-job-is-to-make-you-stop-using-it-2l1d</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;&lt;code&gt;touchgrass&lt;/code&gt; — an offline, open-weight agent whose only job is to make you stop using it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It runs Gemma locally (via Ollama, on &lt;code&gt;127.0.0.1&lt;/code&gt;), takes your minutes and coordinates, and prints a &lt;strong&gt;Field Card&lt;/strong&gt;: one short loop, three noticing prompts anchored to your actual latitude and day length, one dare, and instructions for what to do with the phone. Then the screen part is over. There is no feed, no streak, no second screen. The artifact is paper — print it, tape it to your phone case, go.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;╭──────────────────────────────────────────────────────────────╮
│ touchgrass                                          No. 0284 │
│ F I E L D   C A R D                                          │
│ Sun 11 Oct 2026 · evening                                  │
╰──────────────────────────────────────────────────────────────╯

  FIELD CARD — this evening's card

  new moon · any ground · ☀ 06:26–18:06

  THE LOOP
     Walk toward the setting sun. Head south until the buildings
     thin. Continue until you reach a patch of bare earth.

  NOTICE — three things
     01  Feel the wind on your face. Note its direction.
     02  Pick up a stone. Examine its weight and texture.
     03  Observe the shadows lengthening. How do they shift?

  THE DARE
     Kick a pebble. Listen to the echo.

  POCKET THE PHONE
     Photograph the color of the sky just after the sun dips
     below the horizon.

  generated by gemma3:4b on 127.0.0.1 (local) · loopback only · no network
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Who is it for? Anyone whose screen time needs an off-ramp. Runners, parents, students, and — honestly — hackers on submission day.&lt;/p&gt;

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

&lt;p&gt;There is no deployed link, and that's the point: &lt;strong&gt;this tool works with the radio off.&lt;/strong&gt; The demo is three commands on your own laptop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma3:4b
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--break-system-packages&lt;/span&gt;
touchgrass doctor &lt;span class="nt"&gt;--proof&lt;/span&gt;   &lt;span class="c"&gt;# hero moment: the internet gets refused live&lt;/span&gt;
touchgrass demo             &lt;span class="c"&gt;# proof + card + journal in ~30 seconds&lt;/span&gt;
touchgrass serve            &lt;span class="c"&gt;# → http://127.0.0.1:8765, loopback-only web UI&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The demo web UI&lt;/strong&gt; (&lt;code&gt;touchgrass serve&lt;/code&gt;, loopback only)&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%2Frrsn9e4va7lo1k6mxo6u.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%2Frrsn9e4va7lo1k6mxo6u.png" alt="touchgrass demo web UI in a browser: time, effort and setting controls on the left and a paper-styled Field Card preview on the right" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Terminal Field Card&lt;/strong&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%2F7zv3xp68oka1pshzxkyh.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%2F7zv3xp68oka1pshzxkyh.png" alt="Terminal showing a generated touchgrass Field Card with a sunset loop, three noticing prompts, a dare, and a pocket-the-phone instruction" width="799" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;touchgrass doctor --proof&lt;/code&gt;&lt;/strong&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%2Faktxrw2kds406lfbmlpg.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%2Faktxrw2kds406lfbmlpg.png" alt="touchgrass doctor proof output showing three public IP addresses blocked at the network boundary while loopback to the local Ollama model stays allowed" width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Taking it outside (bonus points, honestly earned):&lt;/strong&gt; &lt;br&gt;
I printed the card, taped it to my phone case, and walked the local park for 30 minutes at sunset. The route — head south until the buildings thin, find bare earth — worked exactly as written; no map needed. The shadow prompt was the one that landed: I stood and watched the light move instead of walking through it, and the stone prompt stopped me a second time. The dare (kick a pebble, listen for the echo) got a laugh out of me, which is more than most software has managed outdoors. One honest finding: the sky-photo instruction arrived a few minutes before the sky did anything interesting — the next iteration should time the pocket-the-phone moment to sunset itself, which the tool already computes.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/RaviTeja799/touchgrass" rel="noopener noreferrer"&gt;https://github.com/RaviTeja799/touchgrass&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT licensed. Python 3.9+, &lt;strong&gt;zero third-party dependencies&lt;/strong&gt; — stdlib only, so &lt;code&gt;pip install&lt;/code&gt; works on a plane. Layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;touchgrass/
  cli.py        plan / demo / serve / log / recall / doctor / locate
  serve.py      loopback-only demo web UI (one self-contained page)
  brain.py      Ollama chat + model auto-resolve + fallback planner
  card.py       FieldCard → colour terminal / receipt text / HTML / JSON
  phenology.py  solar declination, day length, sun times, moon phase
  journal.py    SQLite + FTS5 outing log, on your disk
  offline.py    socket-layer network guard + live proof
  geo.py        locate-once-cached-forever (flags &amp;gt; env &amp;gt; cache &amp;gt; default)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The part I'm proudest of is the smallest one — "we don't send your data anywhere" as a &lt;em&gt;demonstration&lt;/em&gt; instead of a sentence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# offline.py — refuses every non-loopback socket in the process
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_host_of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;_is_loopback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;NetworkBlocked&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;touchgrass blocked an outbound call to &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="si"&gt;!r}&lt;/span&gt;&lt;span class="s"&gt; (via &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;).&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ touchgrass doctor --proof
  leaving the machine:
    ok  1.1.1.1          blocked at the boundary
    ok  8.8.8.8          blocked at the boundary
    ok  93.184.216.34    blocked at the boundary
  staying on the machine:
    ok  127.0.0.1:11434  loopback allowed -- model reachable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;Open-source AI: Gemma 3 (&lt;code&gt;gemma3:4b&lt;/code&gt;, falling back to any &lt;code&gt;gemma*&lt;/code&gt; on disk) running locally through Ollama.&lt;/strong&gt; No API keys, no per-token billing, no rate limits. The project is built around the model in three layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Season math first, model voice second.&lt;/strong&gt; Before Gemma is even called, &lt;code&gt;phenology.py&lt;/code&gt; computes solar declination, day length, longitude-corrected sunrise/sunset, and lunar phase from the calendar and your coordinates — farmer's-almanac arithmetic, no network. On 11 October at +17.7°, +83.3° that's an 11h 40m day, sun about 06:26–18:06. Delete the model entirely and the tool still knows what kind of afternoon it is. Gemma supplies the &lt;em&gt;voice&lt;/em&gt; (route, dare, exit line), never the &lt;em&gt;facts&lt;/em&gt;. The prompt libraries are latitude-aware too: inside the tropics the tool swaps temperate leaf-fall prompts for heat-and-rain ones, so the card reads true where you actually stand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A guard, not a promise.&lt;/strong&gt; &lt;code&gt;offline.py&lt;/code&gt; patches the socket layer so anything imported into the process that tries to phone home is refused at the boundary — and &lt;code&gt;doctor --proof&lt;/code&gt; shows you the refusal live.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graceful degradation as a design principle.&lt;/strong&gt; No model on disk? A hand-written fallback planner (10 archetypes) still gets you outside. Tiny model echoing the schema or parroting the example? Echo/parrot detection repairs those fields from the seed-varied planner, so the card is always fresh and printable. A field guide that stops working without wifi is not a field guide.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The rest is stdlib Python: &lt;code&gt;argparse&lt;/code&gt; CLI, &lt;code&gt;http.server&lt;/code&gt; demo UI, &lt;code&gt;sqlite3&lt;/code&gt; with FTS5 for the journal (&lt;code&gt;touchgrass recall "what was turning in autumn"&lt;/code&gt; searches your own outings on your own disk). Location resolves as flags → env → cached fix → default; &lt;code&gt;touchgrass locate&lt;/code&gt; is the single online step, cached for every &lt;code&gt;--offline&lt;/code&gt; run after. The HTML card is fully self-contained (no webfonts, no CDN) and sized for 80mm thermal paper.&lt;/p&gt;

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

&lt;p&gt;Three things this project can &lt;em&gt;only&lt;/em&gt; do because the model is open and local:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It works with the radio off.&lt;/strong&gt; A trail tool that needs a data plan is not a trail tool. Closed APIs can't make this claim at all — and "we don't send your data anywhere" in a README is worthless next to a live refusal at the socket boundary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing, forever.&lt;/strong&gt; No key, no bill, no 6am-Sunday rate limit when you actually want to go outside. Open weights + local inference + zero-dependency Python = a tool a student can run on a 2019 laptop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I can change its mind.&lt;/strong&gt; The system prompt bans chirpy chatbot words outright; &lt;code&gt;--model&lt;/code&gt; accepts anything Ollama serves. A hosted endpoint kept drifting my prompt toward "embark on a journey of discovery" — with a local model I just rewrote the instructions and regenerated. No lock-in, no roadmap permission slip.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open innovation is what turns AI from a chat window you rent into a field guide you own.&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; 🏔️ — Gemma 3 (&lt;code&gt;gemma3:4b&lt;/code&gt;) via Ollama generates every Field Card's voice; the model auto-resolves to whatever Gemma is on disk, and the whole offline-local argument only works because the weights are open.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Repo: &lt;a href="https://github.com/RaviTeja799/touchgrass" rel="noopener noreferrer"&gt;https://github.com/RaviTeja799/touchgrass&lt;/a&gt; · MIT · Built tonight, used tonight.&lt;/p&gt;

&lt;p&gt;Now go outside. The screen part is over.&lt;/p&gt;

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