<?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: razorbill</title>
    <description>The latest articles on DEV Community by razorbill (@razorbillworks).</description>
    <link>https://dev.to/razorbillworks</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%2F4161347%2Fe3727924-a673-4f34-9e32-b548ad63bee9.jpg</url>
      <title>DEV Community: razorbill</title>
      <link>https://dev.to/razorbillworks</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/razorbillworks"/>
    <language>en</language>
    <item>
      <title>SlothOps: Finding the Cloud VMs I Was Too Lazy to Turn Off</title>
      <dc:creator>razorbill</dc:creator>
      <pubDate>Sun, 25 Oct 2026 10:03:09 +0000</pubDate>
      <link>https://dev.to/razorbillworks/slothops-finding-the-cloud-vms-i-was-too-lazy-to-turn-off-ecj</link>
      <guid>https://dev.to/razorbillworks/slothops-finding-the-cloud-vms-i-was-too-lazy-to-turn-off-ecj</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;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Every cloud engineer knows the dread of opening a monthly invoice and spotting an &lt;code&gt;n1-standard-4&lt;/code&gt; instance that has been running silently for weeks. You spun it up on a Friday afternoon to test something, promised yourself you'd turn it off before leaving, and closed your laptop instead.&lt;/p&gt;

&lt;p&gt;Stopping it should be easy, but the friction gets in the way:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the Google Cloud Console.&lt;/li&gt;
&lt;li&gt;Wait for the dashboard to load.&lt;/li&gt;
&lt;li&gt;Jump into Compute Engine.&lt;/li&gt;
&lt;li&gt;Cycle through a dozen regions because you can't remember if the test box was in &lt;code&gt;us-central1&lt;/code&gt; or &lt;code&gt;europe-west3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click through monitoring graphs to confirm CPU has been flat at zero.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;SlothOps&lt;/strong&gt; is built to reward pure developer laziness. It's a local cloud auditor that turns multi-region cleanup into a single terminal command. It lists your compute instances, passes the inventory to a local &lt;strong&gt;Gemma 2 (2B)&lt;/strong&gt; open-weight model, and hands you the exact &lt;code&gt;gcloud&lt;/code&gt; command to shut the waste down.&lt;/p&gt;

&lt;p&gt;No console hopping, no forgotten test boxes, and no metered API charges.&lt;/p&gt;

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

&lt;p&gt;SlothOps running inside Google Cloud Shell, auditing a sample idle-instance snapshot:&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%2F3e7v1o6nhh1n1hnlxi6j.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%2F3e7v1o6nhh1n1hnlxi6j.png" alt="SlothOps terminal audit in Google Cloud Shell" width="800" height="739"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Running in offline mode against the bundled &lt;code&gt;instances.json&lt;/code&gt; snapshot.&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/Razorbillworks" rel="noopener noreferrer"&gt;
        Razorbillworks
      &lt;/a&gt; / &lt;a href="https://github.com/Razorbillworks/slothops" rel="noopener noreferrer"&gt;
        slothops
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Local-first GCP FinOps CLI powered by Gemma 2. Identifies idle compute instances and prints ready to run cleanup commands.
    &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;🦥 SlothOps&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A lazy-friendly GCP cost auditor that finds the VMs you forgot to turn off.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you spin up test VMs, sandbox boxes or throwaway Redis nodes on Google Cloud and then forget about them, you know the pain: clicking through every region in the console just to check what's idle. SlothOps does that in one command. It lists your compute instances, hands the metadata to a &lt;strong&gt;local Gemma 2 (2B)&lt;/strong&gt; model, and prints a verdict along with ready-to-run &lt;code&gt;gcloud&lt;/code&gt; commands to shut the waste down.&lt;/p&gt;
&lt;p&gt;Everything runs on your machine. No inference API, no extra bill.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Demo&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Razorbillworks/slothops/assets/demo.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%2FRazorbillworks%2Fslothops%2FHEAD%2Fassets%2Fdemo.png" alt="SlothOps running in Google Cloud Shell"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;SlothOps running in Google Cloud Shell in offline mode, auditing the sample instances.json snapshot.&lt;/em&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;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;              +---------------------+
              |    SlothOps CLI     |
              |       (Rust)        |
              +----------+----------+
                         |
          +--------------+--------------+
          |                             |
     Live mode                    Fallback mode
 gcloud compute instances     read local instances.json
   list --format=json                   |
          |                             |
          +--------------+--------------+
                         |
                         v
              +---------------------+
              |&lt;/code&gt;&lt;/pre&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/Razorbillworks/slothops" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Open source under the MIT License. The repo has the Rust CLI, the Terraform IAM policy, the TypeScript formatting script, and the fallback dataset.&lt;/p&gt;

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

&lt;p&gt;I wanted low friction, predictable behavior, and nothing that can wreck your cloud account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       +------------------------------------+
       |          SlothOps CLI              |
       +-----------------+------------------+
                         |
           +-------------+-------------+
           |                           |
     [Live Mode]                [Fallback Mode]
gcloud compute instances        Read instances.json
   list --format=json                 snapshot
           |                           |
           +-------------+-------------+
                         |
                         v
       +------------------------------------+
       |   Ollama Local Inference Engine    |
       |       Model: Gemma 2 (2B)          |
       +-----------------+------------------+
                         |
                         v
       +------------------------------------+
       | Terminal Audit Verdict             |
       | - Flags zero-utilization instances |
       | - Computes estimated spend         |
       | - Prints exact `gcloud stop` flags |
       +------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Architecture and components
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLI core&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rust (&lt;code&gt;tokio&lt;/code&gt;, &lt;code&gt;reqwest&lt;/code&gt;, &lt;code&gt;serde&lt;/code&gt;, &lt;code&gt;colored&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Native binary in &lt;code&gt;src/main.rs&lt;/code&gt; with sub-second startup and a small memory footprint.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Local AI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gemma 2 (2B) via Ollama&lt;/td&gt;
&lt;td&gt;Reads the instance metadata, flags idle ones, and extracts the affected names. Nothing leaves your machine.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IaC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Terraform / HCL (&lt;code&gt;terraform/main.tf&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Creates a service account limited strictly to &lt;code&gt;roles/compute.viewer&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scripts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TypeScript (&lt;code&gt;scripts/summary.ts&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Structured audit output formatting and JSON summaries.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Safety first: no destructive surprises
&lt;/h3&gt;

&lt;p&gt;Tools that delete cloud resources on their own are risky. SlothOps never executes anything. It isolates the waste, estimates the monthly burn, and prints the exact &lt;code&gt;gcloud&lt;/code&gt; command for you to review and run yourself. You stay in control of your cloud state, and the read-only service account backs that up at the permission level.&lt;/p&gt;

&lt;h3&gt;
  
  
  Execution modes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live mode:&lt;/strong&gt; when &lt;code&gt;gcloud&lt;/code&gt; is authenticated, it runs &lt;code&gt;gcloud compute instances list --format=json&lt;/code&gt; against your active project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline / sandbox fallback:&lt;/strong&gt; if you're not logged in, or you're in an environment like Google Cloud Shell that can't run an Ollama daemon, it falls back to the bundled &lt;code&gt;instances.json&lt;/code&gt; with built-in evaluation logic, so testing never stalls.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Known limitations
&lt;/h3&gt;

&lt;p&gt;Gemma 2 (2B) is a small model and can misjudge an instance, so always read the suggested commands before running them. SlothOps currently covers Compute Engine VMs only, not every GCP resource type.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open Models Matter Here
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero inference cost:&lt;/strong&gt; using an LLM to avoid a surprise $50 bill shouldn't need a paid API. Running Gemma 2 locally costs nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy:&lt;/strong&gt; project IDs, zone layouts, and service names stay on your hardware instead of going to a third-party endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline portability:&lt;/strong&gt; the model lives on your workstation, so you can audit infrastructure dumps without a connection.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Instead of logging in through SSO, opening a pile of console tabs and cross-checking charts region by region, you run one command and get the line you need to stop the billing burn. It turns a chore you keep avoiding into something you can do before locking your screen.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Primary track:&lt;/strong&gt; Hacktoberfest Week 3 - Slow and Steady&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partner category:&lt;/strong&gt; Best Use of Gemma&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gcp</category>
      <category>gemma</category>
    </item>
    <item>
      <title>ScopeCheck: An Air-Gapped Scope Creep &amp; Contract Auditor for Freelancers</title>
      <dc:creator>razorbill</dc:creator>
      <pubDate>Sun, 18 Oct 2026 20:45:53 +0000</pubDate>
      <link>https://dev.to/razorbillworks/scopecheck-an-air-gapped-scope-creep-contract-auditor-for-freelancers-13ea</link>
      <guid>https://dev.to/razorbillworks/scopecheck-an-air-gapped-scope-creep-contract-auditor-for-freelancers-13ea</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;ScopeCheck is an offline, air-gapped auditor that evaluates client revision requests, late-stage change emails, and Statement of Work (SOW) terms without letting a single byte of client data leave your laptop.&lt;/p&gt;

&lt;p&gt;Almost every independent developer knows this exact message pattern near a milestone delivery:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The dashboard looks great! While you have the repo open, could you quickly wire up Stripe, user auth, and PDF export before tomorrow? It should only take a few minutes since the UI is done."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When that lands in your inbox, you usually have two bad choices:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Absorb 10+ hours of unbilled architectural labor just to keep the client happy.&lt;/li&gt;
&lt;li&gt;Draft a blunt, defensive response that strains the relationship right before milestone sign-off.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pasting a client's proprietary technical spec or signed contract into commercial cloud AI tools isn't an option either—doing so leaks unreleased business logic and breaches confidentiality agreements.&lt;/p&gt;

&lt;p&gt;ScopeCheck gives freelancers a safe third option. You paste the client's message into a local studio interface, and it gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Severity Rating (1–10):&lt;/strong&gt; An immediate diagnosis of how far the request steps outside standard delivery boundaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architectural Flagging:&lt;/strong&gt; Calls out the actual technical debt hiding behind innocent wording (e.g., distinguishing between a CSS tweak and new database migrations or payment webhooks).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Pushback Draft:&lt;/strong&gt; Generates a polite, firm negotiation script that validates the idea while framing additions as Phase 2 deliverables with separate pricing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Freelancers and boutique technical agencies lose thousands of dollars every year to unpaid scope creep. ScopeCheck catches that creep before work starts.&lt;/p&gt;

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

&lt;p&gt;ScopeCheck runs locally via Ollama to guarantee client text never hits external servers.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Ingestion &amp;amp; Model Selection
&lt;/h3&gt;

&lt;p&gt;Paste raw emails, Slack messages, or contract clauses directly into the interface:&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%2Fxfryxrg9n63tuyycfxse.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%2Fxfryxrg9n63tuyycfxse.png" alt="ScopeCheck Ingestion" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Breakdown &amp;amp; Negotiation Draft
&lt;/h3&gt;

&lt;p&gt;When auditing a typical "quick revision" asking for payment hooks and logins, the local engine flags the unbilled work and drafts a clear response:&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%2Fnz9740tmfuz15nmnk2vf.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%2Fnz9740tmfuz15nmnk2vf.png" alt="ScopeCheck Audit Output" width="697" height="852"&gt;&lt;/a&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/Razorbillworks" rel="noopener noreferrer"&gt;
        Razorbillworks
      &lt;/a&gt; / &lt;a href="https://github.com/Razorbillworks/scopecheck" rel="noopener noreferrer"&gt;
        scopecheck
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Local, zero-leak scope creep and contract auditor for freelancers powered by Gemma.
    &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;🛡️ ScopeCheck&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An air-gapped, local contractual and scope-creep auditor built for freelance engineers, technical consultants, and boutique digital agencies. Powered by local Google Gemma inference via Ollama.&lt;/p&gt;
&lt;p&gt;Built for the &lt;strong&gt;Hacktoberfest Open-Source AI Challenge: Week 2 (Side Hustle Track)&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The Real Problem with Freelance "Quick Revisions"&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Every independent developer or agency freelancer knows this exact message pattern:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The dashboard looks super clean! Hey, while you still have the codebase open, could you quickly wire up user authentication, Stripe webhooks, and an export-to-PDF button before tomorrow? Should only take a few minutes since the UI is already finished!"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When this happens, freelancers are caught in a bad trade-off:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Eat the cost:&lt;/strong&gt; Do 10+ hours of unpaid architecture, backend plumbing, and QA to avoid an awkward confrontation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Burn the bridge:&lt;/strong&gt; Send a blunt, defensive email that strains client relations right before milestone sign-off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leak client data to cloud AI:&lt;/strong&gt; Paste the…&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/Razorbillworks/scopecheck" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/Razorbillworks/scopecheck" rel="noopener noreferrer"&gt;https://github.com/Razorbillworks/scopecheck&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; Apache 2.0&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Reasoning Engine:&lt;/strong&gt; Google Gemma (&lt;code&gt;gemma2:2b&lt;/code&gt; / &lt;code&gt;gemma3:4b&lt;/code&gt;). Gemma's instruction following is remarkably sharp at dissecting contract nuances and technical requirements without hallucinating clauses that don't exist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Connected directly to &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; via local loopback (&lt;code&gt;localhost:11434&lt;/code&gt;), eliminating external API calls and third-party prompt caching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interface:&lt;/strong&gt; Built with Python 3.10+ and Streamlit, styled with an editorial slate-obsidian layout designed for reading dense contracts cleanly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt Architecture:&lt;/strong&gt; The audit harness strictly separates risk calculation from diplomatic script drafting so the model doesn't blend technical debt with negotiation pleasantries.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Most side hustles and freelance agencies operate under strict non-disclosure agreements (NDAs). &lt;/p&gt;

&lt;p&gt;When you paste an unreleased product brief, API structure, or signed agreement into a proprietary cloud AI service, you lose control of that data. Closed platforms routinely log inputs, retain telemetry, and use prompts for future training cycles. For a contractor, that is an immediate legal liability.&lt;/p&gt;

&lt;p&gt;Open innovation is what makes an offline auditor viable:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;True Data Sovereignty:&lt;/strong&gt; Gemma runs entirely inside your machine's RAM. Zero outbound network calls means client NDAs stay completely intact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictable Unit Economics:&lt;/strong&gt; Closed APIs charge variable per-token fees that add up fast with long documents. A local open model costs exactly $0.00 to run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Vendor Lock-In:&lt;/strong&gt; You don't have to worry about sudden API rate limits, deprecations, or outages while traveling or working on restricted client networks.&lt;/li&gt;
&lt;/ol&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; ScopeCheck uses local Google Gemma models (&lt;code&gt;gemma2:2b&lt;/code&gt; / &lt;code&gt;gemma3:4b&lt;/code&gt;) as its primary analytical engine. Gemma's reasoning ability isolates technical deliverable creep, parses ambiguous client communications, and drafts commercial pushback scripts—all running efficiently on standard developer hardware.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Stopped Guessing Why My Walk Sucks: Building a Zero-Cloud Street Auditor with Gemma</title>
      <dc:creator>razorbill</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:58:30 +0000</pubDate>
      <link>https://dev.to/razorbillworks/i-stopped-guessing-why-my-walk-sucks-building-a-zero-cloud-street-auditor-with-gemma-50fp</link>
      <guid>https://dev.to/razorbillworks/i-stopped-guessing-why-my-walk-sucks-building-a-zero-cloud-street-auditor-with-gemma-50fp</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;Most outdoor and fitness tech introduces a contradictory loop: it encourages you to get outside, then demands that you spend your entire walk staring at an OLED display to check live stats, track badges, or babysit an app interface.&lt;/p&gt;

&lt;p&gt;I wanted the opposite: an open-weight tool where &lt;strong&gt;screen time outside is under two seconds per snapshot&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;walkaudit&lt;/strong&gt;, a lightweight, zero-cloud Python tool that turns an everyday outdoor walk into an empirical pedestrian walkability audit using a local vision model running via Ollama.&lt;/p&gt;

&lt;p&gt;Instead of relying on vague impressions like &lt;em&gt;"the road behind our hostel is terrible,"&lt;/em&gt; walkaudit provides structured civic data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You walk down a lane with your phone at chest height, snapping a photo every 25–30 paces and capturing critical hazards (open drains, broken paths) or amenities (shade, benches).&lt;/li&gt;
&lt;li&gt;You transfer the photos to your laptop via USB cable.&lt;/li&gt;
&lt;li&gt;A local Gemma model processes each image and extracts strictly constrained JSON categories (&lt;code&gt;footpath&lt;/code&gt;, &lt;code&gt;surface&lt;/code&gt;, &lt;code&gt;shade&lt;/code&gt;, &lt;code&gt;obstructions&lt;/code&gt;, &lt;code&gt;hazards&lt;/code&gt;, &lt;code&gt;positives&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The tool applies transparent arithmetic on those labels to compute an objective 1 to 5 walkability score, highlights the hardest and best spots, and prompts Gemma to generate three prioritized civic action points.&lt;/li&gt;
&lt;li&gt;Outputs: A standalone &lt;code&gt;audit_report.html&lt;/code&gt; visual dashboard and an &lt;code&gt;audit.csv&lt;/code&gt; dataset.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is designed for students, daily walkers, and local community groups who want to document their street infrastructure empirically without sharing private photos online.&lt;/p&gt;




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

&lt;p&gt;I field-tested walkaudit on the 350-meter access lane behind my student hostel block across 16 photos taken in daylight.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Overall Audit Report &amp;amp; Scores
&lt;/h3&gt;

&lt;p&gt;The aggregate audit revealed an average score of &lt;strong&gt;2.2 / 5.0&lt;/strong&gt;, with &lt;strong&gt;50% of the lane completely missing a footpath&lt;/strong&gt; and &lt;strong&gt;81% flagging uneven, broken, or unpaved walking surfaces&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%2F4so8gthqbbxsrzkq8bf1.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%2F4so8gthqbbxsrzkq8bf1.png" alt="Overall Audit Report" width="732" height="662"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Full Walking Order Table &amp;amp; Labeled Hazards
&lt;/h3&gt;

&lt;p&gt;The detailed breakdown captured the contrast between functional sections (interlock pavers, benches) and hazardous stretches (open drain pits, standing water, and construction debris narrowing the pedestrian path):&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%2F6mcspffop4jeljk2xy8r.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%2F6mcspffop4jeljk2xy8r.png" alt="Audit Table Breakdown" width="800" height="789"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Terminal Run (Local Execution)
&lt;/h3&gt;

&lt;p&gt;Local inference ran via Ollama on a consumer laptop GPU with zero external API calls:&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%2Fr6cfr0oiw8s8aeqqcbi7.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%2Fr6cfr0oiw8s8aeqqcbi7.png" alt="Terminal Run Output" width="799" height="147"&gt;&lt;/a&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/Razorbillworks" rel="noopener noreferrer"&gt;
        Razorbillworks
      &lt;/a&gt; / &lt;a href="https://github.com/Razorbillworks/walkaudit" rel="noopener noreferrer"&gt;
        walkaudit
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Street walkability audit from walk photos using local Gemma
    &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;walkaudit&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Take photos on a walk, get a walkability report for the street.&lt;/p&gt;
&lt;p&gt;I wanted to know what was actually wrong with the lane I walk every day, in more detail than "it's bad". So I take a photo every few steps and let a small Gemma model that runs on my own laptop label each one: is there a footpath, what is the ground like, is there shade, is anything blocking the way. The tool turns the labels into a one-page report with the worst spots, the best spots and three things to fix first.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Razorbillworks/walkaudit/screenshots/report.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%2FRazorbillworks%2Fwalkaudit%2FHEAD%2Fscreenshots%2Freport.png" alt="The report"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Taking the photos&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Pick a street or lane you can walk in 10 to 15 minutes, in daylight.&lt;/li&gt;
&lt;li&gt;Hold the phone at chest height, pointed along the way you are walking, with the ground in the frame.&lt;/li&gt;
&lt;li&gt;Take a photo every 25 to 30 steps, and one more wherever something is wrong (broken pavement…&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/Razorbillworks/walkaudit" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;GitHub Repository: &lt;a href="https://github.com/Razorbillworks/walkaudit" rel="noopener noreferrer"&gt;https://github.com/Razorbillworks/walkaudit&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Licensed under the MIT License.&lt;/em&gt;&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-Weight Model:&lt;/strong&gt; Google's &lt;strong&gt;Gemma&lt;/strong&gt; (&lt;code&gt;gemma4:e2b&lt;/code&gt;) running locally via &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Dependency Architecture:&lt;/strong&gt; &lt;code&gt;walkaudit.py&lt;/code&gt; relies exclusively on Python standard libraries (&lt;code&gt;urllib.request&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt;, &lt;code&gt;csv&lt;/code&gt;, &lt;code&gt;html&lt;/code&gt;, &lt;code&gt;argparse&lt;/code&gt;, &lt;code&gt;pathlib&lt;/code&gt;). There are no complex virtual environments or package installations required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constrained JSON Schema:&lt;/strong&gt; The prompt strictly enforces structured JSON extraction from Gemma. Invalid tags are discarded, and fallbacks are handled deterministically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic Math over Hallucinated Scores:&lt;/strong&gt; Instead of asking an LLM to generate an arbitrary rating, the 1–5 score is computed with fixed Python arithmetic:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;5.0&lt;/span&gt;
&lt;span class="n"&gt;s&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;absent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;partial&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;footpath&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s&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;uneven&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;broken&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unpaved&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;surface&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;obstructions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hazards&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;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shade&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;none&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;positives&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="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Caching:&lt;/strong&gt; Images are cached in &lt;code&gt;audit_cache.json&lt;/code&gt; keyed by file size and model name. Interrupted runs can be resumed instantly without reprocessing completed images.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;For local physical infrastructure and civic mapping, closed cloud APIs introduce fundamental problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Uncompromised Street Privacy:&lt;/strong&gt; Neighborhood street photography inevitably captures residential doorways, building gates, and passersby. Uploading raw images to proprietary third-party servers creates unnecessary privacy risks. With local open-weight models, image buffers exist strictly in memory on the local machine and never leave it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Marginal Cost:&lt;/strong&gt; Commercial vision endpoints charge per image token. Auditing a 5 km neighborhood route requires hundreds of snapshots, creating budget barriers for student clubs or civic groups. Open models on consumer hardware cost zero marginal dollars.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducibility:&lt;/strong&gt; Proprietary cloud APIs change, deprecate endpoints, or alter internal safety alignments without notice. Running open weights locally guarantees that an audit performed today will run identically next year.&lt;/li&gt;
&lt;/ol&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; (runs Google's Gemma model locally via Ollama for multi-image vision extraction and civic synthesis).&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>DormChef: Midnight Pantry Rescue for Abhishek (Built with Gemma 2 &amp; Ollama)</title>
      <dc:creator>razorbill</dc:creator>
      <pubDate>Sun, 04 Oct 2026 21:48:05 +0000</pubDate>
      <link>https://dev.to/razorbillworks/dormchef-midnight-pantry-rescue-for-abhishek-built-with-gemma-2-ollama-583b</link>
      <guid>https://dev.to/razorbillworks/dormchef-midnight-pantry-rescue-for-abhishek-built-with-gemma-2-ollama-583b</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;h3&gt;
  
  
  The Friend &amp;amp; The Problem
&lt;/h3&gt;

&lt;p&gt;Meet my friend and hostel roommate, &lt;strong&gt;Abhishek&lt;/strong&gt;. Like many engineering students, Abhishek hits the gym regularly and tries to stay consistent with his daily protein intake. &lt;/p&gt;

&lt;p&gt;Hostel life makes that tricky. By late evening, the dining mess is closed, takeout is either unhealthy or completely out of a student budget, and in-room cooking tools are strictly constrained. &lt;/p&gt;

&lt;p&gt;Whenever he searches online for quick recipes, standard cooking apps assume access to a four-burner stove, an oven, and fresh groceries. Worse, general AI models often give dangerous advice. They often suggest cracking raw eggs directly over bare electric kettle heating coils, which burns out the element, sparks a short circuit, and risks hostel fines.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;DormChef&lt;/strong&gt; specifically for Abhishek to rescue midnight meals from random pantry items while respecting real hostel appliance limits and safety constraints.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;DormChef&lt;/strong&gt; is an offline-first, local AI culinary assistant built for minimal dorm setups.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Adaptive Appliance Support:&lt;/strong&gt; While Abhishek's daily room defaults are an &lt;strong&gt;electric kettle&lt;/strong&gt; and a &lt;strong&gt;sandwich toaster&lt;/strong&gt;, DormChef also supports &lt;strong&gt;induction plates&lt;/strong&gt; or &lt;strong&gt;no-cook (assembly only)&lt;/strong&gt; situations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible Dietary Priorities:&lt;/strong&gt; Abhishek can pivot between goals depending on the night: &lt;strong&gt;High protein&lt;/strong&gt;, &lt;strong&gt;Ready in 5 minutes&lt;/strong&gt;, &lt;strong&gt;Comfort food&lt;/strong&gt;, or &lt;strong&gt;Cheap (budget survival)&lt;/strong&gt;, alongside an adjustable spice dial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware-Safe Generation:&lt;/strong&gt; The system prompt enforces strict safety boundaries: it forbids dropping solid food or eggs directly into electric kettle elements (suggesting hot-water bath poaching or mug steeping instead) and advises greaseproof wrapping inside sandwich toasters to avoid messy spills.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Editorial Slip Interface:&lt;/strong&gt; The generated recipe streams token-by-token directly onto a clean, distraction-free receipt slip, complete with macro estimates and a practical &lt;em&gt;"Heads-up"&lt;/em&gt; safety tip.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Demo
&lt;/h3&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%2Fsz1251jyyi35o09ojcx1.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%2Fsz1251jyyi35o09ojcx1.png" alt="DormChef interface setup" width="800" height="455"&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%2Ffuz9nrb2nldi1dimhjlg.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%2Ffuz9nrb2nldi1dimhjlg.png" alt="DormChef recipe output with safety heads-up" width="799" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;DormChef in action: translating 3 eggs, brown bread, and an electric kettle into a realistic, high-protein meal without endangering the kettle coil.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Why Open Innovation Matters
&lt;/h3&gt;

&lt;p&gt;The prompt asks why an open-based approach works better than a closed one, and for dorm life, the answer is practical:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hostel Wi-Fi Independence:&lt;/strong&gt; College Wi-Fi in our dorms frequently drops or throttles past midnight. A closed cloud API is useless without an active internet connection. Because DormChef runs locally via Ollama, it functions 100% offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Cost for Students:&lt;/strong&gt; College students cannot afford $20/month AI subscriptions or recurring per-token API charges just to figure out how to cook eggs and bread. Open-weight models ensure reliable, free access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware-Safe Behavioral Alignment:&lt;/strong&gt; By leveraging Google's Gemma 2 (2B) open weights, we can align the system instructions specifically around dorm appliance safety without running into cloud rate limits or latency bottlenecks.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  The Two-Stage Allergen &amp;amp; Safety Filter
&lt;/h3&gt;

&lt;p&gt;Small language models (like 2B parameter weights) often struggle to strictly follow negative constraints. Asking the model "don't use dairy" will often still result in a recipe with butter.&lt;/p&gt;

&lt;p&gt;To prevent this, DormChef uses a two-stage filter built into the Python application layer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pre-filter (Input sanitization):&lt;/strong&gt; Before the prompt reaches the model, Python scans the pantry items against common allergen groups (dairy, eggs, peanuts, tree nuts, gluten, soy, fish, shellfish). Any matching ingredient is stripped out automatically, and the UI notifies the user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post-filter (Verification):&lt;/strong&gt; When Gemma 2 streams the finished recipe, the text is re-scanned. If a blocked word somehow slipped through, a prominent warning is displayed.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  How I Built It &amp;amp; The Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; &lt;code&gt;Google Gemma 2 (2B)&lt;/code&gt; running locally via Ollama. It operates comfortably on a laptop GPU (taking ~1.6 GB VRAM) and streams responses almost instantaneously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Streamlit with custom ivory-slip styling and real-time token streaming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety Logic:&lt;/strong&gt; Python regex filters that catch and remove allergens before the prompt reaches Gemma, with a secondary check on the output.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Handing It Over: What Abhishek Said
&lt;/h3&gt;

&lt;p&gt;I had Abhishek test it using the basic pantry items in our room. When he entered dairy as an allergy, the app removed butter and instructed him to poach the egg mixture inside a heatproof bowl set into the boiling kettle water instead of cooking raw egg directly against the coil:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The bowl in boiling water idea is clever; our kettle doesn't get messed up, and it runs without needing hostel Wi-Fi."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Prize Categories
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; (Google's open-weight model running locally)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Code Repository
&lt;/h3&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Razorbillworks/dormchef" rel="noopener noreferrer"&gt;https://github.com/Razorbillworks/dormchef&lt;/a&gt;&lt;/p&gt;

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