<?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: Mahmudur Rahman Labib</title>
    <description>The latest articles on DEV Community by Mahmudur Rahman Labib (@mahmudurrahmanlabib).</description>
    <link>https://dev.to/mahmudurrahmanlabib</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%2F802036%2Fcbc28da4-56a9-4fbe-9c07-ce6e4af4cdca.jpg</url>
      <title>DEV Community: Mahmudur Rahman Labib</title>
      <link>https://dev.to/mahmudurrahmanlabib</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mahmudurrahmanlabib"/>
    <language>en</language>
    <item>
      <title>Touch Grass Nudge: a tiny local-Gemma app that gives you a 10-minute outdoor quest</title>
      <dc:creator>Mahmudur Rahman Labib</dc:creator>
      <pubDate>Wed, 07 Oct 2026 11:58:56 +0000</pubDate>
      <link>https://dev.to/mahmudurrahmanlabib/touch-grass-nudge-a-tiny-local-gemma-app-that-gives-you-a-10-minute-outdoor-quest-33l6</link>
      <guid>https://dev.to/mahmudurrahmanlabib/touch-grass-nudge-a-tiny-local-gemma-app-that-gives-you-a-10-minute-outdoor-quest-33l6</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Touch Grass Nudge&lt;/strong&gt; is a one-file web app with one job: get you away from the screen. Open it, press a button, and it gives you a single 10-minute outdoor quest suited to the weather, like "walk around the block and notice one thing you've never seen before". Go do it, come back, tap "I did it ✅", and it keeps a tally of the quests you've completed.&lt;/p&gt;

&lt;p&gt;It's for anyone who thinks "I should really go outside" at 4pm and then doesn't. The whole interaction takes about ten seconds so that the screen is the shortest part of the day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&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%2Fbebpaujazmzlyh1xbf7m.jpg" 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%2Fbebpaujazmzlyh1xbf7m.jpg" alt="Touch Grass Nudge showing a quest written by gemma3:1b" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it went:&lt;/strong&gt; honestly, I had to try it indoors. It was raining, so my "touch grass" test was a screenshot from the desk and a quest of "walk around your house or yard for a 10-minute reset" that I'm obliged to follow when the rain stops. The weather-aware prompt tells the model to suggest something that works with rain or from a sheltered doorstep, which is exactly the situation I was in.&lt;/p&gt;

&lt;p&gt;In that test the page couldn't get my location, so it said "weather unavailable" and the model got a generic prompt. The location and weather lookup is the part I did not see working end to end.&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/mahmudurrahmanlabib" rel="noopener noreferrer"&gt;
        mahmudurrahmanlabib
      &lt;/a&gt; / &lt;a href="https://github.com/mahmudurrahmanlabib/touch-grass-nudge" rel="noopener noreferrer"&gt;
        touch-grass-nudge
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      One-file app: local Gemma (Ollama) + Open-Meteo suggest a 10-minute outdoor quest
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Touch Grass Nudge&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;One HTML file. Reads your local weather (Open-Meteo, no key), asks a local open-weight model (Gemma via Ollama) for a 10-minute outdoor micro-quest, and tracks completed quests in your browser. No backend, no account, nothing leaves your machine except the weather lookup.&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;ollama pull gemma3:1b
OLLAMA_ORIGINS=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;http://localhost:8000&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; ollama serve   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; allow this page to call Ollama&lt;/span&gt;
python3 -m http.server 8000                           &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; then open http://localhost:8000&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Use &lt;code&gt;?model=&amp;lt;name&amp;gt;&lt;/code&gt; to try another model. If Ollama isn't reachable it falls back to built-in quests.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/mahmudurrahmanlabib/touch-grass-nudge/screenshot.jpg"&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%2Fmahmudurrahmanlabib%2Ftouch-grass-nudge%2FHEAD%2Fscreenshot.jpg" alt="screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;License: MIT&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/mahmudurrahmanlabib/touch-grass-nudge" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; &lt;a href="https://ai.google.dev/gemma" rel="noopener noreferrer"&gt;Gemma&lt;/a&gt; (&lt;code&gt;gemma3:1b&lt;/code&gt;), an open-weight model, running locally through &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;. The page calls Ollama's &lt;code&gt;/api/generate&lt;/code&gt; straight from the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weather:&lt;/strong&gt; &lt;a href="https://open-meteo.com" rel="noopener noreferrer"&gt;Open-Meteo&lt;/a&gt;, free and keyless. The browser's geolocation feeds temperature, rain, wind and sunset time into the prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App:&lt;/strong&gt; a single &lt;code&gt;index.html&lt;/code&gt;, no build step, no backend, no account. Completed quests are stored in &lt;code&gt;localStorage&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback:&lt;/strong&gt; if Ollama isn't reachable, it shows a built-in quest instead of an error.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The prompt took the most tuning. The first version let the 1B model write a fantasy story about a lost lantern; telling it "real, safe activity, no story, exactly 2 short sentences" fixed that.&lt;/p&gt;

&lt;p&gt;I built it with Claude Code as my coding assistant, so this post is flagged as AI-assisted.&lt;/p&gt;

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

&lt;p&gt;A nudge app is only useful if you'll actually open it daily, and that depends on it being free and private:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Costs nothing to run.&lt;/strong&gt; There is no API key or per-request bill, so a ten-second daily habit never becomes a subscription.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your habits stay local.&lt;/strong&gt; Your time of day, your location and your quest history never go to an AI provider. Only a coordinate pair goes to the weather API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swappable.&lt;/strong&gt; A different model is a &lt;code&gt;?model=&lt;/code&gt; URL parameter away. I used a 1B model because it fits on a laptop and answers in seconds.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Best Use of Gemma&lt;/p&gt;

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