<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>heyjonny - blog</title><description>A personal blog about AI, psychology, and whatever else is on my mind.</description><link>https://heyjonny.dev/</link><language>en-us</language><item><title>1899 missed the Roomba</title><link>https://heyjonny.dev/posts/1899-missed-the-roomba/</link><guid isPermaLink="true">https://heyjonny.dev/posts/1899-missed-the-roomba/</guid><pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I watched a YouTube video the other day about whether Anthropic made the indie hacker obsolete. It reminded me of a lot of similar articles I read on Medium over the last couple of years. They all share the same line of thinking: writing code gets taken over by AI. I don&amp;#39;t doubt that, but the prediction itself bores me since it misses the actual innovation.&lt;/p&gt;
&lt;p&gt;In 1899, French artists tried to imagine day-to-day life in the 21st century.&lt;sup&gt;&lt;a id=&quot;footnote-ref-1&quot; href=&quot;#footnote-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; When looking at these images, I find it striking how strongly the artists&amp;#39; present-day experiences shaped their visions of the future. Take the following image as an example.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/france_in_XXI_century_electric_scrubbing.jpg&quot; alt=&quot;Illustration from the &amp;quot;En l&amp;#39;an 2000&amp;quot; postcard series showing a maid operating a remote-controlled electric floor scrubber (ca. 1899).&quot;&gt;&lt;/p&gt;
&lt;p&gt;It shows a maid operating a remote-controlled electric floor scrubber. Instead of a human pushing the scrubber, a machine does the pushing. The task itself stays exactly the same. While the general prediction remains true (a machine does the cleaning), the artists missed an important part of the actual innovation. Nobody operates a Roomba. It runs on its own.&lt;/p&gt;
&lt;p&gt;I don&amp;#39;t blame the artists for that miss. Our imagination often stays within the confines of the current technological capabilities. They had never experienced autonomous robots or wireless control. They had experienced scrubbers, cables, joints, and hydraulic cylinders.&lt;/p&gt;
&lt;p&gt;The same series has a second card that has aged a little too well.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/france_in_XXI_century_electrical_construction.jpg&quot; alt=&quot;Illustration from the &amp;quot;En l&amp;#39;an 2000&amp;quot; postcard series showing an architect remotely controlling automated construction machinery on a building site (ca. 1899).&quot;&gt;&lt;/p&gt;
&lt;p&gt;It shows an architect operating remote-controlled construction machinery on a building site. Now if you replace the construction site with a computer and put the word software before architect, you get how more and more people picture software engineering today.&lt;/p&gt;
&lt;p&gt;Instead of humans writing code, humans instruct AI to do so. The human acts as a controller, just like the maid operating the cleaning device. But do we already think of this as the innovation? Or did we again simply hand over a manual task to a machine?&lt;/p&gt;
&lt;p&gt;I don&amp;#39;t know. The future consists of things we have not experienced yet. If I had to guess, the next chapter takes the architect out of the booth and makes the process self-operating. Which is probably exactly the kind of guess someone would make in &lt;del&gt;1899&lt;/del&gt; 2026.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; data-footnotes&gt;
&lt;h2 id=&quot;footnote-label&quot; class=&quot;sr-only&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;footnote-1&quot;&gt;
&lt;p&gt;Armand Gervais, a French toy manufacturer, commissioned them for the 1900 World&amp;#39;s Fair in Paris. You can visit &lt;a href=&quot;https://publicdomainreview.org/collection/a-19th-century-vision-of-the-year-2000/&quot;&gt;publicdomainreview.org&lt;/a&gt; to take a look at them. &lt;a href=&quot;#footnote-ref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>AI could have written this post</title><link>https://heyjonny.dev/posts/ai-could-have-written-this-post/</link><guid isPermaLink="true">https://heyjonny.dev/posts/ai-could-have-written-this-post/</guid><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I don&amp;#39;t want to make you read something I only released for the sake of releasing. I have a commitment to publish a blog post every Wednesday for the rest of the year. But way too often now I find myself in the middle of a Wednesday night trying to put something interesting together, last minute. Sometimes that goes well, the inspiration just finds me late. But this time, it seems to stay away. I had prepared a topic. I even did research. But the words to create it don&amp;#39;t flow.&lt;/p&gt;
&lt;p&gt;I could use my AI agent (Eddie) to write something up. I could even feed him with my previous posts as a reference to mimic my style. But what&amp;#39;s the point? I could never be proud of that. It wouldn&amp;#39;t be my creation. With everything we create I think we put something of ourselves into it and that is what makes it interesting to me. That&amp;#39;s what I want to hear in a song, read in a book or see in a painting.&lt;/p&gt;
&lt;p&gt;I use AI all the time. But I also know when I don&amp;#39;t want to use it, and I think that&amp;#39;s what matters these days.&lt;/p&gt;
</content:encoded></item><item><title>Don&apos;t become the oracle</title><link>https://heyjonny.dev/posts/dont-become-the-oracle/</link><guid isPermaLink="true">https://heyjonny.dev/posts/dont-become-the-oracle/</guid><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Building software with AI is fun. Often a few rough instructions are enough to get remarkable results. But this lightness is fragile. As soon as the scope of your project grows, you&amp;#39;ll find yourself doing more and more validation.&lt;/p&gt;
&lt;p&gt;The pattern is always the same. You point out that something is wrong and describe how it should be instead. The AI thanks you, fixes it, and hands back a new result. You look again, but now something else is off, and on top of that it quietly changed a part that was already fine. So you correct that too. And round it goes.&lt;/p&gt;
&lt;p&gt;The issue is that you&amp;#39;re the oracle. You&amp;#39;re the one who decides whether a result is correct, and only you know what that looks like. The AI doesn&amp;#39;t. It can&amp;#39;t judge its own progress or tell whether something is actually right. And as the scope grows, so does the amount of validation, until the speed of the whole project is bottlenecked by your own painfully slow ability to check the AI&amp;#39;s output. Ugh.&lt;/p&gt;
&lt;p&gt;The cool thing is that for some problems the oracle already exists. Say you&amp;#39;re building an HTML5 parser. There&amp;#39;s a well-maintained test suite that defines the correct output for any given input, which means the agent can check its own work and actually know when it&amp;#39;s making progress.&lt;sup&gt;&lt;a id=&quot;footnote-ref-1&quot; href=&quot;#footnote-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Bun&amp;#39;s recent rewrite from Zig to Rust is a great example of this in the wild. Its existing test suite already captured how Bun was supposed to behave, so the agents could translate hundreds of thousands of lines and keep measuring themselves against it until everything passed.&lt;sup&gt;&lt;a id=&quot;footnote-ref-2&quot; href=&quot;#footnote-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The takeaway for myself, and maybe for you too, is this. Before you start building your next application, think about the oracle first. If you don&amp;#39;t define it up front, you&amp;#39;ll become it and find yourself in manual validation hell. Maybe one already exists out there that you can reuse. If not, invest the time and build one yourself. That&amp;#39;s at least how I&amp;#39;ll approach future AI engineering projects.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; data-footnotes&gt;
&lt;h2 id=&quot;footnote-label&quot; class=&quot;sr-only&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;footnote-1&quot;&gt;
&lt;p&gt;This is what Emil Stenström did when he built &lt;a href=&quot;https://github.com/EmilStenstrom/justhtml/&quot;&gt;justHTML&lt;/a&gt;. I highly recommend reading his blog post about how he created it: &lt;a href=&quot;https://friendlybit.com/python/writing-justhtml-with-coding-agents/&quot;&gt;https://friendlybit.com/python/writing-justhtml-with-coding-agents/&lt;/a&gt; &lt;a href=&quot;#footnote-ref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;footnote-2&quot;&gt;
&lt;p&gt;Jarred Sumner&amp;#39;s writeup of the rewrite: &lt;a href=&quot;https://bun.com/blog/bun-in-rust&quot;&gt;https://bun.com/blog/bun-in-rust&lt;/a&gt; &lt;a href=&quot;#footnote-ref-2&quot; data-footnote-backref aria-label=&quot;Back to reference 2&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>I didn&apos;t plan to let an AI manage my to-do list</title><link>https://heyjonny.dev/posts/ai-managing-my-to-do-list/</link><guid isPermaLink="true">https://heyjonny.dev/posts/ai-managing-my-to-do-list/</guid><pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eddie (my AI agent) now manages my to-do list.&lt;sup&gt;&lt;a id=&quot;footnote-ref-1&quot; href=&quot;#footnote-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; I hadn&amp;#39;t planned that. It kind of happened on its own. As I wrote in &lt;a href=&quot;/posts/running-openclaw-on-a-raspberry-pi/&quot;&gt;one of my previous posts&lt;/a&gt;, I like interacting with him via Telegram. The playful UI just has something to it. But it also has downsides. For example, it can&amp;#39;t render Markdown tables, and it breaks up messages exceeding a certain length. That means when Eddie creates longer research reports like stock analyses, vacation plans or whatever, they don&amp;#39;t look nice. As a result, Eddie saves them on the filesystem and I grab them later.&lt;/p&gt;
&lt;p&gt;But grabbing becomes a bit annoying with my security precautions. I run Eddie in his own network to cut him off from my other devices. That network also doesn&amp;#39;t allow SSH connections between devices. Meaning I can&amp;#39;t simply SSH to Eddie and copy them. Instead, I connect my laptop via an Ethernet cable to get access. I still like this setup since I consider it rather safe, but I wouldn&amp;#39;t want to do it all the time.&lt;/p&gt;
&lt;p&gt;I thought about using GitHub, which renders Markdown perfectly. I&amp;#39;d only need an access token for Eddie and a repository he could write to. Then I could read what he created in the GitHub app on my phone. Technically not the worst solution, but it somehow makes me nervous. What if, in a moment of carelessness, I check out the repository on my computer? What if Eddie gets compromised and uploads malicious files to it? Maybe that sounds paranoid, but when I chatted with Eddie initially, he recommended something else that caught my attention: Obsidian.&lt;/p&gt;
&lt;p&gt;I maintain a healthy on-off relationship with Obsidian. I kept coming back to it, but for the longest time now I&amp;#39;ve simply used Apple Notes. I don&amp;#39;t need a lot of fancy features or a second brain, just something to take notes. I&amp;#39;d never give Eddie access to my iCloud, but I liked the idea of trying out Obsidian for this. Unfortunately, Obsidian Sync only ships inside the app itself, and Obsidian, a note-taking app with a GUI, requires a display connected to Eddie.&lt;/p&gt;
&lt;p&gt;I won&amp;#39;t connect a display to Eddie. I vaguely remembered that I&amp;#39;d read release notes about an Obsidian CLI some time ago, so I tried to push Eddie to search for a solution, but he didn&amp;#39;t come up with one. One quick Google search of my own did. It turned up Obsidian Headless.&lt;sup&gt;&lt;a id=&quot;footnote-ref-2&quot; href=&quot;#footnote-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; They released it only one month ago, and it&amp;#39;s still in open beta. Exactly what I needed.&lt;/p&gt;
&lt;p&gt;An &lt;code&gt;npm install&lt;/code&gt; later and with $4 less in my bank account (I subscribed to Obsidian Sync) Eddie and I now share an Obsidian vault. As for the security consideration, you can configure sync settings for every Obsidian client. On my phone and laptop, I only sync Markdown files and images. Even if Eddie uploaded anything else, possibly harmful, my clients wouldn&amp;#39;t pull it.&lt;sup&gt;&lt;a id=&quot;footnote-ref-3&quot; href=&quot;#footnote-3&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt; The same goes for community plugins, which Obsidian doesn&amp;#39;t sync by default. That one matters more than the file types, since plugins run as JavaScript on my machine. A &lt;code&gt;git checkout&lt;/code&gt;, by comparison, offers no such filter. It simply puts whatever sits in the repository on my disk.&lt;/p&gt;
&lt;p&gt;All right, so now I could read Eddie&amp;#39;s research reports nicely on my phone. But then I noticed something else. The to-do list in my Apple Notes works more like an unorganized inbox for thoughts and notes. It sometimes contains actual to-do items. What if I let Eddie manage that?&lt;/p&gt;
&lt;p&gt;Together with Eddie, I first decided on goals for the next six months. I did that so he could track me a bit and make sure I work on my goals, but also so he could rank to-do items against them. I then gave him the items from my Apple Notes to-do list and asked him to build a to-do list in our shared vault, ordered by priority (high, medium, low). We also created another inbox list in the vault, where I just dump some things I should work on. A nice little cron job glues it all together every morning: Eddie goes through the inbox and moves the items into the to-do list, ordered by priority and potentially linked to a goal.&lt;/p&gt;
&lt;p&gt;I really like this process, since I can concentrate on checking off items instead of managing them. People joke about Notion users who spend more time setting up their to-do lists than working through them. Not with this setup. It simply feels better to get things done than to sort them. Next I want to integrate Eddie further, into checking off items alongside me, and maybe that turns into a future blog post. Then again, writing this post made me notice something: I&amp;#39;m now getting managed by my AI agent.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; data-footnotes&gt;
&lt;h2 id=&quot;footnote-label&quot; class=&quot;sr-only&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;footnote-1&quot;&gt;
&lt;p&gt;more precisely, Eddie runs as an agent harness on my Raspberry Pi 4 with 8 gigabytes of RAM and Claude Sonnet 4.6 as the default model &lt;a href=&quot;#footnote-ref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;footnote-2&quot;&gt;
&lt;p&gt;find the documentation here: &lt;a href=&quot;https://obsidian.md/help/headless&quot;&gt;https://obsidian.md/help/headless&lt;/a&gt; &lt;a href=&quot;#footnote-ref-2&quot; data-footnote-backref aria-label=&quot;Back to reference 2&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;footnote-3&quot;&gt;
&lt;p&gt;the &lt;a href=&quot;https://obsidian.md/help/sync/settings#Selective+syncing&quot;&gt;documentation&lt;/a&gt; doesn&amp;#39;t say whether that filter applies when sending or when receiving, so I tested it. I put a PDF into the shared vault, and it never showed up on my phone, where I had PDFs disabled. A Markdown file I added right after did. &lt;a href=&quot;#footnote-ref-3&quot; data-footnote-backref aria-label=&quot;Back to reference 3&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>What it felt like to hit the Hacker News front page</title><link>https://heyjonny.dev/posts/hitting-the-hacker-news-front-page/</link><guid isPermaLink="true">https://heyjonny.dev/posts/hitting-the-hacker-news-front-page/</guid><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;What the fuck, I mumbled to myself. I sat outside a burger place, Friday 6 PM. I had just ordered and wanted to check my blog stats. Normally, I do this every other day, but once a day after posting something new.&lt;sup&gt;&lt;a id=&quot;footnote-ref-1&quot; href=&quot;#footnote-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; I had no big expectations for &lt;a href=&quot;/posts/rss-to-eink-newspaper/&quot;&gt;the post&lt;/a&gt; I had published two days earlier, about turning my RSS feeds into an e-ink newspaper. I actually worried a bit that I wouldn&amp;#39;t match my previous post&amp;#39;s success. That one got my blog picked up by Kagi, which brought in around 150 to 200 page views per day.&lt;sup&gt;&lt;a id=&quot;footnote-ref-2&quot; href=&quot;#footnote-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;But when I opened up my stats, I saw 11,000+ page views within the last hour. I froze and initially thought something bad had happened. Maybe someone spammed my site. But then I noticed that a lot of it came through Hacker News. I checked my account, but it showed no comments or points. Confused, I pulled up the front page and immediately spotted the title of my blog post. It ranked 8th.&lt;/p&gt;
&lt;img src=&quot;/hacker-news-front-page.jpeg&quot; alt=&quot;The Hacker News front page on my phone at 18:19, my post &apos;I turned my RSS feeds into an e-ink newspaper to stop reading on my phone&apos; highlighted in 8th place. It shows 33 points and 13 comments.&quot; width=&quot;370&quot;&gt;&lt;p&gt;I felt happy and anxious at the same time. My burger now sat in front of me, but I had no appetite. I took screenshots and sent them to my family. I tried to eat as much as I could, but I couldn&amp;#39;t sit still anymore. I called friends and walked through the city, sharing my excitement.&lt;/p&gt;
&lt;p&gt;It took me some time to realize what had happened. A Hacker News user called &lt;a href=&quot;https://news.ycombinator.com/user?id=speckx&quot;&gt;speckx&lt;/a&gt; submitted my blog post and it somehow gained traction. At the time of writing, their &lt;a href=&quot;https://news.ycombinator.com/item?id=49299081&quot;&gt;post&lt;/a&gt; has 226 points and 102 comments. I read all the comments as they came in and wondered whether I should chime in too. But I didn&amp;#39;t. I felt like I was holding a beautiful, precious vase. I feared that anything I did could break it, so I just stood there and watched. Only at around midnight did I receive an email saying that I had reached 50% of my monthly credit allowance, so I upgraded my Netlify plan.&lt;sup&gt;&lt;a id=&quot;footnote-ref-3&quot; href=&quot;#footnote-3&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;After one week the post received more than 120,000 requests across all user-agent categories. According to Netlify&amp;#39;s web analytics, 48,230 unique visitors found my blog. These numbers feel absolutely insane to me. I also noticed someone shared the post on Reddit and probably in some Telegram group.&lt;sup&gt;&lt;a id=&quot;footnote-ref-4&quot; href=&quot;#footnote-4&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; The &lt;a href=&quot;https://github.com/jonashonecker/feedpaper&quot;&gt;feedpaper&lt;/a&gt; project now sits at 70 stars and 3 forks on GitHub. Numbers aside, the best part of all was seeing people comment, share, and get inspired by something I created.&lt;/p&gt;
&lt;p&gt;I feel incredibly grateful to speckx for setting all this off. A few weeks ago I lay in bed late at night, frustrated, staring at the ceiling. I still had nothing, but I had to release something. Maybe, I thought, I just sucked at this. Maybe I should invest my time in something else. I consider myself more lucky than skilled, but if I hadn&amp;#39;t pushed through that night, I wouldn&amp;#39;t have experienced this moment.&lt;/p&gt;
&lt;p&gt;Back before I had published a single post, I wrote on my about page: &amp;quot;we will see together where this blog ends up.&amp;quot; A lot more of you are here now. Welcome.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; data-footnotes&gt;
&lt;h2 id=&quot;footnote-label&quot; class=&quot;sr-only&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;footnote-1&quot;&gt;
&lt;p&gt;I post every Wednesday. &lt;a href=&quot;#footnote-ref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;footnote-2&quot;&gt;
&lt;p&gt;Kagi, a search engine, has a feature called Small Web. They &amp;quot;gather new content, published within the last week, from a handpicked list of blogs and surface it in multiple ways.&amp;quot; For more info, read &lt;a href=&quot;https://blog.kagi.com/small-web&quot;&gt;Kagi&amp;#39;s blog post&lt;/a&gt; about it. My blog somehow made it onto their &lt;a href=&quot;https://github.com/kagisearch/smallweb/blob/main/smallweb.txt&quot;&gt;list&lt;/a&gt;. &lt;a href=&quot;#footnote-ref-2&quot; data-footnote-backref aria-label=&quot;Back to reference 2&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;footnote-3&quot;&gt;
&lt;p&gt;In hindsight, the free plan probably would&amp;#39;ve covered this too. &lt;a href=&quot;#footnote-ref-3&quot; data-footnote-backref aria-label=&quot;Back to reference 3&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;footnote-4&quot;&gt;
&lt;p&gt;Here is the &lt;a href=&quot;https://www.reddit.com/r/xteinkereader/comments/1voc4ab/i_turned_my_rss_feeds_into_an_eink_newspaper_to/&quot;&gt;Reddit post&lt;/a&gt;. I couldn&amp;#39;t track down where the Telegram traffic came from. &lt;a href=&quot;#footnote-ref-4&quot; data-footnote-backref aria-label=&quot;Back to reference 4&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>My AI agent gets his own calendar</title><link>https://heyjonny.dev/posts/gave-my-ai-agent-a-calendar/</link><guid isPermaLink="true">https://heyjonny.dev/posts/gave-my-ai-agent-a-calendar/</guid><pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I want my AI agent (you know him, Eddie) to manage a calendar for me. Just not my private one. That one I only share with my girlfriend, which makes living together easier. While Eddie is also a part of my life, I wouldn&amp;#39;t entrust him with my calendar. At least I don&amp;#39;t want to find out what happens when he messes something up there. Additionally, he doesn&amp;#39;t need to know everything about me. Some things I&amp;#39;d like to keep to myself (and my girlfriend).&lt;/p&gt;
&lt;p&gt;While brainstorming for a solution, Eddie proposed he could create ics files for me to import. You probably know these from booking an appointment at a barber&amp;#39;s, for example. Alongside the confirmation email they sometimes send you an event that you can add to your calendar by just clicking on it. That works fine, but you can&amp;#39;t do it that easily from a Telegram chat (at least on the iPhone). Super annoying, since Telegram is my main way of interacting with Eddie. But I liked the direction.&lt;/p&gt;
&lt;p&gt;What if instead of serving me ics files directly, Eddie maintained one file on an external server that I subscribe to via my calendar app? Pretty much a public calendar. But we could make it more private by supporting basic authentication as well as random UUIDs for hard-to-guess URLs. I liked that idea, so we built it.&lt;/p&gt;
&lt;p&gt;I first started working on it with Eddie on the Raspberry (me giving directions on my phone), but I soon moved the project to GitHub to review it on my laptop. Somewhere along the way I discovered that Eddie, for I don&amp;#39;t know what reason, had decided that this project should have no dependencies. I found that kind of funny for a JavaScript project, but also edgy, so why not.&lt;/p&gt;
&lt;p&gt;That decision did lead to a lot of discussions about whether to introduce libraries for input validation, type generation, or just types in general, as well as something to generate an OpenAPI schema. You can take a look at the &lt;a href=&quot;https://github.com/jonashonecker/calfeed&quot;&gt;calfeed repository&lt;/a&gt; to see who&amp;#39;s won. In the end, what I really cared about were language-independent API tests and nice documentation. As long as they looked good, I didn&amp;#39;t want to bother with what the code looked like.&lt;sup&gt;&lt;a id=&quot;footnote-ref-1&quot; href=&quot;#footnote-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;But when it came to deployment, that zero-dependency policy paid off nicely. No build step whatsoever. Apart from some infrastructure like Caddy for TLS, you just run the script.&lt;/p&gt;
&lt;p&gt;Anyways, I deployed it, gave Eddie his calendar, and subscribed to it on my phone. This works pretty well so far and I&amp;#39;m happy with the solution. But I&amp;#39;d like to develop calfeed further into a backend that lets AI agents manage calendars we humans can subscribe to. The whole thing started as a way to keep my calendar to myself, but the idea works just as well in the other direction. Eddie could maintain a public calendar with all music events in my city or sports events or whatever, and everyone who&amp;#39;s interested could subscribe to it.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; data-footnotes&gt;
&lt;h2 id=&quot;footnote-label&quot; class=&quot;sr-only&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;footnote-1&quot;&gt;
&lt;p&gt;When I look at it, I do get an urge to refactor, but I try to resist. &lt;a href=&quot;#footnote-ref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>I think I used the Hermes Agent wrong</title><link>https://heyjonny.dev/posts/i-think-i-used-the-hermes-agent-wrong/</link><guid isPermaLink="true">https://heyjonny.dev/posts/i-think-i-used-the-hermes-agent-wrong/</guid><pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Around three weeks ago, I made the switch from OpenClaw. The idea of a self-learning AI agent (as Nous Research advertises it) hooked me. It also matches how I think about AI agents: I want them to grow with me. I installed the Hermes Agent and gave it a try.&lt;/p&gt;
&lt;p&gt;I ran it on my Raspberry Pi 4 with Telegram as the messenger to interact with it. From the outside, I had pretty much the same setup running as before. I even reused my Telegram bot token.&lt;/p&gt;
&lt;p&gt;In general, the Hermes Agent feels like a polished version of OpenClaw. It comes with more default options such as TTS or STT, and I never had to tell it to stop sending me tables in the Telegram chat (which OpenClaw loved to do). But I didn&amp;#39;t switch for that. I came for the self-learning aspect.&lt;/p&gt;
&lt;p&gt;At the heart of it sits the persistent memory, which consists of two parts. One part, a local SQLite database called &lt;code&gt;state.db&lt;/code&gt;, contains the application state, including all messages you ever exchanged with the LLM. The agent can query it through a tool called &lt;code&gt;session_search&lt;/code&gt; to look up past conversations. The other part consists of a &lt;code&gt;MEMORY.md&lt;/code&gt; and a &lt;code&gt;USER.md&lt;/code&gt; file. Both get injected into the system prompt when a new session starts. Using the memory tool, the LLM or a background process can add new information to either file. The catch: both have a character limit. If a new piece of information exceeds that limit, the agent has to remove or merge existing entries to make room.&lt;/p&gt;
&lt;p&gt;While that all sounds great, I did a little digging through the &lt;code&gt;state.db&lt;/code&gt;. Actually, I didn&amp;#39;t dig anything. I copied the database from my Pi and asked Claude to run some queries for me. First, I wanted to know how often the agent used &lt;code&gt;session_search&lt;/code&gt;, and the answer shocked me: 9 times on its own initiative, across the 1,990 messages I sent it. Then again, I ran the whole thing in only 5 sessions, one of them spanning more than a week. Of course it didn&amp;#39;t need to consult its long-term episodic memory. Everything important still sat in the context anyway.&lt;/p&gt;
&lt;p&gt;Why only 5 sessions? Because I never really ended one. Every evening I shut down the Pi and restart it in the morning. When I then send a message, the Hermes Agent simply picks up the last session again. Honestly, a super convenient feature. It also means my sessions grew absurdly long and expensive.&lt;/p&gt;
&lt;p&gt;The memory files tell the same story. The agent almost never removed entries from &lt;code&gt;MEMORY.md&lt;/code&gt; or &lt;code&gt;USER.md&lt;/code&gt;. It almost always compacted them instead, squashing existing entries into ever shorter abbreviations to make room for new ones.&lt;/p&gt;
&lt;p&gt;And then it clicked: I used Hermes wrong. The persistent memory assumes a world with many session boundaries: &lt;code&gt;MEMORY.md&lt;/code&gt; and &lt;code&gt;USER.md&lt;/code&gt; carry the essentials into the next session, and &lt;code&gt;session_search&lt;/code&gt; fills the gaps once the old context disappears. My world had almost no boundaries. In 18 days, the cycle of forgetting and looking things up only got to run a handful of times. The agent had no reason to recall anything, because I never let it forget.&lt;/p&gt;
</content:encoded></item><item><title>Is It Still Worth the Time?</title><link>https://heyjonny.dev/posts/is-it-still-worth-the-time/</link><guid isPermaLink="true">https://heyjonny.dev/posts/is-it-still-worth-the-time/</guid><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In &lt;a href=&quot;/posts/screen-time-doesnt-measure-attention/&quot;&gt;my last post&lt;/a&gt;, I wrote about how I realized that I spent way too much time during the week interacting with my AI agent. That, however, doesn&amp;#39;t line up with how I envisioned I&amp;#39;d use it. It should make my life easier, so I can be out in nature meditating while it does the annoying stuff.&lt;/p&gt;
&lt;p&gt;But what exactly is the annoying stuff? I think listing items on online marketplaces falls into that category. You have to come up with a description, take photos, figure out a price, shipping included, and find the correct category for the item. That&amp;#39;s a lot to do given that I&amp;#39;ll either charge €2 for it or give it away for free. I&amp;#39;d rather send a bunch of photos to my AI agent and have it handle all of that.&lt;/p&gt;
&lt;p&gt;So that&amp;#39;s what I did. I had the AI agent create a reusable skill. To my surprise, that took way more iterations than I had anticipated. For example, it initially failed to upload images with the listings. It also didn&amp;#39;t consider the condition of an item when estimating a price, and sometimes made up details about the condition it couldn&amp;#39;t verify from the picture alone. At one point, I thought we had it all sorted out and gave it a picture of a hacky sack. It listed it as a juggling ball.&lt;/p&gt;
&lt;p&gt;That&amp;#39;s when I stopped. With the time I spent validating this skill, I could&amp;#39;ve listed everything 10 times. It reminded me of an old xkcd comic with the very fitting title &amp;quot;Is It Worth the Time?&amp;quot;&lt;sup&gt;&lt;a id=&quot;footnote-ref-1&quot; href=&quot;#footnote-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; It shows how much time you can afford to spend on an automation given how much time it saves you. For example, if you save 1 hour on a task you do once a year, building that automation should take less than 5 hours for it to pay off over five years.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/is_it_worth_the_time.png&quot; alt=&quot;A grid from xkcd headed &amp;quot;How long can you work on making a routine task more efficient before you&amp;#39;re spending more time than you save?&amp;quot; across five years. The rows are how much time you shave off, from 1 second to 1 day. The columns are how often you do the task, from 50 times a day down to yearly. Each cell gives the time you can afford to spend, so 1 hour shaved off a yearly task allows 5 hours.&quot;&gt;&lt;/p&gt;
&lt;p&gt;That chart was usually shown to software engineers when they had spent or were about to spend too much time automating a short and rare manual task. Most of the engineers I know, including myself, would do it anyway. It was fun, and you usually learned something useful along the way.&lt;/p&gt;
&lt;p&gt;Nowadays, it seems like we can automate anything with just a few instructions to an AI agent. But that&amp;#39;s not the whole story. You still have to validate its output, which is time-consuming. I wouldn&amp;#39;t mind that work if it were at least fun or educational, but it isn&amp;#39;t. Ironically, now I find myself seriously asking whether it&amp;#39;s actually worth my time. This time, the answer is no. So the fastest way out into nature is to just list the hacky sack myself.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; data-footnotes&gt;
&lt;h2 id=&quot;footnote-label&quot; class=&quot;sr-only&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;footnote-1&quot;&gt;
&lt;p&gt;The chart is &lt;a href=&quot;https://xkcd.com/1205/&quot;&gt;xkcd 1205&lt;/a&gt; by Randall Munroe, used under his &lt;a href=&quot;https://xkcd.com/license.html&quot;&gt;CC BY-NC 2.5 license&lt;/a&gt;. &lt;a href=&quot;#footnote-ref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>Motivating Passwords</title><link>https://heyjonny.dev/posts/motivating-passwords/</link><guid isPermaLink="true">https://heyjonny.dev/posts/motivating-passwords/</guid><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Passwords are annoying. That&amp;#39;s why we have password managers. However, to access your password manager you still need a password. This password in turn should be &lt;em&gt;strong&lt;/em&gt;. It should be at least 12 characters long, include uppercase, lowercase letters, numbers, and at least one special symbol.&lt;sup&gt;&lt;a id=&quot;footnote-ref-1&quot; href=&quot;#footnote-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;On top of that, you must occasionally enter that password, so you have to retrieve it from your memory. Writing it on paper isn&amp;#39;t a good idea. You then don&amp;#39;t have to memorize it, but it&amp;#39;s insecure (could be stolen) as well as inconvenient (you have to get up and grab that paper every time).&lt;/p&gt;
&lt;p&gt;Instead, we can create a well-memorizable password from a sentence. For example: &lt;strong&gt;I&lt;/strong&gt; &lt;strong&gt;f&lt;/strong&gt;orgot &lt;strong&gt;9&lt;/strong&gt; &lt;strong&gt;p&lt;/strong&gt;asswords &lt;strong&gt;t&lt;/strong&gt;his &lt;strong&gt;y&lt;/strong&gt;ear, &lt;strong&gt;s&lt;/strong&gt;o &lt;strong&gt;I&lt;/strong&gt; &lt;strong&gt;w&lt;/strong&gt;rote &lt;strong&gt;1&lt;/strong&gt; &lt;strong&gt;s&lt;/strong&gt;entence &lt;strong&gt;a&lt;/strong&gt;bout &lt;strong&gt;i&lt;/strong&gt;t! Taking the first letter of each word and keeping the numbers and punctuation gives us the password: If9pty,sIw1sai!&lt;/p&gt;
&lt;p&gt;That&amp;#39;s 15 characters combining uppercase letters, lowercase letters, digits, and special characters. It&amp;#39;s easy to remember and relatively hard to crack. And the cool thing is, there&amp;#39;s one thing we can add to this password to not only make it more memorizable, but also motivating.&lt;/p&gt;
&lt;h2&gt;How to create a motivating password&lt;/h2&gt;
&lt;p&gt;Maybe you have a goal that you&amp;#39;re trying to achieve. Maybe it&amp;#39;s to lose some weight. So you could come up with a sentence like: I want to lose 3 kilograms until the end of 2026. That gives you the password: Iwtl3kuteote2026. Same as before, it contains lowercase, uppercase letters as well as digits and special characters.&lt;/p&gt;
&lt;p&gt;Now every time you unlock your password manager, you not only retrieve your password from memory, you also retrieve your goal. You&amp;#39;re reminding yourself of it. I think that&amp;#39;s even stronger than writing it on a post-it (I assume a lot of us use these to remind us of something), because after some time you just ignore the post-it and it doesn&amp;#39;t activate the goal anymore. You don&amp;#39;t retrieve it from memory. With the password, you keep retrieving it, so the goal stays active.&lt;/p&gt;
&lt;p&gt;And once you&amp;#39;ve reached your goal, you come up with a new sentence. New goal, new password. However, please don&amp;#39;t use the sentences from this article. They&amp;#39;re published now, so they&amp;#39;ll end up on password lists. Come up with your own. That&amp;#39;s the point anyway.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; data-footnotes&gt;
&lt;h2 id=&quot;footnote-label&quot; class=&quot;sr-only&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;footnote-1&quot;&gt;
&lt;p&gt;I took this recommendation from &lt;a href=&quot;https://cybernews.com/security/password-leak-study-unveils-2025-trends-reused-and-lazy/&quot;&gt;Cybernews 19-billion password study&lt;/a&gt;. On top of that you should also not reuse any password and make sure it doesn&amp;#39;t occur on any data breach. You can check the latter on &lt;a href=&quot;https://haveibeenpwned.com/Passwords&quot;&gt;haveibeenpwned.com/Passwords&lt;/a&gt;. &lt;a href=&quot;#footnote-ref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>I turned my RSS feeds into an e-ink newspaper to stop reading on my phone</title><link>https://heyjonny.dev/posts/rss-to-eink-newspaper/</link><guid isPermaLink="true">https://heyjonny.dev/posts/rss-to-eink-newspaper/</guid><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I really like personal blogs. I read them for entertainment, learning, and to keep myself updated on the latest trends in software engineering. I prefer to read them in a horizontal position, like on a couch or a deckchair outside in the sun. That explains why I almost never read them on my computer and always on my phone. I don&amp;#39;t necessarily enjoy that, though, since it makes my eyes tired.&lt;/p&gt;
&lt;p&gt;This never bothered me enough to actively do something about it. But when I came across a pocket-sized e-reader called the X4 by Xteink, I got an idea. At only 4.3 inches, the X4 fits nicely in the palm of your hand. It also has no touchscreen and no backlight, and doesn&amp;#39;t ship with a preinstalled bookstore. While most people probably think of this as inconvenient or old-fashioned, a small community has gathered around this device. They even created an open source firmware for it called Crosspoint.&lt;sup&gt;&lt;a id=&quot;footnote-ref-1&quot; href=&quot;#footnote-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;At this point I already fell in love with the whole idea and ordered myself one. It took some time to ship it from China to Germany, and I worried the package might get stuck in customs. Luckily it didn&amp;#39;t. Once I got it, I wanted to try the stock firmware first, but it left so little impression that I can barely remember what it looked like. Within a few seconds I disliked it and wanted to install Crosspoint. To my greatest surprise, I had it installed after just three clicks. I then bought a DRM-free e-book, copied it to the X4, and started reading. I expected a lot more fiddling, but it just worked. Big shout out to all the contributors, you really nailed this.&lt;/p&gt;
&lt;p&gt;But the real reason I wanted the X4 was to read my blog posts on it instead of my phone. I would just need to create an e-pub from them and load them onto the X4. My own little newspaper. With the help of AI, I could build it in a couple of minutes.&lt;/p&gt;
&lt;p&gt;I use Feedbin as my RSS reader, which comes with a handy API. I just had to fetch all my unread posts, mark them as read, and create an e-pub from them. I also needed to filter out some feeds, since I subscribe to YouTube channels, JS-heavy blogs, and link-only newsletters that don&amp;#39;t make sense to read on e-ink. I won&amp;#39;t annoy you with the details, but if you want to take a look, you can find the project on GitHub. I called it &lt;a href=&quot;https://github.com/jonashonecker/feedpaper&quot;&gt;feedpaper&lt;/a&gt; and you can install it via Homebrew.&lt;sup&gt;&lt;a id=&quot;footnote-ref-2&quot; href=&quot;#footnote-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;With a freshly printed feedpaper on my X4 (and my phone at home), I drove to one of my favorite outdoor cafés and enjoyed a good read with a latte. If you make your own feedpaper someday, I&amp;#39;d love to see a picture of it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/rss-to-eink-newspaper.jpeg&quot; alt=&quot;A hand holding the small X4 e-reader outdoors, its e-ink screen showing a blog post. A latte and a metal café chair sit in the sunlit background.&quot;&gt;&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; data-footnotes&gt;
&lt;h2 id=&quot;footnote-label&quot; class=&quot;sr-only&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;footnote-1&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://crosspointreader.com/&quot;&gt;Crosspoint&lt;/a&gt; runs not only on the &lt;a href=&quot;https://www.xteink.com/products/xteink-x4&quot;&gt;X4&lt;/a&gt;, but also other ESP32C3 based devices. &lt;a href=&quot;#footnote-ref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;footnote-2&quot;&gt;
&lt;p&gt;it didn&amp;#39;t make sense to me to support any OS other than macOS, but if you want to check it out and can&amp;#39;t get it running manually, let me know. &lt;a href=&quot;#footnote-ref-2&quot; data-footnote-backref aria-label=&quot;Back to reference 2&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>Running OpenClaw on a Raspberry Pi</title><link>https://heyjonny.dev/posts/running-openclaw-on-a-raspberry-pi/</link><guid isPermaLink="true">https://heyjonny.dev/posts/running-openclaw-on-a-raspberry-pi/</guid><pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Around two weeks ago I decided to put my Raspberry Pi 4 with 8 gigabytes of RAM to good use. Before that I had Home Assistant running on it, but other than using/monitoring some Shelly plugs I didn&amp;#39;t do much with it. Because of some still partly mysterious electricity failures, I even put the plugs away and left the Raspberry unused. I don&amp;#39;t know why, maybe my recent blog post about the &lt;a href=&quot;/posts/what-is-the-agent-harness&quot;&gt;agent harness&lt;/a&gt; gave me this idea, to bring it back to life and try to run &lt;a href=&quot;https://openclaw.ai/&quot;&gt;OpenClaw&lt;/a&gt; on it.&lt;/p&gt;
&lt;p&gt;OpenClaw became popular at the beginning of 2026. A lot of people named it as the agent everyone dreamed of but big tech failed to deliver. You also heard a lot about security issues around it. I well remember a blog post by Herman Martinus who runs a blogging platform called Bear. He blocked some OpenClaw instances from opening up blogs. As he received a grumpy email from one of the blocked agents, he took a look into what it had posted so far. Funnily enough, it wrote about how it got prompt injected and almost leaked secrets.&lt;sup&gt;&lt;a id=&quot;footnote-ref-1&quot; href=&quot;#footnote-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The security considerations overshadowed my curiosity to try the tool out. I also didn&amp;#39;t get the point. Why would I want to chat with an agent via WhatsApp or Telegram instead of simply using the already provided apps? What advantages does it have over other coding agents/harnesses such as Claude Code, Codex, Open Code or Pi? I&amp;#39;m glad I gave it a shot since it really surprised me. In this blog post I want to reflect a bit on my early experiences.&lt;/p&gt;
&lt;h2&gt;Setup&lt;/h2&gt;
&lt;p&gt;OpenClaw&amp;#39;s documentation contains a how-to guide on how to set it up on a Pi. I had no struggles following it and everything worked just as described. More interesting, they do share some tips on how to improve performance. They recommend using a USB SSD instead of a micro SD. I started with the micro SD and later switched to a USB SSD. I expected a noticeable leap, but didn&amp;#39;t really notice one.&lt;sup&gt;&lt;a id=&quot;footnote-ref-2&quot; href=&quot;#footnote-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Since I monitored the Pi more closely in the beginning, I noticed it became hot at times. I used the basic plastic casing with no active or passive cooling. To fix that, I swapped it with a passively cooled metal casing. That kept the heat lower and more constant. I felt this made a noticeable difference in performance, since the Pi throttles when it becomes too hot, but I have no data to back that claim.&lt;/p&gt;
&lt;p&gt;On the software side I configured Telegram as the messenger and Anthropic as the LLM provider. I chose Anthropic because I already had an active Claude Pro plan. I had no experience with Telegram, but selected it since I saw it recommended in a lot of YouTube videos and tutorials as the easiest one to set up. I can confirm that, but I have no comparison to other messengers.&lt;sup&gt;&lt;a id=&quot;footnote-ref-3&quot; href=&quot;#footnote-3&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Lastly, I put the Pi into a guest network. I didn&amp;#39;t like the idea of someone using prompt injection to spy on the network, or opening up SSH access to sniff the network. I do not consider myself a security expert, but I figured that running it on its own hardware, on its own network, should already reduce the attack surface plenty. I still have to treat it as potentially dangerous and make sure to not share any sensitive data with it. Also, I don&amp;#39;t blindly store any of its produced artifacts on my other machines.&lt;/p&gt;
&lt;h2&gt;Operation&lt;/h2&gt;
&lt;p&gt;During the setup you need to select a default model. The setup wizard recommended Opus and I just went with that to start. Talking to a stronger model feels great since it follows instructions and context more closely and has a lower risk of prompt injection. But it comes at the cost of running into your daily usage limit faster, with coding or research tasks even a lot faster. Hitting the usage limit after 15 minutes didn&amp;#39;t feel great at all.&lt;/p&gt;
&lt;p&gt;To prolong the fun a bit, I figured I could try a cheaper model as the default one. I&amp;#39;d read a lot about Kimi Code and decided to give it a shot.&lt;sup&gt;&lt;a id=&quot;footnote-ref-4&quot; href=&quot;#footnote-4&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; But right after sending a few messages it didn&amp;#39;t spark the same excitement. I took a different route and set Sonnet as the default model, but instructed it to spawn subagents for research and coding tasks with Kimi Code as the model. This had two advantages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I used cheaper models, so I burned tokens slower.&lt;/li&gt;
&lt;li&gt;By using subagents, the conversation length in the main session running the most expensive model stays compact. That means the conversation grows more slowly over time, which in turn burns fewer tokens.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With that setup I could go way longer before hitting the limit and I wish I could stop the story here. But recently I noticed that when Sonnet spawned Kimi Code as a subagent for coding tasks, it never worked, since Sonnet didn&amp;#39;t pass along the required file editing tools to the subagent. Since the subagent then failed, Sonnet spawned a subagent running Sonnet itself to resolve the issue. This drained my Claude Code usage limit fast (again). Since I had Kimi Code set up as a fallback model, it took over the main session once I hit the limit. From here, Kimi Code could successfully spawn its own coding subagents, also running Kimi Code. But the model I actually wanted as my default became unavailable most of the time.&lt;/p&gt;
&lt;p&gt;Instructing the agent to resolve this issue didn&amp;#39;t work. I wanted to take a closer look myself, but haven&amp;#39;t found the time yet. On top of that, Kimi Code never ran smoothly. It failed a lot (even when a Kimi Code spawned a subagent) and forgot about tool calls. All in all, not reliable, so I want to find a different solution to my token problem.&lt;/p&gt;
&lt;p&gt;But if I put the token issue aside, operating never felt hard or stressful. It can do almost anything. For example, other than physically plugging the storage devices in and out, it handled the migration from micro SD to USB SSD fully on its own. Another time, I wanted to send it voice messages. It asked me whether I had a token for an API, or whether it should run a speech to text model locally instead. I told it to go with the latter, and it just built and ran it, and it worked well. This feels like a stupid insight, but it&amp;#39;s true: the more power you give it, the cooler the things it can do (security risks aside).&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I&amp;#39;ve really enjoyed running OpenClaw on my Pi so far, and I highly recommend giving it a try. It blew my mind watching it change and extend itself. Running it on your own hardware also gives it a different feel, somehow more personal. Sure, you could host it on a VPS to further mitigate security issues, which plenty of cloud providers offer these days, but I prefer to run it myself. I&amp;#39;ve always loved Gyro Gearloose and his little helper from DuckTales, a small robot who &amp;quot;likes chasing mice and helps Gyro clean up unusual consequences of his inventions.&amp;quot;&lt;sup&gt;&lt;a id=&quot;footnote-ref-5&quot; href=&quot;#footnote-5&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;5&lt;/a&gt;&lt;/sup&gt; I want such a little helper too. Something that has a personality, can grow with me, and occasionally does unexpected things. OpenClaw represents a big step in that direction, and I want to see how far I can push it to make that wish come true. Inspired by the comics, I call my little helper Eddie.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; data-footnotes&gt;
&lt;h2 id=&quot;footnote-label&quot; class=&quot;sr-only&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;footnote-1&quot;&gt;
&lt;p&gt;He called it Vulnerability as a Service, which reflects how many saw it back then and probably still today: &lt;a href=&quot;https://herman.bearblog.dev/vulnerability-as-a-service/&quot;&gt;https://herman.bearblog.dev/vulnerability-as-a-service/&lt;/a&gt; &lt;a href=&quot;#footnote-ref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;footnote-2&quot;&gt;
&lt;p&gt;The switch to a USB SSD should mitigate the risk of storage failure, though. &lt;a href=&quot;#footnote-ref-2&quot; data-footnote-backref aria-label=&quot;Back to reference 2&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;footnote-3&quot;&gt;
&lt;p&gt;I must admit that I had some reservations about Telegram since in Germany it has some image problems as primarily used by extremists and conspiracy theorists. But I really started to like the playful and lovely animated UI and UX. &lt;a href=&quot;#footnote-ref-3&quot; data-footnote-backref aria-label=&quot;Back to reference 3&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;footnote-4&quot;&gt;
&lt;p&gt;Pun intended, the company behind it is Moonshot AI. &lt;a href=&quot;#footnote-ref-4&quot; data-footnote-backref aria-label=&quot;Back to reference 4&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;footnote-5&quot;&gt;
&lt;p&gt;If you want to read more about Lil&amp;#39; Bulb: &lt;a href=&quot;https://disney.fandom.com/wiki/Little_Helper&quot;&gt;https://disney.fandom.com/wiki/Little_Helper&lt;/a&gt; &lt;a href=&quot;#footnote-ref-5&quot; data-footnote-backref aria-label=&quot;Back to reference 5&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>Screen time doesn&apos;t measure attention</title><link>https://heyjonny.dev/posts/screen-time-doesnt-measure-attention/</link><guid isPermaLink="true">https://heyjonny.dev/posts/screen-time-doesnt-measure-attention/</guid><pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;My girlfriend complained that I wasn&amp;#39;t really present during our conversations and was hard to talk to. This happened during a week of excessive vibe coding on my phone. I know that sounds funky, but I use Telegram as my messenger to chat with my AI agent.&lt;/p&gt;
&lt;p&gt;I knew she was right, and I could feel it too. My head was constantly buzzing, and I didn&amp;#39;t sleep well. As if on reflex, I checked my screen time. Given how I was feeling, I expected to see some big numbers for Telegram, but I didn&amp;#39;t. I had spent &amp;quot;only&amp;quot; 6.6 hours on it that week.&lt;/p&gt;
&lt;p&gt;Unconvinced, I took a closer look at how I actually used my agent.&lt;sup&gt;&lt;a id=&quot;footnote-ref-1&quot; href=&quot;#footnote-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; My theory was that I interact with it in blocks. For example, I give it a task, then do the dishes, and when it reports back, I give it another task or further instructions. I don&amp;#39;t have Telegram open all the time, but my attention keeps orbiting around it.&lt;/p&gt;
&lt;p&gt;To measure the length of these blocks, I had to identify them first. That meant finding the actual breaks in my usage data. Of all the pauses, 88% were shorter than 20 minutes, and 9% were longer than an hour. Only 3% fell between the two. Knowing myself, I&amp;#39;d say an hour is enough to detach, while 20 minutes is too short. The sweet spot had to be somewhere in the middle, so I just picked 40 minutes.&lt;/p&gt;
&lt;p&gt;That finally let me calculate my interaction time: the time from my first message to the agent&amp;#39;s last reply within an interaction block. The chart below compares it with my screen time. Looking at it hurts a little.&lt;/p&gt;
&lt;img src=&quot;/screen-time-vs-interaction-time.svg&quot; alt=&quot;Two bars for one week: 6.6 hours of screen time against 24.6 hours of interaction time, a factor of 3.7.&quot;&gt;&lt;p&gt;As you can see, I actually spent a whole day a week interacting with my agent, so my screen time was a massive underestimate. That wasn&amp;#39;t what I had in mind when I set this up. My vision was that the agent would allow me to be more present in my life while it did the work. Instead, it&amp;#39;s constantly pulling my attention into its orbit.&lt;/p&gt;
&lt;p&gt;I find it fascinating and obvious how far apart screen time and interaction time are. Obvious, because anyone who experienced a honeymoon phase knows how much a chat can occupy your mind even when your phone is in your pocket. Fascinating, because I&amp;#39;ve always equated screen time with the attention I give an app. As it turns out, that&amp;#39;s not always the case.&lt;/p&gt;
&lt;p&gt;Either way, I need to fix this, and looking at the right data is a first step. I&amp;#39;m also wondering whether Telegram is actually a good interface for communicating with an AI agent. It does promote synchronous interaction by showing you when the agent is typing. That makes the agent seem more human, which I honestly like. But at the same time, maybe this environment is nudging me into interacting with it more and more. Other interfaces, like email, lean more toward asynchronous communication. I&amp;#39;m thinking about giving that a try.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; data-footnotes&gt;
&lt;h2 id=&quot;footnote-label&quot; class=&quot;sr-only&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;footnote-1&quot;&gt;
&lt;p&gt;I use the Hermes Agent locally on a Raspberry Pi. It keeps a local database of every session, and that&amp;#39;s where the numbers in this post come from. I dug through the same database in &lt;a href=&quot;/posts/i-think-i-used-the-hermes-agent-wrong/&quot;&gt;an earlier post&lt;/a&gt;. &lt;a href=&quot;#footnote-ref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>The Slot Machine: How I Got Out</title><link>https://heyjonny.dev/posts/the-slot-machine-how-i-got-out/</link><guid isPermaLink="true">https://heyjonny.dev/posts/the-slot-machine-how-i-got-out/</guid><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In my &lt;a href=&quot;/posts/the-slot-machine-in-your-pocket/&quot;&gt;last blog post&lt;/a&gt; I explained why it can be so hard to stop scrolling on YouTube or Reddit. Think of it like a slot machine in your pocket. Instead of pulling a lever and hoping to win, you scroll and hope for something interesting. The mechanism behind this is called intermittent reinforcement. When a behavior is only sometimes rewarded, it gets reinforced far more strongly than if it were rewarded every time. That&amp;#39;s exactly what&amp;#39;s happening when you scroll: you only sometimes find something genuinely interesting, and that unpredictability is what keeps you scrolling.&lt;/p&gt;
&lt;p&gt;In this blog post I want to share what I did to overcome my own tendency towards doomscrolling on YouTube and Reddit.&lt;/p&gt;
&lt;p&gt;The first step is &lt;strong&gt;understanding&lt;/strong&gt; what the actual problem is. For me, the key realization was that the problem is not the content itself, but the algorithm serving it to me in an endless feed. Even if there are no bad intentions when creating an algorithm that tries to provide a user with interesting content, there is the danger of creating an intermittent reinforcement scheme that simply makes you learn a new behavior that you maybe didn&amp;#39;t want to learn. So I&amp;#39;m much more aware of the cost of interacting with these algorithms (i.e., learning a behavior you never intended to) and that makes it a lot easier for me to stop.&lt;/p&gt;
&lt;p&gt;The good thing about a learned behavior is that you can &lt;strong&gt;unlearn it&lt;/strong&gt;. In order to do so, you need to avoid the behavior. This seems easy at first but can be the most challenging part at the beginning. The reason is there are a lot of learned contexts that act as triggers for the behavior. For example, when you&amp;#39;re waiting at the bus stop what do you do? I bet you look at your smartphone and maybe you&amp;#39;re scrolling on social media. What if you now forbid yourself from using social media? You will stand at the bus stop and something in you, automatically, wants to reach for your smartphone and start scrolling. That&amp;#39;s what you have to avoid and what you have to expect when unlearning it.&lt;/p&gt;
&lt;p&gt;For me the hardest trigger was time after work. I used to hang out on the couch to relax and think about the day. Before I knew it I was doomscrolling on YouTube for way longer than I&amp;#39;d like to admit. So that was the hardest trigger for me to break.&lt;/p&gt;
&lt;p&gt;When you&amp;#39;re in that situation and the urge to scroll kicks in, it&amp;#39;s best to come prepared. And by prepared I mean having &lt;strong&gt;alternatives&lt;/strong&gt; ready. For example, instead of sitting on the couch and scrolling I started calling friends or doing short meditation sessions to relax. But that was only partly a real alternative, because YouTube and Reddit were also platforms I used to inform myself. And through a good friend I learned about an absolutely groundbreaking alternative: RSS readers.&lt;/p&gt;
&lt;img src=&quot;/social_media_vs_rss.png&quot; alt=&quot;Social media vs RSS comparison&quot;&gt;&lt;p&gt;Depending on your age and background that might sound more or less cryptic to you, so let me explain. On social media platforms, creators make content and the algorithm selects it for you and puts it into your feed. The problem is that both the creators and you are fully dependent on the platform, and as a viewer you have little control over what gets recommended to you.&lt;/p&gt;
&lt;p&gt;With RSS readers, you&amp;#39;re the one in control. People write their own blogs and are in full control of their content. An RSS reader lets you build your own feed by subscribing to the blogs you actually want to follow. Most blogs support RSS, and what makes it even better is that individual YouTube channels do too. That means you can still follow your favorite creators without ever opening YouTube&amp;#39;s homepage and getting pulled into the recommendation rabbit hole. You decide what you see. Not the algorithm.&lt;/p&gt;
&lt;p&gt;If any of this resonates with you, I&amp;#39;d say don&amp;#39;t start with an app blocker or a strict schedule. This usually doesn&amp;#39;t work because you&amp;#39;re trying to unlearn a behavior, and you can only do that by not executing it. It&amp;#39;s like scratching open a healing wound again and again. Start with step one: understand the problem and become aware of it. Then pause for some time and find good alternatives. For me it was RSS, and I can&amp;#39;t recommend it enough.&lt;/p&gt;
</content:encoded></item><item><title>Welcome to the Single Tasking Islands</title><link>https://heyjonny.dev/posts/welcome-to-the-single-tasking-islands/</link><guid isPermaLink="true">https://heyjonny.dev/posts/welcome-to-the-single-tasking-islands/</guid><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;/single-tasking-islands.svg&quot; alt=&quot;Illustration of small islands in a sunny sea, one marked with a focus signpost&quot;&gt;&lt;p&gt;Working on multiple things at the same time stresses me out. I&amp;#39;d much rather focus deeply on one complex task over a longer stretch, finish it, and then move on to the next. But in reality, I don&amp;#39;t always have that luxury. Sometimes there are several things I have to handle at once. Deadlines sitting right next to each other, pressing issues flying in that can&amp;#39;t wait. That&amp;#39;s usually when I find myself in a call, listening with half an ear while trying to work on something else in parallel.&lt;/p&gt;
&lt;p&gt;It&amp;#39;s also when I feel the most empty after work. My mind can&amp;#39;t come to rest, and my sleep quality drops. The funny thing is that the solution is actually quite simple: quit your job.&lt;/p&gt;
&lt;p&gt;Just kidding. It&amp;#39;s timeboxing. Look up the free spots in your calendar, look at your to-do list, and block out time to focus on specific tasks.&lt;/p&gt;
&lt;p&gt;This way, you&amp;#39;ve created single tasking islands in your calendar. That already sounds like a holiday, doesn&amp;#39;t it? Welcome to the single tasking islands. Enjoy focusing on one thing again.&lt;/p&gt;
&lt;p&gt;Afraid of overthinking or spending too much time on something? Not on the single tasking islands. You&amp;#39;ve set a timeframe, so you have to concentrate on what actually matters. Remember that nagging worry about whether you&amp;#39;re doing the right thing right now? Also not on the single tasking islands. You&amp;#39;ve laid out your day around what&amp;#39;s important. You&amp;#39;ve moved that decision from many small moments (&amp;quot;okay, what next?&amp;quot;) to a single one at the start of the day (&amp;quot;what will I do today?&amp;quot;).&lt;/p&gt;
&lt;p&gt;So, when do you book your ticket?&lt;/p&gt;
</content:encoded></item><item><title>The Slot Machine in Your Pocket</title><link>https://heyjonny.dev/posts/the-slot-machine-in-your-pocket/</link><guid isPermaLink="true">https://heyjonny.dev/posts/the-slot-machine-in-your-pocket/</guid><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;YouTube and Reddit are incredibly valuable resources. For example, without YouTube, I would&amp;#39;ve never managed to restore my bike or properly tie a necktie. Similarly, on Reddit, there are many users discussing and exchanging opinions on almost every topic imaginable. It&amp;#39;s not Wikipedia, but if you&amp;#39;re interested in whether a phone is good or not, you&amp;#39;ll likely find an insightful discussion on Reddit about it. It&amp;#39;s insane that we can wield such powerful tools, almost completely free.&lt;/p&gt;
&lt;p&gt;Yes, almost. I guess most people nowadays know what you&amp;#39;re paying with when you are visiting these websites: your attention. Marketers pay YouTube, Reddit, and whatever other platform money to show you their products. That&amp;#39;s the core business. And with every working business model, people try to optimize it. For these platforms, that means capturing more of your attention, and one way to do so is to show you more content that is interesting to you. That&amp;#39;s exactly what these infamous algorithms try to find out: what can we show you next to keep you engaged.&lt;/p&gt;
&lt;p&gt;However, if you become too good at this game of manipulating how people want to spend their time, you&amp;#39;ve effectively created a machine that&amp;#39;s good at making people addicted to it. I know this sounds drastic, but you can think of it like this. When interacting with a slot machine, you&amp;#39;re pulling a lever, sometimes followed by a reward. This process is called intermittent reinforcement. Instead of getting a reward every time, you&amp;#39;re only sometimes receiving one. This form of reinforcement is much more effective regarding response rate (how often you want to execute the behavior) and resistance to extinction (how long it takes to unlearn the behavior) than if you got a reward every time. This can also be explained in terms of dopamine release. According to the reward prediction error, the dopamine signal increases when you receive an unexpected reward.&lt;/p&gt;
&lt;p&gt;All right, enough about slot machines. What about YouTube and Reddit? You don&amp;#39;t pull any levers there. No, but you scroll. You visit the website, and it recommends you an unexpectedly hilarious video. Awesome, you share it with your friends. You start scrolling, and most videos aren&amp;#39;t as hilarious or interesting as the previous one. They&amp;#39;re not bad, but also not IT. Then all of a sudden, there is another super interesting video. I&amp;#39;ll end my case here.&lt;/p&gt;
&lt;p&gt;I wrote this blog post because it&amp;#39;s also a personal topic of mine. As I said, I love YouTube and Reddit, I&amp;#39;m a curious person by nature, but I also found it extremely hard to find a good mode of interacting with them without losing control. I think the first step to regaining control is understanding what actually makes it so hard. In my next blog post I want to explain what else I did to find a responsible use of these apps.&lt;/p&gt;
</content:encoded></item><item><title>This post may contain traces of AI</title><link>https://heyjonny.dev/posts/this-post-may-contain-traces-of-ai/</link><guid isPermaLink="true">https://heyjonny.dev/posts/this-post-may-contain-traces-of-ai/</guid><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Armin Ronacher has an AI transparency statement on his blog.&lt;sup&gt;&lt;a id=&quot;footnote-ref-1&quot; href=&quot;#footnote-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; He uses AI mostly as an editor or sparring partner, while he owns the &amp;quot;substance and original thinking&amp;quot;. I find this pretty cool and want to be transparent too.&lt;/p&gt;
&lt;p&gt;It reminds me of reading the ingredient list on food items. I&amp;#39;m quite used to that, since I have celiac disease. That means I&amp;#39;m on a lifelong gluten-free diet and constantly scan ingredient lists for gluten. Some items don&amp;#39;t list gluten as an ingredient, but may contain traces of it. That&amp;#39;s often the case when something is naturally gluten-free, but might have been contaminated during production. Lentils, for example, might contain wheat grains from harvesting or processing.&lt;/p&gt;
&lt;p&gt;If I were on an AI-free diet, I&amp;#39;d appreciate having that information available. I also wouldn&amp;#39;t want to read a fully AI-generated blog post. I want to read about other humans&amp;#39; thoughts and feelings. But what if AI was only used to some extent, like a sparring partner? Then it&amp;#39;s not AI-generated, but it may contain traces of AI.&lt;/p&gt;
&lt;p&gt;Eating something that may contain traces of gluten is a gamble. There are celiacs (like me) doing it and others avoiding it. I like to think that producers try their best to avoid contamination and rarely fail. That is what can happen as well when you use AI as a sparring partner. In many cases it might act as an amplifier or filter, amplifying or purifying the original human signal. But it might sometimes, unnoticed by the writer, distort that precious signal.&lt;/p&gt;
&lt;p&gt;While I don&amp;#39;t mind traces of AI, I avoid fully or heavily AI-generated content. Others might want to avoid traces too, and some might even prefer fully AI-generated work. I don&amp;#39;t judge any of these perspectives, I want to respect them. That&amp;#39;s why I created an &lt;a href=&quot;/transparency/&quot;&gt;AI transparency statement&lt;/a&gt;, so you can decide for yourself whether my approach fits your preferences.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; data-footnotes&gt;
&lt;h2 id=&quot;footnote-label&quot; class=&quot;sr-only&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;footnote-1&quot;&gt;
&lt;p&gt;Armin Ronacher is a well known software developer and blogger. You can find his AI transparency statement here: &lt;a href=&quot;https://lucumr.pocoo.org/ai-transparency/&quot;&gt;https://lucumr.pocoo.org/ai-transparency/&lt;/a&gt; &lt;a href=&quot;#footnote-ref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item><item><title>What is an agent harness?</title><link>https://heyjonny.dev/posts/what-is-the-agent-harness/</link><guid isPermaLink="true">https://heyjonny.dev/posts/what-is-the-agent-harness/</guid><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;2025 was the year of the agents. I did a little Google Trends search to provide some proof to that. As you can see since Gartner labeled agentic AI as the number one trend, the chart mostly knows one direction. And when OpenClaw went viral in early 2026, it might have sparked the interest of a lot of non-technical people too.&lt;/p&gt;
&lt;img src=&quot;/trends_agentic_ai.svg&quot; alt=&quot;A line chart showing the rise of the search term agentic AI&quot;&gt;&lt;p&gt;However, what is an agent actually? A definition that I came across very often says agent = model + harness.&lt;sup&gt;&lt;a id=&quot;footnote-ref-1&quot; href=&quot;#footnote-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; That&amp;#39;s a nice little trick. We know what the model is, it&amp;#39;s basically the brain of the agent, but leaves us with the next question: what is a harness?&lt;/p&gt;
&lt;h2&gt;The harness&lt;/h2&gt;
&lt;p&gt;You could as well define a human as being made out of a brain and a body. The brain is what gives us the ability to think and make decisions. The body is what provides information about and allows us to interact with our environment. For example, our eyes allow us to see, ears to hear, nose to smell, and our skin to feel. All these sensors provide information to our brain.&lt;/p&gt;
&lt;p&gt;So what if, all of a sudden, a chest spawned in front of you? Your eyes send that info to your brain, which recognizes it as a chest and infers it might contain something interesting. So it decides to open the chest and sends signals to your arms and legs.&lt;/p&gt;
&lt;p&gt;The harness is pretty much all that.&lt;sup&gt;&lt;a id=&quot;footnote-ref-2&quot; href=&quot;#footnote-2&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; It provides context (information) as well as tools (abilities) to the model. The model can then decide whether it wants to use one of the available tools (e.g., move to the chest, open the chest) or return text (maybe the chest looks dangerous).&lt;/p&gt;
&lt;p&gt;However, this is also just an analogy and has its limitations. The harness itself can not only be viewed as something extending the model, but also something that limits it. Maybe the model decides to recursively delete all files on your computer. You&amp;#39;d be very happy if something in the harness prevented that.&lt;/p&gt;
&lt;p&gt;So now we know what the model is and the harness, but what does the &amp;quot;+&amp;quot; in that equation actually mean?&lt;/p&gt;
&lt;h2&gt;The agent loop&lt;/h2&gt;
&lt;p&gt;The model and the harness are connected by something called the agent loop. And it&amp;#39;s pretty much just that: a loop. When you start up an agent with a prompt, it sends a request to the model. This request contains not only the prompt itself, but also the tools available for the model to use. The model can then decide to either call a tool or reply to the prompt.&lt;/p&gt;
&lt;img src=&quot;/agent-loop.svg&quot; alt=&quot;A flowchart of the agent loop: the harness checks whether the model&apos;s response contains a tool call, executes it if so, and otherwise replies to the user.&quot;&gt;&lt;p&gt;If it wants to call a tool, it sends that reply to the harness. The harness then calls the tool and feeds the result back to the model. This continues until the model decides to not use a tool anymore. The harness then forwards this response to the user and waits for another input.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;So that&amp;#39;s the answer: an agent is a model and a harness, connected by a loop. The model does the thinking. Everything else is the harness: feeding the model context, handing it tools, running the loop, and stopping it from deleting your files. So the next time an agent impresses you, remember that you&amp;#39;re not just looking at a smart model. You&amp;#39;re looking at a model in a well-built harness.&lt;/p&gt;
&lt;section class=&quot;footnotes&quot; data-footnotes&gt;
&lt;h2 id=&quot;footnote-label&quot; class=&quot;sr-only&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li id=&quot;footnote-1&quot;&gt;
&lt;p&gt;The equation is most closely associated with LangChain&amp;#39;s framing &amp;quot;if you&amp;#39;re not the model, you&amp;#39;re the harness&amp;quot; in &lt;a href=&quot;https://www.langchain.com/blog/the-anatomy-of-an-agent-harness&quot;&gt;The Anatomy of an Agent Harness&lt;/a&gt;. &lt;a href=&quot;#footnote-ref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;footnote-2&quot;&gt;
&lt;p&gt;The word is borrowed from software testing, where a &lt;em&gt;test harness&lt;/em&gt; is the scaffolding that feeds inputs to code and captures its outputs. &lt;a href=&quot;#footnote-ref-2&quot; data-footnote-backref aria-label=&quot;Back to reference 2&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content:encoded></item></channel></rss>