This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass
What I Built
Neighbourhood Green Plan is a small web app that turns "someone should clean up our street and plant some trees" into an actual plan.
You enter your area, how many volunteers you have, the date, and the type of space (street side, park, outside a school, or an empty plot). In a few seconds it gives you:
- 🌳 Trees: native trees and plants that suit the season and area (think neem, jamun, amla, tulsi), and why
- 📋 Plan: a step-by-step cleanup and planting schedule with timings
- 👥 Roles: how to split the work among your volunteers
- 🧰 Supplies: a checklist so nobody forgets the gloves and sacks
- 💬 WhatsApp: a short, friendly invite message you can copy straight into your neighbourhood group
How it gets people off the screen: the screen is the shortest part of the experience. You spend a minute generating the plan, send one WhatsApp message, and then you put the phone down and go outside with your neighbours. The app handles the planning, the sorting of tasks and the invitation, which are the boring parts that usually stop a community drive from ever happening.
Who it's for: anyone who wants to organise a small cleanup or plantation drive but doesn't know where to start. This includes residents' groups, students, families and school clubs.
Why I built it: I'm a student developer from Uttar Pradesh. Last weekend I built Nani's Recipe Book to keep my family's recipes safe. This time I wanted to build something for the people outside my front door. Community drives often never start because the planning feels like a chore: what to plant, who does what, what to bring, and how to invite everyone. I wanted to take that excuse away.
Demo
The app is built with Streamlit and runs locally with streamlit run app.py.
Code
🌳 Neighbourhood Green Plan
A small web app that turns "someone should clean up our street and plant some trees" into an actual plan. Enter your area, number of volunteers, date and type of space, and get a complete cleanup and tree-planting plan in seconds, powered by the open-weight Gemma model.
Built for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass.
What it does
Given your inputs, the app generates five sections, each in its own tab:
| Tab | What you get |
|---|---|
| 🌳 Trees | 4-5 native trees/plants suited to the season and area, and why |
| 📋 Plan | A step-by-step cleanup and planting schedule with timings |
| 👥 Roles | How to split the work among your volunteers |
| 🧰 Supplies | A checklist of what to bring |
| A short, friendly invite message you can copy into your neighbourhood group |
You can also download the full plan as a Markdown file.
The…
The whole app is a single Python file (app.py).
How I Built It
Open-weight model: I used Gemma (gemma-4-26b-a4b-it), Google's open-weight model, called through Google AI Studio.
Stack: Python, Streamlit for the interface, and the google-genai library to call the model.
How it works:
- The form inputs (area, volunteers, date, space type) are put into one prompt.
- The prompt asks Gemma to answer in simple, friendly English and to split its answer into five sections, each starting with a marker like
[[TREES]]or[[PLAN]]. - A small parser splits the response on those markers and shows each section in its own tab. The WhatsApp message is shown in a code box so it can be copied with one click.
- If the model ever skips the markers, the app falls back to showing the full response instead of breaking.
- The full plan can also be downloaded as a Markdown file.
I also wrote a custom green-and-marigold theme with CSS so it feels friendly and community-oriented rather than like a default developer tool.
An honest note: I ran Gemma through the hosted Google AI Studio API, so this version needs an internet connection and is not an offline app. I'm not claiming otherwise.
What I Learned
-
The 404 that taught me to check model names. My first run failed with a
404 NOT_FOUNDbecause I had left a placeholder as the model name. Listing the available models withclient.models.list()showed me the exact name (models/gemma-4-26b-a4b-it), and it worked right after. -
Streamlit and custom HTML don't always mix. I wrapped my form widgets in a raw HTML
divfor styling, and it rendered as an empty green box above the form. Switching tost.container(border=True)fixed it. - API keys need care. I moved the key out of the interface and into one clearly marked line at the top of the file, and I keep it blank in the repo so it never gets pushed to GitHub.
- Tiny Python details matter. Even a few stray spaces before a variable at the top of the file broke the whole app with an indentation error.
- Limitations: the tree suggestions come from the model, so they should be checked with a local nursery or forest department before planting. Gemma can also occasionally ignore the section markers, which is why the fallback exists.
Why Does Open Innovation Matter?
For a community tool like this, open weights matter for a few reasons:
- No lock-in. Gemma's weights are open, so the app isn't tied to one company's closed model. The model name is a single line in my code, and swapping it is trivial.
- A path to running it locally. The same prompt and the same app logic could run on a laptop through a local runtime, so a neighbourhood group with poor connectivity or privacy concerns could keep everything on their own machine. I haven't built that version yet, but open weights are what make it possible. A closed API wouldn't allow it at all.
- Room to adapt. Because the model is open, it could later be fine-tuned on local knowledge, such as regional trees, local languages or municipal rules, which is exactly what a neighbourhood tool needs.
- Transparency for a community use case. When a tool tells people what to plant and how to organise their neighbours, it matters that the underlying model isn't a black box owned by someone else.
Prize Categories
Best Use of Gemma: the whole app is built around Gemma (gemma-4-26b-a4b-it), which generates the trees, the plan, the roles, the supplies list and the WhatsApp invite.



Top comments (0)