<?xml version="1.0"?>
<rss version="2.0">
   <channel>
      <title>Tim Habersack</title>
      <link>https://tim.hithlonde.com</link>
      <description>Where I put my things..</description>
      <language>en-us</language>
      <pubDate>Sun, 15 Feb 2026 19:52:35 -0800</pubDate>
      <lastBuildDate>Sun, 15 Feb 2026 19:52:35 -0800</lastBuildDate>
      <webMaster>tim.habersack@gmail.com</webMaster>
      <item>
         <title>My OpenClaw Script Pattern (Or: How I Stopped Burning Tokens and Started Building Tools)</title>
         <link>https://tim.hithlonde.com/t/openclaw-script-pattern</link>
         <description>&lt;p&gt;After using OpenClaw for a couple weeks, I've settled on a pattern that works really well: &lt;strong&gt;make scripts do the actual work, OpenClaw just executes them.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;The Problem with Pure AI Generation&lt;/h4&gt;

&lt;p&gt;For the first day or so, I had OpenClaw generating output directly. Need a weather forecast? Ask the AI to fetch the data, format it nicely, and post it to Discord.&lt;/p&gt;

&lt;p&gt;This worked, but it burned tokens, produced inconsistent formatting, and wasn't reusable outside of AI conversations. I needed a better approach.&lt;/p&gt;

&lt;h4&gt;The Script-First Architecture&lt;/h4&gt;

&lt;p&gt;The pattern I landed on is pretty straightforward: write focused Python scripts that do one thing well, then have OpenClaw execute them.&lt;/p&gt;

&lt;p&gt;Instead of this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&quot;OpenClaw, fetch the weather for San Diego, format it nicely with emoji and box drawing characters, and post it to #weather&quot;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I do this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&quot;OpenClaw, run the weather script and post the output to #weather&quot;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The script handles all the logic &mdash; API calls, data parsing, formatting, output. OpenClaw just executes it and relays the result.&lt;/p&gt;

&lt;h4&gt;Example: Weather Forecast System&lt;/h4&gt;

&lt;p&gt;Every morning at 6:50 AM, I get a weather forecast for San Diego posted to my #weather Discord channel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File structure:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;weather-system/
âââ .venv/                    # Python virtual environment
âââ weather-system.py         # Main script
âââ requirements.txt          # Dependencies (requests)
âââ .last-run                 # Timestamp tracking
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;What the script does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calls Open-Meteo API for San Diego coordinates&lt;/li&gt;
&lt;li&gt;Parses current temp, today's high, precipitation timing&lt;/li&gt;
&lt;li&gt;Formats output with weather emoji and Unicode box drawing&lt;/li&gt;
&lt;li&gt;Prints pre-formatted text&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Output format:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;âï¸ WEATHER - 92130
Current: 62&deg;F @ 06:50
Today High: 68&deg;F @ 14:00
Precipitation: 04:00-09:00 (heavy 05:00-06:00)

Tomorrow:
High: 58&deg;F @ 13:00
Low: 48&deg;F
Precipitation: none
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;What OpenClaw does:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Runs the script at 6:50 AM (scheduled via cron)&lt;/li&gt;
&lt;li&gt;Wraps the output in Discord code blocks&lt;/li&gt;
&lt;li&gt;Posts to #weather channel&lt;/li&gt;
&lt;li&gt;Done&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Total tokens used per run: minimal (just executing a script and posting output, not generating the forecast content).&lt;/p&gt;

&lt;h4&gt;Example: Air Quality Monitor&lt;/h4&gt;

&lt;p&gt;This one runs every hour but only posts when air quality is above 50 or crosses the threshold in either direction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File structure:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;aqi-monitor/
âââ .venv/
âââ aqi-monitor.py
âââ aqi-state.json           # Tracks last reading for threshold detection
âââ requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;What the script does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetches current AQI from IQAir API&lt;/li&gt;
&lt;li&gt;Loads previous reading from state file&lt;/li&gt;
&lt;li&gt;Checks if current AQI &gt; 50 OR crossed threshold&lt;/li&gt;
&lt;li&gt;If alert condition: prints formatted alert&lt;/li&gt;
&lt;li&gt;If no alert needed: prints &quot;SILENT&quot;&lt;/li&gt;
&lt;li&gt;Updates state file with current reading&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Output format (when alerting):&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;AQI - 92130 (San Diego) @ 11:00
AQI: 65 | Main: PM2.5
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;What OpenClaw does:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Runs the script hourly (scheduled via cron)&lt;/li&gt;
&lt;li&gt;If output is &quot;SILENT&quot;: does nothing&lt;/li&gt;
&lt;li&gt;If output is alert data: posts to &lt;a href=&quot;https://tim.hithlonde.com/tag/weather&quot;&gt;#weather&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Done&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This prevents spam &mdash; I only get notified when air quality actually matters, not every single hour saying &quot;everything is fine.&quot;&lt;/p&gt;

&lt;h4&gt;The Pattern&lt;/h4&gt;

&lt;p&gt;Both systems (and the four others I've built) follow the same approach:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Focused Python script&lt;/strong&gt; that does one thing well&lt;br /&gt;
&lt;strong&gt;2. Pre-formatted output&lt;/strong&gt; designed for Discord code blocks&lt;br /&gt;
&lt;strong&gt;3. State tracking&lt;/strong&gt; when needed (for thresholds, timestamps, rate limiting)&lt;br /&gt;
&lt;strong&gt;4. Simple execution&lt;/strong&gt; via OpenClaw cron jobs&lt;br /&gt;
&lt;strong&gt;5. Explicit channel routing&lt;/strong&gt; using the message tool&lt;/p&gt;

&lt;p&gt;No complex logic in the cron configuration. No asking the AI to format things on the fly. Just &quot;run this script, post the output to this channel.&quot;&lt;/p&gt;

&lt;h4&gt;Token Management Strategy&lt;/h4&gt;

&lt;p&gt;Another benefit of this is easier cron job setups. I pay for Claude API usage and need tokens for work during the day. So automation tasks run as cron jobs in the middle of the night. Also sometimes a bigger operation I will make as a script then have it be cronned for late at night.&lt;/p&gt;

&lt;p&gt;This keeps my daytime budget available for interactive work. Plus I wake up to completed tasks posted to Discord, which is pretty nice.&lt;/p&gt;

&lt;h4&gt;Summary&lt;/h4&gt;

&lt;p&gt;Once you have the pattern down, adding new systems is pretty straightforward. I can usually go from idea to working automation in under an hour.&lt;/p&gt;

&lt;p&gt;Anyway, that's how I approach making tools for Openclaw so far. If you're building something similar, hopefully this gives you a useful starting point.&lt;/p&gt;
         </description>
         <pubDate>Sun, 15 Feb 2026 12:25:43 -0800</pubDate>
         <guid isPermaLink="false">element-121</guid>
      </item>
      <item>
         <title>Reverting just a couple files from a while ago</title>
         <link>https://tim.hithlonde.com/t/git-reverting-partial-files</link>
         <description>&lt;p&gt;There were 3 files in my repo that had been inadvertently changed like 20 commits ago. I just wanted to revert 3 of them, not all the files in the commit. This was easiest way to do it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git show &amp;lt;commit-hash&amp;gt; -- path/to/file1.php path/to/file2.js path/to/file3.html | git apply -R&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I always forget this and relearn it every 2 years, so maybe next time around I'll look here. &lt;/p&gt;
         </description>
         <pubDate>Sun, 18 Jan 2026 11:51:38 -0800</pubDate>
         <guid isPermaLink="false">element-119</guid>
      </item>
      <item>
         <title>Freedom - Haiku</title>
         <link>https://tim.hithlonde.com/t/haiku-freedom</link>
         <description>&lt;pre&gt;
On rolling green plains,
arms outstretched, child runs, eyes up
at the cotton clouds.
&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;https://tim.hithlonde.com/tag/poetry&quot;&gt;#poetry&lt;/a&gt;&lt;/p&gt;
         </description>
         <pubDate>Thu, 26 Jun 2025 09:00:54 -0700</pubDate>
         <guid isPermaLink="false">element-118</guid>
      </item>
      <item>
         <title>Treats - Haiku</title>
         <link>https://tim.hithlonde.com/t/2025-haiku-treats</link>
         <description>&lt;pre&gt;
Thin strawberry slice
Atop warm, sweet-smelling crepe
Powdered-sugar snow
&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;https://tim.hithlonde.com/tag/poetry&quot;&gt;#poetry&lt;/a&gt;&lt;/p&gt;
         </description>
         <pubDate>Wed, 02 Apr 2025 06:35:43 -0700</pubDate>
         <guid isPermaLink="false">element-117</guid>
      </item>
      <item>
         <title>Spring - Haiku</title>
         <link>https://tim.hithlonde.com/t/haiku-spring-2025</link>
         <description>&lt;pre&gt;
Baby-new green leaf
displays a crystal clear orb,
above rich, dark earth
&lt;/pre&gt;

&lt;p&gt;&lt;a href=&quot;https://tim.hithlonde.com/tag/poetry&quot;&gt;#poetry&lt;/a&gt;&lt;/p&gt;
         </description>
         <pubDate>Wed, 26 Mar 2025 19:00:00 -0700</pubDate>
         <guid isPermaLink="false">element-116</guid>
      </item>
      <item>
         <title>Update #115</title>
         <link>https://tim.hithlonde.com/u/115</link>
         <description>&lt;blockquote&gt;
  &lt;p&gt;I prefer tongue-tied knowledge to ignorant loquacity.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;https://www.brainyquote.com/quotes/marcus_tullius_cicero_156337&quot;&gt;Marcus Tullius Cicero&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://tim.hithlonde.com/tag/quote&quot;&gt;#quote&lt;/a&gt;&lt;/p&gt;
         </description>
         <pubDate>Fri, 17 Jan 2025 07:39:01 -0800</pubDate>
         <guid isPermaLink="false">element-115</guid>
      </item>
      <item>
         <title>Update #114</title>
         <link>https://tim.hithlonde.com/u/114</link>
         <description>&lt;blockquote&gt;
  &lt;p&gt;A home without books is a body without soul.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;https://www.brainyquote.com/quotes/marcus_tullius_cicero_379109&quot;&gt;Marcus Tullius Cicero&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://tim.hithlonde.com/tag/quote&quot;&gt;#quote&lt;/a&gt;&lt;/p&gt;
         </description>
         <pubDate>Wed, 15 Jan 2025 08:01:48 -0800</pubDate>
         <guid isPermaLink="false">element-114</guid>
      </item>
      <item>
         <title>Update #113</title>
         <link>https://tim.hithlonde.com/u/113</link>
         <description>&lt;blockquote&gt;
  &lt;p&gt;Gratitude is not only the greatest of virtues, but the parent of all the others.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;https://www.brainyquote.com/quotes/marcus_tullius_cicero_122152&quot;&gt;Marcus Tullius Cicero&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://tim.hithlonde.com/tag/quote&quot;&gt;#quote&lt;/a&gt;&lt;/p&gt;
         </description>
         <pubDate>Tue, 14 Jan 2025 07:00:52 -0800</pubDate>
         <guid isPermaLink="false">element-113</guid>
      </item>
      <item>
         <title>Update #112</title>
         <link>https://tim.hithlonde.com/u/112</link>
         <description>&lt;p&gt;It's been a very long time since I have posted here. This is the obligatory &quot;oh gosh I will post here more frequently!&quot; post. :D &lt;/p&gt;

&lt;p&gt;Initially I am going to be posting quotes that inspire me every morning. This sounds super cheesy YET, it's nice to think about things outside the normal daily cycle, you know?&lt;/p&gt;
         </description>
         <pubDate>Mon, 13 Jan 2025 08:00:39 -0800</pubDate>
         <guid isPermaLink="false">element-112</guid>
      </item>
      <item>
         <title>Delicious hot drinks</title>
         <link>https://tim.hithlonde.com/t/hot-drinks</link>
         <description>&lt;p&gt;Every morning my wife makes me a beautiful, delicious latte, and it is the best thing ever.&lt;/p&gt;

&lt;p&gt;I am spoiled.&lt;/p&gt;
         </description>
         <pubDate>Mon, 21 Nov 2022 04:04:30 -0800</pubDate>
         <guid isPermaLink="false">element-111</guid>
      </item>
      <item>
         <title>Update #110</title>
         <link>https://tim.hithlonde.com/u/110</link>
         <description>&lt;p&gt;We've been trying to use the indoor pool a lot while we are in VA. It's been fun so far!&lt;/p&gt;
         </description>
         <pubDate>Fri, 23 Sep 2022 08:32:21 -0700</pubDate>
         <guid isPermaLink="false">element-110</guid>
      </item>
         </channel>
</rss>
