{"slug": "grassquest-a-local-gemma-scavenger-hunt-that-sends-you-outside", "title": "GrassQuest: a local Gemma scavenger hunt that sends you outside", "summary": "A developer built GrassQuest, a local-first photo scavenger hunt that uses Gemma 3 4B via Ollama to generate five nature-finding tasks, verify user-submitted photos, and write a short field journal from the confirmed finds. The app runs entirely on the developer's laptop with no cloud, account, or photo uploads, and testing showed five matching photos passed their tasks while mismatched photos were rejected. The project was submitted to the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass.", "body_md": "*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass](https://dev.to/challenges/hacktoberfest-week1-2026-10-05)*\n\nGrassQuest turns a short walk into a photo scavenger hunt. You type where you're going, the season and how long you have. Gemma writes five things to find: a leaf shape, bark, a flower, a puddle reflection, a small insect. You snap a photo of each, and Gemma checks it. At the end it writes a short field journal from only what you actually found.\n\nThe idea is simple: the screen should be the shortest part of the walk. You plan in about 20 seconds, then put the phone away.\n\nIt runs entirely on my laptop. No cloud, no account, and no photo ever leaves my machine.\n\nThere is no live URL on purpose. The model runs locally through Ollama, so a hosted copy would defeat the point.\n\nScreenshots from the demo:\n\nA local-first app for the Hacktoberfest \"Touch Grass\" challenge.\n\n`gemma3:4b` model pulled in Ollama\nInstall dependencies:\n\n```\nnpm install\n```\n\nPull the required model if you haven't already:\n\n```\nollama run gemma3:4b\n```\n\nStart the server:\n\n```\nnpm start\n```\n\nOpen your browser and go to [http://localhost:3000](http://localhost:3000)\n\nSetup: install [Ollama](https://ollama.com), run `ollama pull gemma3:4b`, then `npm install` and `npm start`, and open `http://localhost:3000`.\n\n`localStorage` so a refresh doesn't lose the quest.\nI tested the photo check with real photos on my laptop. Five matching photos passed their tasks, and mismatched photos were rejected. A photo of roses was correctly rejected on a different flower task.\n\n| Task | Photo | Result | \n|---|---|---|\n| Leaf with five lobes | maple leaf | pass | \n| Close-up of rough bark | tree bark | pass | \n| Cluster of pink flowers | flowers | pass | \n| Building reflection in a puddle | puddle | pass | \n| Small insect on a leaf | stink bug | pass | \n| Any task | unrelated photo | rejected | \n\nI used Antigravity to help write the code, and a Claude assistant helped me plan the build and write this post. The app itself runs on Gemma locally.\n\n**Best Use of Gemma:** Gemma 3 4B does all three jobs (planning, vision and writing) locally.", "url": "https://wpnews.pro/news/grassquest-a-local-gemma-scavenger-hunt-that-sends-you-outside", "canonical_source": "https://dev.to/aakash_mehta_48e67c642976/grassquest-a-local-gemma-scavenger-hunt-that-sends-you-outside-h6g", "published_at": "2026-10-10 15:47:12+00:00", "updated_at": "2026-10-10 15:48:30.485897+00:00", "lang": "en", "topics": ["artificial-intelligence", "generative-ai", "ai-tools", "computer-vision", "large-language-models"], "entities": ["GrassQuest", "Gemma 3 4B", "Ollama", "Hacktoberfest", "Antigravity", "Claude"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/grassquest-a-local-gemma-scavenger-hunt-that-sends-you-outside", "markdown": "https://wpnews.pro/news/grassquest-a-local-gemma-scavenger-hunt-that-sends-you-outside.md", "text": "https://wpnews.pro/news/grassquest-a-local-gemma-scavenger-hunt-that-sends-you-outside.txt", "jsonld": "https://wpnews.pro/news/grassquest-a-local-gemma-scavenger-hunt-that-sends-you-outside.jsonld"}}