<?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: Suresh</title>
    <description>The latest articles on DEV Community by Suresh (@suresh_dahal).</description>
    <link>https://dev.to/suresh_dahal</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%2F4158809%2Faf13a6e0-9a03-4f44-bcbe-2b7c1533f225.jpg</url>
      <title>DEV Community: Suresh</title>
      <link>https://dev.to/suresh_dahal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/suresh_dahal"/>
    <language>en</language>
    <item>
      <title>Touch Grass Challenge — AI Gives You a Reason to Go Outside</title>
      <dc:creator>Suresh</dc:creator>
      <pubDate>Wed, 07 Oct 2026 10:35:56 +0000</pubDate>
      <link>https://dev.to/suresh_dahal/touch-grass-challenge-ai-gives-you-a-reason-to-go-outside-25im</link>
      <guid>https://dev.to/suresh_dahal/touch-grass-challenge-ai-gives-you-a-reason-to-go-outside-25im</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;outside | AI plans. You go.&lt;/strong&gt;&lt;br&gt;
It is a local-first outdoor challenge planner powered by an open-weight AI model.&lt;/p&gt;

&lt;p&gt;You tell it:&lt;/p&gt;

&lt;p&gt;where you are&lt;br&gt;
what you enjoy&lt;br&gt;
how often you want to go outside&lt;br&gt;
how much time you have each day&lt;br&gt;
what you want to get out of the experience&lt;/p&gt;

&lt;p&gt;The AI then creates a personalized set of outdoor challenges for the current month.&lt;/p&gt;

&lt;p&gt;Instead of giving you another chatbot to talk to, the app gives you something to do.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Take a different route home&lt;br&gt;
Find five signs of the current season&lt;br&gt;
Explore somewhere you've never walked&lt;br&gt;
Watch the sunset somewhere new&lt;br&gt;
Notice three unfamiliar plants&lt;/p&gt;

&lt;p&gt;You can complete challenges as you go, optionally leave a short note about the experience, and track your progress throughout the month.&lt;/p&gt;

&lt;p&gt;When all challenges are completed, the AI generates a reflection based on what you actually did and the notes you left.&lt;/p&gt;

&lt;p&gt;Then you can:&lt;/p&gt;

&lt;p&gt;repeat the experience&lt;br&gt;
create something new&lt;br&gt;
let the AI decide what comes next&lt;/p&gt;

&lt;p&gt;The app also uses the current month and season when creating plans, so the experience can evolve as the year changes.&lt;/p&gt;

&lt;p&gt;Most importantly, the AI isn't the destination. It's the reason to leave the screen.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://drive.google.com/file/d/1IbMlB3jS68w5PDg2pYuoUyu3oUE8f_YV/view?usp=sharing" rel="noopener noreferrer" class="c-link"&gt;
            touch grass challenge.mkv - Google Drive
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fssl.gstatic.com%2Fdocs%2Fdoclist%2Fimages%2Fdrive_favicon_2026_32dp.png" width="32" height="32"&gt;
          drive.google.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&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/coderSuresh" rel="noopener noreferrer"&gt;
        coderSuresh
      &lt;/a&gt; / &lt;a href="https://github.com/coderSuresh/touch-grass-challenge" rel="noopener noreferrer"&gt;
        touch-grass-challenge
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Touch Grass Challenge&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;This project is the Touch Grass Challenge for the Hacktoberfest 2026 &lt;code&gt;#### Week 1 DEV Challenge&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Touch Grass Challenge creates personalized outdoor plans with AI. The project contains a Next.js frontend and a NestJS API backed by PostgreSQL and Prisma.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Prerequisites&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Node.js 20 or newer&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Ollama with the configured model available locally&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Setup&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Install dependencies in both packages:&lt;/p&gt;
&lt;div class="highlight highlight-source-powershell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;cd backend
npm install

cd ..\frontend
npm install&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Create &lt;code&gt;backend/.env&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-source-dotenv notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-v"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;postgresql://postgres:postgres@localhost:5432/touch_grass&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
&lt;span class="pl-v"&gt;PORT&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;3001&lt;/span&gt;
&lt;span class="pl-v"&gt;FRONTEND_URL&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;http://localhost:3000&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
&lt;span class="pl-v"&gt;OLLAMA_BASE_URL&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;http://localhost:11434&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
&lt;span class="pl-v"&gt;OLLAMA_MODEL&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;gemma4:7.5b&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Create &lt;code&gt;frontend/.env.local&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-source-dotenv notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-v"&gt;NEXT_PUBLIC_API_URL&lt;/span&gt;&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;http://localhost:3001&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Make sure the PostgreSQL database exists, then generate Prisma Client, apply migrations, and optionally seed sample data:&lt;/p&gt;
&lt;div class="highlight highlight-source-powershell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;cd backend
npm run prisma:generate
npm run prisma:migrate
npm run prisma:seed&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;If using Ollama locally, pull the configured model before starting the API:&lt;/p&gt;
&lt;div class="highlight highlight-source-powershell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;ollama pull gemma4:&lt;span class="pl-c1"&gt;7.&lt;/span&gt;5b&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&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/coderSuresh/touch-grass-challenge" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;This full-stack web app is built around local AI inference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack&lt;/strong&gt;&lt;br&gt;
Next.js&lt;br&gt;
TypeScript&lt;br&gt;
Tailwind CSS&lt;br&gt;
NestJS&lt;br&gt;
PostgreSQL&lt;br&gt;
Prisma&lt;br&gt;
Ollama&lt;br&gt;
Gemma 4&lt;/p&gt;

&lt;p&gt;The architecture is:&lt;/p&gt;

&lt;p&gt;Next.js&lt;br&gt;
   ↓&lt;br&gt;
NestJS REST API&lt;br&gt;
   ↓&lt;br&gt;
AI Service&lt;br&gt;
   ↓&lt;br&gt;
Ollama&lt;br&gt;
   ↓&lt;br&gt;
Gemma 4&lt;br&gt;
   ↓&lt;br&gt;
PostgreSQL&lt;/p&gt;

&lt;p&gt;The browser never communicates directly with the AI model.&lt;/p&gt;

&lt;p&gt;The NestJS backend sends the user's preferences and the current temporal context to the local AI service.&lt;/p&gt;

&lt;p&gt;Gemma is used for the parts that actually benefit from generative AI:&lt;/p&gt;

&lt;p&gt;creating personalized outdoor challenges&lt;br&gt;
adapting incomplete challenges when circumstances change&lt;br&gt;
generating an end-of-month reflection&lt;br&gt;
creating the next set of challenges based on previous experiences&lt;/p&gt;

&lt;p&gt;The rest is deterministic application logic.&lt;/p&gt;

&lt;p&gt;For example, the application handles progress, completion state, dates, seasons, and database operations rather than asking the AI to calculate them.&lt;/p&gt;

&lt;p&gt;The AI also returns structured JSON, which is validated by the backend before anything is stored in PostgreSQL.&lt;/p&gt;

&lt;p&gt;There is no authentication in this version. I wanted the experience to start immediately without turning a simple outdoor tool into another account-based platform.&lt;/p&gt;

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

&lt;p&gt;The biggest reason I chose local open-weight AI is independence.&lt;/p&gt;

&lt;p&gt;This application isn't fundamentally dependent on sending someone's preferences, plans, and personal reflections to a closed AI API.&lt;/p&gt;

&lt;p&gt;With Ollama and Gemma running locally, the AI inference can happen on the user's own machine.&lt;/p&gt;

&lt;p&gt;That also makes the idea of an offline AI application much more tangible.&lt;/p&gt;

&lt;p&gt;Once the model and application are installed, I can disconnect from the internet and still generate outdoor challenges locally.&lt;/p&gt;

&lt;p&gt;That's particularly fitting for this project.&lt;/p&gt;

&lt;p&gt;A tool whose purpose is to get you away from the internet shouldn't necessarily require the internet to think.&lt;/p&gt;

&lt;p&gt;Open models also made experimentation much easier. I could build the AI layer around a model running on my own hardware, control the prompts and structured output, and design the product around the capabilities of the model rather than around a remote API dependency.&lt;/p&gt;

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