<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Raman Tiwari</title>
    <description>The latest articles on DEV Community by Raman Tiwari (@ramantiw45).</description>
    <link>https://dev.to/ramantiw45</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4160245%2F853fe481-ef14-461d-a9f2-06ed47b0cf95.png</url>
      <title>DEV Community: Raman Tiwari</title>
      <link>https://dev.to/ramantiw45</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ramantiw45"/>
    <language>en</language>
    <item>
      <title>I planned a walk in 60 seconds, then walked for two hours (open-weight AI, no GPU)</title>
      <dc:creator>Raman Tiwari</dc:creator>
      <pubDate>Thu, 08 Oct 2026 16:11:41 +0000</pubDate>
      <link>https://dev.to/ramantiw45/i-planned-a-walk-in-60-seconds-then-walked-for-two-hours-open-weight-ai-no-gpu-248o</link>
      <guid>https://dev.to/ramantiw45/i-planned-a-walk-in-60-seconds-then-walked-for-two-hours-open-weight-ai-no-gpu-248o</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — 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 &lt;code&gt;openai/gpt-oss-20b&lt;/code&gt; via Groq's free tier, no GPU, $0 to run.&lt;/p&gt;

&lt;p&gt;Live: &lt;a href="https://foliage-walk-planner.onrender.com" rel="noopener noreferrer"&gt;https://foliage-walk-planner.onrender.com&lt;/a&gt;&lt;br&gt;
Repo: &lt;a href="https://github.com/ramantiw45/Hacktoberfest/tree/main/week-01-touch-grass" rel="noopener noreferrer"&gt;https://github.com/ramantiw45/Hacktoberfest/tree/main/week-01-touch-grass&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;I built it because &lt;em&gt;planning&lt;/em&gt; 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.&lt;/p&gt;

&lt;p&gt;On my own test walk I spent about &lt;strong&gt;one minute on the screen and one to two hours outside&lt;/strong&gt; — roughly sixty to one. The screen being the shortest part of the experience is a design target here, not a slogan.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live: &lt;a href="https://foliage-walk-planner.onrender.com" rel="noopener noreferrer"&gt;https://foliage-walk-planner.onrender.com&lt;/a&gt; — try &lt;code&gt;Virar&lt;/code&gt; (19.45510, 72.82513) or &lt;code&gt;Prospect Park&lt;/code&gt; (40.660, -73.969). Cold start takes ~30–60s on Render's free tier.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fijapl4oenbfhzdxwiy46.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fijapl4oenbfhzdxwiy46.png" alt="The plan, generated live on the deployed app" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verbatim output for &lt;code&gt;Virar&lt;/code&gt; (this screenshot predates a prompt fix described below, which is why line 3 is wrong for India):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;10:00-12:00&lt;/li&gt;
&lt;li&gt;2-3 km loop around Virar Lake promenade (no car needed)&lt;/li&gt;
&lt;li&gt;First golden leaves on the banyan trees&lt;/li&gt;
&lt;li&gt;Water, a light jacket, and a phone charger&lt;/li&gt;
&lt;li&gt;It's a real nature escape that recharges your brain more than scrolling.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Field test — I took it to Virar
&lt;/h2&gt;

&lt;p&gt;One tap, then I went outside for one to two hours. From the walk:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnayrrmjsjrct4eayyvf0.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnayrrmjsjrct4eayyvf0.jpeg" alt="Hillside above Virar town, estuary beyond" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj65hv6gfw5euyhrs87xe.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj65hv6gfw5euyhrs87xe.jpeg" alt="The city below the viewpoint" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbqa6rr8ve43wavlihsfe.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbqa6rr8ve43wavlihsfe.jpeg" alt="Virar Lake in the morning haze" width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What worked.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failed, honestly.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Weather never rendered on the deployed app.&lt;/strong&gt; 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 &lt;em&gt;after&lt;/em&gt; 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"First golden leaves on the banyan trees" is a New England line, not a Maharashtra one.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The suggested window was wrong by hours.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Would I use it again next weekend?&lt;/strong&gt; 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.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/ramantiw45/Hacktoberfest/tree/main/week-01-touch-grass" rel="noopener noreferrer"&gt;https://github.com/ramantiw45/Hacktoberfest/tree/main/week-01-touch-grass&lt;/a&gt; — public, MIT LICENSE, no API keys required for the map or weather.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
copy .env.example .env   &lt;span class="c"&gt;# add GROQ_API_KEY from console.groq.com (free, no card)&lt;/span&gt;
uvicorn app:app &lt;span class="nt"&gt;--reload&lt;/span&gt; &lt;span class="nt"&gt;--app-dir&lt;/span&gt; week-01-touch-grass
&lt;span class="c"&gt;# open http://127.0.0.1:8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;With no key at all the app still serves a mock plan plus readable lane errors, so you can always click through.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; &lt;code&gt;openai/gpt-oss-20b&lt;/code&gt; — OpenAI's open-weight model, Apache-2.0, &lt;a href="https://huggingface.co/openai/gpt-oss-20b" rel="noopener noreferrer"&gt;on Hugging Face&lt;/a&gt; — served through Groq's free tier on an OpenAI-compatible endpoint. Swapping models is one env var: &lt;code&gt;GROQ_MODEL&lt;/code&gt;, or &lt;code&gt;GEMINI_MODEL&lt;/code&gt; for Gemma 3, or &lt;code&gt;MODEL_ID&lt;/code&gt; for any Hugging Face model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stack:&lt;/strong&gt; FastAPI + Leaflet/OpenStreetMap (no Google Maps key) + Open-Meteo (no key), deployed on Render's free tier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No GPU required.&lt;/strong&gt; The same weights run on a laptop later via &lt;code&gt;ollama run gpt-oss:20b&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
  User--&amp;gt;Web[Leaflet + FastAPI]
  Web--&amp;gt;Weather[Open-Meteo, cached]
  Web--&amp;gt;Lane[Free lane chain: Groq - AI Studio - HF - mock]
  Lane--&amp;gt;Plan[2-hour walk plan]
  Plan--&amp;gt;Outside[Go outside]&lt;/code&gt;&lt;/pre&gt;


&lt;h3&gt;
  
  
  The honest build log: two providers died mid-week
&lt;/h3&gt;

&lt;p&gt;This is the part I did not expect.&lt;/p&gt;

&lt;p&gt;I started on &lt;strong&gt;Qwen 2.5 via Hugging Face&lt;/strong&gt;. It worked, then stopped:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;HTTP 402, "Payment Required."&lt;/strong&gt; Hugging Face had moved Inference Providers behind paid credits. I checked their free &lt;code&gt;hf-inference&lt;/code&gt; lane programmatically and found essentially no chat models left on it. Dead end.&lt;/li&gt;
&lt;li&gt;So I moved to &lt;strong&gt;Groq&lt;/strong&gt; — and got a &lt;strong&gt;404&lt;/strong&gt;. I probed the endpoint with a deliberately fake API key and got a &lt;strong&gt;401&lt;/strong&gt; back, which proved the path was correct and the &lt;em&gt;model ID&lt;/em&gt; was the problem, not my code.&lt;/li&gt;
&lt;li&gt;Reading Groq's live model docs showed both &lt;strong&gt;Llama 3.x models had been moved to Enterprise&lt;/strong&gt;. Their free tier now offers &lt;code&gt;openai/gpt-oss-20b&lt;/code&gt;, which is open-weight under Apache-2.0 and free — so the swap made the open-source story &lt;em&gt;stronger&lt;/em&gt;, not weaker.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;There was one more bug worth naming, because it is the kind that ships silently. With weather unavailable, my prompt contained literal question marks:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Weather tomorrow: high ?C low ?C rain ?%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The model read that as a request and replied: &lt;em&gt;"Could you share tomorrow's forecast?"&lt;/em&gt; 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 &lt;em&gt;failure&lt;/em&gt; so it falls through to the next provider, and make the weather cache stale-if-error so one good reading survives later rate limits.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;$0 to run.&lt;/strong&gt; No per-token billing, no card, free tier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No vendor lock, demonstrated.&lt;/strong&gt; I changed models three times in one week without touching application logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swappable and hackable.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data stays in the open ecosystem.&lt;/strong&gt; Coordinates go to a free inference lane, not to a vendor I can't audit or leave.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;
&lt;h2&gt;
  
  
  Theme mapping
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Touch Grass&lt;/strong&gt;, literally: about one minute on a screen, one to two hours of hill, lake and estuary. &lt;strong&gt;Getting people into the world&lt;/strong&gt; — the app's only job is to end its own usefulness; every output is an instruction to close the tab. &lt;strong&gt;Screen is the shortest part&lt;/strong&gt;: sixty to one, measured on my own walk, not asserted.&lt;/p&gt;
&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="OpenCode"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Building Foliage Walk Planner with open-weight AI (no local GPU)&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;New to open source, want to submit to this week's Hacktoberfest DEV challenge. Help me get started.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;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.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Suggest something related to finance or market or money management.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;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.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Start with Foliage Walk Planner. I cannot run a local LLM, use Python.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;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.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Can you push to GitHub?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;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.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;How can I deploy? Also create a simple frontend.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;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.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;I reached this point - model call failed with 402 Payment Required.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;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.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Groq returns 404 Not Found.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;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.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Now model_not_found for llama-3.3-70b-versatile.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;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.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Now the plan is empty and weather unavailable.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;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.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;It works now but the live API asks me to share tomorrow's forecast.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;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.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;How do I field test? I took screenshots.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;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.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Help me connect the DevRelay MCP server.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;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.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        24 of 24 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Render&lt;/strong&gt; — the FastAPI app is hosted on Render's free tier (Root Directory &lt;code&gt;week-01-touch-grass&lt;/code&gt;), with the live URL above. Every part of it — API, static frontend, and the map — is served from that one free service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/pratik_12b3f8bf3b50e48bae/stop-overpaying-for-apis-when-to-swap-your-cloud-llm-for-a-local-slm-2n67"&gt;Stop Overpaying for APIs: When to Swap Your Cloud LLM for a Local SLM&lt;/a&gt; — the cost argument for open weights, which I felt rather than read about.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/lynkr/how-i-built-a-free-openai-compatible-api-on-top-of-opencode-67a"&gt;How I Built a Free OpenAI-Compatible API on Top of OpenCode&lt;/a&gt; — the protocol-compatibility trick my provider chain depends on.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/elsie-rainee/comparing-open-source-llm-gateways-in-2026-to-run-enterprise-ai-at-scale-4h4p"&gt;Comparing Open-Source LLM Gateways in 2026&lt;/a&gt; — useful context on why gateways exist at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;p&gt;Open-Meteo, OpenStreetMap contributors, Leaflet, Groq, and the GPT-OSS open weights. Frontend and backend built with an AI coding agent.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>python</category>
    </item>
  </channel>
</rss>
