<?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: KEV</title>
    <description>The latest articles on DEV Community by KEV (@kev_6c7aceafbcfde2a03ae39).</description>
    <link>https://dev.to/kev_6c7aceafbcfde2a03ae39</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%2F2478392%2Fedbd9ad8-b1b3-4c3b-9744-5dcd618cb0d2.jpg</url>
      <title>DEV Community: KEV</title>
      <link>https://dev.to/kev_6c7aceafbcfde2a03ae39</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kev_6c7aceafbcfde2a03ae39"/>
    <language>en</language>
    <item>
      <title>One park, one sheet of paper: Gemma 4 writes a treasure hunt from the park's real data.</title>
      <dc:creator>KEV</dc:creator>
      <pubDate>Fri, 09 Oct 2026 23:07:03 +0000</pubDate>
      <link>https://dev.to/kev_6c7aceafbcfde2a03ae39/one-park-one-sheet-of-paper-gemma-4-writes-a-treasure-hunt-from-the-parks-real-map-n40</link>
      <guid>https://dev.to/kev_6c7aceafbcfde2a03ae39/one-park-one-sheet-of-paper-gemma-4-writes-a-treasure-hunt-from-the-parks-real-map-n40</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;If your kids are anything like mine, they haven't touched grass lately, and the printable scavenger hunts online don't help: they ask for a pinecone in a city park, or a basketball hoop in a nature preserve. &lt;strong&gt;Grass Pass&lt;/strong&gt; turns your real local park into a one-page, black-and-white treasure hunt for your kid's age, written by the open model &lt;strong&gt;Gemma 4&lt;/strong&gt; from that park's real map and checked by code. The kid hunts with a pencil. The phone stays in your pocket. On Sunday the three kids and I tried it at Celebration Park: &lt;strong&gt;under 2 minutes on a screen, about an hour and a half outside, all 8 finds&lt;/strong&gt; (photos below).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn1ihkic5n9vita17otby.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn1ihkic5n9vita17otby.gif" alt="Screen recording: making a Celebration Park pass on Grass Pass and opening its one-page print view." width="560" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://grass-pass.vercel.app" rel="noopener noreferrer"&gt;grass-pass.vercel.app&lt;/a&gt; (no sign-up to open or print an example; your first new pass each day is free) · &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/c0de128/grass-pass" rel="noopener noreferrer"&gt;github.com/c0de128/grass-pass&lt;/a&gt; (MIT)&lt;/p&gt;

&lt;p&gt;I'm Kevin, a dad in Allen, Texas. I built it for my kids Hunter and Sawyer, and Riley, my girlfriend's son. It's for any grown-up with kids aged 4 to 13, plus a 13+ band for teens and adults.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why not a generic printable?
&lt;/h3&gt;

&lt;p&gt;Because parks aren't generic. Two parks in my town, measured on Oct 5, 2026: Connemara Meadow had &lt;strong&gt;70 wildlife species&lt;/strong&gt; photographed in 14 days and no playgrounds, courts or shelters on the map. Celebration Park had &lt;strong&gt;25 soccer fields&lt;/strong&gt; and no recent sightings at all. A generic hunt fails at both.&lt;/p&gt;

&lt;p&gt;So each pass uses what is really there: &lt;strong&gt;Park Finds&lt;/strong&gt; from OpenStreetMap, &lt;strong&gt;Wild Finds&lt;/strong&gt; from iNaturalist sightings within 1.5 km in 14 days, &lt;strong&gt;Lucky Finds&lt;/strong&gt; ("Maybe!" a dog) when 3+ recent Google reviews mention them, a &lt;strong&gt;Find This Spot&lt;/strong&gt; map with an X on a real landmark, and real &lt;strong&gt;October&lt;/strong&gt; monarch counts. If a source has nothing, the pass says &lt;strong&gt;"No data available"&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  A real pass from the live site
&lt;/h3&gt;

&lt;p&gt;The live site made this pass for &lt;strong&gt;Celebration Park, ages 6-10, on Fri Oct 9, 2026 at 12:27 PM CDT&lt;/strong&gt; (clues by &lt;code&gt;gemma-4-31B-it&lt;/code&gt;). Four of its eight finds, word for word:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Point to a roof with pillars that keep you dry in the rain. &lt;em&gt;(1 on the park map · OpenStreetMap)&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;4.&lt;/strong&gt; Which flat space has a low net strung across its center? &lt;em&gt;(4 on the park map · OpenStreetMap)&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;5.&lt;/strong&gt; Hunt for a sandy area with a white base at every turn. &lt;em&gt;(5 on the park map · OpenStreetMap)&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;7.&lt;/strong&gt; Peek at the path that carries hikers above water. &lt;strong&gt;Stay with your grown-up near water.&lt;/strong&gt; &lt;em&gt;(1 on the park map · OpenStreetMap)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Find This Spot:&lt;/strong&gt; "I have a tower you can climb using ladders and steps. What am I?" (the X is 130 m west of START)&lt;br&gt;
&lt;strong&gt;October special:&lt;/strong&gt; 23 monarchs seen Sep 25-Oct 8 vs 59 in 2025.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;On the grown-up's stub: picnic shelter, tennis courts, baseball fields, bridge; the X is the playground. Find 8 is a Lucky Find: "a dog out for a walk (maybe)", because 4 visitor reviews since Oct 2024 mention dogs.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&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%2F8y6zvkcgpd39rjo2s0ab.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%2F8y6zvkcgpd39rjo2s0ab.png" alt="The printed Celebration Park pass: eight tick boxes, a map with an X, the monarch box, a cut line and the grown-up's answer key." width="800" height="1035"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It has no Wild Finds, and says so: no recent sightings nearby. I'd rather print that than invent a squirrel.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://grass-pass.vercel.app" rel="noopener noreferrer"&gt;https://grass-pass.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 90-second tour, with captions:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/JRNFnu2VWZ0" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Test it in 60 seconds
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://grass-pass.vercel.app" rel="noopener noreferrer"&gt;grass-pass.vercel.app&lt;/a&gt;. No login needed.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Explore&lt;/strong&gt; ("See a real pass, right now."), tap any example park. It opens at once, because the site already made it from live data.&lt;/li&gt;
&lt;li&gt;Press &lt;strong&gt;Print pass&lt;/strong&gt;. You get one black-and-white Letter page (A4 works too): the kid's hunt on top, a cut line, the grown-up's answer key below. "Save as PDF" is fine.&lt;/li&gt;
&lt;li&gt;Make one for &lt;strong&gt;your&lt;/strong&gt; park: type its name, a town or a ZIP, pick a park and an age, and press &lt;strong&gt;Make my pass&lt;/strong&gt;. Your first new pass of the day needs no sign-in. After that, press &lt;strong&gt;Try as a judge&lt;/strong&gt;: one click, no sign-up.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On Oct 9 on the live site, two new passes took about &lt;strong&gt;12 seconds&lt;/strong&gt; each and printed on one page. Most take 10-30 seconds; busy map servers can push it to about 90.&lt;/p&gt;

&lt;h3&gt;
  
  
  We took it outside
&lt;/h3&gt;

&lt;p&gt;On Sunday, Oct 11, I took Hunter (13), Riley (13) and Sawyer (10) to Celebration Park here in Allen, one printed pass each.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sunday at Celebration Park&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time on a screen, making and printing the passes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;under 2 minutes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time outside&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;about 1 hour 30 minutes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Finds found&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;all 8&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It's a really big park, so some finds took about 15 minutes of walking. The fountain was the clue "Look for the water that glitters in the sun as it falls." The dog was a Lucky Find: Grass Pass prints a "(maybe)" dog at this park because recent Google reviews mention dogs there. We found one.&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%2Fz8toguo2f05yt0sbi7ax.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%2Fz8toguo2f05yt0sbi7ax.jpg" alt="Sawyer, Riley and me kneeling on the grass at Celebration Park with our passes, and the dog we found. Captions added by me: the clue and " width="800" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hunter&lt;/strong&gt; liked the drawn map on the pass.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sawyer&lt;/strong&gt; liked how the clues were worded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Riley&lt;/strong&gt; liked how technical and accurate it is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What went wrong:&lt;/strong&gt; the first try at making the pass failed. The app retried on its own and finished. And Sawyer was &lt;em&gt;really&lt;/em&gt; embarrassed when I asked a stranger if we could take a photo with their dog. The owner was lovely, liked the idea, and walked off with my copy of the pass.&lt;/li&gt;
&lt;/ul&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%2Fq5zarmcg1370ss3tvuo6.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%2Fq5zarmcg1370ss3tvuo6.jpg" alt="Hunter, Riley, Sawyer and me holding our passes in front of the park's fountain." width="800" height="598"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Captions added by me. I corrected the colours with an AI photo tool, and the small print on the passes came out scrambled.&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/c0de128" rel="noopener noreferrer"&gt;
        c0de128
      &lt;/a&gt; / &lt;a href="https://github.com/c0de128/grass-pass" rel="noopener noreferrer"&gt;
        grass-pass
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Grass Pass: your ticket to get outside. Printable park treasure-hunt passes built from real park data with open-weight Gemma 4. Hacktoberfest 2026 Week 1.
    &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;Grass Pass: Family time is back! Powered by AI.&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Your ticket to get outside. Pick a park. Print a pass. Phone away.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Read the write-up:&lt;/strong&gt; &lt;a href="https://dev.to/kev_6c7aceafbcfde2a03ae39/one-park-one-sheet-of-paper-gemma-4-writes-a-treasure-hunt-from-the-parks-real-map-n40" rel="nofollow"&gt;our DEV submission post&lt;/a&gt; · &lt;strong&gt;Watch the 90-second tour:&lt;/strong&gt; &lt;a href="https://youtu.be/JRNFnu2VWZ0" rel="nofollow noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Try it live:&lt;/strong&gt; &lt;a href="https://grass-pass.vercel.app" rel="nofollow noopener noreferrer"&gt;https://grass-pass.vercel.app&lt;/a&gt; (live since Oct 8, 2026). The example passes open with no
sign-in. Your first new pass each day needs no sign-in either; for more, press &lt;strong&gt;Try as a judge&lt;/strong&gt; (one click, no
sign-up) or sign in with GitHub or Google.&lt;/p&gt;
&lt;p&gt;Grass Pass turns your local park into a one-page treasure hunt, usually in 10-30 seconds (up to about a minute and a
half for a big park or a slow model; measured, see &lt;a href="https://github.com/c0de128/grass-pass#limitations" rel="noopener noreferrer"&gt;Limitations&lt;/a&gt;). Pick a park and your kid's age
(4-6, 6-10 or 10-13; or 13+ for teens and adults). Code collects what is really in that park. &lt;strong&gt;Gemma 4&lt;/strong&gt; (open weights, Apache-2.0, on
DigitalOcean) picks a fair mix…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/c0de128/grass-pass" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;One Next.js 16 app on Vercel with Zod and Upstash Redis. &lt;strong&gt;2,706 unit tests&lt;/strong&gt; run on recorded real API answers, with no mock data. The README has the privacy table, every limit and how to run the evals. MIT licence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credits and licences&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clues, riddles and trip tips:&lt;/strong&gt; &lt;a href="https://huggingface.co/google/gemma-4-31B-it" rel="noopener noreferrer"&gt;Gemma 4&lt;/a&gt; (&lt;code&gt;gemma-4-31B-it&lt;/code&gt;, Apache-2.0) on DigitalOcean serverless inference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eval comparison model:&lt;/strong&gt; Llama 4 Maverick (Llama 4 Community Licence), on DigitalOcean.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-host test:&lt;/strong&gt; Gemma 4 E2B (&lt;code&gt;gemma4:e2b-it-qat&lt;/code&gt;, Apache-2.0) on &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Map data:&lt;/strong&gt; © &lt;a href="https://www.openstreetmap.org/copyright" rel="noopener noreferrer"&gt;OpenStreetMap contributors&lt;/a&gt;, ODbL 1.0, via &lt;a href="https://nominatim.org/" rel="noopener noreferrer"&gt;Nominatim&lt;/a&gt; and the public Overpass servers (overpass-api.de, maps.mail.ru, overpass.private.coffee).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search results map (added Oct 10):&lt;/strong&gt; &lt;a href="https://maplibre.org/" rel="noopener noreferrer"&gt;MapLibre GL JS&lt;/a&gt; 6.13.0 (BSD-3-Clause) draws free &lt;a href="https://openfreemap.org/" rel="noopener noreferrer"&gt;OpenFreeMap&lt;/a&gt; street tiles (OpenMapTiles, OpenStreetMap data); you pick 1, 3, 5 or 10 miles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wildlife sightings and monarch counts:&lt;/strong&gt; &lt;a href="https://www.inaturalist.org/" rel="noopener noreferrer"&gt;iNaturalist&lt;/a&gt; observers (research grade; names and counts only, no photos).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Species facts:&lt;/strong&gt; Wikipedia (CC BY-SA), via the iNaturalist API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lucky Finds:&lt;/strong&gt; Google Maps review counts via &lt;a href="https://serpapi.com/" rel="noopener noreferrer"&gt;SerpApi&lt;/a&gt; (counts and months only, never review text or names).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weather:&lt;/strong&gt; &lt;a href="https://open-meteo.com/" rel="noopener noreferrer"&gt;Weather data by Open-Meteo.com&lt;/a&gt; (CC BY 4.0) and alerts from the &lt;a href="https://www.weather.gov/" rel="noopener noreferrer"&gt;National Weather Service&lt;/a&gt; (US public domain).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Libraries:&lt;/strong&gt; Next.js and React (MIT), Auth.js / next-auth (ISC), Zod (MIT), Tailwind CSS (MIT), Vitest (MIT), Playwright (Apache-2.0), axe-core (MPL-2.0), Lucide icons (ISC); asset tools opentype.js (MIT) and resvg-js (MPL-2.0).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fonts (SIL OFL 1.1):&lt;/strong&gt; Bricolage Grotesque, DM Sans, Fredoka, Nunito, M PLUS Rounded 1c and Varela Round.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pictures:&lt;/strong&gt; park photos by Robert Nunnally (CC BY 2.0), Vulturesong (CC0) and Jackilometresan (CC0). The home page hero is an AI illustration made with v0 by Vercel, labelled "AI illustration" on the site. Stock clips in the video are licensed from Magnific; the people in them are not my family.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design and build:&lt;/strong&gt; site design v3 by me in v0 by Vercel; later redesigns and most of the code by AI coding agents (Claude Code) at my direction. Logo banner first made with Google Gemini, then traced as SVG.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code from before the contest:&lt;/strong&gt; a few generic helpers (model client, rate limits, request guards) were adapted from my own unpublished practice project of Oct 2, 2026. Everything specific to Grass Pass was written from Oct 5 (first commit 5:11 PM CDT).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  How I used open-source AI
&lt;/h3&gt;

&lt;p&gt;One open-weight model does one job, and plain code does everything else.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gemma 4 31B (&lt;code&gt;gemma-4-31B-it&lt;/code&gt;), open weights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Licence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apache-2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Where it runs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DigitalOcean serverless inference (US), through an OpenAI-compatible API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What it does&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Picks a fair mix of real items for the park and age, writes the kid clues, the Find This Spot riddle and the trip tips&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What it never does&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Decide what is safe, write a number or a date, or invent an item&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Calls per pass&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Usually 1 for the clues (at most 3, with a retry and refills), plus 1 for the trip tips&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Real data: OpenStreetMap, iNaturalist + Wikipedia, Google review counts (SerpApi)
   -&amp;gt; code builds the pool: what is really in this park
   -&amp;gt; code removes anything risky (by species id, before AND after the model)
   -&amp;gt; Gemma 4: strict JSON, may only pick real item ids, writes clues + a quote from the source
   -&amp;gt; code checks every clue against its source; a failing clue is dropped, never rewritten
   -&amp;gt; print: one page, kid's hunt on top, grown-up's stub below
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What code does, so you don't have to trust the model:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Safety is code, not a prompt.&lt;/strong&gt; 71 risky groups (venomous snakes, fire ants, poison ivy and more) are removed by species id &lt;em&gt;and every ancestor id&lt;/em&gt;, before and after the model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every clue must quote its source.&lt;/strong&gt; Each clue's &lt;code&gt;sourceQuote&lt;/code&gt; must appear word for word in that item's map fact or Wikipedia summary. A clue that names its answer, adds a number or has a link is dropped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Season check.&lt;/strong&gt; A flower or fruit clue only survives if people near the park recorded that plant flowering or fruiting this month.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Where DigitalOcean and SerpApi do real work
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DigitalOcean runs the model.&lt;/strong&gt; Every Gemma call the live site makes goes to DigitalOcean serverless inference: usually one call for the clues and one for the trip tips. In the Oct 10 eval, 87 Gemma calls made 53 passes at $0.00107 a pass, with a 9.5 s typical call, and the whole two-model run cost $0.09. (The website itself runs on Vercel.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SerpApi turns Google reviews into evidence.&lt;/strong&gt; The &lt;code&gt;google_maps&lt;/code&gt; engine finds the park, then &lt;code&gt;google_maps_reviews&lt;/code&gt; counts reviews since Oct 2024 that mention dogs, bikes, ducks or skateboards. Three or more mentions print a "Maybe!" find with the count. On the live site's example passes on Oct 10: Arbor Hills (at least 20 reviews mention dogs, at least 20 mention bikes), White Rock Lake (9 dogs, 19 bikes) and Celebration Park (4 dogs). Review text is never shown or sent to the AI, and a new park uses at most 4 of the free plan's 250 searches a month.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the AI adds (vs the same app with no AI)
&lt;/h3&gt;

&lt;p&gt;My eval includes a &lt;strong&gt;no-AI template&lt;/strong&gt;: same data and rules, but each clue is the source sentence with the answer blanked out. Same tree:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No-AI template:&lt;/strong&gt; "_&lt;strong&gt;&lt;em&gt;, commonly known as the _&lt;/em&gt;&lt;/strong&gt; orange, is a small deciduous tree or large shrub, typically growing to 8 to 15 metres"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 4:&lt;/strong&gt; "Look for bumpy, bright yellow-green balls on a tree." (Answer: Osage-orange.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A 7-year-old can use the second one. Across &lt;strong&gt;20 real parks&lt;/strong&gt; (17 in North Texas, plus Zilker, Central Park and Golden Gate Park), recorded live and replayed through the app's code, ages 6-10, re-run Sat Oct 10 after the wording rewrite:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Gemma 4 31B (60 runs)&lt;/th&gt;
&lt;th&gt;Llama 4 Maverick (20 runs)&lt;/th&gt;
&lt;th&gt;No-AI template&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Risky species printed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clues quoting their source word for word&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;94.4%&lt;/td&gt;
&lt;td&gt;100% (copied by design)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complete passes (goal 90%)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;90.2%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;94.1%&lt;/td&gt;
&lt;td&gt;17.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reading level (grade, median; goal 3.5 or less)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.5&lt;/td&gt;
&lt;td&gt;2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clue names its own answer, before my checks (goal 5% or less)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.3%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12.7%&lt;/td&gt;
&lt;td&gt;1.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clues repeated across parks (goal 5% or less)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.6%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.3%&lt;/td&gt;
&lt;td&gt;20.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical / slow model call (goal 10 s / 20 s)&lt;/td&gt;
&lt;td&gt;9.5 s / &lt;strong&gt;25.3 s&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;20.6 s / 31.3 s&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost per pass, clue calls (goal $0.001)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.00107&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.00188&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The whole eval run cost &lt;strong&gt;$0.09&lt;/strong&gt; in model calls. Gemma met 8 of my 10 automatic targets. Llama now completes more passes, but it is twice as slow, costs more and names its own answer in 12.7% of clues (my code removes those, so those clues are lost). The misses, honestly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Slow calls:&lt;/strong&gt; the slowest 5% took 25.3 s (goal 20 s). 4 of 87 Gemma calls timed out, and 1 of 60 test runs was lost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; $0.00107 a pass, just over my $0.001 goal (trip tips add one more call).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The kid check&lt;/strong&gt; (10 printed clues read as a 7-year-old would) is not done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not in the eval:&lt;/strong&gt; the map and Lucky Finds. Older age bands only had 6-park checks on Oct 10 (6 of 6 complete in each band).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The build: a small team of AI agents and a review loop
&lt;/h3&gt;

&lt;p&gt;I built Grass Pass in one week with Claude Code set up as a small team: an architect agent wrote the spec, builder agents worked in parallel, then five reviewer agents (contest rules, security, code quality, accessibility, a tough DEV judge) checked the whole app. Every finding went back to a builder, and the reviewers ran again.&lt;/p&gt;

&lt;p&gt;That loop ran &lt;strong&gt;12 times&lt;/strong&gt; from Oct 5 to Oct 9. The first round found 9 serious problems, 2 of them bad enough to stop a release. Even after launch the reviewers caught real things: when I added AI trip tips, the security reviewer wrote 24 risky test tips, and my filter let 15 through, including "Go barefoot in the creek". Gemma's recorded tips were clean, but the page promised code checks every tip, so the rules were rewritten and every probe became a permanent test.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three things that broke, and how I fixed them
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. The first example pass asked for spring flowers in October.&lt;/strong&gt; "Find a tree with white flowers that have five petals" is a Callery pear. Wikipedia agrees, so my quote check passed it, but it blooms in spring. Quoting a source checks &lt;em&gt;what&lt;/em&gt;, not &lt;em&gt;when&lt;/em&gt;. &lt;strong&gt;Fix:&lt;/strong&gt; a season check on iNaturalist flowering records. Out-of-season plant clues on printed passes went from 6 to 0 in the next eval run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A pass for 10-13-year-olds asked them to hunt a poisonous plant.&lt;/strong&gt; In a test pass for a park in Madison, Wisconsin, a reviewer agent got white snakeroot, which its own Wikipedia summary calls "a poisonous perennial herb". It wasn't on my blocklist. &lt;strong&gt;Fix:&lt;/strong&gt; snakeroot and the hemlocks went on the list, and code now drops any species whose own description says poisonous, toxic, venomous, stings or burns, whatever the model writes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Typing my own ZIP code found parks in Paris.&lt;/strong&gt; A bare "75013" is also a Paris postcode, so a reviewer got "Parks near 75013, Paris" on the live site. &lt;strong&gt;Fix:&lt;/strong&gt; a bare 5-digit ZIP is now looked up as a US ZIP code. Now "75013" lists parks in Allen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Saturday update: plainer clues
&lt;/h3&gt;

&lt;p&gt;On Oct 10 I rewrote how clues are worded for every age band, and the park fact sheets Gemma must quote now use plain words. Same parks, same data, same model:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Before (Oct 6 eval)&lt;/th&gt;
&lt;th&gt;After (Oct 10 eval)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Check the 4 things with a roof and tables below them.&lt;/td&gt;
&lt;td&gt;Count the 4 roofs held up by poles with tables below.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check out the 8 paths over water that carry you to the far side.&lt;/td&gt;
&lt;td&gt;Count the 8 paths that go over water or dips.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where is the narrow ribbon of running water?&lt;/td&gt;
&lt;td&gt;Where is the running water with muddy banks?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spot me! I have sinks and toilets inside for people to use. &lt;em&gt;(the answer was a historic marker)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Where is the object that tells something from long ago?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Not every clue improved: "Which insect is green with blue on its tail end?" became "Who am I? I am a male with a green body and blue on my back segments.", which is worse. And the new wording only passed the eval above on the third full run that day; the first two missed my complete-pass goal (86.3% and 78.4%), mostly from provider timeouts.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it can't do (yet)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It isn't instant.&lt;/strong&gt; A new pass takes 10-30 seconds, and up to about 90 when the free map servers are busy. The slowest 5% of model calls took 25 s (my goal was 20).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quiet parks make short passes.&lt;/strong&gt; When a park has few recent wildlife sightings, there isn't enough real nature to hunt. 4 of 51 eval passes came out short (and 1 was lost to a timeout), and the pass says how many finds are missing instead of padding it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some clues are still vague.&lt;/strong&gt; My own checks flagged 13 of 123 printed Wild Finds, like "Check for a small bird that is yellow."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lucky Finds are rationed.&lt;/strong&gt; SerpApi's free plan allows 12 searches a day on the site. Past that, the pass says Lucky Finds are off for today.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It needs the internet.&lt;/strong&gt; The park facts and age band go to DigitalOcean. Gemma also runs on my laptop, but it takes 1-3 minutes a pass.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tested mostly near home.&lt;/strong&gt; The eval covers 20 parks, most in North Texas, for ages 6-10. Find This Spot and Lucky Finds aren't in the eval yet.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Here is what open weights made possible for &lt;em&gt;this&lt;/em&gt; app, measured:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What open gave me&lt;/th&gt;
&lt;th&gt;What I measured&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;My safety rules, not a vendor's.&lt;/strong&gt; Every check lives in my code and runs the same on any model. Switching models is one setting.&lt;/td&gt;
&lt;td&gt;Llama 4 Maverick ran through the exact same checks: 0 risky species printed and 94.1% complete passes, but a 20.6 s typical call, 1.75x the cost and 12.7% of clues naming their own answer, so Gemma stayed the default.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;I can run it myself.&lt;/strong&gt; The app talks to any OpenAI-compatible server, Ollama included.&lt;/td&gt;
&lt;td&gt;The small Gemma 4 E2B on my laptop's CPU (no GPU, $0): 4 of 5 test passes complete, 96.7% of clues quoting their source, 0 risky species. In the app, one try made a 7-of-8 pass in 96 s.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Cheap enough to give away.&lt;/strong&gt; Pay-per-token, no subscription.&lt;/td&gt;
&lt;td&gt;$0.00107 a pass; the whole eval cost $0.09. Passes are cached per park, age and day, so the next family there costs nothing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;It can't be taken away.&lt;/strong&gt; Gemma 4 is Apache-2.0.&lt;/td&gt;
&lt;td&gt;If my host changes prices or closes, the same weights run somewhere else.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The limits, honestly. Self-hosting is slow: with the app's normal time limit the laptop made 0 of 5 complete passes; it needs 1-3 minutes a pass. The live app isn't offline: the park and age band go to DigitalOcean (nothing about the child is asked for or sent). And I can't claim open beat closed: the closed models on my plan answered "403 forbidden" on Oct 5, so I compared open models only.&lt;/p&gt;

&lt;p&gt;What I like most about building it in the open is the stub at the bottom of every page. The kid gets a pencil and an X on a real map. The grown-up gets a strip of paper that names every source, the date it was checked, and the open model that wrote the clues. Nothing on that page asks you to take it on trust.&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 4 31B writes every clue, riddle and trip tip. On my 20-park eval it was twice as fast as Llama 4 Maverick, cheaper, and named its own answer far less often, Gemma 4 E2B ran through the same checks on a laptop CPU, and Gemma redrafted the site's own copy: 184 blocks sent, 90 shipped (78 still on the site).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of DigitalOcean:&lt;/strong&gt; every model call the live app makes runs on DigitalOcean serverless inference, and so did the two-model eval ($0.09 a full run). (The website itself is hosted on Vercel.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of SerpApi:&lt;/strong&gt; Lucky Finds. SerpApi's &lt;code&gt;google_maps&lt;/code&gt; engine matches the park, then &lt;code&gt;google_maps_reviews&lt;/code&gt; counts recent reviews that mention dogs, bikes, ducks or skateboards. Three or more mentions become a "Maybe!" find with the count printed as evidence, like the Celebration Park dog above (4 reviews). Review text is never shown or sent to the AI.&lt;/li&gt;
&lt;/ul&gt;

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