Hacktoberfest 2026 · Open-Source AI Challenge · Touch Grass

Leaf Peep

Snap a tree on your walk. Gemma 4 reads how far its leaves have turned, and it lands on a shared map of where fall colour is peaking this week.

Leaf Peep on three iPhones: the map, a scored tree, and a forecast in dark mode
Demo · 1:48

Ten seconds on the screen. Then back outside.

Watch on YouTube ↗

How it works

Point. Tap. Back to the walk.

The photo being scanned 01

Score a tree

Point your phone at a tree. Gemma 4, an open-weight vision model, reads the photo in a couple of seconds.

A colour score of 65, near peak 02

Read the leaves

A 0–100 colour score and a stage (green → turning → peak → past), the colours it sees, and a guess at the tree.

The new spot on the map 03

Share the colour

The spot lands on the map for everyone. A daily history per spot turns into a forecast: “peak in about a week”.

Hybrid search on Tiger Data

Search by meaning, not just words.

“Red maples by the water” finds the sugar maples on the lakeshore even though no one typed “water”. An open embedding model (MiniLM) and pgvector rank by meaning, Postgres full-text ranks by words, and the two are fused with reciprocal rank fusion.

Search results for red maples by the water
Architecture

Open all the way down.

Gemma 4

Scores every photo against a JSON schema. DigitalOcean serverless inference in production, Ollama on a laptop.

DigitalOcean

One Droplet runs the app, Caddy HTTPS and the database. deploy/up.sh to launch, down.sh to stop billing.

Tiger Data

A hypertable and continuous aggregate power the forecast. pgvector and full-text power hybrid search.

Private by design

Photos are re-encoded so GPS is stripped. Locations are rounded to a ~1 km cell before anything is stored.

Leaf Peep on desktop in dark mode A tree scored 95, peak, in dark mode
Run it yourself

MIT licensed. Free to run.

Run it on a laptop with Ollama and Docker, or put it on a $12/month DigitalOcean Droplet with one command.

# the open model
ollama pull gemma4

# Tiger Data's TimescaleDB with pgvector
docker run -d -p 5433:5432 -e POSTGRES_PASSWORD=leafpeep \
  -e POSTGRES_DB=leafpeep timescale/timescaledb-ha:pg17

# the app
npm install && npm run dev   # → localhost:8080