This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass
TL;DR — One input gives you one walk: the best time window, a loop idea, a nature cue and a packing line, plus a live map pin. Under a minute on screen, then you go outside. Open-weight openai/gpt-oss-20b via Groq's free tier, no GPU, $0 to run.
Live: https://foliage-walk-planner.onrender.com
Repo: https://github.com/ramantiw45/Hacktoberfest/tree/main/week-01-touch-grass
What I Built
A walk planner for people who keep meaning to get outside and don't. You enter a place and a time budget; you get back the best two-hour window, a 2–3 km loop idea, one nature cue worth looking for, a packing line, and a map pin. Then you close the tab and walk.
I built it because planning the walk is exactly where plans die. Weather apps want a full day of your attention, trail sites want a login and ten minutes of map-fiddling, and foliage trackers are US-only. I wanted the whole decision to fit inside one minute, because at one minute it competes with nothing.
On my own test walk I spent about one minute on the screen and one to two hours outside — roughly sixty to one. The screen being the shortest part of the experience is a design target here, not a slogan.
Demo
Live: https://foliage-walk-planner.onrender.com — try Virar (19.45510, 72.82513) or Prospect Park (40.660, -73.969). Cold start takes ~30–60s on Render's free tier.
Verbatim output for Virar (this screenshot predates a prompt fix described below, which is why line 3 is wrong for India):
- 10:00-12:00
- 2-3 km loop around Virar Lake promenade (no car needed)
- First golden leaves on the banyan trees
- Water, a light jacket, and a phone charger
- It's a real nature escape that recharges your brain more than scrolling.
Field test — I took it to Virar
One tap, then I went outside for one to two hours. From the walk:
What worked. The plan named a destination I would not have picked myself — the lake promenade — and the "no car needed" line meant I walked instead of driving somewhere and sitting in a car park. The packing line (water, light jacket) was correct.
What failed, honestly.
- Weather never rendered on the deployed app. Render's free tier shares one outbound IP across many instances, and Open-Meteo rate-limits that IP. So the forecast silently fell back to generic advice. My fix (a 10-minute cache plus one polite retry, with stale-if-error) landed after this test, which is why the failure is still visible in the screenshot above. I'm leaving it visible rather than retaking a flattering one.
- "First golden leaves on the banyan trees" is a New England line, not a Maharashtra one. The prompt was written for autumn foliage. In mid-October Virar the banyans are still deep green, so I ignored the cue completely. Testing a fall-foliage tool in a city with no fall foliage is my mistake, and it's the clearest lesson of the build. The prompt now asks for a cue that is true for the given location in October.
- The suggested window was wrong by hours. It said 10:00–12:00; I went early morning, because the midday haze in my own photos is the honest reason to go earlier. The app couldn't tell me that — the weather call was the part that failed.
Would I use it again next weekend? Yes — for the destination, not for the foliage talk. "Here is a walk you can start in 60 seconds" is the value. If the weather call worked, it would have told me early morning beats midday, which is exactly what I did.
Code
https://github.com/ramantiw45/Hacktoberfest/tree/main/week-01-touch-grass — public, MIT LICENSE, no API keys required for the map or weather.
pip install -r requirements.txt
copy .env.example .env # add GROQ_API_KEY from console.groq.com (free, no card)
uvicorn app:app --reload --app-dir week-01-touch-grass
# open http://127.0.0.1:8000
With no key at all the app still serves a mock plan plus readable lane errors, so you can always click through.
How I Built It
-
Model:
openai/gpt-oss-20b— OpenAI's open-weight model, Apache-2.0, on Hugging Face — served through Groq's free tier on an OpenAI-compatible endpoint. Swapping models is one env var:GROQ_MODEL, orGEMINI_MODELfor Gemma 3, orMODEL_IDfor any Hugging Face model. - Stack: FastAPI + Leaflet/OpenStreetMap (no Google Maps key) + Open-Meteo (no key), deployed on Render's free tier.
-
No GPU required. The same weights run on a laptop later via
ollama run gpt-oss:20b.
flowchart LR
User-->Web[Leaflet + FastAPI]
Web-->Weather[Open-Meteo, cached]
Web-->Lane[Free lane chain: Groq - AI Studio - HF - mock]
Lane-->Plan[2-hour walk plan]
Plan-->Outside[Go outside]
The honest build log: two providers died mid-week
This is the part I did not expect.
I started on Qwen 2.5 via Hugging Face. It worked, then stopped:
-
HTTP 402, "Payment Required." Hugging Face had moved Inference Providers behind paid credits. I checked their free
hf-inferencelane programmatically and found essentially no chat models left on it. Dead end. - So I moved to Groq — and got a 404. I probed the endpoint with a deliberately fake API key and got a 401 back, which proved the path was correct and the model ID was the problem, not my code.
- Reading Groq's live model docs showed both Llama 3.x models had been moved to Enterprise. Their free tier now offers
openai/gpt-oss-20b, which is open-weight under Apache-2.0 and free — so the swap made the open-source story stronger, not weaker.
Two providers changed their terms in the same week, and my app did not break, because it talks OpenAI-compatible chat with model IDs in environment variables. Every swap was one line. That portability is the whole argument for open weights, and I only appreciate it because it happened to me on a deadline.
There was one more bug worth naming, because it is the kind that ships silently. With weather unavailable, my prompt contained literal question marks:
Weather tomorrow: high ?C low ?C rain ?%
The model read that as a request and replied: "Could you share tomorrow's forecast?" The app looked broken — it was asking the user to do its job. Three fixes: tell the model in the prompt to give a complete plan and never ask a question, treat a question-shaped reply as a failure so it falls through to the next provider, and make the weather cache stale-if-error so one good reading survives later rate limits.
Why Does Open Innovation Matter?
- $0 to run. No per-token billing, no card, free tier.
- No vendor lock, demonstrated. I changed models three times in one week without touching application logic.
- Swappable and hackable. The model ID is an env var and the prompt is mine to edit. With a closed API I cannot fine-tune, cannot self-host, and cannot reason about why the output changed.
- Data stays in the open ecosystem. Coordinates go to a free inference lane, not to a vendor I can't audit or leave.
If this had been built on a single closed API, I would have been stranded the moment that provider changed its pricing. Open weights meant there was always another lane.
Theme mapping
Touch Grass, literally: about one minute on a screen, one to two hours of hill, lake and estuary. Getting people into the world — the app's only job is to end its own usefulness; every output is an instruction to close the tab. Screen is the shortest part: sixty to one, measured on my own walk, not asserted.
My Agent Session
The full build, including both dead provider integrations and the empty-completion bug, is saved as a session — so you can read the process, not just the finished app.
Prize Categories
Best Use of Render — the FastAPI app is hosted on Render's free tier (Root Directory week-01-touch-grass), with the live URL above. Every part of it — API, static frontend, and the map — is served from that one free service.
Related reading
- Stop Overpaying for APIs: When to Swap Your Cloud LLM for a Local SLM — the cost argument for open weights, which I felt rather than read about.
- How I Built a Free OpenAI-Compatible API on Top of OpenCode — the protocol-compatibility trick my provider chain depends on.
- Comparing Open-Source LLM Gateways in 2026 — useful context on why gateways exist at all.
Credits
Open-Meteo, OpenStreetMap contributors, Leaflet, Groq, and the GPT-OSS open weights. Frontend and backend built with an AI coding agent.




Top comments (0)