DEV Community

Cover image for Nature Bingo!
Vridhi Sachdev
Vridhi Sachdev

Posted on

Nature Bingo!

Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass Submission ๐ŸŒฟ

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
Enter fullscreen mode Exit fullscreen mode

Demo

Code

GitHub logo 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
Enter fullscreen mode Exit fullscreen mode

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)