<?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: Gabi</title>
    <description>The latest articles on DEV Community by Gabi (@gabi_26).</description>
    <link>https://dev.to/gabi_26</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%2F4133132%2Fe63d83b4-a9df-4bef-a710-b0fdd73193ea.png</url>
      <title>DEV Community: Gabi</title>
      <link>https://dev.to/gabi_26</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gabi_26"/>
    <language>en</language>
    <item>
      <title>Touch Grass Trail: a photo scavenger hunt to get you out the door</title>
      <dc:creator>Gabi</dc:creator>
      <pubDate>Sun, 11 Oct 2026 00:54:54 +0000</pubDate>
      <link>https://dev.to/gabi_26/touch-grass-trail-a-photo-scavenger-hunt-to-get-you-out-the-door-36c8</link>
      <guid>https://dev.to/gabi_26/touch-grass-trail-a-photo-scavenger-hunt-to-get-you-out-the-door-36c8</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;I built this because I wanted to take something that has helped me so much and use it to help other people too.&lt;/p&gt;

&lt;p&gt;When I have a setback, what gets me out of bed and out of my room is running, especially outdoors. If I stay on my phone all that time, I get even worse, so the best way out is to move. I found myself in running. At first I couldn't do it, and building stamina was hard, but you never get anywhere if you don't at least try. Today I really love it. It clears my head, it helps me live a better and more active life, and I even started eating better, all thanks to running.&lt;/p&gt;

&lt;p&gt;I have also always been passionate about photography, so I decided to put the two things I love together, to help someone else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Touch Grass Trail&lt;/strong&gt; is a small web app that gives you a list of simple missions for a walk (spot a bird, find a flower, look up at the sky), then gets out of the way. You take photos along the way, and back home an open-weight model checks them and builds a scrapbook-style album. It's for anyone who wants a small reason to step outside, alone, with family or with friends. It's not therapy and it's not a cure. It's a small nudge to leave the screen behind.&lt;/p&gt;

&lt;h3&gt;
  
  
  An app that wants you to put your phone down
&lt;/h3&gt;

&lt;p&gt;I know how that sounds: an app built to get you off your phone. Here is how I tried to make it honest.&lt;/p&gt;

&lt;p&gt;Touch Grass Trail never asks you to look at the screen while you're out. The missions are written at home, before you leave, [and you can print the list or save it as an image so the phone can stay in your pocket]. There is no feed, no notifications, no account and nothing to scroll.&lt;/p&gt;

&lt;p&gt;The only thing the phone does on the walk is the one thing I think it is actually good at: it is a camera. A camera pulls you in the opposite direction from a feed. When you scroll, you move past the world. When you are looking for something to photograph, you stop and look at it.&lt;/p&gt;

&lt;p&gt;Back home, the screen has a small job with a clear end: add your photos, see what you found, print the album. Then close it.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Writes six missions&lt;/strong&gt; for your place and the season. Each walk gets a different storytelling voice (a detective, a pirate, a nature documentary narrator...), and the missions are always things you can find almost anywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checks your photos at home with a vision model.&lt;/strong&gt; Gemma looks at each photo, says whether it matches the mission, and adds a short fun fact. If it isn't sure, you can still count the photo, because a walk shouldn't be graded by a small model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Builds an album&lt;/strong&gt; with polaroid-style photos, empty slots for what you didn't find, and a print / save-as-PDF button.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The look is inspired by the journal in Life is Strange: paper, tape, sticky notes.&lt;/p&gt;

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

&lt;p&gt;This app runs on your own computer on purpose, so there is no hosted link: your photos never leave your machine, and a public server would defeat that.&lt;/p&gt;

&lt;p&gt;[Video:(&lt;a href="https://youtu.be/UXPnlnylLJY)" rel="noopener noreferrer"&gt;https://youtu.be/UXPnlnylLJY)&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%2Fja8pqczrer02516y0uqw.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%2Fja8pqczrer02516y0uqw.png" alt=" " width="800" height="486"&gt;&lt;/a&gt;&lt;br&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%2Ftl9gechywnn2pc934j63.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%2Ftl9gechywnn2pc934j63.png" alt=" " width="799" height="491"&gt;&lt;/a&gt;&lt;br&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%2Fw6yoy0fqy00qufybscsu.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%2Fw6yoy0fqy00qufybscsu.png" alt=" " width="800" height="558"&gt;&lt;/a&gt;&lt;br&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%2Fbqily0mydqq35z25pj0a.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%2Fbqily0mydqq35z25pj0a.png" alt=" " width="799" height="505"&gt;&lt;/a&gt;&lt;br&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%2F5s2kn4fpaj1sasfvc8iw.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%2F5s2kn4fpaj1sasfvc8iw.png" alt=" " width="800" height="460"&gt;&lt;/a&gt;&lt;br&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%2Fb7pg4m8lvkdyy14s8yao.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%2Fb7pg4m8lvkdyy14s8yao.png" alt=" " width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/gabi-gasparini/touch-grass-trail.git" rel="noopener noreferrer"&gt;https://github.com/gabi-gasparini/touch-grass-trail.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two files and no dependencies: &lt;code&gt;server.mjs&lt;/code&gt; and &lt;code&gt;index.html&lt;/code&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 (4B)&lt;/strong&gt; running locally through &lt;strong&gt;Ollama&lt;/strong&gt;, to write the missions and to read the photos&lt;/li&gt;
&lt;li&gt;A tiny &lt;strong&gt;Node.js&lt;/strong&gt; server with no dependencies&lt;/li&gt;
&lt;li&gt;A single &lt;code&gt;index.html&lt;/code&gt;, with plain CSS and JavaScript and no build step&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It runs on a computer with &lt;strong&gt;8 GB of RAM and no graphics card&lt;/strong&gt;. From my phone, I open the same page over my home Wi-Fi, so the photos go straight to my computer.&lt;/p&gt;

&lt;h3&gt;
  
  
  What went wrong (and what I learned)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A small model is bad at inventing tasks.&lt;/strong&gt; My first idea was to let Gemma invent the missions. It assumed an autumn park (it was spring where I live), sent me to a "forest floor" in a city park, and asked me to photograph a sound. So I split the work: the code picks the target from a curated list, and Gemma writes only the playful title and hint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My first curated list was still too clever.&lt;/strong&gt; It asked for a spiral-shaped leaf, a spiky leaf, a crimson flower. Nobody finds those on a normal walk. I rewrote it around things that exist everywhere: a bird, a flower, something yellow, tree bark, the sky, a stone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured output wasn't free.&lt;/strong&gt; With a JSON schema, the 4B model ended its strings with a curly quote and kept generating &lt;code&gt;1 0 0 0 0...&lt;/code&gt;. That run took 519 seconds. Plain text lines, one mission per request, fixed it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Node's &lt;code&gt;fetch&lt;/code&gt; gives up after five minutes.&lt;/strong&gt; My first photo check on a CPU went past that and Node threw a &lt;code&gt;HeadersTimeoutError&lt;/code&gt;. I switched to the plain &lt;code&gt;http&lt;/code&gt; module and queued the checks, so photos don't fight for 8 GB of RAM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model was grading homework nobody assigned.&lt;/strong&gt; On my walk, two photos were rejected. A bird walking on the grass failed because the mission said "a bird perched on a branch", and a flowerbed of pale yellow-green ornamental kale failed because it said "a single, vibrant yellow petal". Gemma read both photos correctly. My generator had invented those extra requirements. The fix: the code now writes the "what to photograph" line itself from the simple target ("a bird"), and the check judges only that target, with a prompt that is generous about small differences. &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%2Frvx5q2dnjh1q7co866xi.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%2Frvx5q2dnjh1q7co866xi.png" alt=" " width="799" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The honest numbers
&lt;/h3&gt;

&lt;p&gt;With the model warmed up, each mission takes about 27 to 42 seconds to write (the first took 100 seconds, because the model had to load). A photo check takes [190 seconds]. That is slow for an app, but it fits this use: you prepare at home, then you go outside.&lt;/p&gt;

&lt;h3&gt;
  
  
  Taking it outside
&lt;/h3&gt;

&lt;p&gt;I took it on a real walk. [6 of 6 missions found. What was easy, what was hard, what you skipped and why. How many times you needed the screen. Anything that surprised you.]&lt;/p&gt;

&lt;p&gt;I also tried a wrong photo on purpose (a picture of clouds for a ground-texture mission), and Gemma said it wasn't sure. I haven't stress-tested false positives beyond that, so I can't promise the generous prompt never says yes to something it shouldn't.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your photos never leave your computer.&lt;/strong&gt; Everything runs through Ollama on my own machine. From the phone, photos travel over my home Wi-Fi to my computer, not to anyone's server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No cost per use, no account, no API key.&lt;/strong&gt; Going for a walk shouldn't need a subscription.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works without internet&lt;/strong&gt; once the model is downloaded. The page loads nothing from the web.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Models are one line of code.&lt;/strong&gt; The photo-reading model and the writing model are two constants in &lt;code&gt;server.mjs&lt;/code&gt;, so I can swap either without touching anything else.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where a closed API would have been better: speed. A hosted model would have answered in seconds. I chose to wait, because for this project, keeping your photos at home matters more than a faster answer.&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 (4B), running locally on CPU, both writes the missions and reads the photos.&lt;/li&gt;
&lt;/ul&gt;

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