DEV Community

Raman Tiwari
Raman Tiwari

Posted on

I planned a walk in 60 seconds, then walked for two hours (open-weight AI, no GPU)

Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass Submission 🌿

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.

The plan, generated live on the deployed app

Verbatim output for Virar (this screenshot predates a prompt fix described below, which is why line 3 is wrong for India):

  1. 10:00-12:00
  2. 2-3 km loop around Virar Lake promenade (no car needed)
  3. First golden leaves on the banyan trees
  4. Water, a light jacket, and a phone charger
  5. 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:

Hillside above Virar town, estuary beyond

The city below the viewpoint

Virar Lake in the morning haze

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
Enter fullscreen mode Exit fullscreen mode

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, or GEMINI_MODEL for Gemma 3, or MODEL_ID for 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:

  1. HTTP 402, "Payment Required." Hugging Face had moved Inference Providers behind paid credits. I checked their free hf-inference lane programmatically and found essentially no chat models left on it. Dead end.
  2. 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.
  3. 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 ?%
Enter fullscreen mode Exit fullscreen mode

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.

Building Foliage Walk Planner with open-weight AI (no local GPU)
You

New to open source, want to submit to this week's Hacktoberfest DEV challenge. Help me get started.

Agent

Read the project skills and the live challenge page. Key finding: 2026 Hacktoberfest does NOT count PRs. You must build a brand-new project with open-source AI at its core and publish a DEV post in-window. Week 1 theme is 'Touch Grass' - get people off the screen and outside. Window Oct 05-11, 11:59pm PDT. Judging weights Writing Quality most heavily, then relevance, creativity, technical execution, plus 16 partner categories ($200 each) as smaller pools.

You

Suggest something related to finance or market or money management.

Agent

Proposed three finance-adjacent ideas that still satisfy Touch Grass: Farmers Market Saver, Walk-to-Save Challenge, Yard-Sale Flipper. Recommended Farmers Market Saver because it hits the theme, money management, and two partner categories.

You

Start with Foliage Walk Planner. I cannot run a local LLM, use Python.

Agent

Scaffolded FastAPI + Leaflet/OSM + Open-Meteo with a hosted open-weight model so no GPU is needed. Added requirements.txt, render.yaml, .env.example, LICENSE, draft.md, field-test.md.

You

Can you push to GitHub?

Agent

Initialized git, added .gitignore protecting .env, verified no secrets staged via grep for hf_/gho_/sk- patterns, committed, created public repo ramantiw45/Hacktoberfest. SSH push failed with publickey denied, so switched the remote to HTTPS and pushed successfully.

You

How can I deploy? Also create a simple frontend.

Agent

Rebuilt the frontend: autumn paper palette, Bitter display typeface, authored SVG leaf mark instead of emoji, side-by-side form and map collapsing on mobile, and real loading, error, and empty states plus keyboard focus rings and reduced-motion support. Ran the mechanical design detector, which flagged Fraunces as an overused AI-convergent font, so swapped to Bitter and re-ran clean. Gave step-by-step Render instructions including the Root Directory setting people miss.

You

I reached this point - model call failed with 402 Payment Required.

Agent

Hugging Face had moved Inference Providers behind paid credits. Probed their free hf-inference lane programmatically and found no usable chat models left. Built a free-lane chain instead: Groq, then Google AI Studio, then Hugging Face, then a mock fallback.

You

Groq returns 404 Not Found.

Agent

Probed with a deliberately fake key: got 401, which proved the path was correct and the model ID was wrong. Improved error reporting to surface the provider's actual response body instead of a bare status code.

You

Now model_not_found for llama-3.3-70b-versatile.

Agent

Fetched Groq's live model docs and found both Llama 3.x models had moved to Enterprise. Switched the default to openai/gpt-oss-20b, which is open-weight under Apache-2.0 and free, making the open-source story stronger.

You

Now the plan is empty and weather unavailable.

Agent

Two causes. GPT-OSS is a reasoning model, so it spent the entire 300-token budget thinking and returned nothing; raised to 1024 and made an empty completion an explicit failure. Weather 429 came from Render's free tier sharing one egress IP across many instances while Open-Meteo rate-limits that IP, so added a 10-minute cache and one polite retry.

You

It works now but the live API asks me to share tomorrow's forecast.

Agent

Caught a genuine production bug before publishing: with no weather the prompt contained literal question marks, so the model replied by asking the user for a forecast instead of planning. Rewrote the prompt to instruct a complete plan with no questions, made the nature cue location and October specific, added a guard treating a question-shaped reply as a failure so it falls through to the next lane, and made the weather cache stale-if-error.

You

How do I field test? I took screenshots.

Agent

Walked through the field test, then wrote the results: about one minute on screen against one to two hours outside at Virar, roughly sixty to one. Captured three honest failures for the write-up including the Render shared-IP 429 that killed the weather call, and a 'golden leaves on the banyans' cue that is wrong for monsoon-green Maharashtra.

You

Help me connect the DevRelay MCP server.

Agent

Found DevRelay already installed at ~/.devrelay but never registered with OpenCode. Added it as a local stdio MCP server under mcp.servers in the global config, preserving existing provider and model settings, and confirmed authentication as ramantiw45.

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

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)