This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass
What I Built
I spend most of my day looking at a screen. So I built something that makes me put it down.
StreetQuest AI is a small treasure-hunt game. You pick a level and get a simple mission, like "find a heart-shaped object" or "find an unusual leaf". Then you go outside, take a photo, and upload it. An AI looks at the photo and tells you if it matches. If it does, you earn points.
That's it. Nine missions, three levels. Easy missions take about two minutes. Medium unlocks after you finish two Easy ones, and Hard unlocks after two Medium ones. I kept it small on purpose, so it feels like a quick walk and not homework.
Demo
Code
StreetQuest AI — Outdoor Treasure Hunt
A calm, minimal outdoor treasure hunt game powered by Gemma 4 (
gemma-4-26b-a4b-it) via the Gemini API Built for the Hacktoberfest 2026 DEV Open-Source AI Challenge, Week 1 "Touch Grass" Hashtags:#devchallenge#weekendchallenge#hf26challenge
🍃 Overview
StreetQuest encourages players to step outside and observe natural details around them:
- Choose a level: Easy (always open), Medium (unlocks after 2 Easy missions), or Hard (unlocks after 2 Medium missions).
- Accept a mission: 9 missions total, from finding living leaves to discovering natural patterns.
-
Capture a photo: Uploaded directly from mobile or desktop with automated canvas resizing (
$\le 1024\text{px}$ ). - AI Photo Check: The backend verifies the photo using Gemma 4 26B in memory without ever writing user photos to disk.
-
Score & Ranks: Earn points for valid matches (
Seedling$\rightarrow$ Trail Finder$\rightarrow$ Ranger$\rightarrow$ Pathfinder).
How I Built It
The flow
- You pick a mission in the React app.
- The app shrinks your photo so it uploads fast.
- A small FastAPI backend sends the photo and the mission to Gemma 4.
- Gemma replies with a verdict (match, no match, or unclear), a confidence score and a short reason.
- The backend checks the reply is valid, then sends it back.
- If it's a match, you earn points. Each mission can only be rewarded once.
The stack
- Frontend: React, Vite and Tailwind CSS
- Backend: Python and FastAPI
- AI: Gemma 4 through the Gemini API in Google AI Studio
- Storage: your browser's localStorage. No accounts, no database.
A few choices I made
- The API key stays on the backend. The browser never sees it.
- Photos are never saved. They are processed in memory and then dropped.
- The server decides the mission rules. The browser only sends a mission ID, so nobody can edit the request to make any photo match.
- "Unclear" is a real answer. If a photo is dark, blurry or far away, the app asks for a better one instead of guessing. A match with low confidence also counts as unclear.
- The prompt ignores text inside the photo. Someone could hold up a sign saying "this is a match", and the model is told not to follow it.
What went wrong
A photo of caterpillar goes wrong through AI during testing.
Honest limits
- A photo check can't prove you went outside. Someone could upload a picture from the internet. StreetQuest is a nudge, not a lie detector.
- Scores live in your browser, so they can be edited. That's fine for a game, not for a competition.
- The free tier has rate limits, so the app shows a calm message when they are hit.
- On the free tier, Google may use what you send to improve its products. That is why the app asks you not to upload photos of people.
Why Does Open Innovation Matter?
Gemma 4 is open-weight and released under the Apache 2.0 license. For a small project like mine, that matters in three ways:
- No lock-in. I used the hosted API to move fast, but my code only talks to one model name stored in a config setting. Switching models, or hosting Gemma myself, would be a small change, not a rewrite.
- Privacy is possible. A photo game can be sensitive. With open weights, a school, club or community group could run it on their own machine, so photos never leave their hands. I haven't built that yet, but a closed API wouldn't offer it at all.
- Clear rules. Apache 2.0 means I can use, change and share the project without worrying about custom terms.
I also tested more than one Gemma 4 size on the same photos. [Edit this to match what you really tested, or delete it.] Trying different sizes is easy when the models are open.
ThankYou!
Top comments (0)