Inspiration

CS and engineering majors are famously allergic to sunlight. "Touch grass" is the internet's favourite insult — so we asked: what if it were a competition? Introducing Competitive Grass Touching, the first-ever platform to encourage people to actually go outside. Compete to touch and photograph the best patch of grass in your city, and in the process, help map which neighbourhoods actually have green space to touch.

What it does

Once a day, at a completely random time, Grass Touch triggers a city-wide drop. Everyone gets the notification at the same moment and has 30 minutes to find real grass and prove it with a photo.

Your score is based on two things:

  • Speed — how quickly you get there after the drop
  • Grass quality — how convincing, healthy, and grass-like the photo is

Pipeline

  1. Sign in — Create an account with Google and join the daily drops.
  2. Wait for the drop — At a random moment each day, a Grass Touch Drop is sent to every player simultaneously.
  3. Find grass — When the drop begins, open the camera and head for the nearest patch of real public grass. If you're stuck, an AR overlay points you toward nearby parks and green spaces.
  4. Submit your photo — Take a photo within the 30-minute window. A Gemini Flash model analyzes the image and generates a score using quality × speed.
  5. Grow your patch — Your result becomes a procedural glyph — a hand-drawn-style tuft of grass generated from the judge's actual signals. High scores grow into tall, lush green grass. Low scores fade into thin, brown straw. Every tuft represents a real photo submitted by a real player.
  6. Shape the city — Your tuft is placed on a public map, where submissions cluster together to create a living snapshot of where people touched grass today.
  7. Toggle Green Access — Switch on Green Access and the map transforms from a game into an urban planning lens, revealing walking-distance access to green space — and highlighting the neighbourhoods that have little or none.

How we built it

Frontend

React + TypeScript + Vite · Tailwind CSS · Mapbox GL JS · Browser Camera API (getUserMedia) · WebSockets for real-time drop notifications

We built a mobile-first interface where players receive a synchronized daily drop, take a photo of real grass, and see their submission appear on a live city map. The app also includes an AR-style compass that helps users find nearby public green spaces.

Backend

FastAPI · SQLAlchemy · PostgreSQL · WebSockets · Pytest

The backend manages the daily drop schedule, handles photo uploads, broadcasts live updates to all connected players, and stores submissions in a shared database.

AI Judging

Google Gemini Flash · Pydantic · NumPy + Pillow (offline fallback) · Reve.ai

Each photo is analyzed for grass quality, biodiversity, composition, and color. Our own scoring system converts those signals into gameplay points, and a local image-processing fallback keeps the game working even if the AI service is unavailable. Reve.ai was used as inspiration to generate the glyphs.

Authentication & Storage

Supabase · Google OAuth

Supabase provides Google sign-in, PostgreSQL hosting, and cloud storage for all submitted photos.

Deployment

Docker · Google Cloud Run · Cloud Build

The frontend and backend are served from a single container, and deployments happen automatically whenever we push to the main branch.

Challenges we ran into

Anti-cheat was a design problem, not just a filter — we had to define what "real grass" means to a vision model and make rejection entertaining instead of frustrating. Coordinating a split frontend/backend deploy under time pressure meant learning CORS the hard way. And making thousands of independent glyphs feel like one coherent artwork took real iteration on the generative style.

Accomplishments that we're proud of

A judging pipeline that actually catches fakes. A glyph system where the art honestly derives from the grass — dry yellow lawns plant dry yellow glyphs. A map that updates live as people submit. And a green-space equity view we got essentially for free from the same dataset.

What we learned

How three-stage vision prompting beats one vague prompt; that deterministic generative art beats per-submission AI images for coherence, cost, and demo reliability; and that the best exploit-prevention is making the punishment funnier than the cheat.

What's next for Competitive Grass Touching

Streaks and seasonal map "generations," weather-aware glyphs, campus-vs-campus leagues, and sharing our green-space gap data with local parks organizations — the map gets more truthful about urban green equity with every person who plays.

Share this project:

Updates

Submission history