<?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: Srivatsa N</title>
    <description>The latest articles on DEV Community by Srivatsa N (@srivatsa_n_e2f43f244fc85b).</description>
    <link>https://dev.to/srivatsa_n_e2f43f244fc85b</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%2F4051948%2Fdb976c07-b4a4-4c0f-afe8-2d48ce7a7aea.png</url>
      <title>DEV Community: Srivatsa N</title>
      <link>https://dev.to/srivatsa_n_e2f43f244fc85b</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/srivatsa_n_e2f43f244fc85b"/>
    <language>en</language>
    <item>
      <title>Plan Explainer: the PR comment that stops your client from saying 'looks good' to 2 deleted databases</title>
      <dc:creator>Srivatsa N</dc:creator>
      <pubDate>Sat, 17 Oct 2026 16:13:29 +0000</pubDate>
      <link>https://dev.to/srivatsa_n_e2f43f244fc85b/plan-explainer-the-pr-comment-that-stops-your-client-from-saying-looks-good-to-2-deleted-p2p</link>
      <guid>https://dev.to/srivatsa_n_e2f43f244fc85b/plan-explainer-the-pr-comment-that-stops-your-client-from-saying-looks-good-to-2-deleted-p2p</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;Your client opens the pull request and sees this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Plan: 3 to add, 1 to change, 2 to destroy.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They reply "looks good". Or they panic and block everything. Both are wrong, because "2 to destroy" might be a test bucket or it might be the orders database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan Explainer&lt;/strong&gt; is a GitHub Action that translates the plan for the person who has to sign off.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plain code decides.&lt;/strong&gt; It reads the plan JSON, and anything that deletes or replaces a resource requires sign-off. The model never makes this call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A local Gemma model explains.&lt;/strong&gt; It writes a short comment in plain English, ending with the questions the client must answer first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who would pay:&lt;/strong&gt; freelance infrastructure consultants and small agencies. Their clients must approve every change but can't read a plan, so the consultant carries all the risk of a blind "yes". The consultant pays for a paper trail that says the client was asked about backups before approving. It protects the next invoice and the relationship, and it is an easy upsell as a "change-approval report" line item on a retainer.&lt;/p&gt;

&lt;p&gt;It works with OpenTofu too.&lt;/p&gt;

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

&lt;p&gt;There is no hosted demo, because it runs inside CI on the pull request itself. This is the format of the comment the client sees:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sign-off required.&lt;/strong&gt; This replaces &lt;code&gt;aws_db_instance.orders&lt;/code&gt;, so the database is destroyed and rebuilt. &lt;strong&gt;Do you have a backup from today?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Source code: &lt;a href="https://github.com/srivatsan084/Plan-explainer" rel="noopener noreferrer"&gt;https://github.com/srivatsan084/Plan-explainer&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The open-source AI is &lt;strong&gt;Gemma, an open-weight model, run locally with Ollama&lt;/strong&gt; on the consultant's own CI runner. The project is built around a strict split: rules decide, the model only explains.&lt;/p&gt;

&lt;p&gt;The rules are plain Python reading &lt;code&gt;resource_changes[]&lt;/code&gt; from &lt;code&gt;terraform show -json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;classify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;change&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;actions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;delete&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;destroy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;delete&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;create&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;replace&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;update&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;STATEFUL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;update-stateful&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Destroys and replaces fail the check until the client signs off. Only then is the model called, and it receives resource addresses, types and actions, never values. If Ollama is down, the Action posts a plain template comment instead, so the gate never depends on the model.&lt;/p&gt;

&lt;p&gt;I used Claude to draft the rules and script, then checked the logic against Terraform's JSON plan format.&lt;/p&gt;

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

&lt;p&gt;A Terraform plan is a map of someone else's infrastructure. Most clients won't let that leave their CI, which rules out a closed API for this job.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero leakage:&lt;/strong&gt; Gemma runs on the consultant's own runner. Even then, the model only sees addresses and actions, because &lt;code&gt;terraform show -json&lt;/code&gt; can print sensitive values in plain text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero marginal cost:&lt;/strong&gt; no per-token bill, so it can be bundled into a retainer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No lock-in:&lt;/strong&gt; swapping models is one environment variable, and the client can audit exactly what is running.&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; Gemma, served locally via Ollama, writes the client-facing explanation and the approval questions.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>Hacktoberfest 2026 challenge</title>
      <dc:creator>Srivatsa N</dc:creator>
      <pubDate>Sun, 11 Oct 2026 15:53:03 +0000</pubDate>
      <link>https://dev.to/srivatsa_n_e2f43f244fc85b/hacktoberfest-2026-challenge-1ac4</link>
      <guid>https://dev.to/srivatsa_n_e2f43f244fc85b/hacktoberfest-2026-challenge-1ac4</guid>
      <description>&lt;p&gt;🌱 TouchGrass — Go Outside. Touch Grass. Earn Your Place.&lt;/p&gt;

&lt;p&gt;This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/p&gt;

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

&lt;p&gt;TouchGrass is a Strava-inspired outdoor activity platform designed to encourage people to spend less time behind a screen and more time outside.&lt;/p&gt;

&lt;p&gt;Users can log hiking, running, cycling, and diving activities, record GPS trails, upload outdoor photos, earn Grass XP, maintain streaks, complete challenges, and compete on weekly and all-time leaderboards.&lt;/p&gt;

&lt;p&gt;The core idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Go outside → do something → prove it → earn XP → climb the leaderboard. 🌱&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Key Features&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🥾 Activity Tracking — Log hiking, running, cycling, and diving with distance, duration, elevation, title, and location.&lt;/li&gt;
&lt;li&gt;🗺️ GPS Trails — Record your route directly from the browser and visualize it using OpenStreetMap.&lt;/li&gt;
&lt;li&gt;📸 Private Photo Uploads — Upload geotagged outdoor photos up to 15 MB, stored privately under your account.
-Proof of Grass — Activity cards display AI confidence, authenticity status, and earned XP.&lt;/li&gt;
&lt;li&gt;Explore — Discover nearby outdoor routes.&lt;/li&gt;
&lt;li&gt;Leaderboards — Compete for Grass XP and streaks in weekly and all-time rankings.&lt;/li&gt;
&lt;li&gt;Challenges — Join outdoor challenges and earn additional rewards.&lt;/li&gt;
&lt;li&gt;Social Feed — Give kudos, comment, share activities, and filter between community and your own activities.&lt;/li&gt;
&lt;li&gt;🧪 Demo Data — Sample activities are clearly labelled so they can never be mistaken for real user activity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to make the screen the shortest part of the experience.&lt;/p&gt;

&lt;p&gt;Demo&lt;/p&gt;

&lt;p&gt;The application demonstrates activity tracking, GPS route visualization, photo uploads, Proof of Grass cards, leaderboards, challenges, exploration, and social features.&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;GitHub:&lt;br&gt;
&lt;a href="https://github.com/srivatsan084/Touchgrass.git?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;TouchGrass GitHub Repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is open source and contains the implementation of the activity tracking, GPS mapping, authentication, social feed, leaderboards, challenges, and Proof of Grass experience.&lt;/p&gt;

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

&lt;p&gt;TouchGrass is built as a full-stack application using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React + TypeScript — Frontend&lt;/li&gt;
&lt;li&gt;FastAPI + Python — Backend/API&lt;/li&gt;
&lt;li&gt;PostgreSQL/PostGIS — Activity and geospatial data&lt;/li&gt;
&lt;li&gt;OpenStreetMap + Leaflet — Maps and GPS routes&lt;/li&gt;
&lt;li&gt;Open-source AI architecture — Designed for local/open-weight image analysis&lt;/li&gt;
&lt;li&gt;Browser Geolocation API — Real-time activity tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI layer is designed to analyze uploaded activity photos and combine visual signals with GPS, EXIF metadata, timestamps, and activity information to produce an activity confidence and authenticity assessment.&lt;/p&gt;

&lt;p&gt;The important design decision is that the AI is intended to be replaceable and locally runnable, rather than making the application dependent on a proprietary closed AI API.&lt;/p&gt;

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

&lt;p&gt;Outdoor photos can contain personal information about where someone was, when they were there, and what they were doing.&lt;/p&gt;

&lt;p&gt;Using an open AI approach gives TouchGrass the possibility of running image analysis locally or on infrastructure controlled by the user instead of automatically sending every photograph to a proprietary AI service.&lt;/p&gt;

&lt;p&gt;Open models also make the AI layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replaceable — Models can be swapped as better ones become available.&lt;/li&gt;
&lt;li&gt;Inspectable — Developers can understand and modify the pipeline.&lt;/li&gt;
&lt;li&gt; Privacy-friendly — Local inference can keep photos away from third-party servers.&lt;/li&gt;
&lt;li&gt;Experimentable — The verification system can be improved without being locked to one provider.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is especially important for TouchGrass because the photos are evidence of someone's real-world activities.&lt;/p&gt;

&lt;p&gt;Current Limitations &amp;amp; What's Next&lt;/p&gt;

&lt;p&gt;There are currently two areas still under development:&lt;/p&gt;

&lt;p&gt;Real AI Photo Verification&lt;/p&gt;

&lt;p&gt;The Proof of Grass interface is ready for the AI verification pipeline, but a production-ready hosted open-weight vision/forensics model still needs to be integrated.&lt;/p&gt;

&lt;p&gt;The next step is to run an open-weight model locally or through dedicated inference infrastructure for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Activity recognition&lt;/li&gt;
&lt;li&gt;Outdoor scene classification&lt;/li&gt;
&lt;li&gt;Image authenticity signals&lt;/li&gt;
&lt;li&gt;GPS/photo consistency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FastAPI Deployment&lt;/p&gt;

&lt;p&gt;The FastAPI service currently requires separate Python hosting. Deploying the backend alongside the frontend is part of the next iteration.&lt;/p&gt;

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

&lt;p&gt;The project was developed with an AI-assisted workflow, using agents to help design and implement the application architecture, UI, backend functionality, and feature iterations.&lt;/p&gt;

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

&lt;p&gt;Primary: Open-Source AI / Touch Grass&lt;/p&gt;

&lt;p&gt;TouchGrass uses open-source AI as a planned core component of real-world activity verification while encouraging users to physically leave the screen and participate in outdoor activities.&lt;/p&gt;

&lt;p&gt;Final Thought&lt;/p&gt;

&lt;p&gt;Most fitness apps ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How much did you exercise?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;TouchGrass asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Did you actually touch grass?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Go outside. Touch grass. Earn your place. 🌱🏆&lt;/p&gt;

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