<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	 xmlns:friends="wordpress-plugin-friends:feed-additions:1" >

<channel>
	<title>avdi.codes</title>
	<atom:link href="https://avdi.codes/feed/" rel="self" type="application/rss+xml" />
	<link>https://avdi.codes</link>
	<description>Avdi Grimm, Code Cleric</description>
	<lastBuildDate>Mon, 30 Mar 2026 13:27:52 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://avdi.codes/wp-content/uploads/2019/06/cropped-favicon-extraced-from-linda-kerr-loga-32x32.png</url>
	<title>avdi.codes</title>
	<link>https://avdi.codes</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>New Podcast Ep on Agentic Feature Owners</title>
		<link>https://avdi.codes/new-podcast-ep-on-agentic-feature-owners/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=new-podcast-ep-on-agentic-feature-owners</link>
		
		<dc:creator><![CDATA[Avdi Grimm]]></dc:creator>
		<pubDate>Mon, 30 Mar 2026 13:27:51 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://avdi.codes/?p=113453</guid>

					<description><![CDATA[Check it out, Jessitron and I are podcasting again! You can catch the first episode, and find links to subscribe, on Graceful.Dev: “I’ve often wished I could fork myself…”]]></description>
										<content:encoded><![CDATA[
<p>Check it out, Jessitron and I are podcasting again! You can catch the first episode, and find links to subscribe, on Graceful.Dev: <a href="https://graceful.dev/podcast/ive-often-wished-i-could-fork-myself/">“I’ve often wished I could fork myself…”</a></p>
]]></content:encoded>
					
		
		
		<friends:post-format>link</friends:post-format>
	</item>
		<item>
		<title>Can you tell me how to test</title>
		<link>https://avdi.codes/can-you-tell-me-how-to-test/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=can-you-tell-me-how-to-test</link>
		
		<dc:creator><![CDATA[Avdi Grimm]]></dc:creator>
		<pubDate>Fri, 19 Dec 2025 21:04:04 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://avdi.codes/?p=81641</guid>

					<description><![CDATA[Testing server-rendered HTML: Testing React et al: With apologies to Penny Arcade]]></description>
										<content:encoded><![CDATA[
<p>Testing server-rendered HTML:</p>



<ol class="wp-block-list">
<li>Make a request, look at the result.</li>
</ol>



<p>Testing React et al:</p>



<ol class="wp-block-list">
<li>Make a request.</li>



<li>Receive HTML.</li>



<li>Ignore it!</li>



<li>It also contains a string.</li>



<li>The string is attached to a bird</li>



<li>The bird speaks latin</li>



<li>Find an antiquities professor</li>



<li>He can distract the bird</li>



<li>While you build a fake browser</li>
</ol>



<p><em>With apologies to <a href="https://www.penny-arcade.com/comic/2002/08/19/can-you-tell-me-how-to-get">Penny Arcade</a></em></p>
]]></content:encoded>
					
		
		
		<friends:post-format>aside</friends:post-format>
	</item>
		<item>
		<title>Developer Tooling is a Lousy Business</title>
		<link>https://avdi.codes/developer-tooling-is-a-lousy-business/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=developer-tooling-is-a-lousy-business</link>
		
		<dc:creator><![CDATA[Avdi Grimm]]></dc:creator>
		<pubDate>Thu, 15 May 2025 19:56:47 +0000</pubDate>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[Extracted from SIGAVDI]]></category>
		<guid isPermaLink="false">https://avdi.codes/?p=40619</guid>

					<description><![CDATA[It's a trap.]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"></blockquote>



<p>Back in 2017 Slava Akhmechet <a href="https://web.archive.org/web/20170119021049/http://www.defstartup.org/2017/01/18/why-rethinkdb-failed.html">wrote a post-mortem on the RethinkDB project</a>:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>If you do set out to build a developer tools company, tread carefully. The market is filled with good alternatives. User expectations are high and prices are low. Think deeply about the value you’re offering to the customer. Remember – wanting the world to be a certain way doesn’t make it so.</p>
</blockquote>



<p>As a veteran of a developer tools startup, my view of that market is similarly jaundiced.</p>



<p>Every hacker has a great idea idea for a developer tools startup at some point. But it&#8217;s a tough market to succeed in.</p>



<ul class="wp-block-list">
<li>It&#8217;s just not as big a market as you think it is. Yes, there is gobs of money in the software industry as a whole. But the money available for tools servicing that industry is orders of magnitude smaller.</li>



<li>Other shops&#8217; pain points are less similar to yours than you think.</li>



<li>Everyone looks at your great idea and thinks &#8220;oh, I could do that internally, it&#8217;s just a simple matter of coding&#8221;. The fact that they are wrong does nothing for your bottom line.</li>



<li>The more desperately a company needs your tools, the more peculiar will be their ball of legacy code and the more unexpected and non-standard will be their workflows. You will dump hundreds of hours into supporting these hard cases, in order to have compelling success stories. But most of that work won&#8217;t translate into supporting the <em>next</em> special snowflake.</li>



<li>The gulf is deceptively wide between &#8220;that&#8217;s a really cool idea!&#8221; and &#8220;I&#8217;m going to invest time and energy into incorporating it into our processes.&#8221;</li>



<li>If the idea <em>really</em> has legs, the proof will be that established developer tools companies copy it and commoditize it and it becomes part of the new baseline of tools. Which most likely leaves you back at square one, hopefully having sold your technology to a enterprise dev tool company before the market for it tanked. Of course, if the commoditization happens in the form of a really great Open Source alternative, even that exit may not be an option.</li>
</ul>



<p><em>(This article was adapted from a <a href="/sigavdi">SIGAVDI</a> email from January 2017.)</em></p>
]]></content:encoded>
					
		
		
		<friends:post-format>standard</friends:post-format>
	</item>
		<item>
		<title>I made a keychain</title>
		<link>https://avdi.codes/keychain/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=keychain</link>
					<comments>https://avdi.codes/keychain/#comments</comments>
		
		<dc:creator><![CDATA[Avdi Grimm]]></dc:creator>
		<pubDate>Fri, 09 May 2025 17:23:25 +0000</pubDate>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[community]]></category>
		<guid isPermaLink="false">https://avdi.codes/?p=39985</guid>

					<description><![CDATA[On ivar and strict_ivars and how I'm not always as clever as I like to think]]></description>
										<content:encoded><![CDATA[
<p><a href="https://jessitron.com">Jessitron</a> has taken up making friendship bracelets lately. She has a lot of meetings and it&#8217;s something to do with her hands.</p>



<p>She makes bracelets. Except sometimes they turn out too short. They turn out to be&#8230; keychains, instead.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="769" data-id="40000" src="https://avdi.codes/wp-content/uploads/2025/05/signal-2025-05-09-105336_002-1024x769.jpeg" alt="" class="wp-image-40000" srcset="https://avdi.codes/wp-content/uploads/2025/05/signal-2025-05-09-105336_002-1024x769.jpeg 1024w, https://avdi.codes/wp-content/uploads/2025/05/signal-2025-05-09-105336_002-300x225.jpeg 300w, https://avdi.codes/wp-content/uploads/2025/05/signal-2025-05-09-105336_002-768x577.jpeg 768w, https://avdi.codes/wp-content/uploads/2025/05/signal-2025-05-09-105336_002-1536x1154.jpeg 1536w, https://avdi.codes/wp-content/uploads/2025/05/signal-2025-05-09-105336_002-1440x1081.jpeg 1440w, https://avdi.codes/wp-content/uploads/2025/05/signal-2025-05-09-105336_002.jpeg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" data-id="39998" src="https://avdi.codes/wp-content/uploads/2025/05/signal-2025-05-09-105310_002-576x1024.jpeg" alt="" class="wp-image-39998"/></figure>



<figure class="wp-block-image size-large"><img decoding="async" data-id="39999" src="https://avdi.codes/wp-content/uploads/2025/05/signal-2025-05-09-105236_002-576x1024.jpeg" alt="" class="wp-image-39999"/></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">Some bracelets that turned out to be keychains.</figcaption></figure>



<p>A couple weeks ago I saw Joel Drapper announce his <a href="https://joel.drapper.me/ivars/">strict_ivars</a> gem, and I got really excited. I loved the concept. But I immediately thought of my own spin on it. Mostly, I wanted it to generate warnings instead of exceptions. I also wanted to solve the &#8220;repetitive initializer&#8221; problem at the same time.</p>



<p>It got my wheels spinning in a way they haven&#8217;t in a long time. Here was a Ruby metaprogramming problem I could sink my teeth into! It would be fun. It would recruit skills I don&#8217;t get to use very often. It could be useful for other people!</p>



<p>I sank a lot of time I really couldn&#8217;t spare into the project. I knew if I didn&#8217;t turn something out quickly I&#8217;d never release anything at all. To work faster I leveraged an LLM assistant to be my hands. I solved some of the trickiest Ruby metaprogramming problems I&#8217;ve ever seen, which is <a href="https://github.com/avdi/naught">saying something</a>. (Have you ever tried to locate the <code class="" data-line="">Method</code> object for the original definition of a method that has been hidden behind a prepended module?)</p>



<p>I finished it enough to at least demonstrate the functionality I&#8217;d intended, and I released it. </p>



<p>I&#8217;d told Joel I was inspired by his work, and after my release he did <a href="https://joel.drapper.me/ivar/">an excellent, gracious, in-depth technical comparison of the two gems</a>. It turns out he&#8217;s building on <a href="https://github.com/ruby-next/require-hooks">some tech</a> I hadn&#8217;t even heard of (embarrassing!). He pointed out a number of shortcomings in my approach that I hadn&#8217;t thought through. Issues baked into the architecture that aren&#8217;t easily fixed.</p>



<p>I wanted to make a friendship bracelet. But it turned out that I&#8217;d made a keychain. Realizing I&#8217;d made a keychain felt embarrassing. I felt exposed. I felt old and busted and shown-up.</p>



<p>The truth is I still put a lot of pride into being Very Good At Ruby. I cling to that pride, sometimes. I want to show that I&#8217;ve &#8220;still got it&#8221;. In a life drowned in caregiving and homemaking and survival, I often feel like I&#8217;m vanishing. Like I have so much still to offer, if only&#8212;and then there is screaming from another room, and I must defuse a meltdown, or mediate an argument, or make a belated dinner, or chase down a meds prescription, or or or&#8230;</p>



<p>And then of course there is the actual consulting work and <a href="https://graceful.dev">content work</a> that keeps a roof over our heads. But it is not always technically engaging.</p>



<p>To me there&#8217;s not much more alluring and aspirational than being able to buckle down to some really abstruse coding problem and come up with something shiny and cool to show other people.</p>



<p>I feel bad for not initially understanding Joel&#8217;s approach better. I feel bad for positioning something less-well-thought-out as an alternative. And I feel a little foolish. But it&#8217;s OK to feel foolish.</p>



<p>I need to accept that my life doesn&#8217;t presently offer the time for getting bracelets right, and there&#8217;s no getting around that.</p>



<p>I learned things though. I learned about <a href="https://github.com/ruby/prism">Prism</a>, and about <a href="https://docs.ruby-lang.org/en/master/TracePoint.html">TracePoint</a>, and more about how to work successfully with a coding agent while I&#8217;m chopping onions.</p>



<p>I don&#8217;t think anyone should use <code class="" data-line="">ivar</code> in production. I&#8217;m planning on pulling it from Rubygems, and I&#8217;ll recommend <a href="https://github.com/joeldrapper/strict_ivars">strict_ivars</a> in its place.</p>



<p>I was tempted to pull down the <a href="https://github.com/avdi/ivar">repo</a> as well, out of embarrassment. But I think I&#8217;ll leave it up, because there are some interesting metaprogramming examples in there.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://avdi.codes/keychain/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<friends:post-format>standard</friends:post-format>
	</item>
		<item>
		<title>Agents Aren&#8217;t Juniors, They Are Amnesiac Spies</title>
		<link>https://avdi.codes/agents-arent-juniors-they-are-amnesiac-spies/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=agents-arent-juniors-they-are-amnesiac-spies</link>
		
		<dc:creator><![CDATA[Avdi Grimm]]></dc:creator>
		<pubDate>Fri, 09 May 2025 13:37:08 +0000</pubDate>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[LLMs]]></category>
		<guid isPermaLink="false">https://avdi.codes/?p=39959</guid>

					<description><![CDATA[If this is what you think working with a junior is like, you probably suck at mentoring]]></description>
										<content:encoded><![CDATA[
<p>The other day I told Augment:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Use the Table Data Gateway pattern for this class</p>
</blockquote>



<p>It did as it was told, perfectly, the first time. This is not something I could tell a junior without a great deal more hand-holding. It instantly understood me, because uncounted millions of lines of code and writing-about-code are baked into its probability matrix.</p>



<p>On the other hand, no matter how many times I refactor the agent&#8217;s work, or tell it how to refactor its own work, it will never <em>learn</em> from that experience. It will never get better than it is. It will never grow in taste and instincts.</p>



<p>Today&#8217;s coding agents aren&#8217;t like &#8220;working with a junior&#8221;. They are like working with Jason Bourne, or Charly Baltimore from <em>The Long Kiss Goodnight</em>. They are amnesiac spies, who have a &#8220;<a href="https://www.youtube.com/watch?v=jZOywn1qArI">very particular set of skills</a>&#8221; but can&#8217;t remember any of them until circumstances prompt them to throw a knife, or to remember every license plate in a parking lot. Nor can they form new memories, except in the most superficial ways: they are always the same idiot savant.</p>



<p>Postscript: Unlike a spy though, the agent is terrible at getting itself out of sticky situations. If it can&#8217;t &#8220;figure out&#8221; (pattern-match) why a test is failing it&#8217;ll add more and more code and eventually <a href="https://medium.com/table-xi/in-defense-of-sliming-937b63046efb">slime the tests</a>. Even if I&#8217;ve explicitly forbidden them to do that. This is a situation in which it shows its lack of self-awareness&#8212;another trait that makes it distinctly un-junior-like.</p>



<p></p>
]]></content:encoded>
					
		
		
		<friends:post-format>standard</friends:post-format>
	</item>
		<item>
		<title></title>
		<link>https://avdi.codes/39927-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=39927-2</link>
		
		<dc:creator><![CDATA[Avdi Grimm]]></dc:creator>
		<pubDate>Thu, 08 May 2025 21:10:15 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://avdi.codes/?p=39927</guid>

					<description><![CDATA[Please do try out Ivar, I&#8217;m sure there are corner cases and I&#8217;d love to identify them]]></description>
										<content:encoded><![CDATA[
<p>Please do try out <a href="https://github.com/avdi/ivar">Ivar</a>, I&#8217;m sure there are corner cases and I&#8217;d love to identify them</p>
]]></content:encoded>
					
		
		
		<friends:post-format>aside</friends:post-format>
	</item>
		<item>
		<title></title>
		<link>https://avdi.codes/39835-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=39835-2</link>
					<comments>https://avdi.codes/39835-2/#comments</comments>
		
		<dc:creator><![CDATA[Avdi Grimm]]></dc:creator>
		<pubDate>Thu, 08 May 2025 00:34:01 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://avdi.codes/?p=39835</guid>

					<description><![CDATA[Check it out, I published a new RubyGem! (I think the original post syndicated to the fediverse a little wonky so I&#8217;m re-linking it)]]></description>
										<content:encoded><![CDATA[
<p>Check it out, I published a new RubyGem!</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-avdi-codes wp-block-embed-avdi-codes"><div class="wp-block-embed__wrapper">
<span class="S9gyPHljq1D2YIzfr7kbW5LwTeBdh"><blockquote class="wp-embedded-content" data-secret="7E830He39W"><a href="https://avdi.codes/announcing-ivar-rubys-missing-instance-variable-typo-warnings/">Announcing Ivar: Ruby&#8217;s Missing Instance Variable Typo Warnings</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;Announcing Ivar: Ruby&#8217;s Missing Instance Variable Typo Warnings&#8221; &#8212; avdi.codes" src="https://avdi.codes/announcing-ivar-rubys-missing-instance-variable-typo-warnings/embed/#?secret=zbn3resimk#?secret=7E830He39W" data-secret="7E830He39W" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></span>
</div></figure>



<p>(I think the original post syndicated to the fediverse a little wonky so I&#8217;m re-linking it)</p>
]]></content:encoded>
					
					<wfw:commentRss>https://avdi.codes/39835-2/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<friends:post-format>link</friends:post-format>
	</item>
		<item>
		<title>Announcing Ivar: Ruby&#8217;s Missing Instance Variable Typo Warnings</title>
		<link>https://avdi.codes/announcing-ivar-rubys-missing-instance-variable-typo-warnings/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=announcing-ivar-rubys-missing-instance-variable-typo-warnings</link>
					<comments>https://avdi.codes/announcing-ivar-rubys-missing-instance-variable-typo-warnings/#comments</comments>
		
		<dc:creator><![CDATA[Avdi Grimm]]></dc:creator>
		<pubDate>Thu, 08 May 2025 00:12:56 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Ruby]]></category>
		<guid isPermaLink="false">https://avdi.codes/?p=39810</guid>

					<description><![CDATA[Ivar is a Ruby gem that automatically checks for typos in instance variables.]]></description>
										<content:encoded><![CDATA[
<p>You should probably go tread <a href="https://avdi.codes/keychain/" data-type="post" data-id="39985">this post instead</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://avdi.codes/announcing-ivar-rubys-missing-instance-variable-typo-warnings/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<friends:post-format>standard</friends:post-format>
	</item>
		<item>
		<title>Facts, feelings, and fascism &#8211; by Amy Isikoff Newell</title>
		<link>https://avdi.codes/facts-feelings-and-fascism-by-amy-isikoff-newell/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=facts-feelings-and-fascism-by-amy-isikoff-newell</link>
					<comments>https://avdi.codes/facts-feelings-and-fascism-by-amy-isikoff-newell/#comments</comments>
		
		<dc:creator><![CDATA[Avdi Grimm]]></dc:creator>
		<pubDate>Fri, 02 May 2025 21:46:22 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://avdi.codes/?p=39554</guid>

					<description><![CDATA[fascists would rather we pay less attention to external facts (which they are lying to us about) and more attention to our feelings, because those are so easy to manipulate It is always a good idea to read Amy Newell, but *especially* now. Source: Facts, feelings, and fascism &#8211; by Amy Isikoff Newell]]></description>
										<content:encoded><![CDATA[<blockquote><p>fascists would rather we pay less attention to external facts (which they are lying to us about) and more attention to our feelings, because those are so easy to manipulate</p></blockquote>
<p>It is always a good idea to read Amy Newell, but *especially* now.</p>
<p>Source: <em><a href="https://www.amywriteswords.com/p/facts-feelings-and-fascism?publication_id=293363&amp;utm_campaign=email-post-title&amp;r=1du1c&amp;utm_medium=email">Facts, feelings, and fascism &#8211; by Amy Isikoff Newell</a></em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://avdi.codes/facts-feelings-and-fascism-by-amy-isikoff-newell/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<friends:post-format>quote</friends:post-format>
	</item>
		<item>
		<title></title>
		<link>https://avdi.codes/39202-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=39202-2</link>
					<comments>https://avdi.codes/39202-2/#comments</comments>
		
		<dc:creator><![CDATA[Avdi Grimm]]></dc:creator>
		<pubDate>Thu, 01 May 2025 21:06:50 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://avdi.codes/?p=39202</guid>

					<description><![CDATA[Has anyone done self-hosted GitPod (or other self-hosted devbox) on their own cloud compute that ISN&#8217;T AWS? I wish I could just chuck it on a Vultr box but it needs KVM. I&#8217;m just so allergic to doing this shit on AWS. I want A BOX with A NAME that is MINE but that lives [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Has anyone done self-hosted GitPod (or other self-hosted devbox) on their own cloud compute that ISN&#8217;T AWS? I wish I could just chuck it on a Vultr box but it needs KVM.</p>
<p>I&#8217;m just so allergic to doing this shit on AWS. I want A BOX with A NAME that is MINE but that lives in a datacenter. And I would rather gargle rusty nails than edit IAM policies.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://avdi.codes/39202-2/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<friends:post-format>status</friends:post-format>
	</item>
	</channel>
</rss>
