This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass
What I Built
WildLog is a pocket field journal for walks. You photograph a plant, tree, bird or insect, and a local Gemma model tells you what it is and gives you one short fact. It can read the answer aloud so you can look up instead of down. You add a note about where you were, and it saves to a journal on your device. There's also a daily "find three things" quest, to give a walk a reason.
The idea came from going outside to test it. What grabbed me wasn't the app, it was the ferns.
That's what the app is for: take one photo, learn one thing, put the phone away. It's for anyone who walks past plants every day without knowing what they are, like me.
Demo
Live demo: https://wildlog.onrender.com
The hosted version is a demo mode. It shows photos and answers recorded during my tests, because the real identification runs on my laptop (more on that below).


Code
How I Built It
-
Model:
gemma3:4b, an open-weight model, running locally through Ollama on a laptop with no GPU. I use its image understanding to identify what's in the photo. - Backend: Express, which takes the photo and sends it to Ollama. It asks for a JSON answer with a name, one fact and a confidence level.
- Frontend: React with Vite. The browser shrinks each photo to about 800px and converts it to JPEG before upload, which keeps identification at about 3 to 4 seconds on CPU.
- Journal: entries are stored in the browser's local storage, so there's no account and no database.
- Read-aloud: the browser's built-in speech voice.
- Hosting: the demo is a static site on Render.
What I tested, including where it failed
I took it outside and photographed real things:
| What it was | What Gemma said | Confidence | Time | Result |
|---|---|---|---|---|
| Mango tree | Mango tree | high | 3.2s | Correct |
| Holy basil | Holy basil (Tulsi) | high | 2.8s | Correct |
| Fern | Boston fern | medium | 4.1s | [Correct / partly right / wrong: check the species first] |
| Concrete wall (first prompt) | Grey rock | high | 20.1s | Wrong |
| Same wall (fixed prompt) | Stone wall | [confidence] | [time] | Correct |
The wall is my favourite result. My first prompt told the model to identify a plant, tree or bird, and gave it no way to say "this is none of those", so it named a rock with high confidence. I changed the prompt so it could say when a photo wasn't a plant or animal, and to name the broader group when it wasn't sure of the species. After that it answered "stone wall", which was right.
Two things I learned:
- The model's confidence isn't a measure of whether it's right. It said "high" for a wrong answer and only "medium" for the fern.
- Exact species is hard. A 4B model can often tell you the group from one photo, but not always the species. Ferns are a good example.
Where Render fits, honestly
I wrote a Docker setup to run Gemma on a Render private service, but I didn't deploy it. A service big enough for the model needs a payment card on file, and I chose not to add one. So the Render site is a front-end demo, and I'm not claiming live inference there.
Why Does Open Innovation Matter?
- It runs offline on a CPU-only laptop. For something you use on a trail with no signal, that's the whole point.
- My photos stay on my own network. The phone is just the camera, and the laptop does the thinking. Nothing goes to someone else's server.
- It costs nothing to run. No API key and no per-photo fee.
- I could change its behaviour myself. When the model confidently called a wall a rock, I fixed it by rewriting the prompt that controls it, and I could swap the model or tune it further if I wanted.
A closed API could have identified more species more accurately, but it would have needed internet, an account and a bill, which is the opposite of what a "touch grass" tool should require.
Prize Categories
-
Best Use of Gemma: the app is built around
gemma3:4brunning locally through Ollama, including its image understanding. - Best Use of Render: the demo is hosted as a static site on Render, and the repo includes a Docker setup for running Ollama on a Render private service (written but not deployed).
Top comments (0)