<?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: qife422</title>
    <description>The latest articles on DEV Community by qife422 (@qife422).</description>
    <link>https://dev.to/qife422</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%2F4177940%2F4af67489-3916-49cf-bd01-151836fb4a5e.png</url>
      <title>DEV Community: qife422</title>
      <link>https://dev.to/qife422</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/qife422"/>
    <language>en</language>
    <item>
      <title>Touch Grass Card: a 270M Gemma in your browser that deals you a reason to go outside</title>
      <dc:creator>qife422</dc:creator>
      <pubDate>Sun, 11 Oct 2026 23:52:12 +0000</pubDate>
      <link>https://dev.to/qife422/touch-grass-card-a-270m-gemma-in-your-browser-that-deals-you-a-reason-to-go-outside-4mmh</link>
      <guid>https://dev.to/qife422/touch-grass-card-a-270m-gemma-in-your-browser-that-deals-you-a-reason-to-go-outside-4mmh</guid>
      <description>&lt;h2&gt;
  
  
  The problem with "touch grass" advice
&lt;/h2&gt;

&lt;p&gt;Everyone tells you to touch grass. Nobody tells you where to walk, what to look for, or how to make 30 free minutes feel like a tiny adventure instead of a lap around the block. So I built the smallest possible tour guide: an open-weight AI that lives entirely in a browser tab and deals you one outdoor mission at a time.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Touch Grass Card&lt;/strong&gt; is a single web page. You tell it where you are (default: my college town, Corvallis, Oregon), how many minutes you can spare, and a vibe — chill, adventurous, curious, social. It then generates a mission card:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Title&lt;/strong&gt; — a name for the mission&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mission&lt;/strong&gt; — exactly what to do, in 2–3 sentences&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look for&lt;/strong&gt; — three things to notice while you're out&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proof&lt;/strong&gt; — one photo to take when you're done&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/qife422/touch-grass-card" rel="noopener noreferrer"&gt;github.com/qife422/touch-grass-card&lt;/a&gt; — it's one HTML file plus this README. That's the whole app.&lt;/p&gt;

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

&lt;p&gt;Live demo: &lt;a href="https://qife422.github.io/touch-grass-card/" rel="noopener noreferrer"&gt;qife422.github.io/touch-grass-card&lt;/a&gt; (first load downloads the model once; after that it runs offline — try it in airplane mode).&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%2F5zv51i16y5vdlbk1vx4l.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%2F5zv51i16y5vdlbk1vx4l.png" alt="Touch Grass Card demo" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The "brain" is &lt;strong&gt;Gemma 3 270M&lt;/strong&gt; (instruction-tuned, ONNX export: &lt;code&gt;onnx-community/gemma-3-270m-it-ONNX&lt;/code&gt;), running on-device via &lt;strong&gt;Transformers.js 4.2.0&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It uses &lt;code&gt;fp32&lt;/code&gt; weights (~1 GB one-time download) on both WebGPU and the WASM fallback. I originally tried the much smaller &lt;code&gt;q4f16&lt;/code&gt; WebGPU weights, but ONNX Runtime has a known overflow bug for this model on the WebGPU fp16 path that makes it emit repeated unused tokens instead of English — no error, just garbage. fp32 is slower to download, but it is the path that actually works on both backends, so that is what the page ships.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no backend, no API key, no analytics. The only "prompt engineering" is a system message that forces a strict four-field output format, because a 270M model needs guardrails the way a golden retriever needs a fence.&lt;/p&gt;

&lt;p&gt;Honest field notes on the model: 16 draws, zero garbled tokens — the fp32 fix held on real hardware (Chrome on Apple Silicon), so the &lt;code&gt;&amp;lt;unused&amp;gt;&lt;/code&gt; bug I guarded against never showed up. The &lt;em&gt;semantic&lt;/em&gt; reliability is the real story, though. Of the 16 missions, only about 3 were actually practical. Two ignored the safety instruction in the system prompt entirely: one proposed building a "Mobile Sensor Jammer" to "launch under the hood," and another ("Rain Cloud Rescue") told me to go find a kidnapped/missing person and call the police. Others were poetic but absurd — "The Whispering Willow" wants a handcrafted wooden box of fallen branches, and one card hallucinated the town completely ("Sunnyvale Weather Report," a city in California, emitting a forecast instead of a mission). The good ones felt genuinely personal — my final pick, "Unplug to Breathe," asked for a short, easy walk to a nearby park and a moment in the sun. A 270M model is a golden retriever: loyal, local, occasionally convinced the mailman is a mission.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open weights are the whole point
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero signal is a feature.&lt;/strong&gt; Once cached, the page works on a trail with no reception — exactly where a "go outside" app should work. A cloud LLM can't follow you there.- &lt;strong&gt;Private by architecture.&lt;/strong&gt; My location text never leaves the page. There is no server for it to leave to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free forever.&lt;/strong&gt; No per-token bill means I can hand this link to anyone. The total hosting cost is a static file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swappable brain.&lt;/strong&gt; The model is one constant in the script. Fine-tune a Gemma on local trail data, or drop in a bigger sibling, and the page gets smarter untouched.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  I actually went outside
&lt;/h2&gt;

&lt;p&gt;Sunday morning, October 11, I took the "Unplug to Breathe" card literally: find a sunny spot, take a short, easy walk to a nearby park. (It was card 9 of 16 — the river card I wanted first turned out to be a 44-minute bus ride away, and I don't have a car, so the little model and I compromised.) After days of gray rain, Corvallis finally gave me blue sky — 46°F at 10 AM, jacket weather, but the sun made it feel generous. I found everything on the card's "look for" list: the grassy open space, the trees starting to turn, the sun. The card's "proof" field, true to form for this 270M model, wasn't actually a photo instruction — it just declared that walking to a park is the most effective way to get outside — so I photographed the park instead: blue sky, green lawn, an empty picnic table under a yellowing tree. Standing there with nothing urgent pulling at me, I felt the past week's rain and small frustrations dissolve a little. It beat scrolling, and it wasn't close.&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%2Fydh7p1i36xf81mnhzgxm.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%2Fydh7p1i36xf81mnhzgxm.jpg" alt="Proof photo" width="800" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd build next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A mission history + streaks (localStorage only — still no server, ever)&lt;/li&gt;
&lt;li&gt;Seasonal prompt packs (fall foliage missions hit different in October)&lt;/li&gt;
&lt;li&gt;A bigger Gemma via WebGPU when available, same page, one-line change&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 3 270M runs locally in the browser; it's the core of the project, not a garnish.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;---&lt;em&gt;Built over a weekend in Corvallis between classes. The code is MIT — fork it, swap the model, go touch grass in your own town.&lt;/em&gt;&lt;/p&gt;

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