<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wc="https://wilhelm.codes/ns/feed/1.0"><channel><title>Wilhelm Codes · Bits</title><link>https://wilhelm.codes/bits/</link><description>Slinger of nibbles, bits and bytes. Over 25 years of professional experience as a software engineer. Love making glowing rectangles go "beep-boop".</description><generator>Hugo</generator><language>en-US</language><managingEditor>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</managingEditor><webMaster>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</webMaster><lastBuildDate>Mon, 14 Sep 2026 17:15:00 +1000</lastBuildDate><atom:link href="https://wilhelm.codes/bits/index.xml" rel="self" type="application/rss+xml"/><item><title>I’ve been rebuilding the public landing page for the homelab this …</title><link>https://wilhelm.codes/bits/update-a-thin-layer-of-grime/</link><pubDate>Mon, 14 Sep 2026 17:15:00 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/update-a-thin-layer-of-grime/</guid><category>wilhelm.codes</category><category>homelab</category><category>css</category><category>design</category><wc:kind>bit</wc:kind><wc:bit>update</wc:bit><wc:untitled>true</wc:untitled><description>I&amp;rsquo;ve been rebuilding the public landing page for the homelab this weekend and somewhere in the middle of it I laid a scanline over the whole thing. It&amp;rsquo;s a single hairline that repeats itself every three pixels. It&amp;rsquo;s faint enough that the page stops looking quite so flat without you ever working out why. Then, obviously, I wanted it here too.
The lazy version is a white line at about 1.5% opacity, which is what the other page uses, because the other page is forty words of neon over black; legibility isn&amp;rsquo;t really the goal. However, this site is mostly prose, so a white line lightens the words as well as the background. I didn&amp;rsquo;t spend all that time on the reading column just to lay a haze over it.</description><content:encoded><![CDATA[<p>I&rsquo;ve been rebuilding the <a href="https://nightcity.network">public landing</a> page for the homelab this weekend and somewhere in the middle of it I laid a scanline over the whole thing. It&rsquo;s a single hairline that repeats itself every three pixels. It&rsquo;s faint enough that the page stops looking quite so flat without you ever working out why. Then, obviously, I wanted it here too.</p>
<p>The lazy version is a white line at about <code>1.5%</code> opacity, which is what the other page uses, because the other page is forty words of neon over black; legibility isn&rsquo;t really the goal. However, <em>this</em> site is mostly prose, so a white line lightens the words as well as the background. I didn&rsquo;t spend all that time on the reading column just to lay a haze over it.</p>
<p>So the grain mixes off <code>--text</code> instead of white:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">CSS</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="nt">--grain</span><span class="o">:</span> <span class="nt">color-mix</span><span class="o">(</span><span class="nt">in</span> <span class="nt">srgb</span><span class="o">,</span> <span class="nt">var</span><span class="o">(</span><span class="nt">--text</span><span class="o">)</span> <span class="nt">1</span><span class="p">.</span><span class="nc">5</span><span class="o">%,</span> <span class="nt">transparent</span><span class="o">);</span></span></span></code></pre></div>
</div>
<p>This can be applied like so:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">CSS</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">grain</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">position</span><span class="p">:</span> <span class="kc">fixed</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">inset</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">pointer-events</span><span class="p">:</span> <span class="kc">none</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">z-index</span><span class="p">:</span> <span class="mi">10</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">background</span><span class="p">:</span> <span class="nb">repeating-linear-gradient</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="kc">to</span> <span class="kc">bottom</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">grain</span><span class="p">)</span> <span class="mi">0</span> <span class="mi">1</span><span class="kt">px</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="kc">transparent</span> <span class="mi">1</span><span class="kt">px</span> <span class="mi">3</span><span class="kt">px</span>
</span></span><span class="line"><span class="cl">  <span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
</div>
<p>And finally referened like so just above the closing <code>&lt;/body&gt;</code> tag:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">HTML</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">&#34;grain&#34;</span> <span class="na">aria-hidden</span><span class="o">=</span><span class="s">&#34;true&#34;</span><span class="p">&gt;&lt;/</span><span class="nt">div</span><span class="p">&gt;</span></span></span></code></pre></div>
</div>
<p>This works out great, because a colour mixed with itself gives that colour straight back. The grain physically <em>cannot</em> touch the body copy. I&rsquo;ve learned quite a few new things today!</p>
<p>As a bonus the lightbox is a <code>&lt;dialog&gt;</code> and the browser promotes a modal dialog into the top layer. This sits above every <code>z-index</code> on the page; including the one holding the grain. So a zoomed photograph comes up perfectly clean and I didn&rsquo;t have to write a rule to make that happen.</p>
<p>Whether you can see any of this depends entirely on your monitor, your colour settings and even your resolution. If you can&rsquo;t see it, it&rsquo;s working.</p>
]]></content:encoded></item><item><title>Page loads had been creeping up again, so I went looking. Turns out …</title><link>https://wilhelm.codes/bits/update-putting-the-site-on-a-diet/</link><pubDate>Fri, 11 Sep 2026 01:09:12 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/update-putting-the-site-on-a-diet/</guid><category>wilhelm.codes</category><category>hugo</category><category>performance</category><wc:kind>bit</wc:kind><wc:bit>update</wc:bit><wc:untitled>true</wc:untitled><description>Page loads had been creeping up again, so I went looking. Turns out I&amp;rsquo;d been quietly serving enormous screenshots. One post was pulling 5.1 MB of PNGs, and a single one of those was a 1.96 MB app screenshot sitting in a column 736 pixels wide. Oof.
The fix was mostly plumbing. My img shortcode was handing the raw src straight to the &amp;lt;img&amp;gt; tag, so Hugo never got a look in. Everything now goes through one partial that resizes to the width it actually displays at, re-encodes to WebP and emits a srcset, plus width and height so the layout stops jumping around while things load. Markdown images get the same treatment through a render hook. The awkward bit: images under static/ aren&amp;rsquo;t resources, so Hugo can&amp;rsquo;t touch them. A second mount in hugo.toml fixes that without breaking any existing URLs.</description><content:encoded><![CDATA[<p>Page loads had been creeping up again, so I went looking. Turns out I&rsquo;d been quietly serving <em>enormous</em> screenshots. One post was pulling 5.1 MB of PNGs, and a single one of those was a 1.96 MB app screenshot sitting in a column 736 pixels wide. Oof.</p>
<p>The fix was mostly plumbing. My <code>img</code> shortcode was handing the raw <code>src</code> straight to the <code>&lt;img&gt;</code> tag, so Hugo never got a look in. Everything now goes through one partial that resizes to the width it actually displays at, re-encodes to WebP and emits a <code>srcset</code>, plus <code>width</code> and <code>height</code> so the layout stops jumping around while things load. Markdown images get the same treatment through a render hook. The awkward bit: images under <code>static/</code> aren&rsquo;t resources, so Hugo can&rsquo;t touch them. A second mount in <code>hugo.toml</code> fixes that without breaking any existing URLs.</p>
<p>While I was in there I dealt with the JavaScript. Every page was carrying all seven inline scripts, even the 90-odd pages with no code blocks, no zoomable images and no locked series titles. Those three now load only where they actually do something. The two that genuinely run everywhere moved into one small fingerprinted bundle, so your browser fetches it once for the whole visit instead of re-reading it on every page. I also finally turned on HTML minification, which I&rsquo;d apparently never bothered with.</p>
<p>Where it landed:</p>
<table>
	<thead>
			<tr>
					<th>what</th>
					<th>before</th>
					<th>after</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Images the site serves</td>
					<td>12.3 MB</td>
					<td>1.5 MB</td>
			</tr>
			<tr>
					<td>HTML over the wire, mean per page</td>
					<td>10,236 B</td>
					<td>6,671 B</td>
			</tr>
			<tr>
					<td>Worst offending post, first paint</td>
					<td>5.1 MB</td>
					<td>112 KB</td>
			</tr>
	</tbody>
</table>
<p>That last one is about 46 times smaller. Nothing changed visually, which was the whole point. The sparks still spark and the locked titles still scramble.</p>
<p>One last silly thing. I added a new short code to style &ldquo;Plant Smart&rdquo; as &ldquo;<span class="wm-plant">Plant</span>🌱<span class="wm-smart">Smart</span>&rdquo;. Fun!</p>
]]></content:encoded></item><item><title>With all the frenetic redesigning of Plant🌱Smart these past few weeks, …</title><link>https://wilhelm.codes/bits/image-plantsmart-galleries/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/image-plantsmart-galleries/</guid><category>plantsm.art</category><wc:kind>bit</wc:kind><wc:bit>image</wc:bit><wc:untitled>true</wc:untitled><description>With all the frenetic redesigning of Plant🌱Smart these past few weeks, I couldn&amp;rsquo;t believe I completely forgot about the image gallery on the details page. The old design looked a bit dated like everything else, soooo the galleries also get a refresh and lightbox. Yay.</description><content:encoded><![CDATA[<p>With all the frenetic redesigning of <span class="wm-plant">Plant</span>🌱<span class="wm-smart">Smart</span> these past few weeks, I couldn&rsquo;t believe I completely forgot about the image gallery on the details page. The old design looked a bit dated like everything else, soooo the galleries also get a refresh and lightbox. Yay.</p>
<p><img src="https://wilhelm.codes/bits/image-plantsmart-galleries/gallery-before_hu_1462c362d02031cb.png" alt="The gallery before, which is disgusting." /></p><p><img src="https://wilhelm.codes/bits/image-plantsmart-galleries/gallery-after_hu_c59343267200afda.png" alt="The beautiful new image gallery." /></p>]]></content:encoded></item><item><title>@wilhelm.codes is on sifa.id!</title><link>https://wilhelm.codes/bits/link-sifa-id/</link><pubDate>Tue, 25 Aug 2026 19:13:30 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/link-sifa-id/</guid><category>bluesky</category><category>atproto</category><wc:kind>bit</wc:kind><wc:bit>link</wc:bit><wc:source>sifa.id</wc:source><wc:target>https://sifa.id/p/wilhelm.codes</wc:target><description>This is still very early days, but Sifa is a professional network built on the AT Protocol. It&amp;rsquo;s meant to be an open alternative to LinkedIn which, let&amp;rsquo;s be honest, has always been a bit of a hellsite. Even more so lately with all the AI boosterism on the timeline. Probably may never grow a network as large here as I have on LI, but good riddance. I&amp;rsquo;ll still be keeping the entry in the side rail navigation for the time being, but its days are numbered.</description><content:encoded><![CDATA[<p>This is still very early days, but Sifa is a professional network built on the <a href="https://atproto.com/">AT Protocol</a>. It&rsquo;s meant to be an open alternative to LinkedIn which, let&rsquo;s be honest, has always been a bit of a hellsite. Even more so lately with all the AI boosterism on the timeline. Probably may never grow a network as large here as I have on LI, but good riddance. I&rsquo;ll still be keeping the entry in the side rail navigation for the time being, but its days are numbered.</p>
]]></content:encoded></item><item><title>Welp, I finally did it! I’ve moved the git repository for this site …</title><link>https://wilhelm.codes/bits/update-adios-github/</link><pubDate>Mon, 24 Aug 2026 11:00:00 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/update-adios-github/</guid><category>wilhelm.codes</category><category>github</category><wc:kind>bit</wc:kind><wc:bit>update</wc:bit><wc:untitled>true</wc:untitled><description>Welp, I finally did it! I&amp;rsquo;ve moved the git repository for this site from Github to the Forgejo instance in my homelab. Further, I&amp;rsquo;ve replaced Cloudflare&amp;rsquo;s build pipeline with a simple 20-line YAML file used by my Woodpecker CI server, which is also hosted in my homelab. I&amp;rsquo;m still using Wrangler to push the static assets to Cloudflare Pages and I&amp;rsquo;ll always need an external DNS provider for my domain, but you can&amp;rsquo;t reasonably self-host everything.</description><content:encoded><![CDATA[<p>Welp, I finally did it! I&rsquo;ve moved the git repository for this site from Github to the Forgejo instance in my homelab. Further, I&rsquo;ve replaced Cloudflare&rsquo;s build pipeline with a simple 20-line YAML file used by my Woodpecker CI server, which is also hosted in my homelab. I&rsquo;m still using Wrangler to push the static assets to Cloudflare Pages and I&rsquo;ll always need an external DNS provider for my domain, but you can&rsquo;t reasonably self-host <em>everything</em>.</p>
<p>It&rsquo;s nice to have <em>almost</em> full control of my little website now! And all it took was 3 attempts to get the integration right. 😅</p>
<p><img
  src="https://wilhelm.codes/bits/update-adios-github/changelog-proof_hu_6623937c7992b7c5.webp"
  srcset="/bits/update-adios-github/changelog-proof_hu_6623937c7992b7c5.webp 736w, /bits/update-adios-github/changelog-proof_hu_e96734be3e965506.webp 1104w, /bits/update-adios-github/changelog-proof_hu_375583fd984255af.webp 1472w"
  sizes="(max-width: 48rem) 100vw, 736px"
  width="736"
  height="273"
  alt="Alternative text for screen readers"
  
  loading="lazy"
  decoding="async"
/>
</p>
<p>A great note to end on for a Monday evening!</p>
]]></content:encoded></item><item><title>A Word on Omarchy</title><link>https://wilhelm.codes/bits/link-a-word-on-omarchy/</link><pubDate>Mon, 24 Aug 2026 00:00:19 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/link-a-word-on-omarchy/</guid><wc:kind>bit</wc:kind><wc:bit>link</wc:bit><wc:source>マリウス.com</wc:source><wc:target>https://マリウス.com/a-word-on-omarchy/</wc:target><description>A measured and reasoned critique of the shit-show that is Omarchy. Classic security engineer snark met with some Shakespearean levels of verbosity. This isn&amp;rsquo;t necessarily firing shots at the increasingly far-right DHH, but plays into his surrounding cult of personality and how it&amp;rsquo;s used to lure Linux beginners into a false sense of security based purely on vibes&amp;hellip; and a shit tonne of Bash scripts. Credit to the author for avoiding Omarchy&amp;rsquo;s creator&amp;rsquo;s politics.</description><content:encoded><![CDATA[<p>A measured and reasoned critique of the shit-show that is Omarchy. Classic security engineer snark met with some Shakespearean levels of verbosity. This isn&rsquo;t necessarily firing shots at the increasingly far-right DHH, but plays into his surrounding cult of personality and how it&rsquo;s used to lure Linux beginners into a false sense of security based purely on vibes&hellip; and a shit tonne of Bash scripts. Credit to the author for avoiding Omarchy&rsquo;s creator&rsquo;s politics.</p>
]]></content:encoded></item><item><title>“Nearly all men can stand adversity, but if you want to test a man’s …</title><link>https://wilhelm.codes/bits/quote-if-you-want-to-test-a-mans-character/</link><pubDate>Sun, 23 Aug 2026 12:18:30 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/quote-if-you-want-to-test-a-mans-character/</guid><category>wisdom</category><wc:kind>bit</wc:kind><wc:bit>quote</wc:bit><wc:untitled>true</wc:untitled><wc:source>Robert G. Ingersoll</wc:source><description>&amp;ldquo;Nearly all men can stand adversity, but if you want to test a man&amp;rsquo;s character, give him power&amp;rdquo;</description><content:encoded><![CDATA[<p>&ldquo;Nearly all men can stand adversity, but if you want to test a man&rsquo;s character, give him power&rdquo;</p>
]]></content:encoded></item><item><title>Goodbye Tailwind. Goodbye Node. We’re rolling vanilla HTML, CSS and …</title><link>https://wilhelm.codes/bits/blurb-hours-without-webfonts/</link><pubDate>Thu, 20 Aug 2026 20:50:00 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/blurb-hours-without-webfonts/</guid><category>css</category><category>wilhelm.codes</category><wc:kind>bit</wc:kind><wc:bit>blurb</wc:bit><wc:untitled>true</wc:untitled><description>Goodbye Tailwind. Goodbye Node. We&amp;rsquo;re rolling vanilla HTML, CSS and JS. No more webfonts, we on them system faces now. A couple of hours on I have not missed the webfonts once. The site is lighter, the text is sharper on my screen and the only person who ever noticed was me. 750kb cold start for the main page is now under 18kb.
Everything is so much faster now I should&amp;rsquo;ve done this months ago when I first revamped the site.</description><content:encoded><![CDATA[<p>Goodbye Tailwind. Goodbye Node. We&rsquo;re rolling vanilla HTML, CSS and JS. No more webfonts, we on them system faces now. A couple of hours on I have not missed the webfonts once. The site is lighter, the text is sharper on my screen and the only person who ever noticed was me. <code>750kb</code> cold start for the main page is now <em>under</em> <code>18kb</code>.</p>
<p>Everything is so much faster now I should&rsquo;ve done this months ago when I first revamped the site.</p>
]]></content:encoded></item><item><title>Errors are Values</title><link>https://wilhelm.codes/bits/link-errors-are-values/</link><pubDate>Sun, 16 Aug 2026 10:00:00 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/link-errors-are-values/</guid><category>go</category><wc:kind>bit</wc:kind><wc:bit>link</wc:bit><wc:source>The Go Blog</wc:source><wc:target>https://go.dev/blog/errors-are-values</wc:target><description>It&amp;rsquo;s an oldie, but I always go back to it. The post I keep sending to people who tell me Go error handling is just noise. The point was never that you type if err != nil a lot. The point is that an error is an ordinary value, so you can do ordinary things with it.</description><content:encoded><![CDATA[<p>It&rsquo;s an oldie, but I always go back to it. The post I keep sending to people who tell me Go error handling is just noise. The point was never that you type <code>if err != nil</code> a lot. The point is that an error is an ordinary value, so you can do ordinary things with it.</p>
]]></content:encoded></item><item><title>“Debugging is twice as hard as writing the code in the first place. …</title><link>https://wilhelm.codes/bits/quote-brian-kernighan/</link><pubDate>Sun, 09 Aug 2026 08:05:00 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/quote-brian-kernighan/</guid><category>wisdom</category><wc:kind>bit</wc:kind><wc:bit>quote</wc:bit><wc:untitled>true</wc:untitled><wc:source>Brian Kernighan, The Elements of Programming Style</wc:source><description>&amp;ldquo;Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.&amp;rdquo;</description><content:encoded><![CDATA[<p>&ldquo;Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.&rdquo;</p>
]]></content:encoded></item><item><title>Spent an evening on the tags. A few of them were doing the same job …</title><link>https://wilhelm.codes/bits/update-tidied-up-the-tags/</link><pubDate>Wed, 05 Aug 2026 17:40:00 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/update-tidied-up-the-tags/</guid><category>wilhelm.codes</category><wc:kind>bit</wc:kind><wc:bit>update</wc:bit><wc:untitled>true</wc:untitled><description>Spent an evening on the tags. A few of them were doing the same job under different names, so the duplicates are merged and the thin ones are gone. The cloud in the rail is shorter and rather more honest for it.</description><content:encoded>&lt;p>Spent an evening on the tags. A few of them were doing the same job under different names, so the duplicates are merged and the thin ones are gone. The cloud in the rail is shorter and rather more honest for it.&lt;/p>
</content:encoded></item><item><title>The Grug Brained Developer</title><link>https://wilhelm.codes/bits/link-the-grug-brained-developer/</link><pubDate>Sun, 02 Aug 2026 12:20:00 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/link-the-grug-brained-developer/</guid><category>wisdom</category><wc:kind>bit</wc:kind><wc:bit>link</wc:bit><wc:source>grugbrain.dev</wc:source><wc:target>https://grugbrain.dev/</wc:target><description>Read this for the third time and it still lands. Complexity very, very bad. Grug is right more often than I would like to admit.</description><content:encoded>&lt;p>Read this for the third time and it still lands. Complexity very, very bad. Grug is right more often than I would like to admit.&lt;/p>
</content:encoded></item><item><title>Opened the bill expecting a fright and found a NAT gateway I have not …</title><link>https://wilhelm.codes/bits/blurb-a-nat-gateway-i-forgot/</link><pubDate>Sat, 01 Aug 2026 22:15:00 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/blurb-a-nat-gateway-i-forgot/</guid><category>aws</category><category>cost-optimisation</category><wc:kind>bit</wc:kind><wc:bit>blurb</wc:bit><wc:untitled>true</wc:untitled><description>Opened the bill expecting a fright and found a NAT gateway I have not needed since March. It has been quietly charging me rent to forward packets nowhere. Coding is my passion.</description><content:encoded>&lt;p>Opened the bill expecting a fright and found a NAT gateway I have not needed since March. It has been quietly charging me rent to forward packets nowhere. Coding is my passion.&lt;/p>
</content:encoded></item><item><title>I keep promising myself I will write more on the weekends. The drafts …</title><link>https://wilhelm.codes/bits/blurb-the-drafts-folder-disagrees/</link><pubDate>Wed, 29 Jul 2026 19:05:00 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/blurb-the-drafts-folder-disagrees/</guid><wc:kind>bit</wc:kind><wc:bit>blurb</wc:bit><wc:untitled>true</wc:untitled><description>I keep promising myself I will write more on the weekends. The drafts folder keeps returning a different answer.</description><content:encoded>&lt;p>I keep promising myself I will write more on the weekends. The drafts folder keeps returning a different answer.&lt;/p>
</content:encoded></item><item><title>“A little copying is better than a little dependency.”</title><link>https://wilhelm.codes/bits/quote-rob-pike/</link><pubDate>Sun, 26 Jul 2026 07:45:00 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/quote-rob-pike/</guid><category>go</category><category>wisdom</category><wc:kind>bit</wc:kind><wc:bit>quote</wc:bit><wc:untitled>true</wc:untitled><wc:source>Rob Pike, Go Proverbs</wc:source><description>&amp;ldquo;A little copying is better than a little dependency.&amp;rdquo;</description><content:encoded><![CDATA[<p>&ldquo;A little copying is better than a little dependency.&rdquo;</p>
]]></content:encoded></item><item><title>Sat down to fix one broken keybind. Three hours later the whole tmux …</title><link>https://wilhelm.codes/bits/blurb-another-yak-shaved/</link><pubDate>Wed, 22 Jul 2026 21:30:00 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/blurb-another-yak-shaved/</guid><category>tmux</category><wc:kind>bit</wc:kind><wc:bit>blurb</wc:bit><wc:untitled>true</wc:untitled><description>Sat down to fix one broken keybind. Three hours later the whole tmux config is rewritten and the keybind is still broken.</description><content:encoded>&lt;p>Sat down to fix one broken keybind. Three hours later the whole tmux config is rewritten and the keybind is still broken.&lt;/p>
</content:encoded></item><item><title>“The most damaging phrase in the language is: ‘It’s always been done …</title><link>https://wilhelm.codes/bits/quote-grace-hopper/</link><pubDate>Sun, 19 Jul 2026 08:12:00 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/quote-grace-hopper/</guid><category>wisdom</category><wc:kind>bit</wc:kind><wc:bit>quote</wc:bit><wc:untitled>true</wc:untitled><wc:source>Grace Hopper</wc:source><description>&amp;ldquo;The most damaging phrase in the language is: &amp;lsquo;It&amp;rsquo;s always been done that way.&amp;rsquo;&amp;rdquo;</description><content:encoded><![CDATA[<p>&ldquo;The most damaging phrase in the language is: &lsquo;It&rsquo;s always been done that way.&rsquo;&rdquo;</p>
]]></content:encoded></item><item><title>The Memory Heist</title><link>https://wilhelm.codes/bits/link-the-memory-heist/</link><pubDate>Wed, 15 Jul 2026 20:44:05 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/link-the-memory-heist/</guid><category>security</category><category>ai</category><wc:kind>bit</wc:kind><wc:bit>link</wc:bit><wc:source>Ayush Paul</wc:source><wc:target>https://www.ayush.digital/blog/the-memory-heist</wc:target><description>An interesting read a mate of mine shared about how relatively simple it is to exfiltrate your sandboxed Claude memories when pairing it with an agent that can access the web. Good stuff!</description><content:encoded>&lt;p>An interesting read a mate of mine shared about how relatively simple it is to exfiltrate your sandboxed Claude memories when pairing it with an agent that can access the web. Good stuff!&lt;/p>
</content:encoded></item><item><title>Strangely sudden news today. Looks like “Go Report Card” has been …</title><link>https://wilhelm.codes/bits/blurb-go-report-card-is-gone/</link><pubDate>Mon, 13 Jul 2026 18:32:56 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/blurb-go-report-card-is-gone/</guid><category>golang</category><wc:kind>bit</wc:kind><wc:bit>blurb</wc:bit><wc:untitled>true</wc:untitled><description>Strangely sudden news today. Looks like &amp;ldquo;Go Report Card&amp;rdquo; has been completely sunset as of a couple weeks ago. I really dug that little service. At least it&amp;rsquo;s still available for self-hosting, but now I have to go on cross-repo badge cleanup duty.</description><content:encoded><![CDATA[<p>Strangely sudden news today. Looks like &ldquo;Go Report Card&rdquo; has been completely sunset as of a couple weeks ago. I really dug that little service. At least it&rsquo;s still available for <a href="https://github.com/gojp/goreportcard">self-hosting</a>, but now I have to go on cross-repo badge cleanup duty.</p>
]]></content:encoded></item><item><title>Having a play with a more dynamic menu drawer. Just working out the …</title><link>https://wilhelm.codes/bits/update-new-menu/</link><pubDate>Sat, 04 Jul 2026 13:17:45 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/update-new-menu/</guid><category>wilhelm.codes</category><category>hugo</category><wc:kind>bit</wc:kind><wc:bit>update</wc:bit><wc:untitled>true</wc:untitled><description>Having a play with a more dynamic menu drawer. Just working out the kinks on smaller screens.</description><content:encoded>&lt;p>Having a play with a more dynamic menu drawer. Just working out the kinks on smaller screens.&lt;/p>
</content:encoded></item><item><title>Decided to introduce a new projects page to showcase some of the …</title><link>https://wilhelm.codes/bits/update-new-projects-page/</link><pubDate>Thu, 02 Jul 2026 20:39:18 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/update-new-projects-page/</guid><category>wilhelm.codes</category><category>hugo</category><wc:kind>bit</wc:kind><wc:bit>update</wc:bit><wc:untitled>true</wc:untitled><description>Decided to introduce a new projects page to showcase some of the bigger things I&amp;rsquo;m working on. I&amp;rsquo;m still working out the kinks and I&amp;rsquo;m not 100% sold on the current design. Each card is powered by a .toml based datasource in Hugo, contains a kind of linear heatmap of activity related to the associated project&amp;rsquo;s tag as well as the 5 latest related posts. Good enough to publish, I guess.</description><content:encoded><![CDATA[<p>Decided to introduce a new <a href="https://wilhelm.codes/projects">projects</a> page to showcase some of the bigger things I&rsquo;m working on. I&rsquo;m still working out the kinks and I&rsquo;m not 100% sold on the current design. Each card is powered by a <code>.toml</code> based datasource in Hugo, contains a kind of linear heatmap of activity related to the associated project&rsquo;s tag as well as the 5 latest related posts. Good enough to publish, I guess.</p>
<p>I also can&rsquo;t decide on which activity graph animation I like the most. 😅</p>
]]></content:encoded></item><item><title>I am very smart. I only just realised over the weekend that issues and …</title><link>https://wilhelm.codes/bits/update-forgot-to-turn-on-comments/</link><pubDate>Mon, 29 Jun 2026 11:47:27 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/update-forgot-to-turn-on-comments/</guid><category>wilhelm.codes</category><category>github</category><wc:kind>bit</wc:kind><wc:bit>update</wc:bit><wc:untitled>true</wc:untitled><description>I am very smart. I only just realised over the weekend that issues and discussions in the parent repo for this site were disabled. Meaning, article coments using Giscuss was functionally disabled here. WOOPS!</description><content:encoded>&lt;p>I am very smart. I only just realised over the weekend that issues and discussions in the parent repo for this site were disabled. Meaning, article coments using Giscuss was functionally disabled &lt;em>here&lt;/em>. WOOPS!&lt;/p>
</content:encoded></item><item><title>Welp. I’ve convinced myself that Glazier needs Terraform-style …</title><link>https://wilhelm.codes/bits/blurb-ive-convinced-myself-glazier-needs-variable-blocks/</link><pubDate>Wed, 24 Jun 2026 10:19:56 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/blurb-ive-convinced-myself-glazier-needs-variable-blocks/</guid><category>glazier</category><category>hcl</category><wc:kind>bit</wc:kind><wc:bit>blurb</wc:bit><wc:untitled>true</wc:untitled><description>Welp. I&amp;rsquo;ve convinced myself that Glazier needs Terraform-style variable declaration blocks to validate --var flags. I&amp;rsquo;m doing it and I will not be stopped. I&amp;rsquo;m thinking something as simple as the following session block-adjecent top-level spec:
HCL variable &amp;#34;name&amp;#34; { description = optional(string) type = required(string | bool | number) default = optional(type) } Time to do what I do best: make things more complicated than they have any right to be.</description><content:encoded><![CDATA[<p>Welp. I&rsquo;ve convinced myself that Glazier needs Terraform-style variable declaration blocks to validate <code>--var</code> flags. I&rsquo;m doing it and I will not be stopped. I&rsquo;m thinking something as simple as the following <code>session</code> block-adjecent top-level spec:</p>
<div class="code-block">
  <div class="code-head">
    <span class="code-file"></span>
    <span class="code-lang">HCL</span>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-hcl" data-lang="hcl"><span class="line"><span class="cl"><span class="k">variable</span> <span class="s2">&#34;name&#34;</span> {
</span></span><span class="line"><span class="cl"><span class="n">  description</span> <span class="o">=</span> <span class="k">optional</span><span class="p">(</span><span class="k">string</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">  type</span>        <span class="o">=</span> <span class="k">required</span><span class="p">(</span><span class="k">string</span> <span class="err">|</span> <span class="k">bool</span> <span class="err">|</span> <span class="k">number</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">  default</span>     <span class="o">=</span> <span class="k">optional</span><span class="p">(</span><span class="k">type</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">}</span></span></code></pre></div>
</div>
<p>Time to do what I do best: make things more complicated than they have any right to be.</p>
]]></content:encoded></item><item><title>I should update Plant🌱Smart. Thinking it should get a similar …</title><link>https://wilhelm.codes/bits/blurb-i-should-update-plantsmart/</link><pubDate>Tue, 23 Jun 2026 07:32:42 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/blurb-i-should-update-plantsmart/</guid><category>plantsm.art</category><wc:kind>bit</wc:kind><wc:bit>blurb</wc:bit><wc:untitled>true</wc:untitled><description>I should update Plant🌱Smart. Thinking it should get a similar treatment to this site. Maybe even exploring moving completely to Hugo instead of a haphazardly-assembled static Svelte site.</description><content:encoded><![CDATA[<p>I should update <span class="wm-plant">Plant</span>🌱<span class="wm-smart">Smart</span>. Thinking it should get a similar treatment to this site. Maybe even exploring moving completely to Hugo instead of a haphazardly-assembled static Svelte site.</p>
]]></content:encoded></item><item><title>Some small incremental updates for the site today:
The addition of a …</title><link>https://wilhelm.codes/bits/update-new-rss-feeds/</link><pubDate>Sun, 21 Jun 2026 16:01:44 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/update-new-rss-feeds/</guid><category>wilhelm.codes</category><wc:kind>bit</wc:kind><wc:bit>update</wc:bit><wc:untitled>true</wc:untitled><description>Some small incremental updates for the site today:
The addition of a new bit type for site updates like this one. Proper RSS feeds for both long-form articles and bits. Check the footer! A quick sweep of the site map to ensure everything maps out properly. There were a few dead links previously. You can now filter bits by type! Have a play with it at the top of this page. Some minor grammatical updates here and there for some recent content. Something to note is that the bits filter is purely JS based and assumes all content will be displayed in a single page. This is fine for now, but there may be 100s or even 1,000s of entries on a long enough timeline. At that point, basic text search and filtering that supports pagination may be necessary. But, not today!</description><content:encoded><![CDATA[<p>Some small incremental updates for the site today:</p>
<ul>
<li>The addition of a new bit type for site updates like this one.</li>
<li>Proper RSS feeds for both <a href="https://wilhelm.codes/articles.xml">long-form articles</a> and <a href="https://wilhelm.codes/bits.xml">bits</a>. Check the footer!</li>
<li>A quick sweep of the <a href="https://wilhelm.codes/sitemap.xml">site map</a> to ensure everything maps out properly. There were a few dead links previously.</li>
<li>You can now filter bits by type! Have a play with it at the top of <a href="https://wilhelm.codes/bits">this</a> page.</li>
<li>Some minor grammatical updates here and there for some recent content.</li>
</ul>
<p>Something to note is that the bits filter is purely JS based and assumes all content will be displayed in a single page. This is fine for now, but there may be 100s or even 1,000s of entries on a long enough timeline. At that point, basic text search and filtering that supports pagination may be necessary. But, not today!</p>
]]></content:encoded></item><item><title>I hate to say it but the router situation is insane</title><link>https://wilhelm.codes/bits/video-insane-router-situation/</link><pubDate>Sun, 21 Jun 2026 15:07:30 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/video-insane-router-situation/</guid><wc:kind>bit</wc:kind><wc:bit>video</wc:bit><wc:source>low level · youtube · 10mins</wc:source><wc:target>https://www.youtube.com/watch?v=gEMx7kt7n4E</wc:target><description>Man, some of these router CVEs are laughably bad. Not saying rolling your own router with OpenWRT is a perfect solution&amp;hellip; but compared to this it functionally is.</description><content:encoded>&lt;p>Man, some of these router CVEs are laughably bad. Not saying rolling your own router with OpenWRT is a perfect solution&amp;hellip; but compared to this it functionally is.&lt;/p>
</content:encoded></item><item><title>“Cognitive surrender” leads AI users to abandon logical thinking, research finds</title><link>https://wilhelm.codes/bits/link-cognitive-surrender/</link><pubDate>Sun, 21 Jun 2026 13:09:31 +1000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/link-cognitive-surrender/</guid><wc:kind>bit</wc:kind><wc:bit>link</wc:bit><wc:source>Ars Technica</wc:source><wc:target>https://arstechnica.com/ai/2026/04/research-finds-ai-users-scarily-willing-to-surrender-their-cognition-to-llms/</wc:target><description>An interesting study on the concept of &amp;ldquo;cognitive surrender&amp;rdquo; or, how we simply offload thinking to an LLM and implicitly trust whatever it spits out the other end.</description><content:encoded><![CDATA[<p>An interesting study on the concept of &ldquo;cognitive surrender&rdquo; or, how we simply offload thinking to an LLM and implicitly trust whatever it spits out the other end.</p>
]]></content:encoded></item><item><title>Tempted to drop the custom fonts altogether. They account for …</title><link>https://wilhelm.codes/bits/blurb-so-tempting/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/blurb-so-tempting/</guid><wc:kind>bit</wc:kind><wc:bit>blurb</wc:bit><wc:untitled>true</wc:untitled><description>Tempted to drop the custom fonts altogether. They account for well-over half the transfer on a hard refresh.</description><content:encoded>&lt;p>Tempted to drop the custom fonts altogether. They account for well-over half the transfer on a hard refresh.&lt;/p>
</content:encoded></item><item><title>I am not a smart man. I completely forgot I was using the “Pro” …</title><link>https://wilhelm.codes/bits/blurb-i-am-not-a-smart-man/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/blurb-i-am-not-a-smart-man/</guid><category>woops</category><category>wilhelm.codes</category><wc:kind>bit</wc:kind><wc:bit>blurb</wc:bit><wc:untitled>true</wc:untitled><description>I am not a smart man. I completely forgot I was using the &amp;ldquo;Pro&amp;rdquo; version of FontAwesome and had the entire library committed to this very public repository without any licensing coverage. I mean, the pro version shouldn&amp;rsquo;t be shared anyway. You may have noticed the associated Github repository has been temporarily set to private and that all commit history as been wiped. Sucks, but I felt this was much more pragmatic than removing multiple specific files from the tree. I am not an expert git surgeon, so that got a hard pass from me.</description><content:encoded><![CDATA[<p>I am not a smart man. I completely forgot I was using the &ldquo;Pro&rdquo; version of FontAwesome and had the entire library committed to this very public repository without any licensing coverage. I mean, the pro version shouldn&rsquo;t be shared anyway. You may have noticed the associated Github repository has been temporarily set to private and that all commit history as been wiped. Sucks, but I felt this was much more pragmatic than removing multiple specific files from the tree. I am not an expert git surgeon, so that got a hard pass from me.</p>
<p>I&rsquo;m currently experimenting with some alternative OPEN SOURCE web icons and updating the third-party licensing notice bundled with the repo to cover icons as well as web fonts.</p>
<p>Luckily, only <em>I</em> noticed this issue and immediately worked to address it.</p>
<p><em>edit:</em> Good-bye, sweet git history!</p>
]]></content:encoded></item><item><title>“Simplicity is a great virtue but it requires hard work to achieve it …</title><link>https://wilhelm.codes/bits/quote-edsger-dijkstra/</link><pubDate>Wed, 17 Jun 2026 09:00:00 +0000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/quote-edsger-dijkstra/</guid><category>wisdom</category><wc:kind>bit</wc:kind><wc:bit>quote</wc:bit><wc:untitled>true</wc:untitled><wc:source>Edsger Dijkstra</wc:source><description>&amp;ldquo;Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better.&amp;rdquo;</description><content:encoded><![CDATA[<p>&ldquo;Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better.&rdquo;</p>
]]></content:encoded></item><item><title>“Talk is cheap. Show me the code.”</title><link>https://wilhelm.codes/bits/quote-linus-torvalds/</link><pubDate>Mon, 15 Jun 2026 09:00:00 +0000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/quote-linus-torvalds/</guid><category>wisdom</category><wc:kind>bit</wc:kind><wc:bit>quote</wc:bit><wc:untitled>true</wc:untitled><wc:source>Linus Torvalds</wc:source><description>&amp;ldquo;Talk is cheap. Show me the code.&amp;rdquo;</description><content:encoded><![CDATA[<p>&ldquo;Talk is cheap. Show me the code.&rdquo;</p>
]]></content:encoded></item><item><title>I’m keeping these stupid test quotes around. I love them. Fight me.</title><link>https://wilhelm.codes/bits/blurb-keeping-em/</link><pubDate>Sat, 13 Jun 2026 00:00:00 +0000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/blurb-keeping-em/</guid><wc:kind>bit</wc:kind><wc:bit>blurb</wc:bit><wc:untitled>true</wc:untitled><description>I&amp;rsquo;m keeping these stupid test quotes around. I love them. Fight me.</description><content:encoded>&lt;p>I&amp;rsquo;m keeping these stupid test quotes around. I love them. Fight me.&lt;/p>
</content:encoded></item><item><title>“There are only two hard things in Computer Science: cache …</title><link>https://wilhelm.codes/bits/quote-phil-karlton/</link><pubDate>Fri, 05 Jun 2026 05:00:00 +0000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/quote-phil-karlton/</guid><category>wisdom</category><wc:kind>bit</wc:kind><wc:bit>quote</wc:bit><wc:untitled>true</wc:untitled><wc:source>Phil Karlton</wc:source><description>&amp;ldquo;There are only two hard things in Computer Science: cache invalidation and naming things.&amp;rdquo;</description><content:encoded><![CDATA[<p>&ldquo;There are only two hard things in Computer Science: cache invalidation and naming things.&rdquo;</p>
]]></content:encoded></item><item><title>“Programs must be written for people to read, and only incidentally …</title><link>https://wilhelm.codes/bits/quote-harold-abelson/</link><pubDate>Sun, 24 May 2026 06:00:00 +0000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/quote-harold-abelson/</guid><category>wisdom</category><wc:kind>bit</wc:kind><wc:bit>quote</wc:bit><wc:untitled>true</wc:untitled><wc:source>Harold Abelson</wc:source><description>&amp;ldquo;Programs must be written for people to read, and only incidentally for machines to execute.&amp;rdquo;</description><content:encoded><![CDATA[<p>&ldquo;Programs must be written for people to read, and only incidentally for machines to execute.&rdquo;</p>
]]></content:encoded></item><item><title>“Premature optimization is the root of all evil.”</title><link>https://wilhelm.codes/bits/quote-donald-knuth/</link><pubDate>Tue, 12 May 2026 07:00:00 +0000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/quote-donald-knuth/</guid><category>wisdom</category><wc:kind>bit</wc:kind><wc:bit>quote</wc:bit><wc:untitled>true</wc:untitled><wc:source>Donald Knuth</wc:source><description>&amp;ldquo;Premature optimization is the root of all evil.&amp;rdquo;</description><content:encoded><![CDATA[<p>&ldquo;Premature optimization is the root of all evil.&rdquo;</p>
]]></content:encoded></item><item><title>“The best error message is the one that never shows up.”</title><link>https://wilhelm.codes/bits/quote-thomas-fuchs/</link><pubDate>Thu, 30 Apr 2026 08:00:00 +0000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/quote-thomas-fuchs/</guid><category>wisdom</category><category>ux</category><wc:kind>bit</wc:kind><wc:bit>quote</wc:bit><wc:untitled>true</wc:untitled><wc:source>Thomas Fuchs</wc:source><description>&amp;ldquo;The best error message is the one that never shows up.&amp;rdquo;</description><content:encoded><![CDATA[<p>&ldquo;The best error message is the one that never shows up.&rdquo;</p>
]]></content:encoded></item><item><title>“Perfection is achieved, not when there is nothing more to add, but …</title><link>https://wilhelm.codes/bits/quote-antoine-de-saint-exup%C3%A9ry/</link><pubDate>Mon, 06 Apr 2026 05:00:00 +0000</pubDate><author>0xdeadbeef@devilmayco.de (Wilhelm Murdoch)</author><guid>https://wilhelm.codes/bits/quote-antoine-de-saint-exup%C3%A9ry/</guid><category>wisdom</category><category>design</category><wc:kind>bit</wc:kind><wc:bit>quote</wc:bit><wc:untitled>true</wc:untitled><wc:source>Antoine de Saint-Exupéry</wc:source><description>&amp;ldquo;Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.&amp;rdquo;</description><content:encoded><![CDATA[<p>&ldquo;Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.&rdquo;</p>
]]></content:encoded></item></channel></rss>