<?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: Mahmudur Rahman Labib</title>
    <description>The latest articles on DEV Community by Mahmudur Rahman Labib (@mahmudurrahmanlabib).</description>
    <link>https://dev.to/mahmudurrahmanlabib</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%2F802036%2Fcbc28da4-56a9-4fbe-9c07-ce6e4af4cdca.jpg</url>
      <title>DEV Community: Mahmudur Rahman Labib</title>
      <link>https://dev.to/mahmudurrahmanlabib</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mahmudurrahmanlabib"/>
    <language>en</language>
    <item>
      <title>I Was Too Lazy to Open Five AI Tabs, So I Built AgentWebUI 🦥</title>
      <dc:creator>Mahmudur Rahman Labib</dc:creator>
      <pubDate>Sun, 25 Oct 2026 00:30:07 +0000</pubDate>
      <link>https://dev.to/mahmudurrahmanlabib/i-was-too-lazy-to-open-five-ai-tabs-so-i-built-agentwebui-207a</link>
      <guid>https://dev.to/mahmudurrahmanlabib/i-was-too-lazy-to-open-five-ai-tabs-so-i-built-agentwebui-207a</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Did you know the chainsaw was originally invented to help with childbirth?&lt;/p&gt;

&lt;p&gt;Two Scottish doctors in the late 1700s looked at a hard, slow, painful job and thought: &lt;em&gt;there has to be a lazier way.&lt;/em&gt; A few centuries later, we use it to cut down trees and star in horror movies.&lt;/p&gt;

&lt;p&gt;That's the thing about laziness. It's not a character flaw. It's the R&amp;amp;D department of the human race.&lt;/p&gt;

&lt;p&gt;So here's my confession. My AI workflow had become a part-time job. Claude Code in one terminal. Codex in another. A local Llama in Ollama. DeepSeek in a browser tab I kept losing. Every task started with the same ritual: &lt;em&gt;which tab was I in, and where did I put that conversation?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;OpenWebUI was supposed to fix this. Instead, I spent an afternoon trying to plug an agent into it and ended up with a lot of YAML and no agent.&lt;/p&gt;

&lt;p&gt;So, like any respectable sloth, I did the laziest possible thing. I asked two friends who are almost as lazy as me, and together we built one tool so none of us would ever have to do that again.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AgentWebUI&lt;/strong&gt; is a lightweight, self-hosted, agent-first web UI. One server, one sidebar, every AI model and agent you use.&lt;/p&gt;

&lt;p&gt;You open it, it says "Good evening", and it asks you one question: &lt;em&gt;ask anything, or hand a task to an agent?&lt;/em&gt; That second option is the whole point. You don't do the work. You delegate it, then go lie down.&lt;/p&gt;

&lt;p&gt;What it lets you be lazy about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Switching tools.&lt;/strong&gt; Claude Code, Codex, local Llama and DeepSeek all live in the same chat list. Pick one from a dropdown.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paying twice.&lt;/strong&gt; Plug in the Claude or Codex subscription you already pay for. No separate API key ritual.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup.&lt;/strong&gt; It's Docker plus an env file. Fill in the blanks, run one command, done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Waiting.&lt;/strong&gt; It's extremely lightweight, so it starts fast and doesn't eat your laptop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remembering.&lt;/strong&gt; Projects, files, search (⌘K) and a "Jump back in" row mean you never hunt for that one chat again.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Who gets to be lazier?&lt;/strong&gt; Any developer juggling more than one AI tool. Which, in 2026, is every developer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Try it live:&lt;/strong&gt; &lt;a href="https://agentwebui.hackershostel.com/#/" rel="noopener noreferrer"&gt;agentwebui.hackershostel.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the home screen, the sidebar holds a DeepSeek chat, a Claude Code workspace, Codex, OpenAI and Gemini, all in one list. The model picker says &lt;strong&gt;llama3.2:3b&lt;/strong&gt;, running locally. That's five tools' worth of tabs I no longer have to open.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/HackersHostel" rel="noopener noreferrer"&gt;
        HackersHostel
      &lt;/a&gt; / &lt;a href="https://github.com/HackersHostel/AgentWebUI" rel="noopener noreferrer"&gt;
        AgentWebUI
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The lightest web UI for OpenAI-compatible model APIs and ACP agents.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/HackersHostel/AgentWebUI/agentwebui_lite/static/logo.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FHackersHostel%2FAgentWebUI%2FHEAD%2Fagentwebui_lite%2Fstatic%2Flogo.svg" width="56" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;AgentWebUI&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/HackersHostel/AgentWebUI/actions/workflows/tests.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/HackersHostel/AgentWebUI/actions/workflows/tests.yml/badge.svg" alt="Tests"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One small web page to chat with AI models and with command-line agents, on your own server. Open it and chat
there is no setup screen and no accounts. Everything is configured in &lt;code&gt;.env&lt;/code&gt;. The package and command are still
named &lt;code&gt;agentwebui-lite&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Models:&lt;/strong&gt; any OpenAI-compatible API (OpenAI, OpenRouter, NVIDIA, Groq, Ollama, LM Studio, vLLM, …).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents:&lt;/strong&gt; anything that speaks the &lt;a href="https://agentclientprotocol.com" rel="nofollow noopener noreferrer"&gt;Agent Client Protocol&lt;/a&gt; over stdio: Claude
Code, Codex, Hermes, Pi, Gemini CLI, OpenCode, … Pick the agent, then &lt;strong&gt;its&lt;/strong&gt; model and effort, then the folder it
works in. It streams its thinking, plan, tool calls and diffs, and asks before it acts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The server is about 3,000 lines of Python with one dependency (&lt;code&gt;aiohttp&lt;/code&gt;) and uses about 40 MB of memory. The web
client is Preact through htm with no build step. Nothing loads from the internet unless you pick a font other than
Geist.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/HackersHostel/AgentWebUI" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Setup, written for people who also don't want to read setup instructions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/HackersHostel/AgentWebUI.git
&lt;span class="nb"&gt;cd &lt;/span&gt;AgentWebUI
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env   &lt;span class="c"&gt;# fill in your models and agents&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open it in your browser and go back to lying down.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The design rule was simple: &lt;strong&gt;agents are the main character, chat is the supporting cast.&lt;/strong&gt; In most UIs it's the other way around.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-weight models at the core.&lt;/strong&gt; Llama 3.2 3B runs locally, and open-weight DeepSeek models sit right next to it. Same input box, same history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents as first-class citizens.&lt;/strong&gt; Agents get their own section, run inside project workspaces, and show up in the chat list like any other conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bring-your-own subscription.&lt;/strong&gt; Claude Code and Codex connect through the subscriptions you already have.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker + env files.&lt;/strong&gt; Every model endpoint and agent connection is config, not code. Moving from laptop to home server is a copy-paste.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightweight on purpose.&lt;/strong&gt; No feature makes it in unless it earns its weight.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Because the laziest model is the one you never have to ask permission to use.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It runs on my machine.&lt;/strong&gt; A local Llama answers even when the Wi-Fi doesn't. Quick questions never leave the laptop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My files stay mine.&lt;/strong&gt; Agents work on my own projects, on my own server, not in someone else's cloud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swap models without drama.&lt;/strong&gt; New open-weight model drops? Change the env file, restart, done. No vendor lock-in, no rewrite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheap tasks cost nothing.&lt;/strong&gt; Small jobs go to free local models. The paid subscriptions only get the heavy lifting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A closed, single-vendor tool can't do this. It wants you in &lt;em&gt;its&lt;/em&gt; tab. AgentWebUI is just one tab, and it's yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;A scientific study, conducted by me, on my own laziness:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;With AgentWebUI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Find the right AI tool&lt;/td&gt;
&lt;td&gt;Open 4 tabs, 2 terminals, sigh&lt;/td&gt;
&lt;td&gt;One dropdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Find yesterday's chat&lt;/td&gt;
&lt;td&gt;Check every app's history&lt;/td&gt;
&lt;td&gt;⌘K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Try a new open model&lt;/td&gt;
&lt;td&gt;New tool, new install, new login&lt;/td&gt;
&lt;td&gt;Edit env file, restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hand off a coding task&lt;/td&gt;
&lt;td&gt;Open a terminal, set up the agent&lt;/td&gt;
&lt;td&gt;Pick Claude Code, type the task&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The chainsaw doctors would be proud. Hard job in, lazy solution out.&lt;/p&gt;

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

&lt;p&gt;Entering for the overall prize.&lt;/p&gt;




&lt;p&gt;Built with &lt;a class="mentioned-user" href="https://dev.to/tahrimwalid"&gt;@tahrimwalid&lt;/a&gt; and &lt;a class="mentioned-user" href="https://dev.to/mahedi"&gt;@mahedi&lt;/a&gt;, who are almost as lazy as me.&lt;/p&gt;

&lt;p&gt;If you're a developer with more AI tabs than browser memory, give AgentWebUI a spin. Then do what the sloths do: delegate, relax, and let the agents earn their keep. 🦥&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>StackScribe: technical dictation that keeps the important bits intact</title>
      <dc:creator>Mahmudur Rahman Labib</dc:creator>
      <pubDate>Tue, 13 Oct 2026 12:47:09 +0000</pubDate>
      <link>https://dev.to/mahmudurrahmanlabib/stackscribe-technical-dictation-that-keeps-the-important-bits-intact-243d</link>
      <guid>https://dev.to/mahmudurrahmanlabib/stackscribe-technical-dictation-that-keeps-the-important-bits-intact-243d</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;StackScribe&lt;/strong&gt;, a voice-first way to turn a rough support or incident note into a support ticket, engineering handoff, or customer update. It is for support engineers, DevOps teams, and small software companies that need to document incidents quickly without losing the details that make the note useful: &lt;code&gt;PHP-FPM&lt;/code&gt;, &lt;code&gt;wp-cli&lt;/code&gt;, &lt;code&gt;php:9000&lt;/code&gt;, error strings, versions, hostnames, and timestamps.&lt;/p&gt;

&lt;p&gt;The team keeps its own technical termbook. StackScribe passes those terms to ElevenLabs Scribe v2 as keyterm prompts, then lets the engineer review the transcript before drafting. Gemma turns the corrected note into the selected handoff format. The result stays editable, and a person has to review and copy it; the app does not file a ticket or send a message automatically.&lt;/p&gt;

&lt;p&gt;The likely customer is a small software company or support consultancy whose engineers repeatedly translate voice notes into tickets and incident updates. The product would save time on that documentation while reducing the chance that an exact error, identifier, or operational boundary gets lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mahmudurlabib.com/stackscribe/" rel="noopener noreferrer"&gt;Try the live StackScribe demo&lt;/a&gt;. Click &lt;strong&gt;Try sample&lt;/strong&gt;, then &lt;strong&gt;Draft support ticket&lt;/strong&gt; to see the workflow.&lt;/p&gt;

&lt;p&gt;The public demo currently runs its deterministic sample flow. Live transcription and model drafting are implemented in the project but need a configured API Worker and provider credentials; the public demo does not yet call those services. I am stating that limit clearly so the demo does not imply a live provider connection that is not configured.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/mahmudurrahmanlabib/stackscribe" rel="noopener noreferrer"&gt;Public GitHub repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The front end is static HTML, CSS, and JavaScript. A Cloudflare Worker holds provider keys, checks inputs and allowed origins, and applies daily request limits. Audio and transcript contents are not saved to an application database.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The speech path uses ElevenLabs Scribe v2 with a user-editable list of technical keyterms. The drafting path calls an OpenAI-compatible endpoint, with Gemma 3 12B Instruct as the default open-weight model. The model prompt preserves exact tokens, separates observed facts from hypotheses, flags uncertain details, and avoids inventing a root cause, severity, or ETA.&lt;/p&gt;

&lt;p&gt;There are three outputs: a support ticket, an engineering handoff, and a customer update. Each has different constraints: an internal incident handoff can keep log strings and investigation requests, while a customer update avoids exposing internal logs or unsupported promises. The sample is deterministic, and five Worker tests cover the request validation, provider payloads, output parsing, and rate limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Technical support has team-specific vocabulary and policy boundaries. An open-weight model gives a team room to change the drafting model, host inference on infrastructure it controls, and tune the prompt to its own support workflow without rebuilding the voice capture path around one closed model provider. It also makes the model choice a deployment decision: a small team can begin with a hosted open model and move to self-hosted inference if its privacy, cost, or volume needs change.&lt;/p&gt;

&lt;p&gt;This is not a fully offline product: the current speech-recognition design uses ElevenLabs as a hosted service. The open model is responsible for shaping the transcript into a useful artifact, while ElevenLabs handles speech-to-text and keyterm prompting. That split lets the product use a specialist speech service while keeping the reasoning and formatting layer replaceable.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;Optional. I did not save a DevRelay session for this build.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Best Use of ElevenLabs&lt;/li&gt;
&lt;li&gt;Best Use of Gemma&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>elevenlabs</category>
      <category>gemma</category>
    </item>
    <item>
      <title>Touch Grass Nudge: a tiny local-Gemma app that gives you a 10-minute outdoor quest</title>
      <dc:creator>Mahmudur Rahman Labib</dc:creator>
      <pubDate>Wed, 07 Oct 2026 11:58:56 +0000</pubDate>
      <link>https://dev.to/mahmudurrahmanlabib/touch-grass-nudge-a-tiny-local-gemma-app-that-gives-you-a-10-minute-outdoor-quest-33l6</link>
      <guid>https://dev.to/mahmudurrahmanlabib/touch-grass-nudge-a-tiny-local-gemma-app-that-gives-you-a-10-minute-outdoor-quest-33l6</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;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Touch Grass Nudge&lt;/strong&gt; is a one-file web app with one job: get you away from the screen. Open it, press a button, and it gives you a single 10-minute outdoor quest suited to the weather, like "walk around the block and notice one thing you've never seen before". Go do it, come back, tap "I did it ✅", and it keeps a tally of the quests you've completed.&lt;/p&gt;

&lt;p&gt;It's for anyone who thinks "I should really go outside" at 4pm and then doesn't. The whole interaction takes about ten seconds so that the screen is the shortest part of the day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&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%2Fbebpaujazmzlyh1xbf7m.jpg" 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%2Fbebpaujazmzlyh1xbf7m.jpg" alt="Touch Grass Nudge showing a quest written by gemma3:1b" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it went:&lt;/strong&gt; honestly, I had to try it indoors. It was raining, so my "touch grass" test was a screenshot from the desk and a quest of "walk around your house or yard for a 10-minute reset" that I'm obliged to follow when the rain stops. The weather-aware prompt tells the model to suggest something that works with rain or from a sheltered doorstep, which is exactly the situation I was in.&lt;/p&gt;

&lt;p&gt;In that test the page couldn't get my location, so it said "weather unavailable" and the model got a generic prompt. The location and weather lookup is the part I did not see working end to end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/mahmudurrahmanlabib" rel="noopener noreferrer"&gt;
        mahmudurrahmanlabib
      &lt;/a&gt; / &lt;a href="https://github.com/mahmudurrahmanlabib/touch-grass-nudge" rel="noopener noreferrer"&gt;
        touch-grass-nudge
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      One-file app: local Gemma (Ollama) + Open-Meteo suggest a 10-minute outdoor quest
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Touch Grass Nudge&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;One HTML file. Reads your local weather (Open-Meteo, no key), asks a local open-weight model (Gemma via Ollama) for a 10-minute outdoor micro-quest, and tracks completed quests in your browser. No backend, no account, nothing leaves your machine except the weather lookup.&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;ollama pull gemma3:1b
OLLAMA_ORIGINS=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;http://localhost:8000&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; ollama serve   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; allow this page to call Ollama&lt;/span&gt;
python3 -m http.server 8000                           &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; then open http://localhost:8000&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Use &lt;code&gt;?model=&amp;lt;name&amp;gt;&lt;/code&gt; to try another model. If Ollama isn't reachable it falls back to built-in quests.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/mahmudurrahmanlabib/touch-grass-nudge/screenshot.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fmahmudurrahmanlabib%2Ftouch-grass-nudge%2FHEAD%2Fscreenshot.jpg" alt="screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;License: MIT&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/mahmudurrahmanlabib/touch-grass-nudge" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&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;a href="https://ai.google.dev/gemma" rel="noopener noreferrer"&gt;Gemma&lt;/a&gt; (&lt;code&gt;gemma3:1b&lt;/code&gt;), an open-weight model, running locally through &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;. The page calls Ollama's &lt;code&gt;/api/generate&lt;/code&gt; straight from the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weather:&lt;/strong&gt; &lt;a href="https://open-meteo.com" rel="noopener noreferrer"&gt;Open-Meteo&lt;/a&gt;, free and keyless. The browser's geolocation feeds temperature, rain, wind and sunset time into the prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App:&lt;/strong&gt; a single &lt;code&gt;index.html&lt;/code&gt;, no build step, no backend, no account. Completed quests are stored in &lt;code&gt;localStorage&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback:&lt;/strong&gt; if Ollama isn't reachable, it shows a built-in quest instead of an error.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The prompt took the most tuning. The first version let the 1B model write a fantasy story about a lost lantern; telling it "real, safe activity, no story, exactly 2 short sentences" fixed that.&lt;/p&gt;

&lt;p&gt;I built it with Claude Code as my coding assistant, so this post is flagged as AI-assisted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;A nudge app is only useful if you'll actually open it daily, and that depends on it being free and private:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Costs nothing to run.&lt;/strong&gt; There is no API key or per-request bill, so a ten-second daily habit never becomes a subscription.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your habits stay local.&lt;/strong&gt; Your time of day, your location and your quest history never go to an AI provider. Only a coordinate pair goes to the weather API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swappable.&lt;/strong&gt; A different model is a &lt;code&gt;?model=&lt;/code&gt; URL parameter away. I used a 1B model because it fits on a laptop and answers in seconds.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Best Use of Gemma&lt;/p&gt;

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