<?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: william freund</title>
    <description>The latest articles on DEV Community by william freund (@986036734).</description>
    <link>https://dev.to/986036734</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%2F4173730%2F57c0f6f7-641d-4fa8-870e-c2b4ccdc5e22.png</url>
      <title>DEV Community: william freund</title>
      <link>https://dev.to/986036734</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/986036734"/>
    <language>en</language>
    <item>
      <title>Touch Grass: an open-source AI agent that plans your way outside 🌿</title>
      <dc:creator>william freund</dc:creator>
      <pubDate>Fri, 09 Oct 2026 15:27:30 +0000</pubDate>
      <link>https://dev.to/986036734/touch-grass-an-open-source-ai-agent-that-plans-your-way-outside-46mn</link>
      <guid>https://dev.to/986036734/touch-grass-an-open-source-ai-agent-that-plans-your-way-outside-46mn</guid>
      <description>&lt;p&gt;&lt;em&gt;My submission for the Hacktoberfest Open-Source AI Challenge: Week 1 — "Touch Grass".&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The prompt was simple: build something with open-source AI at its core that gets people off the screen and into the world. So I built the smallest agent I could that does exactly that — you tell it where you are and how much time you have, and it plans a real outdoor micro-adventure: when to go, where to stand, what to look for, and what to do with your phone (spoiler: airplane mode).&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Touch Grass&lt;/strong&gt; is a tiny Python agent (~200 lines, one dependency). It runs a tool-using loop over any OpenAI-compatible chat endpoint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: geocoding (OpenStreetMap), sunrise/sunset times, and a 12-hour weather outlook (Open-Meteo) — all free, keyless, open data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brain&lt;/strong&gt;: any open-weight model behind an OpenAI-compatible API. The agent supports local Ollama for fully offline inference, or a hosted gateway. For this demo I ran it against a hosted open-weight model served over an OpenAI-compatible endpoint; swapping models is one environment variable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output&lt;/strong&gt;: a concrete Markdown plan — time window, spot, timed steps, things to notice, a phone rule, and a rain check. No frameworks, no vendor SDKs. The whole thing is &lt;code&gt;requests&lt;/code&gt; + a loop.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Real run, tonight, no cherry-picking — asked for a 45-minute sunset walk with birding near Olympic Forest Park, Beijing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  Lakeside Light &amp;amp; Last Calls — Aohai, Olympic Forest Park
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;When:&lt;/strong&gt; 17:05 → 17:50. Sunset is 17:46, so this window catches warm pre-sunset light and ends in the afterglow. Overcast, 21°C, 0% precipitation across the next 12 hours — dry and calm. Honest caveat: overcast may swallow the sun disc itself. That's fine — it's actually &lt;em&gt;better&lt;/em&gt; for birds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Where:&lt;/strong&gt; the east shore of Aohai lake, looking west across the water. Enter at the south gate, 8 minutes' walk to the shoreline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The plan:&lt;/strong&gt; timed steps from gate to shoreline birding (17:10–17:28), then 5 minutes north to a west-facing photo gap, shooting the afterglow 5–10 minutes &lt;em&gt;after&lt;/em&gt; official sunset.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Look for:&lt;/strong&gt; grey herons and great egrets in the shallows, little grebes and coots on open water, azure-winged magpies in the treeline, the lake going two-tone in the wind, early-October migrants in the willows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Leave the phone:&lt;/strong&gt; airplane mode in your pocket until 17:44 — the camera is the only phone use, and it starts when the light does.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rain check:&lt;/strong&gt; not needed today. If the sky fully greys out, drop the sunset shot and walk the wetland boardwalk instead.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;What I like about this output: the agent actually &lt;em&gt;used&lt;/em&gt; its tools. It geocoded the park, pulled real sunset/weather data, and reasoned about it — noticing that overcast hurts the sunset photo but helps the birding, and adjusting the plan accordingly. That's the agent earning its keep, not just filling a template.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open innovation matters here
&lt;/h2&gt;

&lt;p&gt;This project only makes sense because it's open, in three concrete ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It can go where the trail goes.&lt;/strong&gt; A closed API means the agent dies the moment you lose signal. Open weights mean the same agent runs on a laptop with Ollama, fully offline — which is exactly where a "touch grass" tool needs to work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your location stays yours.&lt;/strong&gt; The agent's most sensitive input is where you are and when. With open models and open data sources, none of that has to travel to a server you don't control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing to run and anyone can improve it.&lt;/strong&gt; The model is swappable, the data sources are free, the code is ~200 lines of MIT-licensed Python. A student, a hiking club, or a park ranger can fork it, point it at a newer open model next year, and it's better — no permission, no bill.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Closed models could generate the same &lt;em&gt;words&lt;/em&gt;. They couldn't give you the same &lt;em&gt;guarantees&lt;/em&gt;. For a tool whose whole job is getting you outside, offline and private aren't features — they're the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&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
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:11434/v1  &lt;span class="c"&gt;# or any OpenAI-compatible endpoint&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;qwen2.5:3b
python &lt;span class="nt"&gt;-m&lt;/span&gt; touchgrass.cli &lt;span class="nt"&gt;--place&lt;/span&gt; &lt;span class="s2"&gt;"your park here"&lt;/span&gt; &lt;span class="nt"&gt;--minutes&lt;/span&gt; 45 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--interests&lt;/span&gt; &lt;span class="s2"&gt;"birding, sunset photos"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo: &lt;a href="https://github.com/986036734/touch-grass" rel="noopener noreferrer"&gt;https://github.com/986036734/touch-grass&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I validated the plan logic against real data tonight; the agent geocoded, checked sunset and weather, and reasoned over them rather than filling a template.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Overall&lt;/li&gt;
&lt;/ul&gt;

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