This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass
We keep using our phones to learn about the world instead of looking at the world around us. We'll open an app to identify a bird while the bird is sitting ten feet away, ignored.
So I asked myself: what if AI didn't give us another reason to stare at a screen?
Nature Saathi is an AI-powered outdoor learning companion that turns an ordinary walk into a real-world nature expedition. Saathi (ΰ€Έΰ€Ύΰ€₯ΰ₯) means "companion" in Hindi. Most apps want your eyes on the screen. Nature Saathi wants them on the sky, the soil, and the sparrow on the wall.
You tell it three things: how much time you have, how adventurous you feel, and what you're curious about (leaves, birds, and so on). A local AI model writes a custom expedition just for you. You read one mission, put the phone away, go explore, come back, and tap complete.
π± The screen should be the shortest part of the experience.
Who is it for? Curious kids, families, students, and anyone who wants a nudge to notice the world. It also suits anyone who has caught themselves "going for a walk" while scrolling.
The whole product is built around one idea: AI creates the mission, you leave the screen, and you come back with a discovery.
sessionStorage)
Youtube demo video : https://youtu.be/5P2vqBBz-FI
Expedition setup: choosing time, difficulty, and an interest like πΏ Leaves
Mission generation: Gemma writes the outdoor challenge
Active expedition: the key moment. The app literally tells you to put your phone away.
An AI-powered outdoor learning companion that turns an ordinary walk into a real-world nature expedition.
Quick Start Β· How It Works Β· API Β· Tests Β· Roadmap
Saathi (ΰ€Έΰ€Ύΰ€₯ΰ₯) means companion. Most apps want your eyes on the screen. Nature Saathi wants them on the sky, the soil, and the sparrow on the wall.
Pick how long you have, how adventurous you feel, and what you're curious about. A local AI model writes a custom expedition for you. You read one mission, put the phone away, go explore, come back, and tap complete.
βββββββββββββ βββββββββββββ βββββββββββββ βββββββββββββ
β 1. PICK β βββΆ β 2. READ β βββΆ β 3. EXPLOREβ βββΆ β 4. RETURN
β¦ The README covers setup, Ollama configuration, the API, tests, and a roadmap.
| Layer | Tech |
|---|---|
| Frontend | HTML, CSS, vanilla JavaScript |
| Backend | Python, Flask |
| AI | Ollama runningGemma 3 4B locally |
| Tests | Python unittest + a Node test for frontend logic |
Nature Saathi
β
Browser / UI
β
Flask
β
Mission Service
β
Ollama
β
Gemma 3 4B
β
Generated Mission
β
Browser
The browser sends your choices to a single endpoint:
POST /api/missions/generate
{
"duration_minutes": 45,
"difficulty": "Explorer",
"interest": "Birds"
}
Flask hands the request to a mission service, which fills a prompt template and asks Gemma (through Ollama) for an expedition. The response contains a title, theme, intro, a safety note, and a list of missions. Each mission has a task, an observation_cue (what to look, listen, or feel for), a learning_note (the "aha" fact), and an evidence_type.
The part I'm proudest of is the validation layer. The mission service checks everything the model returns. Malformed, incomplete, or unsafe output never reaches the page. Errors always share one shape, so the frontend can respond predictably:
{ "error": { "code": "...", "message": "..." } }
| Status | Meaning |
|---|---|
| 400 | Invalid request |
| 503 | Ollama is unavailable |
| 502 | Model output was malformed, incomplete, or unsafe |
When your product tells people to walk outside, "the AI said so" isn't good enough. Every expedition has to carry a safety note.
I'll be honest: running a model locally is slower than calling a hosted API. My first Gemma generations took significantly longer than a typical API call, and the default timeouts failed before the model finished.
So I:
That trade-off shaped the design. Because generation takes a moment, Nature Saathi generates the whole expedition once, up front. Then you put the phone away and never wait on the AI mid-walk.
The test suite is deliberately dependency-light:
python -m unittest discover -s tests -v # mission service checks
node tests/test_frontend_render.js # navigation, progress, refresh recovery, bad data
The mission I got: Find different types of flowers around you
Where I went: A park near my hostel.
What happened: I chose 45 minutes and flowers, and Nature Saathi gave me five field notes: Color Spectrum, Shape Seekers, Silent Observation, Flower Count, and Floral Sounds.I took it to a park near my hostel, and my friend came along. We did the flower activity together.
There were so many flowers: yellow, pink, purple, and white, plus some wild flowers growing on their own. I expected to find a few flowers. I didn't expect how much beauty I had been walking past.
The best part wasn't only the flowers. Once we stopped and really looked, we saw butterflies, honeybees, and other tiny insects moving from flower to flower. We also noticed how strong and different the fragrance was from each one.
While completing the missions, I felt calm. Doing it with a friend made it even better, because we kept pointing things out to each other.
I loved this experience, and we both enjoyed it a lot.
Nature Saathi uses Ollama to run Gemma 3 locally instead of sending every interaction to a hosted AI API. For this particular project, that open approach was better than a closed one in several ways:
127.0.0.1, the privacy story is simple to verify. ollama pull gemma3:4b. That matters for classrooms, community groups, and anyone who can't or won't hand over a credit card.OLLAMA_MODEL). If a better open-weight model arrives next month, Nature Saathi can adopt it without rewriting the app.
There's also a philosophical fit. An app about noticing the world around you is stronger when the technology behind it is something you can inspect, run, and change yourself.
Contributions and ideas are welcome. Open an issue and say hello!