<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>
            garrit.xyz
        </title>
        <link>
            https://garrit.xyz
        </link>
        <description>
            Garrit Franke
        </description>
        <language>
            en
        </language>
        <lastBuildDate>
            Mon, 10 Aug 2026 00:00:00 +0000
        </lastBuildDate>
        <item>
            <title>
                ASCII art of a dolphin looking into a mirror
            </title>
            <guid>
                https://garrit.xyz/posts/2026-08-10-ascii-art-of-a-dolphin-looking-into-a-mirror
            </guid>
            <link>
                https://garrit.xyz/posts/2026-08-10-ascii-art-of-a-dolphin-looking-into-a-mirror?utm_source=rss
            </link>
            <pubDate>
                Mon, 10 Aug 2026 00:00:00 +0000
            </pubDate>
            <description>
                <![CDATA[<p>Simon Willison has an amazing <a href="https://simonwillison.net/tags/pelican-riding-a-bicycle/">personal benchmark</a> that he uses on any new AI model that comes out:</p>

<blockquote><p>&quot;Generate an SVG of a pelican riding a bicycle&quot;</p></blockquote>

<p>The outputs are as funny as they are informative about the AI model. The pelican is very saturated on the internet by now, so it&#39;s hard to tell if an AI is particularly trained against this prompt.</p>

<p>So, for the longest time, I wanted to have my own similar personal benchmark that I can throw at new models to see how they perform. And I think I finally have it:</p>

<blockquote><p>&quot;ASCII art of a dolphin looking into a mirror&quot;</p></blockquote>

<p>As you might imagine, most AIs are neither specifically trained on ASCII art, nor the appearance of a dolphin, nor building asymmetric reflections of said subject. The results so far are very... promising:</p>

<h2>Claude Sonnet 5 (Medium)</h2>

<p>What even is that?</p>

<p><code>
,-&#39;`-.
                          ,-&#39;::::::::::`-.
                     _.--:::::::::::::::::`--.__
                _.-&#39;`   :::::::::::::::::::::::`-.
             .-&#39;      ,::::::::::::::::::::::::::`.
           .&#39;       ,&#39;::::::::::::::::::::::::::::`.
          /       ,&#39;::::::::::::::::,--._::::::::::\
         /      ,&#39;::::::::::::::::,&#39;     `-._:::::::\
        |      /::::::::::::::::,&#39;          _)::::::::\
        |     /:::::::::::,--&#39;``            `.::::::::|
        |    |:::::::,--&#39;`    ⚬              |::::::::|
        |    |::::::/                        /::::::::|
        |    |:::::|         mirror         /:::::::::|
         \    \:::::\                      /::::::::::/
          \    \:::::`-._               ,-&#39;::::::::::/
           `.   `-:::::::`--.._____..--&#39;:::::::::::.&#39;
             `-._  `-:::::::::::::::::::::::::::_.-&#39;
                 `--._``--:::::::::::::::--&#39;&#39;_.-&#39;
                       ``--..________..--&#39;&#39;
    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
                    (reflection, same shape)
</code></p>

<h2>Claude Opus 5 (High)</h2>

<p>This one is my favorite so far!</p>

<p><code>
                               .------------------------------.
                               |                              |
                      __       |      __                      |
        /\         _-&#39;  `-.    |   .-&#39;  `-_         /\        |
       /  \     _-&#39;    o   `.  | .&#39;   o    `-_     /  \       |
   ___/    \_-&#39;             _) |(_             `-_/    \___   |
  /                      _-&#39;   |  `-_                      \  |
  \_                __--&#39;      |     `--__                _/  |
    `--..______..--&#39;           |          `--..______..--&#39;    |
                               |                              |
                               &#39;------------------------------&#39;
</code></p>

<h2>Claude Fable 5 (High)</h2>

<p><code></code>`</p>

<hr/>

<pre><code>    ___                      |  _______  |
 .-&#39;   &#39;-.        _         | |   _..-&#39; |
/  o      \___..-&#39; \        | | &#39;-.._ o |
\             __.--&#39;        | |--.__    |
 &#39;-.____..--&#39;&#39;    \         | | /       |
     \/  \    \    \        | |  /  \/  |
          \    &#39;.___\       | |_/       |
           &#39;--&#39;             |  ~~~~~~~  |
                            |___________|
          dolphin              mirror</code></pre>

<p><code></code>`</p>

<h2>Claude Fable 5 (Extra)</h2>

<p>Response Suffix: &quot;Fin-tastic reflection, if I may say so.&quot;</p>

<p><code>
                             .----------------------.
                             |                      |
           __                |          __          |
     _____/  \______         |   ______/  \_____    |
   =&lt;    _      o   &gt;        |  &lt;   o      _    &gt;=  |
     \_____________/         |   \_____________/    |
        o   ..               |                      |
      o    .                 &#39;----------------------&#39;
                                       |  |
                                    ___|__|___
                                   (__________)
</code></p>

<h2>GPT-5.6 Sol (Extra High)</h2>

<p><code></code><code>
                 __
             ___/  \___
        ____/          \____
      _/                    \__
     /     _..---.._            </code>-.
    /   .-&#39;         <code>-.            \
   /   /      __       \            |
  |   |     .&#39;  </code>.      |           |
   \   \    _<strong><em>/     /           /
    <code>-. </code>-.</em>        <em>.-&#39;       </em>.-&#39;
       <code>---.</code>------&#39;       _.-&#39;
            \           .-&#39;
             \   </strong>_   /
              _/   _/
                \   /
                 _/</p>

<pre><code>                  ||  MIRROR  ||
                  ||          ||
                  ||    __    ||
                  || __/  \__ ||
                  ||/        \||
                  ||\        /||
                  || `-.__.-&#39; ||
                  ||    \/    ||
                  ||          ||
                  ||__________||</code></pre>

<p><code></code>`</p>

<h2>Gemini 3.1 Pro</h2>

<p><code>
_                   _
           ,&#39; `.      .-.      .&#39; `.
         ,&#39;     `--.  | |  .--&#39;     `.
       ,&#39;           `-| |-&#39;           `.
     ,&#39;               | |               `.
    /                 | |                 \
   |         O    _.-.| |.-._    O         |
   |             (____| |____)             |
    \          ,&#39;     | |     `.          /
     `--------&#39;       &#39;-&#39;       `--------&#39;
         o                           o
      o     o                     o     o
~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^~^
</code></p>

<h2>Gemini 3.6 Thinking</h2>

<p><code></code>`</p>

<hr/>

<pre><code> .-&#39;     `-.                     .----.                 .-&#39;     `-.</code></pre>

<p>   .&#39;   o       \                    | || |                /       o   &#39;.
  /      <em>       \                   | || |               /       </em>      \
 /     /&#39; \       \                  | || |              /       / &#39;\     \
/    /<code>    )       \________         | || |         ________/       (    </code>\    \
|    |     /                 \       | || |        /                 \     |    |
|    |    &#39;-----.             \      | || |       /             .----&#39;     |    |
 \    \          <code>----.        \     | || |      /        .----&#39;          /    /
  &#39;.   &#39;-------------&#39;          \    | || |     /          &#39;-------------&#39;   .&#39;
    &#39;---------------------------&#39;    &#39;----&#39;     &#39;---------------------------&#39;
</code><code></code></p>

<h1>Conclusion</h1>

<p>AIs seem to really struggle with this. Some more than others. I believe this will be a fun benchmark in the future, so expect more of where that came from!</p>]]>
            </description>
        </item>
        <item>
            <title>
                You should be using a meta harness for agents
            </title>
            <guid>
                https://garrit.xyz/posts/2026-07-15-you-should-be-using-a-meta-harness-for-agents
            </guid>
            <link>
                https://garrit.xyz/posts/2026-07-15-you-should-be-using-a-meta-harness-for-agents?utm_source=rss
            </link>
            <pubDate>
                Wed, 15 Jul 2026 00:00:00 +0000
            </pubDate>
            <description>
                <![CDATA[<p>So you&#39;ve been using an agent harness like <a href="https://code.claude.com/docs/de/overview">Claude Code</a>, <a href="https://openai.com/de-DE/codex/">Codex</a>, <a href="https://pi.dev/">Pi</a> or one of the many others on the market. This is great! It&#39;s incredible how quickly these projects are evolving.</p>

<p>After talking to some coworkers, reading articles on various blogs and seeing countless memes, it seems like many developers are still stuck in the habit of using &quot;an agent&quot; to aid their work - meaning they use one or at most two agent sessions at once. This is often accompanied by phrases like &quot;I&#39;m scrolling on my phone while I wait for the agent to finish&quot;. This worked fine 6 months ago, but frankly, we&#39;re past that point now.</p>

<p>Recently, there has been an influx of what I&#39;d call &quot;meta harnesses&quot;. I don&#39;t know if this is an official term for these products (yet), but I think it&#39;s quite fitting.</p>

<p>The idea of a meta harness is an environment to manage the lifecycle of many parallel agents. You can spin up sessions on demand (optionally in a new Git worktree), kick off your usual agent tasks and be notified if it needs input or once is done with its tasks. In the meantime, you can spin up multiple other agents to work on other parts of the codebase, or even other codebases too.</p>

<p>Gone are the days of working on a single bug for half a day before moving to the next issue. With a meta harness, you can work on 5+ open issues at the same time! Just hook up your issue tracker to the agent (through MCP or CLI, whatever makes more sense for you), paste a link to the issue into the prompt and off it goes. No need to babysit every action. In fact, in the past couple of months, meta harnesses have almost entirely replaced my always-open IDE (VSCode in my case), a shift that I wouldn&#39;t have imagined a year ago.</p>

<h2>Which meta harness should I choose?</h2>

<p>These are the three meta harnesses that I&#39;ve worked with extensively and that I am confident in recommending:</p>

<p><strong><a href="https://www.conductor.build/">Conductor</a></strong> was the first meta harness that I&#39;ve tried. It&#39;s very polished, has a clear and intuitive UI and is compatable with Claude Code and Codex. If you&#39;ve been using one of these two agents, all your skills, commands and MCPs are automatically picked up. Choose this if you </p>

<p><strong><a href="https://cursor.com/">Cursor</a></strong> recently made a huge shift away from &quot;AI IDE&quot; by overhauling the entire application. Cursor has arguably the best user experience of all harnesses I&#39;ve tried. It&#39;s not really a &quot;meta harness&quot;, but rather a way to manage multiple parallel Cursor sessions at the same time. The user experience remains very similar.</p>

<p><strong><a href="https://superset.sh/">Superset</a></strong> is by far the most flexible meta harness I&#39;ve tried, and it&#39;s the one I&#39;m currently using the most. Their approach is raw terminal sessions with whatever harness you like the most, instead of wrapping the session in a fancy UI. Superset still provides all the same features as the other harnesses, like Git worktrees, GitHub integration and agent notifications. It supports the most harnesses out there, and you can customize it extremely well to your liking.</p>

<h2>When not to use a meta harness</h2>

<p>Using many parallel agents through a meta harness does come with the tradeoff of heavy context switching. A rule of thumb I found for myself is that meta harnesses work really well for <strong>quick tasks</strong> like fixing bugs and implementing smaller features. For larger endeavours like proper features or refactorings, I sometimes still resort to opening an IDE and using a single, focused agent session with proper code navigation support just to be sure that I&#39;m the right headspace. I believe over time this ratio will shift more and more towards using meta harnesses as agent capabilities become better and better.</p>

<h2>Conclusion</h2>

<p>If you haven&#39;t used a meta harnesses yet, I highly recommend you try one out for your next coding tasks. I genuinly believe that it will change the way you develop software. And if you&#39;ve just started using them or have experience in other meta harnesses, I&#39;d be greatful to hear from you!</p>]]>
            </description>
        </item>
        <item>
            <title>
                Pac-Man, but you&apos;re the ghost
            </title>
            <guid>
                https://garrit.xyz/posts/2026-06-13-pac-man-but-you-re-the-ghost
            </guid>
            <link>
                https://garrit.xyz/posts/2026-06-13-pac-man-but-you-re-the-ghost?utm_source=rss
            </link>
            <pubDate>
                Sat, 13 Jun 2026 00:00:00 +0000
            </pubDate>
            <description>
                <![CDATA[<p>I always felt a little bad for the ghosts in Pac-Man. They patrol the maze, they corner the guy, and then he eats a glowing pellet and suddenly they&#39;re the ones running for their lives. So I built a small game where you finally get to play the other side.</p>

<p>Pac-Man has its own AI, and your job is to catch him before he clears the maze. The twist is the same one that always ruined my day as a ghost: if he eats a power pellet, the tables flip and he hunts you for a few seconds. Then you run.</p>

<p>You can play the game <a href="https://garritfra.github.io/pac-hunt/">here</a>. Have fun!</p>

<p>&lt;img width=&quot;676&quot; height=&quot;867&quot; alt=&quot;Image&quot; src=&quot;https://github.com/user-attachments/assets/80319217-7cd2-432e-8006-01ff5cefef06&quot; /&gt;</p>]]>
            </description>
        </item>
        <item>
            <title>
                Fixing corrupted Home Assistant energy statistics
            </title>
            <guid>
                https://garrit.xyz/posts/2026-05-29-fixing-corrupted-home-assistant-energy-statistics
            </guid>
            <link>
                https://garrit.xyz/posts/2026-05-29-fixing-corrupted-home-assistant-energy-statistics?utm_source=rss
            </link>
            <pubDate>
                Fri, 29 May 2026 00:00:00 +0000
            </pubDate>
            <description>
                <![CDATA[<blockquote><p><strong>TL;DR:</strong> My meter dropped offline for ~13 days. Home Assistant&#39;s long-term stats came back wrong — a -4,500 kWh bar, a phantom 862 kWh solar spike. The dashboard is a <em>view</em>. The truth is in the <code>statistics</code> table. You fix it with one <code>SELECT</code> to find the damage and one <code>UPDATE</code> to undo it.</p></blockquote>

<p>For a while now, my <a href="https://www.home-assistant.io/docs/energy/">energy dashboard in Home Assistant</a> reports that my house had produced <strong>negative 4,500 kWh</strong> in April. It was finally time to fix that.</p>

<p>&lt;img width=&quot;1080&quot; height=&quot;1527&quot; alt=&quot;Image&quot; src=&quot;https://github.com/user-attachments/assets/01335840-93b5-4d80-ae45-1bb972650269&quot; /&gt;</p>

<p>Each sensor stores two values per hour in the <code>statistics</code> table. <code>state</code> is the raw meter reading. <code>sum</code> is HA&#39;s cumulative total, computed from the deltas between readings. When a <code>total_increasing</code> sensor blinks out and back, <code>sum</code> gets corrupted — but <code>state</code> is almost always still fine. So you trust <code>state</code> and rebuild <code>sum</code> to match.</p>

<p>Stop HA and back up the DB first — you&#39;re editing prod. Then: find the broken row, read its numbers, plug them into the fix.</p>

<h3>1. Find it</h3>

<p>Get the <code>metadata_id</code>, then dump the rows around the glitch. Select <code>start_ts</code> too — those raw unix timestamps are what you&#39;ll paste into the fix:</p>

<p><code></code>`sql
SELECT id, statistic<em>id FROM statistics</em>meta WHERE statistic_id LIKE &#39;%balkonkraftwerk%&#39;;
-- -&gt; 142</p>

<p>SELECT id, start<em>ts, datetime(start</em>ts,&#39;unixepoch&#39;,&#39;localtime&#39;) AS t, state, sum
FROM statistics
WHERE metadata<em>id = 142
  AND start</em>ts BETWEEN strftime(&#39;%s&#39;,&#39;2026-05-04&#39;) AND strftime(&#39;%s&#39;,&#39;2026-05-05&#39;)
ORDER BY start_ts;
<code></code>`</p>

<p>You&#39;re hunting for the row where the story breaks. There are two shapes it takes, and they want different fixes.</p>

<h3>Fix A — phantom spike (<code>state</code> flat, <code>sum</code> jumps)</h3>

<p>The output:</p>

<p><code>
id        start_ts     t                     state     sum
...
2643324   1777917600   2026-05-04 20:00:00   862.271   1031.552   &lt;- last sane row
2643402   1777921200   2026-05-04 21:00:00   862.271   1893.823   &lt;- sum leapt, state didn&#39;t
</code></p>

<p><code>state</code> is identical across both rows, so no energy was actually produced. The damage is the jump in <code>sum</code>:</p>

<p><code>
phantom = 1893.823 - 1031.552 = 862.271   (the bad delta)
from id = 2643402                          (first row carrying it)
</code></p>

<p><code>sum</code> is cumulative, so that 862.271 rides along in <em>every</em> later row too. Subtract it once, from the bad row onward:</p>

<p><code>sql
UPDATE statistics SET sum = sum - 862.271
WHERE metadata_id = 142 AND id &gt;= 2643402;
</code></p>

<h3>Fix B — gap + reset (<code>state</code> advanced, <code>sum</code> restarted at 0)</h3>

<p>Same <code>SELECT</code>, different sensor (155, the grid meter), around the outage:</p>

<p><code>
start_ts     t                     state      sum
1775044800   2026-04-01 14:00:00   4922.912   4792.995   &lt;- last reading before the gap
1776171600   2026-04-14 15:00:00   5127.167   0.382      &lt;- meter&#39;s back, sum reset to ~0
</code></p>

<p>Two things broke: <code>sum</code> fell off a cliff to 0.382, and the 13 days between are simply missing. But <code>state</code> kept counting through the outage, so it tells you the truth. Derive everything from those two rows:</p>

<p><code>
real consumption during gap = state_after - state_before = 5127.167 - 4922.912 = 204.255
where sum SHOULD be at 14.04 = sum_before + that      = 4792.995 + 204.255 = 4997.250
offset to re-base later rows  = should_be - actual     = 4997.250 - 0.382  = 4996.868
</code></p>

<p>Step one, lift every post-reset row back onto the real baseline (using the gap&#39;s <em>end</em> timestamp, <code>1776171600</code>):</p>

<p><code>sql
UPDATE statistics SET sum = sum + 4996.868
WHERE metadata_id = 155 AND start_ts &gt;= 1776171600;
</code></p>

<p>Step two, draw a straight line across the empty gap. The CTE just holds the two endpoints — start (<code>t0=1775044800</code>, <code>s0=4792.995</code>) and the now-corrected end (<code>t1=1776171600</code>, <code>s1=4997.250</code>) — and fills an hourly row for each step between:</p>

<p><code>sql
WITH RECURSIVE v(t0,t1,s0,s1) AS (SELECT 1775044800,1776171600,4792.995,4997.250),
hours(ts) AS (SELECT t0+3600 FROM v
  UNION ALL SELECT ts+3600 FROM hours,v WHERE ts+3600 &lt; v.t1)
INSERT INTO statistics (metadata_id, created_ts, start_ts, sum)
SELECT 155, h.ts, h.ts, v.s0 + (v.s1-v.s0)*(h.ts-v.t0)*1.0/(v.t1-v.t0)
FROM hours h, v;
</code></p>

<p>Restart, re-run the <code>SELECT</code>, confirm the line is boring again.</p>

<p>&lt;img width=&quot;3422&quot; height=&quot;1786&quot; alt=&quot;Image&quot; src=&quot;https://github.com/user-attachments/assets/12775462-3ed8-4399-885c-f26e6ea24af8&quot; /&gt;</p>

<h3>UPDATE, some hours later</h3>

<p>I told you it was one <code>UPDATE</code>. I was wrong, and the next morning the dashboard told me so. The -4,500 bar was back. The 862 kWh spike was back. Same size, new date: today.</p>

<p>Nothing new had broken. My own fix had bounced back.</p>

<p>Here&#39;s what I&#39;d missed. <code>statistics</code> isn&#39;t the only table. There&#39;s a second one — <code>statistics_short_term</code>, five-minute rows that HA rolls up into the hourly <code>statistics</code> table once an hour. And it still held the <em>old</em>, pre-fix cumulative sums. So every hour, HA dutifully re-aggregated the garbage and clobbered my correction, dumping the difference straight into the current hour. I wasn&#39;t fixing the data. I was fixing a cache while the source of truth quietly overwrote me.</p>

<p>Worse: HA was <em>running</em> the whole time. The recorder keeps short-term state in memory and flushes it on shutdown — so even my careful edits got stomped the moment it wrote back. Editing a database underneath a live application is like editing a file in <code>vim</code> while another process truncates it. Whoever writes last wins, and it isn&#39;t you.</p>

<p>So the boring line I buried up top — <em>stop HA first</em> — turned out to be the whole game. Not a footnote. The rule.</p>

<p>Stop the core properly. On HAOS that&#39;s <code>ha core stop</code> — and do it over real SSH, not the browser terminal, which is served through the frontend, dies with it, and locks you out. (Ask me how I know.) Then fix <em>both</em> tables:</p>

<p><code>sql
UPDATE statistics            SET sum = sum - 862.271 WHERE metadata_id = 142 AND id &gt;= 2643402;
UPDATE statistics_short_term SET sum = sum - 862.271 WHERE metadata_id = 142;
</code></p>

<p>Before you start HA back up, check the seam: the highest <code>sum</code> in short-term should land right where your latest <code>statistics</code> row sits, with no cliff between them.</p>

<p><code>sql
SELECT MIN(sum), MAX(sum) FROM statistics_short_term WHERE metadata_id = 142;
</code></p>

<p>One nuance that explains why the first pass <em>looked</em> fine: short-term only keeps the recent stuff, ~10 days. If the hour you&#39;re editing is older than that, it&#39;s already purged and <code>statistics</code> is all you need. My April gap was ancient enough to ignore it. The recent spikes weren&#39;t — and that&#39;s exactly what came back to bite me.</p>]]>
            </description>
        </item>
        <item>
            <title>
                Don&apos;t trust large context windows
            </title>
            <guid>
                https://garrit.xyz/posts/2026-05-06-dont-trust-large-context-windows
            </guid>
            <link>
                https://garrit.xyz/posts/2026-05-06-dont-trust-large-context-windows?utm_source=rss
            </link>
            <pubDate>
                Wed, 06 May 2026 00:00:00 +0000
            </pubDate>
            <description>
                <![CDATA[<p>I recently watched <a href="https://youtu.be/-QFHIoCo-Ko">a video</a> that put a name on something I&#39;d been feeling. The author splits an LLM&#39;s context window into two zones. There&#39;s the <strong>smart zone</strong>, where the model is sharp, and the <strong>dumb zone</strong>, where attention drops off and the model starts forgetting what you told it five minutes ago. The cutoff sits somewhere around 100k tokens. It doesn&#39;t matter how big the advertised context window is.</p>

<p>This matters because coding agents will happily walk you straight into the dumb zone. A modern agent burns through tokens fast. A few file reads, a long debug session, a sprawling test run, and you&#39;re at 100k before lunch. Meanwhile vendors keep advertising windows of 200k, 1M, even 2M, as if those numbers represented a usable working set. They don&#39;t. Studies like <a href="https://arxiv.org/abs/2404.06654">RULER</a> and <a href="https://research.trychroma.com/context-rot">Chroma&#39;s report on context rot</a> show that effective context is a fraction of the advertised number, and that performance degrades gradually as you fill the window.</p>

<p>Large context windows are mostly a marketing number. The architectures behind them work, but they paper over a problem the underlying attention mechanism doesn&#39;t really solve. The number on the box gets bigger every release. The usable part doesn&#39;t keep up.</p>

<p>Modern agents are getting smart about this. Tools like Claude Code now auto-compact: when the session gets long, the agent summarizes the history and starts fresh. That helps. But auto-compaction kicks in after you&#39;ve already spent time in the dumb zone, and the summary is itself produced by a model that&#39;s already degraded. Better than nothing, but I&#39;d rather avoid the situation altogether.</p>

<p>What I do is open a new session and pass it a spec I wrote myself. That&#39;s a much higher signal handoff than any automated summary, because I get to decide what matters going forward. It&#39;s the <a href="https://garrit.xyz/posts/2025-05-20-no-matter-what-you-do-always-leave-a-breadcrumb">breadcrumb</a> approach applied to agents. Leave an artifact that the next session, or the next person, can pick up cleanly.</p>

<p>You can take this further. Projects like <a href="https://github.com/obra/superpowers">obra/superpowers</a> and <a href="https://github.com/mattpocock/skills">mattpocock/skills</a> structure entire agent workflows around small, named artifacts. PRDs, plans, skills, sub-agent handoffs. Each one is a way to keep the working session in the smart zone by deliberately moving information out of the session into something the next session can read.</p>

<p>So I treat my context window like a budget. I assume only the first chunk is really working for me, and everything I can move out of the live session and into a written artifact is one less thing for attention to fight over.</p>]]>
            </description>
        </item>
        <item>
            <title>
                n8n-nodes-open5e: n8n community node that lets you access D&amp;D 5th edition SRD content
            </title>
            <guid>
                https://garrit.xyz/posts/2026-02-13-n8n-nodes-open5e-n8n-community-node-that-lets-you-access-d-d-5th-edition-srd-content
            </guid>
            <link>
                https://garrit.xyz/posts/2026-02-13-n8n-nodes-open5e-n8n-community-node-that-lets-you-access-d-d-5th-edition-srd-content?utm_source=rss
            </link>
            <pubDate>
                Fri, 13 Feb 2026 00:00:00 +0000
            </pubDate>
            <description>
                <![CDATA[<p><a href="https://github.com/garritfra/n8n-nodes-open5e">n8n-nodes-open5e</a> is an n8n community node that lets you access <a href="https://www.dndbeyond.com/srd">D&amp;D 5th edition SRD content</a> from the <a href="https://api.open5e.com">Open5e API</a> in your n8n workflows.</p>

<p>The Open5e node provides access to 12 different D&amp;D 5e resources through the Open5e API. Each resource supports three operations:</p>

<ul><li><strong>Get Many</strong>: Retrieve multiple items with optional filters and pagination</li><li><strong>Get</strong>: Retrieve a single item by its identifier (slug or key)</li><li><strong>Search</strong>: Search for items by name or description</li></ul>

<h2>Example Workflows</h2>

<h3>1. Random Encounter Generator</h3>

<p>Create random encounters by fetching monsters filtered by challenge rating:</p>

<ol><li>Add an Open5e node to your workflow</li><li>Select Resource: <strong>Monster</strong></li><li>Select Operation: <strong>Get Many</strong></li><li>In <strong>Filters</strong>, add:<ul><li>Challenge Rating: <code>5</code></li><li>Document Source: <code>wotc-srd</code></li></ul></li><li>Toggle <strong>Return All</strong> ON to get all matching monsters</li><li>Connect to a Function node to randomly select 3-5 monsters</li><li>Format the output as needed (Discord message, email, etc.)</li></ol>

<h3>2. Spell Lookup Bot</h3>

<p>Build a Discord bot that looks up spell information:</p>

<ol><li>Use a Discord Trigger node to listen for commands</li><li>Add a Function node to extract the spell name from the command</li><li>Add an Open5e node:<ul><li>Resource: <strong>Spell</strong></li><li>Operation: <strong>Search</strong></li><li>Search Term: <code>={{ $json.spellName }}</code></li></ul></li><li>Add a Function node to format the spell details</li><li>Send the formatted spell info back to Discord</li></ol>

<h3>3. Item Database Search</h3>

<p>Search for magic items and weapons by name:</p>

<ol><li>Add an HTTP Request trigger or Form trigger to accept search queries</li><li>Add an Open5e node:<ul><li>Resource: <strong>Magic Item</strong> (or <strong>Weapon</strong>)</li><li>Operation: <strong>Search</strong></li><li>Search Term: <code>={{ $json.query }}</code></li><li>Limit: <code>10</code></li></ul></li><li>Format and return the results</li></ol>

<h2>Contributing</h2>

<p>This is my first n8n community node. Contributions are welcome! Please feel free to submit a Pull Request or <a href="https://github.com/garritfra/n8n-nodes-open5e/issues">open an issue</a> if you encounter any issues.</p>]]>
            </description>
        </item>
        <item>
            <title>
                On Seeking Order in Chaos
            </title>
            <guid>
                https://garrit.xyz/posts/2026-02-11-on-seeking-order-in-chaos
            </guid>
            <link>
                https://garrit.xyz/posts/2026-02-11-on-seeking-order-in-chaos?utm_source=rss
            </link>
            <pubDate>
                Wed, 11 Feb 2026 00:00:00 +0000
            </pubDate>
            <description>
                <![CDATA[<p>From my <a href="https://garrit.xyz/posts/2023-09-09-everyday-carry-notebooks">notebook</a>:</p>

<blockquote><p>Brains are pattern recognition machines.</p><p>I seek structure, sometimes meta-structure.</p><p>I try to structure how I structure things.</p><p>Projects, stories and adventures often only become apparent when they are in the past.</p><p>They evolve naturally, organically. Starting a project can result in something completely different. Is there a structure in that?</p><p>I am trying to find structure again.</p><p>Life is chaotic, and that&#39;s okay.</p></blockquote>

<p>I had this on my mind for quite some time. I&#39;m trying to cope with chaos in my life. I <em>like</em> chaos, and I like turning chaos into order. But often, that does not work and I get frustrated.</p>

<p>Projects - no matter if programming, writing, planning an event or woodworking - are inherently chaotic. There is no structure in the concept of a &quot;project&quot;. I want to think of a project as the sum of threads of actions towards a goal, and life is the sum of every project you ever started. I try to find a way to capture and grasp these &quot;threads&quot; - like commits on different branches of a code repository. On projects other than programming, this utterly fails.</p>

<p>I have to keep telling myself to be fine with the fact that life does not follow a structure. My personal takeaway is learning to recognize when I am seeking structure as a response to anxiety vs. when I&#39;m doing it because it&#39;s actually useful.</p>

<p>Am I alone with this? Does this resonate with anyone out there? I&#39;d love to hear from you.</p>]]>
            </description>
        </item>
        <item>
            <title>
                A fix for long-pressing movement keys in VSCode with Vim-Mode
            </title>
            <guid>
                https://garrit.xyz/posts/2026-02-04-a-fix-for-long-pressing-movement-keys-in-vscode-with-vim-mode
            </guid>
            <link>
                https://garrit.xyz/posts/2026-02-04-a-fix-for-long-pressing-movement-keys-in-vscode-with-vim-mode?utm_source=rss
            </link>
            <pubDate>
                Wed, 04 Feb 2026 00:00:00 +0000
            </pubDate>
            <description>
                <![CDATA[<h2>The Setup</h2>

<ul><li>MacOS</li><li>VSCode</li><li>Vim Extension</li></ul>

<h2>The Issue</h2>

<p>Long-pressing <code>j</code> or <code>k</code> (think &quot;down&quot; or &quot;up&quot; in Vim) only results in one down or up action, instead of continuous scrolling.</p>

<h2>The Fix</h2>

<p>In a terminal, run the following command:</p>

<p><code>
defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false
</code></p>

<p>Original post: https://stackoverflow.com/a/44010683</p>

<h2>Additional tip</h2>

<p>In the MacOS settings, set &quot;Key Repeat Rate&quot; and &quot;Delay Until Repeat&quot; to the highest setting to be able to scroll much faster.</p>

<p>&lt;img width=&quot;478&quot; height=&quot;92&quot; alt=&quot;Image&quot; src=&quot;https://github.com/user-attachments/assets/7bf85853-377d-4727-a5c8-2766f2794e8a&quot; /&gt;</p>]]>
            </description>
        </item>
        <item>
            <title>
                The Scientific Method
            </title>
            <guid>
                https://garrit.xyz/posts/2026-02-03-the-scientific-method
            </guid>
            <link>
                https://garrit.xyz/posts/2026-02-03-the-scientific-method?utm_source=rss
            </link>
            <pubDate>
                Tue, 03 Feb 2026 00:00:00 +0000
            </pubDate>
            <description>
                <![CDATA[<p><a href="https://en.wikipedia.org/wiki/Scientific_method">The Scientific Method</a> is widely accepted among researchers and academics to be the de facto standard of establishing truth.</p>

<p>Lately, I was wandering if parts of the scientific method could more often be applied to every day life. There are <a href="https://www.sciencebuddies.org/science-fair-projects/science-fair/steps-of-the-scientific-method">many</a> <a href="https://www.khanacademy.org/science/biology/intro-to-biology/science-of-biology/a/the-science-of-biology">different</a> <a href="https://extension.unr.edu/publication.aspx?PubID=4239">resources</a> out there explaining the scientific method, often with examples of how to apply it outside of an academic environment. The core method is always the same (in this case, taken from <a href="https://www.sciencebuddies.org/science-fair-projects/science-fair/steps-of-the-scientific-method">sciencebuddies.org</a>):</p>

<blockquote><ol><li>Ask a Question</li><li>Do Background Research</li><li>Construct a Hypothesis</li><li>Test Your Hypothesis by Doing an Experiment</li><li>Analyze Your Data and Draw a Conclusion</li><li>Communicate Your Results</li></ol></blockquote>

<p>Related: <a href="https://garrit.xyz/posts/2024-01-30-to-prove-something-is-true-try-disproving-it-first">To prove something is true, try disproving it first</a></p>]]>
            </description>
        </item>
        <item>
            <title>
                The Cult of Done Manifesto
            </title>
            <guid>
                https://garrit.xyz/posts/2026-02-02-the-cult-of-done-manifesto
            </guid>
            <link>
                https://garrit.xyz/posts/2026-02-02-the-cult-of-done-manifesto?utm_source=rss
            </link>
            <pubDate>
                Mon, 02 Feb 2026 00:00:00 +0000
            </pubDate>
            <description>
                <![CDATA[<p><a href="https://medium.com/@bre/the-cult-of-done-manifesto-724ca1c2ff13">The Cult of Done Manifesto</a> is a fascinating way of embracing a chaotic mind. I copied the 13 golden rules into my very first <a href="https://garrit.xyz/posts/2023-09-09-everyday-carry-notebooks">pocket notebook</a> and stumble upon them from time to time.</p>

<blockquote><ol><li>There are three states of being. Not knowing, action and completion.</li><li>Accept that everything is a draft. It helps to get it done.</li><li>There is no editing stage.</li><li>Pretending you know what you’re doing is almost the same as knowing what you are doing, so just accept that you know what you’re doing even if you don’t and do it.</li><li>Banish procrastination. If you wait more than a week to get an idea done, abandon it.</li><li>The point of being done is not to finish but to get other things done.</li><li>Once you’re done you can throw it away.</li><li>Laugh at perfection. It’s boring and keeps you from being done.</li><li>People without dirty hands are wrong. Doing something makes you right.</li><li>Failure counts as done. So do mistakes.</li><li>Destruction is a variant of done.</li><li>If you have an idea and publish it on the internet, that counts as a ghost of done.</li><li>Done is the engine of more.</li></ol></blockquote>]]>
            </description>
        </item>
    </channel>
</rss>