This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass
What I Built
Wordle. Strands. A tiny emoji grid pasted into the group chat, and a streak you refuse to break. Daily games are a favorite few minutes of the day for a lot of us (me included), and they all share the same catch: you play them sitting still, staring at a screen.
So what if the daily game made you go outside?
That's Nature Bingo. It keeps the part of those games I love, the small pleasure of finishing something each day and sharing your result to friends, and adds a reason to go outside. It's a photo scavenger hunt where an open-weight model is the referee and the real world is the game board. Completing the card means taking a walk.
You tell the app roughly where you are (optional), pick a 3ร3 or 4ร4 card and a difficulty, and Gemma generates a bingo card of things you can actually find outside right now: something with spots, a seed pod, a shadow made by leaves. Then you put the phone in your pocket and go for a walk. When you spot a square, you take a photo, upload it, and Gemma checks it. If it's a match you get a "๐ Great job!" popup with a short fun fact about what you found. Finish the card, or hit End game whenever you've had enough, and you get a Wordle-style result to paste to your friends.
How it gets people off the screen
| Design choice | Why it matters |
|---|---|
| The phone is a camera, not a feed | Screen time is a few seconds per square, and the rest is looking around |
| Squares are visual and findable on foot | You have to look at real leaves, bark and light, not at the app |
| Local-context cards (region, season, setting) | A monsoon walk in India and an autumn walk in Berlin get different cards |
| Photos only, no audio or video | Simple, private, and a clear "one good photo per find" rule |
| Optional END button | No pressure to finish. A 15 minute stroll is a valid game. |
| Shareable result with total time | A small reason to invite friends along and compare walks |
Who it's for: anyone who loves a quick daily game and could use a nudge outside. Puzzle fans looking for a ritual that isn't on a couch, families on a weekend walk, friends comparing results, remote workers on a lunch break, and anyone who doesn't know a single species name (you don't need to).
What the result looks like
๐ฟ Nature Bingo ยท 10 Oct 2026
Nagpur ยท Monsoon ยท Medium ยท 3ร3
๐ฉ๐ฉโฌ
๐ฉ๐ฉ๐ฉ
โฌ๐ฉ๐ฉ
7/9 found ยท 2 bingos
โฑ๏ธ 24m 12s
๐ Ended early
Demo
- ๐ Live app: https://nature-bingo.streamlit.app/
Code
wickedseer
/
nature-bingo
Hacktoberfest Week 1 Submission
๐ฟ Nature Bingo
A bingo game that gets you off the screen and into the world. Gemma generates a bingo card for where you are, you go outside and photograph what you find, and Gemma checks each photo and shares a fun fact. Finish with a Wordle-style result to share with friends.
Built for the Hacktoberfest Open-Source AI Challenge, Week 1: Touch Grass.
Demo: https://nature-bingo.streamlit.app/
How it works
Step
What happens
1. Setup
Pick a 3ร3 or 4ร4 grid and a difficulty. Optionally add your region, season and setting.
2. Generate
Gemma creates a bingo card of visual, photographable squares that fit your context.
3. Explore
Walk around. Tap ๐ท Photo on a square and upload a picture of what you found.
4. Verify
Gemma checks the photo against the square and answers in a popup: "๐ Great job!" plus a fun fact.
5. Finish
Complete the card, or
The whole app is a single app.py, so it's easy to read, fork and adapt.
How I Built It
Stack
| Layer | Choice |
|---|---|
| Open model | Gemma 3 (open-weight), default gemma-3-27b-it
|
| Model access | Gemini API through the google-genai SDK |
| UI | Streamlit, light minimal theme |
| Images | Pillow (orientation fix, downscale, re-encode) |
| Hosting | Streamlit Community Cloud |
Gemma does three jobs
| Job | Input | Output |
|---|---|---|
| Card generation | Grid size, difficulty, region, season, setting | A JSON list of squares with a title and hint |
| Photo judging | The photo plus the square |
match, is_real_scene, a one-line reason |
| Fun fact | Same call as judging | A short, accurate fact about what's in the photo, only when it matches |
Judging and the fun fact share one multimodal call, so a find costs a single request.
Game flow
Setup โ Gemma generates card โ Pick square โ Upload photo in a popup
โ Gemma verifies โ "Great job!" + fun fact (in the popup)
โ Card complete or END โ shareable result + total time
Problems I hit, and what I did
| Problem | Solution |
|---|---|
| Gemma on the Gemini API has no system instruction or JSON mode | Put every rule in the prompt, ask for JSON only, and parse defensively (strip fences, find the outermost array or object) |
| The model sometimes returns too few or duplicate squares | Dedupe, then fill from a built-in fallback set so a game always starts |
| Players could upload a screenshot or a photo of a screen | The judge prompt returns is_real_scene, and screens and printouts are rejected |
| The same photo could be reused for several squares | SHA-256 of the upload, remembered per game |
| Text inside an image can try to instruct the model | The prompt tells the judge to ignore instructions found in the image |
| Large phone photos are slow and expensive to send | Downscale to 768px and re-encode as JPEG before the call |
| A shared API key on a public app could be drained | A per-session cap on photo checks |
| The original layout put the uploader below the grid, which broke the flow | Moved upload and result into a modal dialog, so the verdict and fun fact appear right where the player is looking |
| Streamlit reruns the script on every click | Used a fragment-scoped rerun inside the dialog, so checking a photo doesn't tear down the popup |
Design decisions worth calling out
- Visual-only squares. The prompt forbids sounds and smells, so every square can be verified from one photo.
- Safe squares. No people, no approaching wildlife, no touching unknown plants, no trespassing.
- Honest scope. I cut audio on purpose. One input type made the game simpler, more private and easier to judge fairly.
Why Does Open Innovation Matter?
The game is a small thing, but it sends photos of people's neighbourhoods to a model. That makes the model choice matter.
- Portability. Gemma's weights are open, so nothing in Nature Bingo depends on a proprietary model. Today it runs through the Gemini API because that's the quickest way to deploy for free on Streamlit Community Cloud. The same prompts work against a self-hosted Gemma on a GPU, or a smaller Gemma on a phone, by changing a base URL and a model name.
- A privacy path. A closed API is a one-way door for photos. With open weights, a school, a park service or a family can run the whole game on their own hardware, so the pictures never leave it.
- Offline play. The best place to play this is somewhere with weak signal. Open weights make an on-device version possible, and a closed API never could.
- Cost and control. A game for friends shouldn't die because a vendor changed its pricing or retired a model. With open weights you can pin the exact model and keep running it.
- Right-sized models. Gemma comes in several sizes, so you can trade accuracy for speed. Judging a photo of a leaf doesn't need a frontier model.
I'll be upfront that the deployed version isn't offline today. It's the open model that makes the offline version possible, and that's the path I'd take next.
Prize Categories
- Best Use of Gemma: Gemma is the engine of the whole game. It generates the local-context bingo cards, judges each uploaded photo (multimodal), and writes the fun facts, all served through the Gemini API.
Top comments (0)