<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" media="screen" href="https://brainbaking.com/pretty-feed-v3.xsl" ?>
<rss version='2.0' xmlns:content='http://purl.org/rss/1.0/modules/content/' xmlns:atom='http://www.w3.org/2005/Atom' xmlns:dc='http://purl.org/dc/elements/1.1/'>
  <channel>
    <title>Brain Baking</title>
    <link>https://brainbaking.com/</link>
    <description>Freshly Baked Thoughts by Wouter Groeneveld</description>
    <copyright>© 2026 Wouter Groeneveld (CC BY 4.0)</copyright>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <managingEditor>hifromrss@brainbaking.com (Wouter Groeneveld)</managingEditor>
    <lastBuildDate>Wed, 22 Apr 2026 10:05:47 +0200</lastBuildDate>
    <atom:link href="https://brainbaking.com/index.xml" rel="self" type="application/rss+xml" />
    <image>
      <url>https://brainbaking.com/img/logo.svg</url>
      <title>Brain Baking</title>
      <link>https://brainbaking.com/</link>
      <width>72</width>
      <height>72</height>
      <description>Freshly Baked Thoughts by Wouter Groeneveld</description>
    </image>    
    
    
    <item>
      <title>Hello Again, SuSE Linux</title>
      <link>https://brainbaking.com/post/2026/04/hello-again-suse-linux/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Wed, 22 Apr 2026 10:05:47 +0200</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/04/hello-again-suse-linux/</guid>
      
        
          <category domain="https://brainbaking.com/tags/linux">linux</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>It&rsquo;s good to see you again, old friend. It&rsquo;s been a while. Twenty-three years, you say? How come we managed to drift apart that far? I know, I know, I betrayed you. But my room was cold at night and Gentoo offered me the ability to keep on compiling. And then I betrayed GNU/Linux for FreeBSD. And then I switched the demon for the apple. I&rsquo;ve been on an apple diet for so long now, I can barely remember the tux.</p>
<p>What is it you say? Oh, it&rsquo;s openSUSE now. Sure, you&rsquo;re a chameleon, you can take on any colour you&rsquo;d like. Great to see it&rsquo;s still green. I like green. How&rsquo;s YaST doing these days? <code>zypper</code>? What&rsquo;s that, no more <code>rpm -i</code>? That&rsquo;s cool, it looks like you&rsquo;ve made some progress! Let&rsquo;s make a screenshot the proper nerdy way and do some <code>uname -a | cowsay</code> in a terminal! Oh, that&rsquo;s no longer cool? <code>fastfetch</code>? So first <code>zypper install fastfetch</code> and then that command? Let&rsquo;s try that:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/04/hello-again-suse-linux/suse-linux.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/04/hello-again-suse-linux/suse-linux.jpg" loading="lazy" title="openSUSE Tumbleweed running on the HP work laptop." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>openSUSE Tumbleweed running on the HP work laptop.</figcaption></figure>
</p>
<p>My last experience with the Linux desktop was indeed about twenty years ago. Since 2012, I&rsquo;ve been a macOS user. I&rsquo;m no longer proud of it: <a href="/post/2024/05/i-miss-bsd-linux/">I miss Linux</a> and I think <a href="/post/2022/10/my-desktop-is-dull-thanks-to-macos/">macOS is boring and full of bloat</a>. Yet the rise of the Apple silicon made me buy another one in 2020, which is still the one I&rsquo;m using right now. The hardware is amazing, the screen is amazing, and the weight and fanless features are amazing. But I still miss customisation features&mdash;the ability to truly make the desktop mine&mdash;and I stopped updating the OS as a protest to ever increasing bloatware. This laptop is still running Sonoma which is bad enough as it is.</p>
<p>I have no intentions to go out and buy another machine any time soon; this one&rsquo;s still doing fine; but I did start to wonder. What if&hellip; I got a ThinkPad and installed Linux back onto it? Would the hardware match the high standards I&rsquo;m accustomed to now? Would I still be able to make my way around the OS? I ran GNOME 2 and KDE 3 (and then got nerdy with Fvwm). I compiled my own <a href="/works/linux-2-6-sources/">Linux 2.6 kernel patches</a> back when that was brand new. I have no idea what&rsquo;s happening now. That&rsquo;s not to say that I don&rsquo;t touch Linux: I use it daily to host this website, to run the NAS at home, and in virtual containers. But that&rsquo;s not the <em>Linux Desktop Experience</em>.</p>
<p>My main motivation for moving away from Linux was my frustration with endless configuration and compilation. Back in the day, hibernate didn&rsquo;t just work out of the box, the fan speed had to be configured depending on the type of the laptop, nVidia drivers were a pain (still are), etc. Work and life started getting in the way: I no longer had endless seas of time on my hand to go nuts with Gentoo. With two young kids, that times has dwindled even more, so NixOS or even Arch is out of the question.</p>
<p>Being fed up with the crappy Windows 11 installation on my work laptop, I wiped that partition and remembered my old friend The European Chameleon. So here I am, testing the waters yet again. Thanks to Valve, <a href="https://lutris.net/">Lutris is amazing</a>. KDE Plasma feels mature (even though some configuration settings seem sluggish). I don&rsquo;t want to dive into the rabbit hole of AwesomeWM (but I do). I don&rsquo;t want to try and live without systemd or have to hurt my brain about X11 vs Wayland. I want the thing to &ldquo;just work&rdquo;. I want my chameleon to be an apple. A proper one, like a &ldquo;back in the day&rdquo; apple one.</p>
<p>I haven&rsquo;t had the time to give openSUSE a proper trail. I&rsquo;m mainly fighting my muscle memory with <code>CMD</code> versus that strange <code>CTRL</code> location which is somewhat diminished by <a href="https://github.com/RedBearAK/toshy">Toshy</a> that then doesn&rsquo;t work well in combination with my Emacs configuration. What I did notice is that hibernation/suspend is still ugly: if I close the lid for a night without putting the laptop in true hibernate mode (with its dedicated swap partition), the battery drain is ridiculous, especially coming from a MacBook Air that I just jam shut and open up again a hundred times a day.</p>
<p>This made me realise I will probably have to give up on the hardware quality part if my next laptop is going to be a non-Apple one. Which I don&rsquo;t really want to? <a href="https://site.sebasmonia.com/">Seb</a> and I discussed which laptop to get when ours would break down. The Framework is an obvious one as are the System76 ones that specifically support Linux. Alex White&rsquo;s <a href="https://thatalexguy.dev/my-everyday-carry">everyday carry post</a> made me realise the build quality of these is average at best. It&rsquo;s going to be a painful experience migrating from that. I know <a href="https://kevquirk.com/a-year-with-the-framework-13">Kev is happy with his Framework</a>, but I&rsquo;m not yet fully convinced. The fact that this HP EliteBook 6 G1a 16 work laptop&rsquo;s screen and overall build quality is terrible is not helping either. The touchpad palm detection experience is horrible on KDE.</p>
<p>Let&rsquo;s first give the chameleon another chance to see if on an OS level I could live without macOS and my usual mac-exclusive power tools. The ones I&rsquo;ll miss the most might be <a href="https://alfred.app/">Alfred</a> and <a href="https://www.devontechnologies.com/apps/devonthink">DEVONthink</a>. My recent migration to do-everything-in-Emacs does make the transition a lot easier. I also moved from iTerm2 to Ghostty last year and am now trying out Kitty with the Fish shell. My RSS feed now lives inside my FreshRSS server making me less dependent on NetNewsWire.</p>
<p>Software-wise, I&rsquo;m getting there. I&rsquo;m sure I&rsquo;ll get there.</p>
<p>But what about hardware-wise?</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/linux">linux</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 22 April 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Hello%20Again%2c%20SuSE%20Linux">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>The Strange Heterogeneity of Hiking Signs Part II</title>
      <link>https://brainbaking.com/post/2026/04/the-strange-heterogeneity-of-hiking-signs-part-ii/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Sun, 19 Apr 2026 20:59:47 +0200</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/04/the-strange-heterogeneity-of-hiking-signs-part-ii/</guid>
      
        
          <category domain="https://brainbaking.com/tags/hiking">hiking</category>
        
          <category domain="https://brainbaking.com/tags/signs">signs</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>In 2022, I wrote about our encounter with <a href="/post/2022/06/the-strange-heterogeneity-of-hiking-signs/">the strange heterogeneity of hiking signs</a> during <em>A Short Hike</em> (that&rsquo;s also a video game but not the thing we were doing). The photo shared then depicted a signpost with arrows on top of specific shapes (i.e. a blue diamond, a yellow cross, &hellip;) identifying different&mdash;and in most cases, much longer&mdash;routes. It turns out that these symbols never represent the same distance.</p>
<p>When I meet my friend from another province, we usually go hiking somewhere near his home. There, the weirdly shaped signs are nowhere to be seen. Instead, the remarkably clear numbered &ldquo;knooppunten&rdquo; (nodes) let you plan your own route. It&rsquo;s in fact exactly like the bigger blue node signs we&rsquo;re accustomed to when biking (<a href="https://www.fietsknooppunt.be/">https://www.fietsknooppunt.be/</a> becomes <a href="https://www.wandelknooppunt.be/">https://www.wandelknooppunt.be/</a>).</p>
<p>Last year, I noticed our province finally adapting the same system: <code>wandeleninlimburg.be</code> also <a href="https://www.wandeleninlimburg.be/nl/wandelen-op-knooppunten">features a virtual map</a> where you can select which numbered nodes to follow. Finally some consistency!</p>
<p>Except that of course the existing plaques didn&rsquo;t move. Instead, various governmental instances only <em>added</em> signs to the poles. The confusing heterogeneity was back with a vengeance. We found out that the best way to battle this is to simply ignore all the rest and follow the &ldquo;standardised&rdquo; numbered nodes from <code>wandelknooppunt.be</code>.</p>
<p>Last week we were on another short trip just to get out of the house. Unfortunately, the misery of having small kids seems to follow you around if you take them with you. It also makes packing for just a few nights a literal and figurative nightmare, but I digress. On <em>Another Short Hike</em> (the hopefully to be announced video game sequel), we encountered this very insightful pole depicting the same junction-style number system:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/04/the-strange-heterogeneity-of-hiking-signs-part-ii/knooppunt-mol.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/04/the-strange-heterogeneity-of-hiking-signs-part-ii/knooppunt-mol.jpg" loading="lazy" title="Hiking Node 58 in the province of Antwerpen. And god knows what else." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>Hiking Node 58 in the province of Antwerpen. And god knows what else.</figcaption></figure>
</p>
<p>I mean, really? Let&rsquo;s tackle them from top to bottom:</p>
<p>Biggest plaque on top; <code>wandelknooppunt.be</code> node 58 with directions to node 69, 89, 57, and 51. Remember, these numbers are local as well, so the 69 here won&rsquo;t be the 69 say 20 kilometres away. We also encountered a big map highlighting these numbers so it&rsquo;s fairly easy to follow these. If you&rsquo;ve got a smartphone, you can always look up which direction to go.</p>
<p>Second from the top; yellow/green with a black arrow to the left: a very local <a href="https://www.trekkings.be/molom.html">Mol Om</a> sign indicating the long distance path created by the local walking club to celebrate the municipality of Mol. The site discusses its funny history of pragmatism that might cause trouble:</p>
<blockquote>
<p>Trail markers at that time did not always make it a habit to request permission from the landowner or manager before marking the trails. That practice, combined with mistrust, led to conflicts more often than it does today. Sabotage by scratching out or removing markers was commonplace at Mol-Om, to such an extent that for the first official trail walk [1974] the Mol Sports Council would only apply the markers the day before each event, for fear that they would otherwise disappear too quickly again.</p>
</blockquote>
<p>The sign was (and still is) very obtuse: we only found out about it now by looking up what &ldquo;Mol Om&rdquo; means. No indication of it on local maps either. I presume their clandestine markings turned tolerable predate the numbered nodes.</p>
<p>Third from the top; a Santiago de Compostella pilgrim route. The iconic yellow scallop with blue background, <em>Camino De Santiago</em>. The <a href="https://compostelagenootschap.be/op-weg/pelgrimswegen/stappen/vertrekken-belgie-luxemburg/">Flemish Compostella Society</a> lists all pilgrim routes going trough Belgium; the one we found is part of the <em>Via Monastica</em> (<code>282.22 km</code>). I&rsquo;m fascinated by these routes. If the kids are old enough&hellip; Who knows.</p>
<p>Fourth from the top; an orange arrow to the right: who knows? This is not part of the usual symbols indicating hiking paths like the orange circle and blue diamonds on the right side of the same pole. The other, fatter arrow, of course with the same orange colour, going the other direction, is possibly another route? The way to the restrooms?</p>
<p>The last one that looks like a triangle with legs: an initiative of <a href="https://www.sport.vlaanderen/sporten-in-mijn-omgeving/vind-een-route/vind-een-looproute/?zoomLevel=8.4&amp;amp;lat=50.99035270516344&amp;amp;lng=4.499683189703228">Sport Vlaanderen</a>, a governmental instance promoting walking as a sport. Why they couldn&rsquo;t reconcile with the numbered node network of <code>wandelknooppunt.be</code> beats me. Maybe they were first?</p>
<p>No geocaches to be found along the way but plenty of hidden boxes that used to be there. I&rsquo;ll save some meat for another post. <em>Meatwhile</em>, <a href="https://ashorthike.com/">let&rsquo;s get hiking</a>.</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/hiking">hiking</a> /
                  <a href="https://brainbaking.com/tags/signs">signs</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 19 April 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: The%20Strange%20Heterogeneity%20of%20Hiking%20Signs%20Part%20II">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>My Workspaces</title>
      <link>https://brainbaking.com/post/2026/04/my-workspaces/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Tue, 14 Apr 2026 12:47:15 +0200</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/04/my-workspaces/</guid>
      
        
          <category domain="https://brainbaking.com/tags/setup">setup</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>This post is inspired by Franck Sauer&rsquo;s <a href="https://www.francksauer.com/index.php/about/my-workspace">My Workspaces</a>. I love Franck&rsquo;s setup and background story behind each photo. I&rsquo;ve been meaning to write this for months but postponed the search for old desktop setup photos because I wasn&rsquo;t sure where to start. Back in the nineties, we didn&rsquo;t brainlessly press that button: every shot was one less on the film roll and added to the cost. Hence my oldest setup&mdash;the 486 in my dad&rsquo;s makeshift office that also served as the washing machine room&mdash;is lost forever.</p>
<h2 id="2002">2002+</h2>
<p>My parents got me a sturdy but boring looking IKEA desk I&rsquo;ve been using extensively up until 2015. My room looked more or less the same once that piece of furniture got in up until I moved out. Here&rsquo;s a picture of my then brand new flatron CRT that&rsquo;s showcasing <em>Smash Bros. Melee</em> (I played on the GameCube through a PCI TV card):</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/04/my-workspaces/2003.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/04/my-workspaces/2003.jpg" loading="lazy" title="My &#39;workspace&#39; in 2006. Note the white DS Lite in the background, putting this photo somewhere after June 2006." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>My &#39;workspace&#39; in 2006. Note the white DS Lite in the background, putting this photo somewhere after June 2006.</figcaption></figure>
</p>
<p>There are more photos of my <a href="https://jefklakscodex.com/articles/gaming-setup-2007-flashback/">gaming setup from 2002-2007</a> in case you&rsquo;re interested. I once built a virtual tour of my room in the form of an HTML imagemap website but that too is lost in time meaning there&rsquo;s nothing much to see on the photo now, except for a sliver of a blue DELL laptop I used for more serious university work.</p>
<p>I wish I kept that keyboard around though, it was surprisingly comfortable. Not as cool as Microsoft&rsquo;s <em>Natural Keyboard Elite</em>, but still! At some point in time, I was also dumb enough to sell the Wavebird and all GameCube games. What was I thinking&hellip;</p>
<h2 id="2008">2008</h2>
<p>I moved out in 2008 and rented a cheap flat for three years to save up on money before my wife &amp; I bought our first home. Again, my meticulous archival work proves to be not that meticulous after all: I can&rsquo;t find a single photo of that apartment, except for the empty rooms just before I got in. The IKEA desk moved to the living room as I didn&rsquo;t own a TV.</p>
<p>On the other hand, it probably wasn&rsquo;t worth saving, as <strong>workspace</strong> denotes some work had to be done there. I was a software development consultant back then and worked at the client&rsquo;s offices. Those were long hours and long commutes meaning nothing much was done at home.</p>
<p>Here&rsquo;s an unremarkable at best picture of what that typical office space looked like in those years:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/04/my-workspaces/2008-work.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/04/my-workspaces/2008-work.jpg" loading="lazy" title="My office workspace in 2008 with a corporate HP laptop plugged into a then already older CRT from a client." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>My office workspace in 2008 with a corporate HP laptop plugged into a then already older CRT from a client.</figcaption></figure>
</p>
<p>Yes, that on the lower right is my wallet. I believe it still is now.</p>
<h2 id="2013">2013</h2>
<p>When we bought a house and started living together, we had a spare room to throw in everything we couldn&rsquo;t find a good spot for. This included my cheap bookcase and the very same IKEA desk:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/04/my-workspaces/2013.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/04/my-workspaces/2013.jpg" loading="lazy" title="My workspace in 2013. I can&#39;t recall any work has been done there at all." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>My workspace in 2013. I can&#39;t recall any work has been done there at all.</figcaption></figure>
</p>
<p>The <em>Monkey Island</em> poster I already had hanging on the wall a year before I left my parents&rsquo; place; it&rsquo;s still with me now as you&rsquo;ll see in the later pics. I can&rsquo;t believe any work has been done at all in that &ldquo;office&rdquo;: I was still a consultant and working from home was a big no-no.</p>
<p>That meant the space was largely unused, which is a shame, because now that I look back at it, it looks cosy, especially with that chicken hug stuffed in the lower left of the bookcase!</p>
<h2 id="2014">2014</h2>
<p>I started to resent the commutes. I quit my job and we sold and bought another house where we still live in as I type this. One of the three bedrooms became my &ldquo;office&rdquo;&mdash;I&rsquo;ll still use quotes here as again nothing much was done there. I didn&rsquo;t like locking myself in that room upstairs as my wife was downstairs watching TV. The Nintendo Switch was my big savour<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>: a hybrid handheld system that I could play on the couch!</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/04/my-workspaces/2014-merged.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/04/my-workspaces/2014-merged.jpg" loading="lazy" title="My workspace in 2014. Left: that same IKEA desk survived yet another move. This photo was taken right after we moved in, hence the lack of decorations. Right: in the living room/kitchen, were most of my writing was done." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>My workspace in 2014. Left: that same IKEA desk survived yet another move. This photo was taken right after we moved in, hence the lack of decorations. Right: in the living room/kitchen, were most of my writing was done.</figcaption></figure>
</p>
<p>Again, this post is far from impressive compared to Franck&rsquo;s cool setups. Most of my writing and thinking happened on the kitchen table. In 2012-2013 I bought a MacBook Air and since then loved inventing a makeshift workspace wherever. Working from home still was the big exception.</p>
<h2 id="2021">2021</h2>
<p>After four years I quit my job again to rejoin academia and pursue a PhD. That meant the way I worked radically shifted: more individually, and more from home. On top of that, in 2020, a thing called COVID happened, where we suddenly were forced to work from home. Just like many others, I <em>finally</em> started taking the home workspace environment seriously.</p>
<p>I already published the result in the <a href="/post/2021/02/my-retro-desktop-setup/">2021 retro desktop setup</a> post:</p>
<p>
<figure><a href="https://brainbaking.com/post/2021/02/my-retro-desktop-setup/desk_overview.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2021/02/my-retro-desktop-setup/desk_overview.jpg" loading="lazy" title="My 2020 workspace featuring a 486 machine, a beige Win98 tower, a WinXP one, and on the far right, the &#39;work horse&#39; MacBook and second screen." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>My 2020 workspace featuring a 486 machine, a beige Win98 tower, a WinXP one, and on the far right, the &#39;work horse&#39; MacBook and second screen.</figcaption></figure>
</p>
<p>If you look closely enough, you&rsquo;ll notice the same skylight as the leftmost photo in 2014. I jammed as much retro hardware as I could find in that tiny room, binning the IKEA desk (R.I.P.) and buying more IKEA stuff (Linnmon). In 2020, after eight years of faithful service, the old MacBook Air got replaced by the one I&rsquo;m typing this on (on the far right).</p>
<p>Thankfully, the <em>Monkey Island</em> posters survived. There are more photos of this setup in the linked post.</p>
<h2 id="2024">2024</h2>
<p>For the first time in my life, I felt truly happy in my home workspace. It became my sanctuary: me, surrounded by old junk.</p>
<p>And then our daughter <a href="/post/2024/03/my-retro-desktop-setup/">started poisoning the place</a> with baby toys:</p>
<p>
<figure><a href="https://brainbaking.com/post/2024/03/my-retro-desktop-setup/desk_reverse.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2024/03/my-retro-desktop-setup/desk_reverse.jpg" loading="lazy" title="The other side of the retro room: Billy bookshelves and baby toys." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>The other side of the retro room: Billy bookshelves and baby toys.</figcaption></figure>
</p>
<p>At least I managed to fend off most of the toys and eventually, when she got older, we managed to contain her junk within her room or below stairs.</p>
<h2 id="2025">2025</h2>
<p>Until the second kid came along and kicked me out. Our house looks big but really isn&rsquo;t, so we renovated to create more space. Still, my workspace became his bedroom, so I had to move <a href="/post/2025/10/my-desk-setup-in-2025/">to the old living room</a>:</p>
<p>
<figure><a href="https://brainbaking.com/post/2025/10/my-desk-setup-in-2025/setup-2025.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2025/10/my-desk-setup-in-2025/setup-2025.jpg" loading="lazy" title="My workspace in 2025, with a bigger window overlooking the front garden and street." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>My workspace in 2025, with a bigger window overlooking the front garden and street.</figcaption></figure>
</p>
<p>Later that year I properly fixed the cable work, relayed another Ethernet cable, and started thinking about how I could restore my retro hardware. Unfortunately, only the 486 is on display right now, and that one hasn&rsquo;t been touched in almost a year due to busy parenthood.</p>
<p>At least now there was room for another IKEA case that can hold more board games than the previous one could in the hallway (that of course got claimed by the kids). I prepare my lessons here and like the bigger window but do miss the previous workspace. Hardware-wise, nothing much changed, except for a <a href="/post/2026/01/apple-ruined-my-mechanical-keyboard-experience-a-nuphy-halo-75-review/">mechanical keyboard</a>.</p>
<p>Perhaps I should throw in a retro TV to hook up the SNES. I don&rsquo;t know. Since becoming a parent, this stuff matters less but I miss it more, it&rsquo;s hard to explain. As for gaming, most of it is done on the couch with the Analogue Pocket, Switch, or just with the MacBook on my lap.</p>
<p>So far for having a dedicated workspace&hellip;</p>
<p>As a bonus photo, here&rsquo;s the current state of the above workspace at the time of writing:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/04/my-workspaces/current.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/04/my-workspaces/current.jpg" loading="lazy" title="The current state of the 2025 workspace. Whoops..." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>The current state of the 2025 workspace. Whoops...</figcaption></figure>
</p>
<p>Yeah, I know&hellip;</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>That&rsquo;s a mild exaggeration as I was already a big GB(A) and DS fanboy. It did  rejuvenate my interest in handheld gaming.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/setup">setup</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 14 April 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: My%20Workspaces">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>A Commentary On GenAI Inspected Through Different Lenses</title>
      <link>https://brainbaking.com/post/2026/04/a-commentary-on-genai-inspected-through-different-lenses/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Wed, 08 Apr 2026 09:28:03 +0200</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/04/a-commentary-on-genai-inspected-through-different-lenses/</guid>
      
        
          <category domain="https://brainbaking.com/tags/genai">genai</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>The amount of concerning reports related to generative AI is rising at an alrming rate, yet all we do is make ourselves <em>more</em> dependent on the brand new technology. Why? It&rsquo;s not just that we&rsquo;re lazy&mdash;we are!&mdash;there are many more variables involved. As part of my quest to try and understand what the heck is going on and what is becoming of one of my prime professional fields: software engineering, I read and read and read. And then I read and read and read. And then I became disappointed and depressed.</p>
<p>I see colleagues jumping the gun, others being more prudent. I see industry discovering there&rsquo;s yet another buck to be made. I see students forgoing learning at all. I wanted to try to form my own judgement of genAI in its modern form by looking at it from four different viewpoints: that of the software engineer, that of the teacher, that of the creativity researcher, and that of the concerned civilian living in this capitalist world.. References can be found at the end of this article.</p>
<h2 id="1-as-the-software-engineer">1. As the software engineer</h2>
<p>Does anyone remember Dan North&rsquo;s <a href="https://dannorth.net/blog/programming-is-not-a-craft/">Programming is not a craft</a> post from 2011? I do, and I often think about it. With the advent of genAI, North&rsquo;s port might be even more polarising:</p>
<h3 id="a-programming-is-not-a-craft">A. Programming is not a craft</h3>
<p>Well, congrats to you, you&rsquo;ve won the lottery: here&rsquo;s a tool that immediately can add customer value. If you don&rsquo;t care about the inner code quality, you can have genAI generate (slop) code faster than you can think. If you love the impact of software itself, you&rsquo;ll love Claude Code et al. Are you perhaps an enterprise software engineer? In that case you&rsquo;ll be able to scaffold and generate CRUD crap even faster, hooray!</p>
<p>But wait a minute. You obviously won&rsquo;t take true ownership of this code: you&rsquo;ll want to impress your clients with the results, but keep the lid closed at all times. The less ownership and feeling of responsibility, the easier it comes to completely let go of all the breaks and just accept any future changes without code reviewing at all.</p>
<p>People who are now claiming they will keep themselves in the loop as an architectural reviewer don&rsquo;t need to lie to themselves. After the nth time pressing the green button, and as the technology further evolves, you&rsquo;ll wind up eventually accepting the slop anyway. Verification burnout will pop up next: because it&rsquo;s not your own code you&rsquo;re attempting to so carefully review, it actually takes <em>more</em> instead of less effort, increasing your stress level instead of reducing it!</p>
<p>Does the code quality really matter if all clients see is the end product? As a gamer, I just want the game to run smoothly, I don&rsquo;t care about the spaghetti. Or do I? I do, implicitly&mdash;the more spaghetti, the less smoothly it&rsquo;ll run. The more holes, the more soft locks and crashes. So programming might or might not be a craft, but as Cal Newport and <a href="https://en.wikipedia.org/wiki/Zen_and_the_Art_of_Motorcycle_Maintenance">Robert M. Pirsig</a> say: the concept of Quality is important!</p>
<h3 id="b-programming-is-a-craft">B. Programming is a craft</h3>
<p>Maybe it&rsquo;s time to become a goose farmer instead. The only thing left for you to do is to move to a depressing quality control position instead of crafting something yourself. No more &ldquo;I built this&rdquo;, but &ldquo;I managed its orchestration&rdquo;. Depending on how you view this, It&rsquo;s either a promotion or demotion. I tend to agree with the latter.</p>
<p>Why? Because we humans are the <em>Homo Faber</em>, the ones who like to control their fate and environment with the use of tools. Yes, genAI certainly is a tool, but it&rsquo;s a tool that takes away all other tools. Instead of kneading dough by hand, feeling it, knowing when to ferment and when to bake, we&rsquo;re forced to oversee the industrial Wonder Bread production process. Instead of manipulating leather to create a pair of shoes, we&rsquo;re being employed by Nike to watch shoes being made by machines.</p>
<p>This somehow reminds me of David Graeber&rsquo;s <a href="/post/2020/12/thoughts-on-bullshit-jobs/">bullshit jobs</a> where useless paper pushing is prevalent but also called a &ldquo;revolution&rdquo; when it comes to a professional purpose. I beg to differ. Humans want to make things. They want to be proud of the things they made. The fact that the open source community rejects this slop code is a telling sign: if you&rsquo;re programming in the open, your peers who also think highly of software development will keep you in check. But when it&rsquo;s &ldquo;for (enterprise) work&rdquo;, we don&rsquo;t care, generate away, I&rsquo;m not the true owner anyway.</p>
<p>If programming is a craft, then the recently leaked Claude Code CLI source code will be a big joke to you, where constructs are endlessly repeated, and spaghetti is topped up with more spaghetti. Code that is being generated doesn&rsquo;t even seem to be made to be (re)read: how then, are we expecting to maintain it, or guarantee its security? By letting the agent maintain it and guarantee its security, I can hear you say?</p>
<h2 id="2-as-the-teacher">2. As the teacher</h2>
<p>What is there left to say? I&rsquo;ve already asserted that genAI tools <a href="/post/2023/10/chatgpt-is-worse-for-students-than-stack-overflow/">are worse than Stack Overflow</a>. Sure, mindless copy-pasting has long existed before this AI storm, but not on this scale. GenAI is able to provide a working solution to an assignment faster than I can come op with the assignment itself. Suddenly, all our traditional evaluation systems and grading workflows became useless: scoring high on a checklist is just a matter of pasting the requirements into Claude.</p>
<p>We try to adapt by requiring oral defences, having students explain what they did and why, and asking them to walk us through a small imaginative change. The result is a spectacular fall in grades from previous years: they are just not able (1) to explain the code they did not make but generated and (2) to make small adjustments as they skipped the hard part: the learning and understanding. Yet in the hallways, I hear lots of students bragging to each other about how they let ChatGPT do their homework. Congrats. We&rsquo;ll see each other again in September for your second try.</p>
<p>We often forget something else very important: <em>peer pressure</em>. About a year ago, on the train I overheard a few girls on their way to a university lecture chatting about their homework. One of them complained: &ldquo;I put in all that hard work, but all the others are just using ChatGPT to do it. Next time, I&rsquo;m not doing all that, I&rsquo;m also just using AI, that&rsquo;s not fair!&rdquo;. I should have gotten up to congratulate her: the only one actively learning is the one putting in the hard work!</p>
<p>There is no shortcut to becoming proficient. There is only hard work. Sure, the more you prompt your way through your curriculum, the more proficient you&rsquo;ll become with the tool, but ask yourself: did you learn what you wanted to learn or did you learn to prompt?</p>
<p>When I was an undergraduate, I used to fill A4 pages with summaries of courses to help me study. Just before the exams, I could quickly glance over these pages to remembers the core concepts. Some students sold their summaries to others. Now, genAI can generate summaries for you. But smart students will know this will only fool yourself: the purpose of the summaries is to <em>make them</em>: to study and gradually fill the pages. Not to acquire a summary. The journey is the destination. When my summaries were done, I could just as well throw them away: they were just a tool to help with the hard work.</p>
<p>Yet it&rsquo;s next to impossible to explain this to a student who only sees how easy it is to jump to an outcome by leveraging AI. Maybe legislation will help here? (Not really; see below) In case all this is not clear: students are becoming dumber yet the programming projects they hand in are becoming better than ever.</p>
<h2 id="3-as-the-creativity-researcher">3. As the creativity researcher</h2>
<p>As the inventor of the framework presented in <a href="/works/the-creative-programmer/">The Creative Programmer</a>, I thought it would be interesting to take a look at the seven domains and how genAI fits in these. In <em>The Creative Programmer</em>, I present seven distinct but heavily intertwined themes that define the way we are creative when we solve a programming problem:</p>
<ol>
<li>Technical Knowledge&mdash;if we don&rsquo;t have any knowledge, we won&rsquo;t have the creative ability to combine them. Guess what; GenAI is actively <em>deskilling</em> us. The more you generate, the less you actively learn, harming your creative ability to solve problems. Creativity requires a rich mental toolbox to draw from. By prompting, you&rsquo;re not exactly filling that toolbox.</li>
<li>Communication&ndash;I see both a good and a bad thing here: if your colleagues aren&rsquo;t immediately available, rubber ducking with an AI agent might help identifying that problem. On the other hand, it&rsquo;s also awfully easy to stay locked inside that comfortable genAI chatbox. Why ask anyone when it talks to your mouth?</li>
<li>Constraints&mdash;If you manage to constraint yourself (ha!) to only ask AI for 10 possible ways to approach a problem you don&rsquo;t know how to approach <em>without having it solve the problem for you</em>, this might help you learn how to approach certain heavily constrained environments. Unfortunately, it&rsquo;s very easy to just have it generate the solution as well, rendering a possible learning path useless.</li>
<li>Critical Thinking&mdash;The more we use genAI, the less critical we are and the more likely we are accepting whatever comes out of it. Validating the the source material <em>outside</em> of that chatbox suddenly requires a lot of willpower. I&rsquo;ve even heard people changing their entire preferred technology stack to something more popular because genAI is better at it. That&rsquo;s <em>very</em> sad.</li>
<li>Curiosity&mdash;Judge for yourself. What does reliance on genAI tell you about your curiosity to discover other things?</li>
<li>Creative state of Mind&mdash;without Cal Newport&rsquo;s &ldquo;Deep Work&rdquo;, there won&rsquo;t be an &ldquo;aha!&rdquo; moment. The 90% transpiration, 10% inspiration is suddenly turned on its head: Claude is the one sweating for us, even at night, while all we do is press the green button and write &ldquo;LGTM!&rdquo;. Maybe we should take the time to read Newport&rsquo;s new book <em>Slow Productivity</em>.</li>
<li>Creative Techniques&mdash;GenAI itself as a technique might belong in this section; but the question is; are we the one yielding the tool or is the tool yielding us?</li>
</ol>
<p>I might be overly focusing on the negative here and have to recognise the possible advantages of having genAI as a tool available in our creative toolbox&mdash;but <em>only</em> when we learn to yield it properly and with moderation, which is not exactly what we are doing lately, is it.</p>
<p>In <a href="https://arxiv.org/pdf/2505.17241?">an  interesting systematic literature review</a> (2025) with lots of references to other academic material if that&rsquo;s what you&rsquo;re looking for, Holzner et al. conclude with:</p>
<blockquote>
<p>[&hellip;] human-GenAI collaboration shows small but consistent gains in creative output across tasks and contexts. However, collaboration with GenAI reduces the diversity of ideas, indicating a risk of creative outputs that could become more homogeneous.</p>
</blockquote>
<p>More same-ness; exactly what we need when it comes to creativity, right? The more we use genAI, the more creatively we will be able to prompt, but the less creative we will be in actually applying a solution to the problem. We no longer create: we generate.</p>
<p>We know that genAI will do everything in its power to keep you locked within that chat box. Its tendency to talk to your mouth, agree with your statements, and serve you whatever you want to hear creates biases and dependencies. It&rsquo;s not unlike a drug that slowly but surely diminished your critical thinking, and thus, creativity. Don&rsquo;t take my word for it; <a href="https://www.sciencedirect.com/science/article/pii/S0747563224002206">read it for yourself</a>:</p>
<blockquote>
<p>experiments with almost 1,300 subjects and found that in 80% of the cases when participants chose to consult ChatGPT, they went with wrong answers without stopping to scrutinize them. [&hellip;] Decision-makers overrely on AI advice in that they follow it even when said advice contradicts available context information.</p>
</blockquote>
<h2 id="4-as-the-concerned-civilian">4. As the concerned civilian</h2>
<p>This is where the true nature of humans are unfolded: when it comes to earning something for themselves, ethics suddenly becomes a very malleable subject. On the morality, ethics, and privacy, everyone agrees that genAI is what Ron Gilbert calls <em>a train wreck</em>. This bears no further explanation from me: Microsoft slurped all GitHub repositories dry without taking any licenses into account, the book that I painstakingly produced in almost two years was ingested OpenAI&rsquo;s systems in about two seconds, &hellip; Yet at the same time, everyone also consistently ignores all these topics in favour  of their own self-interest.</p>
<p>Why, I wonder? Everyone knows they should eat less meat. Yet almost nobody does. Everyone knows Microsoft (and probably other big tech companies) <a href="https://bdsmovement.net/microsoft">power genocide</a> yet the adoption rate of Windows as an OS is still 95%. Why? Everyone knows the climate is going to shits yet we happily turn the other way and take the plane on a weekend trip to sip some wine and do some shopping in Italy. As Gretea Thunberg said: <em>knowing is not enough</em>.</p>
<p>For GenAI, similar patterns emerge. We know it&rsquo;s bad for us, yet we happily close our eyes and use it anyway. Why, I wonder? The power of a drug, the pull, the ease at which something can be done without breaking too much sweat? Here&rsquo;s a possible answer I suggested before: because humans are inherently lazy. As long as Belgian supermarkets keep on stocking apples from New Zealand and Belgium, most people won&rsquo;t care and just pick up whatever. As long as we keep handing out company cars and making infrastructure geared towards car drivers, most people will be driving to work instead of biking.</p>
<p>A possible answer to the problem then might be governmental legislation to protect people living in a society from making the wrong choices. And I&rsquo;m 100% sure that <em>will work!</em> Yet legislation is always (1) either happening way too late; or (2) minimised or manipulated by the people who wield the power because they have bought out key politicians to prevent laws like this from happening. Hence my depression. In the case of GenAI, a technology that evolves at lightning speed and is taking the world by storm, legislation will be way too late. To prove my point, in an attempt to modernise, many Belgian governmental instances already &ldquo;embraced&rdquo; the technology and made many blunders in doing so. The EU is currently evaluating the options. Meanwhile, the San Francisco bros are laughing.</p>
<hr>
<h2 id="conclusion">Conclusion</h2>
<p><em>Prompt engineering</em> is the most degenerative thing that ever happened to <em>engineering</em>. It&rsquo;s a capitalist&rsquo;s way to minimise the cost of the human. Yet I don&rsquo;t see genAI disappearing any time soon. Companies and decision makers smelled the green and won&rsquo;t let go.</p>
<p>I don&rsquo;t understand how capitalism works, but I know it&rsquo;s been growing in power ever since we centralised cane sugar plantations with the help of slavery. GenAI is evidently yet another product of capitalism. The companies I&rsquo;ve worked for wanted more and more profit each year: even though they were sometimes satisfied with last year&rsquo;s profit, the target for the next year was always increased no matter what. GenAI is already responsible for thousands of layoffs in an attempt to even more aggressively push profit up.</p>
<p>To what end, I wonder? Why? To our own detriment. It seems that our cognition is for sale, and the sale has already been made. You know what they say: no returns are accepted. Peer pressure to use genAI on the job is already prevalent as it &ldquo;gets things done faster&rdquo;, so quite logically also brings in money faster. Let&rsquo;s worry about durability and maintenance later, shall we. Also, I&rsquo;ve seen colleagues fall into the trap of obsessive agent babysitting. Whether at work, on the lunch break, or in the very late evenings: you&rsquo;ve got to keep those agents spinning! Squeeze the maximum out of your tokens because they squeeze the maximum out of you. There goes our work-life balance, coming from the tools that are supposed to take over our work so we can focus more on the life part.</p>
<p>So as long as I remain in a position to be able to choose whether I can put in the work myself for my (hobby) programming projects, I will. As long as I am in a position to bike instead of drive, to be a vegetarian instead of meat-eater, or in short, to be a concerned civilian, I will. And so should you. Even though that won&rsquo;t stop this devolution from happening at all. Sure I will occasionally consult Gemini et al. to ask it a specific question regarding a broken config file that has me scratching my head. But I treat these queries as specialised internet searchers, not as a way to evade the hard work completely.</p>
<p>I&rsquo;ve become Albert Camus&rsquo;s pessimist. I&rsquo;m genuinely afraid of how our kids will turn out if we don&rsquo;t act quickly to save our youth. Yet I won&rsquo;t stop being an activist.</p>
<p><strong>Reading List</strong></p>
<p>I&rsquo;d rather link to personal blog posts instead of academic publications here as we&rsquo;re dealing with something that impacts us on a personal level and by the time the relevant 2026 studies are published, the landscape will have changed yet again. The following folks expressed their experience and opinion on genAI:</p>
<ul>
<li>Nolan Lawsom; <a href="https://nolanlawson.com/2025/12/22/how-i-use-ai-agents-to-write-code/">How I use AI agents to write code</a>. A clear conflicted state: it&rsquo;s okay to generate away at work, but &ldquo;I also don’t use AI for my open-source work, because it just feels… ick. The code is &lsquo;mine&rsquo; in some sense, but ultimately, I don’t feel true ownership over it, because I didn’t write it&rdquo;.</li>
<li>John Allsopp: <a href="https://webdirections.org/blog/the-structure-of-engineering-revolutions/">The Structure of Engineering Revolutions</a></li>
<li>Dave Gauer; <a href="https://ratfactor.com/tech-nope2">A programmer&rsquo;s loss of social identity</a></li>
<li>Cory Zue; <a href="https://www.coryzue.com/writing/software-got-weird/">Software got weird</a></li>
<li>Doug Belshaw; <a href="https://blog.dougbelshaw.com/claude-constitution/">Claude&rsquo;s Constitution and the trap of corporate AI ethics</a></li>
<li>Tom Hall; <a href="https://www.ludions.com/texts/2007a/">Towards a Slow Code Manifesto</a></li>
<li>Rishi Baldawa; <a href="https://rishi.baldawa.com/posts/review-isnt-the-bottleneck/">The Reviewer Isn&rsquo;t the Bottleneck</a></li>
<li>Information/superhighway.net; <a href="https://blog.information-superhighway.net/on-the-need-for-understanding">On The Need For Understanding</a></li>
<li>Antoine Leblanc; <a href="https://dosgame.club/deck/@nicuveo@tech.lgbt/116210257371803993">Chatbot psychosis (Mastodon)</a> &ldquo;this is the main reason why i believe that chatbot addiction / chatbot psychosis is a LOT more widespread than we realise: people with a clear understanding of the ethical issues try claude once, it does a thing correctly enough, they get one-shot, and they start posting like if sephiroth was on linked-in, ethical concerns be damned. it keeps happening.&rdquo; Exactly.</li>
<li>Sean Boots; <a href="https://sboots.ca/2026/03/11/generative-ai-vegetarianism/">Generative AI vegetarianism</a></li>
<li>Simon Willison; <a href="https://simonwillison.net/2026/Mar/9/not-so-boring/">Perhaps not Boring Technology after all</a></li>
<li>Sophie from Localghost; <a href="https://localghost.dev/blog/stop-generating-start-thinking/">Stop Generating Start Thinking</a></li>
<li>Micaheal Harley; <a href="https://michaelharley.net/ai/">AI Stance</a></li>
<li>Lauren Woolsey; <a href="https://padlet.com/laurenUU/ai-sucks-and-you-should-not-use-it-c92rnafcqlbev8zn">AI Sucks And You Shouldn&rsquo;t Use It</a></li>
<li>Ron Gilbert; <a href="https://grumpygamer.com/my_dinner_with_ai/">My Dinner With AI</a></li>
<li>Matthew Lamont; <a href="https://techtea.io/articles/2026/ai-greed/">Generative AI is an Evil Technology</a></li>
<li>Arne Brasseur; <a href="https://toot.cat/@plexus/116283016837715719">The AI Divide (Mastodon)</a></li>
<li>Zach Manson; <a href="https://notes.zachmanson.com/copilot-edited-an-ad-into-my-pr/">CoPilot Edited an Ad Into My PR</a></li>
<li>Michael Taggart; <a href="https://taggart-tech.com/reckoning/">I Used AI. It Worked. I Hated It.</a></li>
<li>Bob Nystrom; <a href="https://journal.stuffwithstuff.com/2026/01/24/the-value-of-things/">The Value of Things</a>. GenAI can have utility but not meaning.</li>
<li>Jonny; <a href="https://neuromatch.social/@jonny/116324676116121930">Dismantling Claude Code source (Mastodon)</a>. Another train wreck, as expected.</li>
<li>Cal Newport; <a href="https://calnewport.com/in-defense-of-thinking-2/">In Defense of Thining</a></li>
<li>Hamilton Greene; <a href="https://hamy.xyz/blog/2025-11_why-im-moving-blog-fsharp-to-csharp">Why I&rsquo;m moving from F# to C#</a></li>
<li>Senator Bernie Sanders <a href="https://www.youtube.com/watch?v=h3AtWdeu_G0">vs. Claude</a> (YouTube)</li>
<li>Felienne Hermans; <a href="https://www.felienne.nl/2026-14/">AI in Week Reports</a> (Scroll down for English)</li>
<li>Brit Butler; <a href="https://blog.kingcons.io/posts/ill-omens.html">Ill Omens</a>, a critique on LLM ethics</li>
</ul>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/genai">genai</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 8 April 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: A%20Commentary%20On%20GenAI%20Inspected%20Through%20Different%20Lenses">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Remakes And Remasters Of Old DOS Games: A Small 2026 Update</title>
      <link>https://brainbaking.com/post/2026/04/remakes-and-remasters-of-old-dos-games-2026/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Sun, 05 Apr 2026 17:55:00 +0200</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/04/remakes-and-remasters-of-old-dos-games-2026/</guid>
      
        
          <category domain="https://brainbaking.com/tags/games">games</category>
        
          <category domain="https://brainbaking.com/tags/dos">dos</category>
        
          <category domain="https://brainbaking.com/tags/engines">engines</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>It&rsquo;s been two years since the <a href="/post/2024/04/remakes-and-remasters-of-old-dos-games/">Remakes And Remasters Of Old DOS Games</a> article. Nostalgia still sells handsomely thus our favourite remaster studios (hello Night Dive) are cranking out hit after hit. It&rsquo;s time for a small 2026 update. I&rsquo;ve also updated the original article just in case you might find your way here through that one.</p>
<p>Below is a list of remakes and remasters announced and/or released since April 2024:</p>
<h2 id="adventure-games">Adventure games</h2>
<ul>
<li><strong>Little Big Adventure</strong>: <a href="https://store.steampowered.com/app/2318070/Little_Big_Adventure__Twinsens_Quest/">Twinsen’s Quest</a> released in November 2024 is a complete graphical overhaul of the original.</li>
<li>Not a remake but still noteworthy; <strong>Gobliins 6</strong> is <a href="https://jefklakscodex.com/games/pc/gobliins-6/">a sequel to a 34 year old DOS game</a>!</li>
</ul>
<h2 id="shooters">Shooters</h2>
<p>Guess what, Nightdive is still running the show here:</p>
<ul>
<li><strong>Star Wars: Dark Forces</strong> got a <a href="https://www.gog.com/en/game/star_wars_dark_forces_remaster">remaster</a>;</li>
<li>Although not a DOS game, <strong>Outlaws</strong> got <a href="https://www.gog.com/en/game/outlaws_handful_of_missions_remaster">the remaster treament as well</a></li>
<li>Oh, and yes, <strong>DOOM I + II</strong> <a href="https://www.gog.com/en/game/doom_doom_ii">is another masterpiece</a>;</li>
<li>As is the <strong>Heretic + Hexen</strong> <a href="https://www.gog.com/en/game/heretic_hexen">package</a>;</li>
<li>As did <strong>Blood</strong> as <a href="https://www.gog.com/en/game/blood_refreshed_supply">Refreshed Supply</a> (again?).</li>
</ul>
<p>At this point I don&rsquo;t even know where to start!</p>
<h2 id="platformers">Platformers</h2>
<ul>
<li><strong>BioMenace</strong>: <a href="https://www.gog.com/en/game/biomenace_remastered">Remastered</a> by the same devs that did the Duke Nukem 1 &amp; 2 remasters on Evercade. I enjoyed it, <a href="https://jefklakscodex.com/games/pc/biomenace-remastered/">it&rsquo;s good!</a></li>
<li>A <strong>Halloween Harry</strong>-inspired <a href="https://store.steampowered.com/app/3040430/Halloween_Harry/">top-down 3D version</a> is currently being made that only shares the name &amp; style of the original&mdash;luckily, not the crappy level design.</li>
<li>Ubisoft remastered the original <strong>Rayman</strong> (<a href="https://store.steampowered.com/app/4094670/Rayman_30th_Anniversary_Edition/">30th Anniversary Edition</a>) but it wasn&rsquo;t met with much success. They changed the included GBA music&mdash;that&rsquo;s what SEGA would have done, right?</li>
</ul>
<p>Monster Bash HD is still being worked on (I hope?).</p>
<h2 id="strategy">Strategy</h2>
<ul>
<li>I found a <strong>Masters of Magic</strong> <a href="https://store.steampowered.com/app/1623070/Master_of_Magic/">remake</a> (2022) on Steam that&rsquo;s been met with some positive reception. I didn&rsquo;t play the original so can&rsquo;t say how faithfully it&rsquo;s related to the DOS version.</li>
<li>Blizzard also decided to cash in with the <strong>Warcraft I+II</strong> <a href="https://us.shop.battle.net/en-us/product/warcraft-2-remastered">remaster bundle</a>. I was mostly a Wacraft III person so I can&rsquo;t comment on this.</li>
</ul>
<h2 id="other">Other</h2>
<ul>
<li>Someone did a <strong>Wacky Wheels</strong> <a href="https://cascadiagames.itch.io/wacky-wheels-hd">HD Remake</a> on <code>itch.io</code>? Wow! Best approach this carefully, it looks to have its own technical problems.</li>
</ul>
<p>Did I miss something? Let me know!</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/games">games</a> /
                  <a href="https://brainbaking.com/tags/dos">dos</a> /
                  <a href="https://brainbaking.com/tags/engines">engines</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 5 April 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Remakes%20And%20Remasters%20Of%20Old%20DOS%20Games%3a%20A%20Small%202026%20Update">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Favourites of March 2026</title>
      <link>https://brainbaking.com/post/2026/04/march-2026/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Wed, 01 Apr 2026 20:45:00 +0200</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/04/march-2026/</guid>
      
        
          <category domain="https://brainbaking.com/tags/metapost">metapost</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>Our daughter turned three. We&rsquo;re beyond exhausted but a ripgrep search in this repository yields five more instances of the word <em>exhausted</em> in combination of parenting so I&rsquo;ll shut up. I guess we also celebrate that after three years of pure chaos, we&rsquo;re&hellip; still alive?</p>
<p>Previous month: <a href="/post/2026/03/february-2026/">February 2026</a>.</p>
<h2 id="games-ive-played">Games I&rsquo;ve played</h2>
<p>I am just two levels short of finishing <a href="https://jefklakscodex.com/games/pc/gobliins-6/">Gobliins 6</a> before deciding to throw in the towel. Thanks to the increased amount of moon logic presence, the entire adventure was more frustrating than relaxing. As a big Gobliins fan, I have to admit: the game left me a bit disappointed. It&rsquo;s all right; I&rsquo;ll just replay Gob3 again.</p>
<p>As it left me wanting more, I went back to the original <a href="https://jefklakscodex.com/games/pc/gobliiins/">Gobliiins</a> game that I somehow missed as back in the day my dad bought Gobliins 2 and we just continued with 3 without looking back. It&rsquo;s still worth exploring but very basic and the presence of the life bar is a very strange (and bad!) design choice that fortunately was abandoned in the sequels.</p>
<p>I charged the Analogue Pocket and hope to get in some good ol&rsquo; Game Boy (Color) games in the coming month.</p>
<h2 id="selected-blog-posts">Selected (blog) posts</h2>
<p>I read a depressing amount of personal genAI tales; more than enough to fill another blog post. I&rsquo;ll try to keep these out of here as much as possible.</p>
<ul>
<li>Michael vibe-code-ported an X11 window manager <a href="https://www.ecliptik.com/blog/2026/Vibe-Coding-a-Fluxbox-Inspired-Wayland-Compositor/">into Wayland</a>; an interesting Claude experiment to see how agentic development works.</li>
<li>Greg Newman hosted the <a href="https://gregnewman.io/blog/emacs-carnival-2025-07-writing-experience/">Emacs Blog Post Carnival 2025-07</a> on writing experiences and summarised the participating links. Lots of little gems in there.</li>
<li>Rijksmuseum writes about the discovery of the <a href="https://www.rijksmuseum.nl/en/stories/themes/rembrandt/story/a-new-rembrandt-discovered">new Rembrandt painting</a>. Well, &ldquo;new&rdquo;&mdash;it&rsquo;s been in private collection for years and only recently resurfaced.</li>
<li>Peter Bridger shares his experience in the retro happening <a href="https://www.strifestreams.com/articles/2026/swag-february-2026/">SWAG February 2026</a>. I wish we had something similar nearby!</li>
<li>Chuck Jordan shares <a href="https://spectrecollie.com/2026/02/23/the-vibes-of-simcity/">SimCity vibes</a>. As one of the original programmers involved in the projects, he would know. (Via <a href="https://virtualmoose.org/">The Virtual Moose</a>)</li>
<li>The 1MB Club has an interesting (older) article I read last month: <a href="https://1mb.club/blog/https-redirects/">consider disabling HTTPS auto redirects</a>. I can&rsquo;t remember why I turned this back on: I want my old WinXP machine to be able to reach <code>brainbaking.com</code> as well without the extra TLS overhead. Funny though: they mention &ldquo;You can freely view this website on both HTTPS and HTTP.&rdquo;. I remove the <code>s</code> in the protocol, press <code>RET</code>, and get redirected. Whoops.
<ul>
<li>PolyWolf has been thinking about <a href="https://wolfgirl.dev/blog/2026-02-23-so-ive-been-thinking-about-static-site-generators/">blazing fast static site generators</a>. This is a goldmine as I have a wild idea to write my own generator in Clojure. When the exhaustion and brain fog go away, that is.</li>
</ul>
</li>
<li>According to  Rishi Baldawa <a href="https://rishi.baldawa.com/posts/review-isnt-the-bottleneck/">the reviewer isn&rsquo;t the bottleneck</a>. This one&rsquo;s a bit AI flavoured, so beware if you&rsquo;re coming down with an AI cold. (I know I have. Handkerchiefs full.)</li>
<li>Marcin Wichary&rsquo;s keyboard grandmastery again shines through in his <a href="https://aresluna.org/fn/">Apple Fn endgame article</a>. I wish his keyboard book wasn&rsquo;t sold out.</li>
<li>Wordsmith writes about the <a href="https://wordsmith.social/overthinking-the-apocalypse/the-underrated-simplicity-of-harvest-moon-1996">underrated simplicity of the original Harvest Moon</a> (1996) video game.</li>
<li>Dale Mellor defends sing a <a href="https://khleedril.org/blog/2026-03-07--dynamic-site.html">dynamically-produced blog site</a> which is a nice change given the static site generator craziness. I&rsquo;m still on Hugo and have little need for the points he brings up, but still, some others might.</li>
<li>Tazjin <a href="https://tazj.in/blog/trying-guix">tries out Guix as a Nixer</a>. I was eyeing on Guix as a budding Lisp fanboy, but both options still can&rsquo;t seem to fit in my head. I&rsquo;ll let it stew for a little while longer.</li>
<li>Homo Ludditus announces <a href="https://ludditus.com/2026/02/21/its-distro-hopping-time-no-happy-ending-though/">distro hopping time</a>. The conclusion? &ldquo;The madhouse could be a valid destination. But I’m still looking for better alternatives.&rdquo; So far for 2026 as the year of the Linux desktop huh.</li>
<li>The Digital Antiquarian writes about the <a href="https://www.filfre.net/2025/07/the-year-of-peak-might-and-magic/">year of peak Might &amp; Magic</a>, when New World Computing still was on top of the world.</li>
<li>Here&rsquo;s an interesting thought experiment by Andrey Listopadov: <a href="https://andreyor.st/posts/2022-02-20-what-if-structural-editing-was-a-mistake/">What if structural editing was a mistake?</a></li>
<li>In this 2020 post by Vincent Bernat, photos of a bunch of cool <a href="https://vincent.bernat.ch/en/blog/2020-old-pc-cards">vintage PC expansion cards</a> are shared in conjunction with timeperiod-correct software that made great use of them.</li>
<li>Gabor Torok <a href="https://20y.hu/~slink/journal/kde-plasma/index.html">switched to KDE Plasma</a>, an interesting read because we both switched to OSX because of <em>resons</em> and are trying to crawl out of the Apple hole. I don&rsquo;t know if I&rsquo;m quite ready yet.</li>
<li>Did you know there&rsquo;s a relation <a href="https://abbeyperini.com/blog.html?blog=knitting">between knitting and programming</a>? Abbey Perini does.</li>
<li>Mykal Machon shares some insightful <a href="https://mykalmachon.com/posts/guiding-principles">guiding principles</a> to lead a fuller life. Judging by the principles, I don&rsquo;t think Mykal has any young kids.</li>
</ul>
<p>My wife bumped into an hacker called Un Kyu Lee crafting his own micro journal hardware. The result looks very cool, including hinge to hang on the door as a physical reminder:</p>
<figure>
	<a href="https://www.youtube.com/watch?v=1ZP9wwYMaMY" class="lbox"><img loading="lazy" class="img-responsive" src="https://brainbaking.com/post/2026/04/march-2026/yt-1ZP9wwYMaMY.jpg" title="YouTube video 1ZP9wwYMaMY">
	</a>
	</figure>

<p>I&rsquo;d rather keep on journaling with my fountain pens, but still, very cool!</p>
<h2 id="other-random-links">Other random links</h2>
<ul>
<li>I&rsquo;m using this as a checklist to find out if I missed essential albums: Hip Hop Golden Age&rsquo;s <a href="https://hiphopgoldenage.com/list/top-40-hip-hop-albums-1998/">Top 40 Hip Hop Albums of 1998</a>.</li>
<li>Here&rsquo;s another GitHub &ldquo;awesome&rdquo; list; this time <a href="https://github.com/public-api-lists/public-api-lists">public APIs</a>. Could be useful. Already used for my courses.</li>
<li>It doesn&rsquo;t hurt to link to <a href="https://www.ludions.com/texts/2007a/">the 2007 Slow Code manifesto</a>.</li>
<li><a href="https://arcade.pirillo.com/fontcrafter.html">FontCrafter</a> is a cool way to generate a real font based on your handwriting.</li>
<li><a href="https://github.com/sandialabs/wiretap">WireTap</a> is an open source Ngrok alternative.</li>
<li>The <a href="https://stumpwm.github.io/">Stump Window Manager</a> is the only WM (except the obvious EXWM) I could find that&rsquo;s written in Common Lisp.</li>
<li>I should look into <a href="https://ulauncher.io/">Ulauncher</a> if I ever want to make the switch to Linux to replace Alfred.</li>
<li>Christoph Frick shares <a href="https://gist.github.com/christoph-frick/d3949076ffc8d23e9350d3ea3b6e00cb">a cool GitHub Gist</a> showcasing you can write your AwesomeWM config in Fennel instead of Lua.</li>
<li><a href="https://github.com/sxyazi/yazi">Yazi</a> looks like an Emacs Dired inside a shell?</li>
</ul>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/metapost">metapost</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 1 April 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Favourites%20of%20March%202026">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>App Defaults In March 2026</title>
      <link>https://brainbaking.com/post/2026/03/app-defaults-march-2026/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Sun, 29 Mar 2026 20:15:59 +0200</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/03/app-defaults-march-2026/</guid>
      
        
          <category domain="https://brainbaking.com/tags/lists">lists</category>
        
          <category domain="https://brainbaking.com/tags/app defaults">app defaults</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>It&rsquo;s been almost three years since sharing <a href="/post/2023/11/app-defaults-in-late-2023/">my toolkit defaults (2023)</a>. High time to report an update. There&rsquo;s a second reason to post this now: I&rsquo;ve been trying to get back into the Linux groove (more on that later), so I&rsquo;m hoping to either change the defaults below in the near future or streamline them across macOS &amp; Linux.</p>
<p>When the default changed I&rsquo;ll provide more information; otherwise see the previous post as linked above.</p>
<ul>
<li><strong>Backup system</strong>: Still Restic, but I added Syncthing into the loop to get that 1-2-3 backup number higher. I still have to buy a fire-proof safe (or sync it off-site).</li>
<li><strong>Bookmarks and <em>Read It Later</em> systems</strong>: Still Alfred &amp; Obsidian. Experimenting with Org-mode and org-capture; hoping to migrate this category to Emacs as well.</li>
<li><strong>Browser</strong>: Still Firefox.</li>
<li><strong>Calendar and contacts</strong>: Still Self-hosted Radicale.</li>
<li><strong>Chat</strong>: Mainly Signal now thanks to <a href="/post/2025/07/how-to-bully-your-friends-into-using-signal/">bullying friends into using it</a>.</li>
<li><strong>Cloud File Storage</strong>: lol, good one.</li>
<li><strong>Coding environment</strong>: <del>For light and quick scripting, Sublime Text</del> Emacs! Otherwise, any of the dedicated tools from the JetBrains folks. <code>dap-mode</code> and <code>lsp-mode</code> can only do so much; it&rsquo;s dreadful in Java.</li>
<li><strong>Image editor</strong>: Still ImageMagick + GIMP.</li>
<li><strong>Mail</strong>: <del>Apple Mail for macOS for brainbaking</del> Mu4e in Emacs! and  <del>Microsoft Outlook for work</del> Apple Mail for the work Exchange server. I didn&rsquo;t want to mix but since Mu cleared up Mail, that&rsquo;s much better than Outlook.</li>
<li><strong>Music</strong>: Still Navidrome.</li>
<li><strong>Notes</strong>: Still pen &amp; paper but I need to remind myself to take up that pen more often.</li>
<li><strong>Password Management</strong>: Still KeePassXC.</li>
<li><strong>Photo Management</strong>: Still PhotoPrism. I considered replacing it but I barely use it; it&rsquo;s just a photo dump place for now.</li>
<li><strong>Podcasts</strong>: I find myself using the Apple Podcast app more often than in 2023. I don&rsquo;t know if that&rsquo;s a bad thing&mdash;it will be if I want to migrate to Linux.</li>
<li><strong>Presentations</strong>: Haven&rsquo;t found the need for one.</li>
<li><strong>RSS</strong>: Still NetNewsWire <em>but</em> since last year it&rsquo;s backed by a FreshRSS server making cross-platform reading much better. Android client app used is Randrop now, so that&rsquo;s new.</li>
<li><strong>Spreadsheets</strong>: For student grading, Google Sheets or <del>Excel if I have to share it with colleagues</del>. My new institution is pro Teams &amp; Office 365. Yay.</li>
<li><strong>Text Editor</strong>: I&rsquo;m typing this Markdown post in <del>Sublime Text</del> Emacs.</li>
<li><strong>Word Processing</strong>: Still Pandoc if needed.</li>
<li><strong>Terminal</strong>: emulator: <del>iTerm2</del> Ghostty, but evaluating Kitty as well (I hated how the iTerm2 devs shoved AI shit in there); shell: <del>Zsh</del> migrated to Fish two days ago! The built-in command line option autocomplete capabilities are amazing. Guess what: more and more I&rsquo;m using eshell and Emacs.</li>
</ul>
<p>Some more tools that have been adapted that don&rsquo;t belong in one of the above categories:</p>
<ul>
<li>Karabiner Elements to remap some keys (see <a href="/post/2026/01/apple-ruined-my-mechanical-keyboard-experience-a-nuphy-halo-75-review/">the explanation</a>)</li>
<li>I tried out Martha as a Finder alternative. It&rsquo;s OK but I&rsquo;d rather dig into Dired (Emacs)&mdash;especially if I see the popularity of tools like <code>yazi</code> that just steal Dired features.</li>
<li>I replaced quite a few coreutils CLI commands with their modern counterparts: <code>ls</code> now is <code>eza</code>, <code>cat</code> now is <code>bat</code>, <code>du</code> now is <code>gdu</code>, <code>cd</code> now is <code>zoxide</code>, and <code>fzf</code> can be used to enhance shell search history but Fish eliminated that need.</li>
<li><a href="https://alt-tab-macos.netlify.app/">AltTab</a> for macOS replaces the default window switcher. The default didn&rsquo;t play nice with new Emacs frames and I like the mini screenshot.</li>
</ul>
<p>A prediction for this post in 2027: all tools have been replaced with Emacs. All silliness aside; Emacs is the best thing that happened to me in the last couple of months.</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/lists">lists</a> /
                  <a href="https://brainbaking.com/tags/app-defaults">app defaults</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 29 March 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: App%20Defaults%20In%20March%202026">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Please Compensate The Work You Appreciate</title>
      <link>https://brainbaking.com/post/2026/03/please-compensate-the-work-you-appreciate/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Tue, 24 Mar 2026 12:02:31 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/03/please-compensate-the-work-you-appreciate/</guid>
      

      
      <description>
          <![CDATA[ 
          <p>The other day, I had a casual conversation with colleagues about buying music. Nobody gave a rat&rsquo;s ass; they all just either downloaded the <code>.mp3</code> files or used Spotify. Most conversations on this topic end like this so I expected the response from more than a few individuals, but not from everyone. I was deemed the silly fool who buys stuff and supports artists.</p>
<p>Yet at the same time, we all bemoan the fact that creative individuals are losing their job due to the rise of generative AI. To that I say: maybe that&rsquo;s our own fault for not properly compensating these people in the first place?</p>
<p>Please compensate the work you appreciate. Showing appreciation is not enough to bring food to the table. If you get paid for the work you are doing each month, don&rsquo;t you think it&rsquo;s only logical that these people also get paid? Where do you think that money should be coming from? It&rsquo;s weird to still encounter that much reluctance to support makers in 2026. Most <em>Brain Baking</em> readers will (hopefully) find this obvious, and this article won&rsquo;t have a big impact on the reasoning of my colleagues, but it doesn&rsquo;t hurt to re-iterate this, so I&rsquo;ll mention it again: please compensate the work you appreciate. Below are a few remarks I heard every time I bring up this topic (related to music &amp; software in general).</p>
<p><strong>I&rsquo;m not buying music albums, I&rsquo;m not as rich as you are.</strong></p>
<p>Even though the person meant this as a joke, the underlying message was: &ldquo;I don&rsquo;t want to spend that much money on music/a creative product&rdquo;. I buy one to two albums each month and on Bandcamp artists can decide for themselves how much to charge. You don&rsquo;t have <code>€20</code> to spare for this, but you are paying for three streaming services? Right. See also: <a href="/post/2021/02/you-shouldnt-use-spotify/">You Shouldn&rsquo;t Use Spotify</a>.</p>
<p><strong>I can share the Spotify subscription with my sister to make it even cheaper.</strong></p>
<p>Did you know a thing called libraries exist where you can, you know, lend stuff, including CDs? Did you know that once you buy a digital album, you can do whatever the hell you want with it, including, you know, lending it to your sister?</p>
<p><strong>But those artists already have millions, no way I&rsquo;m giving them more.</strong></p>
<p>This is a tougher nut to crack indeed. Michael Jackson is dead (remember, 2Pac isn&rsquo;t), so where does that money end up? Even when he was still alive, supporting an artist who already has eight figure numbers on their account might be harder to justify. I&rsquo;d say you should prioritise buying and supporting smaller (indie/local) groups. Maybe in this case you can also turn to the second hand market and at least support your local music shop that way.</p>
<p><strong>I only like popular pop music and they already earn more than enough.</strong></p>
<p>Consider the previous example; for instance Jackson&rsquo;s album <em>Bad</em>. It wasn&rsquo;t only Michael who was involved in the creation of that particular album you like. So all these people don&rsquo;t deserve to have a meal. Consider this: if everybody thought like you, would that artist still be rich&mdash;or <em>Dy Tryin</em> (got it? 50 Cent? No?)?</p>
<p><strong>Micro$oft is bad.</strong></p>
<p>You&rsquo;re right. Today, you should <a href="https://bdsmovement.net/microsoft">boycott Microsoft</a>&mdash;but there used to be a time where they weren&rsquo;t evil and helped propel software (and its development) into the modern age. If nobody bought MS-DOS, Windows 3.1, if no OEM deal was ever made to package Win95/98 with your new beige Compaq tower, maybe the contemporary software landscape looked a lot bleaker. What does this teach us? Compensate the work you appreciate <em>only if it&rsquo;s ethically sound</em><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p><strong>You can&rsquo;t find all these things on Bandcamp.</strong></p>
<p>Right again, but the remaining can be found on plenty of other platforms such as Apple Music. This is not an excuse to neglect compensating the artist.</p>
<p><strong>But thirty percent is pinched off by Apple!</strong></p>
<p>Yes. That means seventy percent remains for the artist. And if you don&rsquo;t buy anything but stream or download music, a hundred percent of zero remains for the artist. I&rsquo;ll leave that calculation up to you as an exercise in critical thinking.</p>
<p><strong>I used to buy CDs in stores but don&rsquo;t anymore these stores are gone.</strong></p>
<p>Unfortunately, most brick and mortar stores are struggling, indeed. Perhaps also because most people sopped buying music and just download and/or stream stuff instead?</p>
<p><strong>The last thing I bought wasn&rsquo;t good.</strong></p>
<p>I&rsquo;m sorry to hear. Did you also consider that buying the bad thing might put the creator in a financial situation where they can produce something else that potentially might be better&mdash;with your help, that is? Bigger creative projects that take months or years require funding beforehand. I presume you are aware of the disadvantages of being funded by venture capital.</p>
<p><strong>I&rsquo;m not paying anything for free software.</strong></p>
<p>Open source does not equal <em>free</em> in the sense that the people that created these packages don&rsquo;t deserve to eat. Supporting a project sends an important signal to its maintainers: the thing you are doing is relevant, please continue doing so. Sending an appreciative letter also helps but doesn&rsquo;t pay bills, and since we&rsquo;re living in an increasingly bill-paying society, many expert developers simply quit working on free software. What do you think all those &ldquo;donate&rdquo; buttons are for?</p>
<p><strong>I only buy hardware, not software.</strong></p>
<p>I&rsquo;ll be sure to tell my software engineering friends and colleagues to retrain into hardware engineers as soon as possible.</p>
<p><strong>I&rsquo;m not using paid service x because free Google service y exists.</strong></p>
<p>You&rsquo;re still paying, buddy. Just not with money, but perhaps with something that is worth even more than the green currently in your wallet. It&rsquo;s called your personal data.</p>
<p><strong>Going to a music gig already costs an arm and a leg, no way I&rsquo;m also buying the album.</strong></p>
<p>What kind of an argument is this? So you like the band enough to drop <code>€80</code> for a concert but you&rsquo;re against paying for music just to make a statement? Next time simply stay home and instead buy the album, that&rsquo;s 80% cheaper and you can listen to it again and again.</p>
<p><strong>I don&rsquo;t have room to collect CDs.</strong></p>
<p>Who said anything about collecting? Then buy them digitally. At this point, we&rsquo;re just arguing for the sake of arguing&hellip;</p>
<hr>
<p>I think it&rsquo;s strange that many people still completely ignore all these arguments for compensating artists. These arguments alone are pretty useless: it&rsquo;s not the awareness that&rsquo;s the problem. Most illegal downloaders or lazy Spotify users are well-aware of the ethical concerns and financial consequences. Knowing is not enough to get people to act. Most people have heard of global warning and know we&rsquo;re slowly but surely destroying the earth, yet we happily keep on driving cars, eating meat, flying planes.</p>
<p>If you know what does move people, please let me know.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Can you appreciate work that is not ethical? Sure you can; there are plenty of cool looking video games made by extreme right-thinking dickheads. Whether or not to support those dickheads is up to you.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>


          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 24 March 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Please%20Compensate%20The%20Work%20You%20Appreciate">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>A Satisfied Customer Review Of The Yogurtia</title>
      <link>https://brainbaking.com/post/2026/03/a-satisfied-customer-review-of-the-yogurtia/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Fri, 20 Mar 2026 15:05:04 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/03/a-satisfied-customer-review-of-the-yogurtia/</guid>
      
        
          <category domain="https://brainbaking.com/tags/fermentation">fermentation</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>And now for something completely different. For years, we&rsquo;ve been happy users of the <a href="https://tanica-usa.com/">Yogurtia</a>, a Japanese &ldquo;fermented food maker&rdquo;. That alone should sound enticing enough to warrant this small review!</p>
<p>What&rsquo;s a fermented food maker? I&rsquo;m glad you ask. It&rsquo;s a maker for food to ferment. Next question.</p>
<p>In case that wasn&rsquo;t crystal clear, here&rsquo;s a common way we employ our Yogurtia: to make yoghurt. Shocking, given the name, right? There are plenty of mundane looking kitchen appliances out there that can &ldquo;make yoghurt&rdquo; so why should you import a Japanese device instead? While researching yoghurt making machines, we often encounter contraptions you can put multiple small containers in that will be heated to 40 degrees Celcius for eight to twelve hours. Once it&rsquo;s done, you pull out the containers and voilà: your very own yoghurt pots.</p>
<p>The Yogurtia doesn&rsquo;t do this. Instead, there&rsquo;s one giant contiainer where you pour in milk and remnants of your previous yoghurt. That means you can make much more in one go&mdash;but that also means you can more easily put in other stuff.</p>
<p>The biggest reason for buying the Yogurtia is the capability to precisely configure the temperature and time it needs to ferment. Most basic yoghurt makers just come with an on/off switch. We can set it to 60 degrees instead of the usual 40 if we want to more easily ferment other stuff.</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/03/a-satisfied-customer-review-of-the-yogurtia/yoghurt.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/03/a-satisfied-customer-review-of-the-yogurtia/yoghurt.jpg" loading="lazy" title="Preparing breakfast with a freshly made yoghurt container thanks to the Yogurtia maker." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>Preparing breakfast with a freshly made yoghurt container thanks to the Yogurtia maker.</figcaption></figure>
</p>
<p>Perhaps I should elaborate on the &ldquo;other stuff&rdquo;. While the Yogurtia obviously markets itself in the west towards yoghurt lovers, the real purpose of this neat little contraption is to make <a href="https://en.wikipedia.org/wiki/Amazake">amazake</a> and <a href="https://en.wikipedia.org/wiki/Natt%C5%8D">nattō</a>. I&rsquo;ve had great success with the former. To make amazake, you&rsquo;ll need to grow a specific mold on rice first called <a href="https://en.wikipedia.org/wiki/K%C5%8Dji_(food)">koji</a>. Activating that koji is done at 60 degrees which is too hot for most small fermentation chambers/yoghurt makers. I produce koji-fied rice in my <a href="/post/2021/07/fridge-as-inoculation-room/">fridge-hacked inoculation room</a>.</p>
<p>A rice cooker that can be properly configured might be another option, but cheaper machines often have trouble maintaining the temperature, requiring you to add some cold water. If the temperature is too high, the koji will be killed off, resulting in a less sweet beverage as the mold is responsible for breaking down the carbs of the rice into simple sugars.</p>
<p>In a previous employer&rsquo;s cantine, I was known as the amazake guy. I brought the smelly stuff to work for interested colleages to try it out and enthuse them to get started on fermenting stuff themselves. The result was met with mixed success: most people said <em>yuck!</em>, I got the label &ldquo;the amazake guy&rdquo;, and one time I forgot to take the canister out of the fridge at work. Or maybe the order is reversed here, that would certainly make more sense. I tried once more with spamming everyone to go out and buy Sandor Katz&rsquo; <a href="https://www.wildfermentation.com/the-art-of-fermentation/">The Art of Fermentation</a> bible. Then I tried bringing pickled stuff to work. More <em>yuck!</em> and <em>what strange colour does that radish have?</em></p>
<p>The one thing I didn&rsquo;t try, which I&rsquo;m making up for by writing this satisfied customer review, is convincing them to buy a Yogurtia. Maybe I should have done that instead. In Belgium, yoghurt is one of the few &ldquo;fresh&rdquo; fermented products almost everyone eats regularly (we&rsquo;ll ignore cheese; sausages; wine; olives; and yes, even <a href="/post/2022/07/around-the-world-in-search-of-chocolate/">chocolate</a>; &hellip;. for now).</p>
<p>Did you know you can use a spoonful of sourdough starter to jump-start the yoghurt making process? Did you know you can jump-start the bread rising process by using a spoonful of yoghurt? Food for thoug&mdash;no, a new blog post.</p>
<p>A+++. Would buy again.</p>
<p>(And did buy again. Never connect a Japanese electronic device that assumes <code>110 W</code> directly to the European power grid of <code>230 W</code>. Ouch. That plastic did melt good.)</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/fermentation">fermentation</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 20 March 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: A%20Satisfied%20Customer%20Review%20Of%20The%20Yogurtia">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>The Best Indicator For Quality In a Video Game Is My Willingness To Replay It</title>
      <link>https://brainbaking.com/post/2026/03/the-best-indicator-for-quality-in-video-games-is-replayability/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Sun, 15 Mar 2026 18:40:00 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/03/the-best-indicator-for-quality-in-video-games-is-replayability/</guid>
      
        
          <category domain="https://brainbaking.com/tags/games">games</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>Here&rsquo;s a thought: the best indicator for quality in a video game is my willingness to first finish and then replay it.</p>
<p>How many games have you replayed once? Or even twice? Or how about simply finishing it in the first place. I catch myself giving up on games that tend to drag on much faster than I used to for a few key reasons: (1) having less time and patience, and (2) my quality bar has been raised significantly compared to my youth when I had to make due with less. For me, that means the act of simply finishing a game is already a big step towards meeting that bar. Getting enthused by the thought of replaying it is an even bigger sign of quality.</p>
<p>Do you replay a game as part of a yearly tradition? I know folks who do yearly runs of <em>Jazz Jackrabbit: Holiday Hare</em> to soak up the Christmas holiday atmosphere at the end of the year. I guess we can categorise games you play just to get in a holiday mood as an exception: these <em>Jazz</em> episodes can hardly be called qualitative.</p>
<p>What does <em>replaying a game</em> actually mean in context of never-ending games such as roguelikes, city builders, and MMORPGs? I have played endless hours of <em>Zeus: Master of Olympus</em> and completed countless <em>Mephisto Diablo II hell runs</em> hoping to farm some good necromancer gear. I spent hours and hours shaking fruit trees and visiting other&rsquo;s villages in <em>Animal Crossing: Wild World</em> to try and pay off my loan without properly &ldquo;restarting&rdquo; by creating a new savegame.</p>
<p>As an interesting exercise, I analysed the top 25 games listed in my <a href="https://jefklakscodex.com/top100/">Top 100</a> (the A and S tier) and counted them by my replay rate.</p>
<p><strong>Replayed 5+ times</strong>: <em>Commandos 2</em>, <em>Castlevania: Aria of Sorrow</em>, <em>Super Mario World</em>, <em>Animal Crossing: Wild World</em>, <em>Sonic 3</em>, <em>Rainbow Six 3: Raven Shield</em>, <em>Zeus: Master of Olympus</em>, <em>Wizardry 8</em>, <em>Baldur&rsquo;s Gate II</em>.</p>
<p><strong>Replayed 3-5 times</strong>: <em>Goblins Quest 3</em>, <em>Age of Empires II</em>, <em>The Legend of Zelda: A Link to the Past</em>, <em>Wario Land 3</em>, <em>Monkey Island 2</em>.</p>
<p><strong>Replayed 1-2 times</strong>: <em>Tactics Ogre: Reborn</em>, <em>The Legend of Zelda: The Wind Waker</em>, <em>Super Metroid</em>, <em>Duke Nukem 3D</em>, <em>Paper Mario 2</em>, <em>Deus Ex</em>.</p>
<p><strong>Yet to replay</strong>: <em>Hollow Knight</em>, <em>Mario &amp; Luigi: Superstar Saga</em>, <em>Fire Emblem: The Sacred Stones</em>, <em>Pizza Tower</em>.</p>
<p>What are the games that have yet to be replayed doing in that tier list? Good question! A few reasons I can come up with: recency bias (<em>Hollow Knight</em>, <em>Pizza Tower</em>) &amp; what I&rsquo;d like to call &ldquo;RPG fatigue&rdquo; (<em>Superstar Saga</em>): replaying a (j)RPG is a massive undertaking that often requires too much commitment compared to playing something shiny and new. <em>Superstar Saga</em> is &ldquo;only&rdquo; 20 hours long which is 10 hours shorter than <em>Hollow Knight</em> so my reasoning doesn&rsquo;t really stand here, but it surely is the reason why I wouldn&rsquo;t attempt to do yet another run-through of <em>Baldur&rsquo;s Gate II</em> any time soon. Or touch v3, for that matter.</p>
<p>It might be interesting to calculate the correlation between the game length and my willingness to replay a game but we&rsquo;d then have to take the &ldquo;old playthroughs&rdquo; out of the equation. Looking at <em>Baldur&rsquo;s Gate II</em> again, these replays were done when I was young and didn&rsquo;t have anything else to do. <em>Shadows of Amn</em> and the expansion <em>Throne of Bhaal</em> together require almost 90 hours to finish which would simply be impossible now. My bias towards shorter games now might affect how I evaluate the quality of a game. The longer it gets, the faster I&rsquo;m fatigued by it, even though it can be very engaging. I don&rsquo;t think my attention span shortened: it&rsquo;s just that I can only dedicate a few hours a day for hobby projects, including gaming.</p>
<p>There are reasons not to replay a game, even if you think it&rsquo;s exceptional. For instance, you probably don&rsquo;t want to immediately replay a story-driven narrative game you just finished since the story is still in your head. Another example I can think of is that you love the game&rsquo;s atmosphere and general gameplay but hate the boss encounters. <em>Hollow Knight</em> fits that bill for me: while the bosses were amazing, I do not want to slog through that &ldquo;git gud&rdquo; fest again any time soon.</p>
<p>There are reasons to replay a game over and over again, even if you think it&rsquo;s crap. For instance, just to pass the time with nothing more but your phone, you might be seduced to play a <em>Bejeweled</em>-like that&rsquo;s addictive and just gets you going, even though you hate it.</p>
<hr>
<p>Maybe the point I am trying to get across makes less sense than it did when I started writing this&hellip; What do others have to say about replayability? Dan Kline thinks that <a href="https://dankline.wordpress.com/2009/11/25/replayability-a-game/">without replayability, your game is boring</a>. Why would replayability be a core aspect of a game?</p>
<blockquote>
<p>I can think of 2 reasons off the top of my head. First, all the prominent games of history are replayable. Sports, chess, board games, children’s games, are all at their core replayable concepts. Second, rulesets that create interesting choices (another frequent game definition) seems to require replayability.<br/>This is an interesting point.  Replayability is the fallout of interesting choices.  If the choices aren’t replayable, then they, by definition, weren’t interesting enough to explore.  If you can predict the outcome of all possible rule permutations, then you aren’t playing a game. The rules are trivial.</p>
</blockquote>
<p>I&rsquo;m not sure if this is true for all possible cases. Replaying adventure games usually means retracing your exact steps, making the exact same choices the game expects you to make to progress. And yet I&rsquo;ve replayed <em>Monkey Island 2</em> more than three times because I love the atmosphere. I know most puzzles by heart but I don&rsquo;t care. And contrary to a chess session, finishing <em>Monkey Island 2</em> now is exactly like finishing it 20 years ago; there are no branching paths or other ways to finish it that theoretically increase its replayability factor.</p>
<p>As discussed in <a href="https://tildes.net/~games/1a3l/do_you_replay_video_games">this tilde.net thread on replayability</a>, many folks consider games to be replayable if there are branching paths you can explore in another playthrough. And while that&rsquo;s a very obvious approach, by that same approach <em>Monkey Island 2</em> would not be replayable at all. Yet I replay it. Often. Also, simply the presence of branching paths does not automatically mean it&rsquo;s a high quality game.</p>
<p>Aki-Petteri Meskanen names the engaging and charming world <a href="https://www.tuni.fi/playlab/replaying-a-game-is-not-without-its-reasons/">as a reason to revisit a game</a>. Besides that, co-op play is also a big reason to reinstall to a previously completed game. That&rsquo;s the reason why <em>Raven Shield</em> and even <em>Commandos 2</em> score so high on my list: my best memories of these games stem from local networked play sessions with a friend despite already having finished the single player campaign several times.</p>
<p>My <strong>willingness</strong> to replay a game is <strong>an</strong> indicator for quality. That personal statement has less to do with the theoretical definition of replayability and more with my own recent experiences with video games. Also, as I mentioned, sometimes I&rsquo;m simply not willing to (re)invest the time, even though the first playthrough was a superb experience. I don&rsquo;t think I will ever replay <em>Hollow Knight</em>, but as James Bond says: never say never again!</p>
<p>All that being said, I think this idea can be expanded to re-watching movies and re-listening to audio albums as well!</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/games">games</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 15 March 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: The%20Best%20Indicator%20For%20Quality%20In%20a%20Video%20Game%20Is%20My%20Willingness%20To%20Replay%20It">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>25 Years Of ADSL Speed</title>
      <link>https://brainbaking.com/post/2026/03/25-years-of-adsl-speed/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Wed, 11 Mar 2026 08:30:01 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/03/25-years-of-adsl-speed/</guid>
      
        
          <category domain="https://brainbaking.com/tags/adsl">adsl</category>
        
          <category domain="https://brainbaking.com/tags/screenshots">screenshots</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>Twenty-five years ago, I captured a screenshot of my FTP client showcasing the download of a SuSE Linux gcc compilation package at the dazzling rate of <code>439,36 KB/sec</code>:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/03/25-years-of-adsl-speed/ADSL_snelh.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/03/25-years-of-adsl-speed/ADSL_snelh.jpg" loading="lazy" title="Downloading the gcc cross-compiler for s390x through the  ftp.belnet.be mirror. Note the then very new Windows XP Olive theme." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>Downloading the gcc cross-compiler for s390x through the  ftp.belnet.be mirror. Note the then very new Windows XP Olive theme.</figcaption></figure>
</p>
<p>For some reason, that screenshot must have been relevant, as I found it uploaded as part of my UnionVault.NET <a href="/museum/">museum</a> from 2002. Nowadays, such a download speed can officially be scoffed at as being slower than a snarky snail. Yet in 2000-2002, that was lightning-fast. Perspectives change.</p>
<p>In Belgium, telecom company Belgacom introduced ADSL in 1999, significantly boosting our digital lives. No longer did I have to hang up the ISDN line when <a href="/post/2024/07/instant-messaging-clients-of-yore/">chatting over ICQ</a> when mom wanted to do a quick phone call to grandma to ask about next week&rsquo;s party. No longer did we have to listen to squeaky sounds and wait and wait and wait&hellip; for an image or file to appear. The future was here!</p>
<p>For our family, the future was here a smidge earlier than the average Flemish family as my dad worked very close to the source. He was one of the Belgacom employees responsible for testing out various early ADSL modems at home, so our dialup method changed frequently. I do remember that we too were blessed with &ldquo;The Frog&rdquo;: the Alcatel <a href="https://www.computinghistory.org.uk/det/36102/Alcatel-Stingray-ADSL-Modem/">&lsquo;Stingray&rsquo; ADSL SpeedTouch USB Modem</a> that looked like a frog or ray, depending on who you&rsquo;d ask:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/03/25-years-of-adsl-speed/stingray.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/03/25-years-of-adsl-speed/stingray.jpg" loading="lazy" title="The first iteration of the Alcatel SpeedTouch modem." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>The first iteration of the Alcatel SpeedTouch modem.</figcaption></figure>
</p>
<p>That lovely shape was capable of handling at most <code>8 Mbps</code> downstream but our cables/ISP was not ready to handle that just yet.</p>
<p>In September 2002, Belgacom announced they would further <a href="https://userbase.be/forum/viewtopic.php?p=124&amp;amp;hilit=snelheid+2002#p124">increased the ADSL bandwidth</a>:</p>
<blockquote>
<p>Snelheidsverhoging: alle Belgacom ADSL-abonnementen. De maximum downstreamsnelheid bedroeg sinds de lancering 750 Kbit/s (ADSL GO) en 1Mbit/s (ADSL Plus-Pro-Office-Premium).<br/>
Door de bijkomende investeringen en netwerkaanpassingen van Belgacom zal de meerderheid van de klanten pieksnelheden kunnen halen tot <code>3 Mbit/s</code>. Deze werkzaamheden zullen vermoedelijk voltooid zijn in het eerste kwartaal van 2003.</p>
</blockquote>
<p>Three whoppin&rsquo; megabits (not bytes) per second! Can you imagine that? I guess you can given the current average download speeds of&hellip; Wait, let me check <a href="https://www.speedtest.net/">speedtest.net</a>&hellip; <code>75 MBps</code> or, in other words, <strong>25 times faster</strong> than the bleeding-edge 2003 speeds<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. Try streaming your favourite YouTube video with a few megabits per second. YouTube didn&rsquo;t exist until two years later (2005). Perspectives change.</p>
<p>In that statement they mention they have 400k customers. Given the widespread adoption of internet in Belgium, that number can be safely multiplied by ten nowadays.</p>
<p>The Skynet ISP that was bought up by Belgacom and hosted our very first personal homes under <code>users.skynet.be</code> provided a monthly limit of <code>10 GB</code>. According to Belgacom in that same announcement, only a tiny portion of their users effectively hit that limit. Nowadays, everyone is accustomed to &ldquo;stream whatever, whenever! YOLO!&rdquo;. Back then, speeds were &ldquo;high&rdquo;, but we still had to be mindful of the stuff we downloaded each month, especially when <a href="/post/2025/10/i-owe-warez-for-properly-discovering-crpgs/">wading through newsgroups looking for shady new releases</a> Perspectives change.</p>
<p>I wonder if my dad kept a list of the routing hardware we burned through in those late nineties/early noughties. All I can recall is that it was <em>a lot</em>. Since he was employed by the national telecom company that only really was (and still is) rivalled by a single other company&mdash;Telenet&mdash;we never tried the alternative. Nowadays, multiple &ldquo;shadow&rdquo; ISPs exist like Orange, Mobile Vikings, and Scarlet that hire the Proximus cable network. Proximus is the rebranding and full privatisation of Belgacom that was the rebranding of the institute  RTT (<em>Regie voor Telegraaf en Telefoon</em>&mdash;or, as my dad would call it, <em>Rap Terug Thuis</em>).</p>
<p>Unfortunately, the Web Archive never crawled all <code>users.skynet.be</code> homes and I neglected to backup whatever my dad uploaded on there so our <code>bk231547</code> stuff is forever gone. I regret taking only a single screenshot of my download speed, so I cannot repeat this enough: <strong>archive your stuff</strong>! That&rsquo;s also the oldest screenshot of my machine/OS I have; the <a href="/post/2020/11/desktop-screenshots-of-olde/">other desktop screenshots</a> are from 2004+. This blog post is just an excuse to get that image under the <code>brainbaking.com</code> moniker.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>According to <a href="https://www.meter.net/stats/country/belgium/#:~:text=Providing%20internet%20speed%20test%20service,32">meter.net historical speed tests results</a>, only five years ago, for Belgium, that average was <code>50 MBps</code>. Does this mean that in five years it&rsquo;ll be on average <code>1 GBps</code>? That&rsquo;s more than a CD-ROM in less than a second. Perspectives change. In twenty more years, nobody will remember what a CD-ROM even is. At work I hit <code>280 MBps</code>.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/adsl">adsl</a> /
                  <a href="https://brainbaking.com/tags/screenshots">screenshots</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 11 March 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: 25%20Years%20Of%20ADSL%20Speed">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>A Note On Shelling In Emacs</title>
      <link>https://brainbaking.com/post/2026/03/a-note-on-shelling-in-emacs/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Sun, 08 Mar 2026 07:20:27 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/03/a-note-on-shelling-in-emacs/</guid>
      
        
          <category domain="https://brainbaking.com/tags/emacs">emacs</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>As you no doubt know by now, we Emacs users have the <em>Teenage Mutant Ninja Power</em>. Expert usage of a <em>Heroes in a Hard Shell</em> is no exception. Pizza Time!</p>
<p>All silliness aside, the plethora of options available to the Emacs user when it comes to executing shell commands in &ldquo;terminals&rdquo;&mdash;real or fake&mdash;can be overwhelming. There&rsquo;s <code>shell</code>, <code>eshell</code>, <code>comint</code>, <code>term</code>, <code>ansi-term</code>, and then third party packages further expand this with <code>eat</code>, <code>vterm</code>, &hellip; The most interesting shell by far is the one that&rsquo;s not a shell but a Lisp REPL that looks like a shell: <strong>Eshell</strong>. That&rsquo;s the one I would like to focus one now.</p>
<p>But first: why would you want to pull in your <code>$TERM</code> work inside Emacs? The more you get used to it, the easier it will be to answer this: because all your favourite text selection, manipulation, &hellip; shortcuts will be available to you. Remember how stupendously difficult it is to just shift-select and yank/copy/whatever you want to call it text in your average terminal emulator? That&rsquo;s why. In Emacs, I can move around the point in that shell buffer however I want. I can search inside that buffer&mdash;since everything is just text&mdash;however I want. Even the easiest solution, just firing off your vanilla <code>shell</code>, that in my case runs Zsh, will net you most of these benefits.</p>
<p>And then there&rsquo;s Eshell: the Lisp-powered shell that&rsquo;s not really a shell but does a really good job in pretending it is. With Eshell you can interact with everything else you&rsquo;ve got up and running inside Emacs. Want to dump the output to a buffer at point? <code>./command.sh &gt;&gt;&gt; #&lt;mybuffer&gt;</code>. Want to see what&rsquo;s hooked into LSP mode? <code>echo $lsp-mode-hook</code>. Want to create your own commands? <code>(defun eshell/mycmd(arg))</code> and then just <code>mycmd dir/somefile</code>. Eshell makes it possible to mix Elisp and your typical Bash-like syntax.</p>
<p>The only problem is that Eshell isn&rsquo;t a true terminal emulator and doesn&rsquo;t support full-screen terminal programs and fancy TTY stuff. That&rsquo;s where <a href="https://codeberg.org/akib/emacs-eat">Eat: Emulate A Terminal</a> comes in. The Eat minor mode is compatible with Eshell: as soon as you execute a command-line program, it takes over. There are four input modes available to you for sending text to the terminal in case your Emacs shortcuts clash with those of the program. It solves all my problems: long-running processes like <code>bun run vitest</code> work; interactive programs like <a href="https://github.com/dundee/gdu/">gdu</a> and <code>composer create-project</code> work, &hellip;</p>
<hr>
<p>Yet the default Eshell mode is a bit bare-bones, so obviously I pimped the hell out of it. Here&rsquo;s a short summary of what my <a href="https://codeberg.org/wouterg/bakemacs">Bakemacs shelling.el config</a> alters:</p>
<ul>
<li>Customize <code>eshell-banner-message</code> at startup</li>
<li>Integrate <code>consult-history</code>: <code>M-r</code> replaces the default &ldquo;i-search backward&rdquo;. This is a gigantic improvement as Consult lets me quickly <em>and</em> visually finetune my search through all previous commands. These are also saved on exit (increase <code>eshell-history-size</code> while you&rsquo;re at it).</li>
<li>Improve <code>C-g</code> to immediately kill a process or deactivate the mark.</li>
<li>The big one: replace <code>pcomplete</code> with a custom completion-at-point system (see below).</li>
<li>When typing a path like <code>cd dir1/dir2</code>, backspace kills the entire last <code>/dir2</code> directory instead of just a single character. This works just like <code>find-file</code> now and speeds up my path commands by a lot.</li>
<li>Bind a shortcut to a convenient function that sends input to Eshell &amp; executes it.</li>
<li>Change the prompt into a simple <code>$ </code> to more easily copy-paste things in and out of that buffer. This integrates with <code>consult-outline</code> meaning I can very easily jump back to a previous command and its output!</li>
<li>Move most of the prompt info to the modeline such as the working directory and optional Git information.</li>
<li>Make <code>ls</code> sort by directories first to align it with my Dired change: <code>--group-directories-first</code> doesn&rsquo;t work as <code>eshell/ls</code> is an Elisp function.</li>
<li>Bind a shortcut to a convenient pop-to-eshell buffer &amp; new-eshell-tab function that takes the current perspective into account.</li>
<li>Make <code>cat</code> font-lock so it outputs with syntax highlighting.</li>
<li>Create a <code>bcd</code> command: <code>bcd &lt;#somebuf&gt;</code> does a <code>cd</code> into the directory of that buffer&rsquo;s contents.</li>
<li>Create a <code>rcd</code> command: stay on the current Tramp host but go to an absolute path. Using <code>cd /</code> will always navigate to your local HDD root so <code>rcd /</code> is the same as <code>cd /</code> if you&rsquo;re used to <code>ssh</code> instead of Emacs&rsquo;s Tramp.</li>
<li>Give Eshell dedicated space on the top as a side window to quickly call and dismiss with <code>(window-toggle-side-windows)</code>.</li>
<li>Customise more shortcuts to help with navigation. UP and DOWN (or <code>C-p</code>/<code>C-n</code>) just move the point, even at the last line, which never works in a conventional terminal. <code>M-p</code> and <code>M-n</code> cycle through command history.</li>
<li>Customise more aliases of which the handy ones are:
<ul>
<li><code>alias ff view-file $1</code> &amp; <code>alias fe find-file $1</code></li>
<li><code>alias cls clear 1</code></li>
<li><code>alias l ls -lah</code></li>
<li><code>alias d dired $1</code></li>
<li><code>alias f fd --color=always $*</code></li>
</ul>
</li>
</ul>
<p>Here&rsquo;s a short video demonstrating some of these features:</p>
<figure class="video-mask">
  <video width="100%" controls preload="metadata" aria-label="Eshell with an autocomplete window on top, the Markdown source of this blog post on bottom. Note the custom modeline info on top displaying the working directory.">
	<source src="/post/2026/03/a-note-on-shelling-in-emacs/eshell.mp4" type="video/mp4">
	Your browser does not support HTML video. Here's a link to the MP4-encoded video instead: <a href="/post/2026/03/a-note-on-shelling-in-emacs/eshell.mp4">/post/2026/03/a-note-on-shelling-in-emacs/eshell.mp4</a>.
  </video>
  <figcaption>
    Eshell with an autocomplete window on top, the Markdown source of this blog post on bottom. Note the custom modeline info on top displaying the working directory.
  </figcaption>
</figure>

<p>The reason for ditching <code>pcomplete</code> is simple: it&rsquo;s extremely slow over Tramp. Just pressing TAB while working on a remote machine takes six seconds to load a simple directory structure of a few files, what&rsquo;s up with that? I&rsquo;ve been profiling my Tramp connections and connecting to the local NAS over SSH is very slow because apparently <code>pcomplete</code> can&rsquo;t do a single <code>ls</code> and process that info into an autocomplete pop-up.</p>
<p>Yet I wanted to keep my Corfu/Cape behaviour that I&rsquo;m used to working in other buffers so I created my own completion-at-point-function that dispatches smartly to other internals:</p>
<ul>
<li>If the point is at command and &hellip;
<ul>
<li>it&rsquo;s a path: direct to <code>cape-file</code>.</li>
<li>it&rsquo;s a local dir cmd: wrap <code>cape-file</code> to filter on dirs only. Cape is dumb and by default also returns files.</li>
<li>it&rsquo;s an elisp func starting with <code>(</code>: complete that with <code>elisp-completion-at-point</code>.</li>
<li>else it&rsquo;s a shell command. These are now cached by expanding all folders from <code>$PATH</code> with a fast Perl command.</li>
</ul>
</li>
<li>If the point is at the argument and &hellip;
<ul>
<li>it&rsquo;s a variable starting with <code>$</code>: create a super CAPF to lisp <em>both</em> Elisp and <code>$ENV</code> vars (also cached)!</li>
<li>it&rsquo;s a buffer or process starting with <code>#&lt;</code>: fine, here <code>pcomplete</code>, can you handle this? Are you sure?</li>
<li>it&rsquo;s a remote dir cmd (e.g. <code>/protocol:</code>): <code>pcomplete</code>.</li>
<li>it&rsquo;s (still) a local dir cmd: see above.</li>
<li>In all other cases, it&rsquo;s probably a file argument: fall back to just <code>cape-file</code>.</li>
</ul>
</li>
</ul>
<p>I&rsquo;m sure there are holes in this logic but so far it&rsquo;s been working quite well for me. Cape is very fast as is my own shell command/variable cache. The added bonus is having access to nerd icons. I used <code>:annotation-function</code> to distinguish Elisp vars from external shell vars in case you&rsquo;re completing <code>$</code> as there are only a handful shell variables and a huge number of Elisp ones.</p>
<p>I also learned the hard way that you should cache stuff listed in your modeline as this gets continuously redrawn when scrolling through your buffer:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-elisp" data-lang="elisp"><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>doom-modeline-def-segment bb/doom-modeline-pwd-segment <span style="color:#eceff4">()</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a3be8c">&#34;The cached modeline segment of bb/doom-modeline-pwd&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span><span style="color:#81a1c1">unless</span> <span style="color:#eceff4">(</span>string= bb/doom-modeline--pwd-cache-dir default-directory<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">(</span>bb/doom-modeline-pwd-update<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>    bb/doom-modeline--pwd-cache-out<span style="color:#eceff4">)</span>
</span></span></code></pre></div><p>The details can be found in <code>theme.el</code>&mdash;just to be on the safe side, I disabled Git/project specific stuff in case <code>file-remote-p</code> is <code>t</code> to avoid more Tramp snailness.</p>
<p>The last cool addition: make use of Emacs&rsquo;s new <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Symbol-Completion.html">Completion Preview mode</a>&mdash;but only for recent commands. That means I temporarily remap <code>completion-at-point-functions</code> as soon as TAB is pressed. Otherwise, the preview might also show things that I don&rsquo;t really want. The video showcases this as well.</p>
<p>Happy (e)sheling!</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/emacs">emacs</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 8 March 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: A%20Note%20On%20Shelling%20In%20Emacs">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Favourites of February 2026</title>
      <link>https://brainbaking.com/post/2026/03/february-2026/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Wed, 04 Mar 2026 09:20:00 +0200</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/03/february-2026/</guid>
      
        
          <category domain="https://brainbaking.com/tags/metapost">metapost</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>A sudden burst of Japanese cherry flowers sparkling in the sun brings much-needed lightheartedness into our late February lives. Before we know it, the garden will be littered with these little pink petals, and the very short blossom season will be behind us. Our cherry tree always had the tendency of being early, eager, and then running out of steam. It&rsquo;s weird to have temperatures reach almost twenty degrees Celsius while a few weeks ago it was still freezing. No wonder the tree is confused.</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/03/february-2026/cherryblossom.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/03/february-2026/cherryblossom.jpg" loading="lazy" title="A deep blue sky overlooking the cherry blossom in our garden." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>A deep blue sky overlooking the cherry blossom in our garden.</figcaption></figure>
</p>
<p>In case you were wondering: no, this weather is not normal: it&rsquo;s yet another noticeable temperature spike. Our local (retired) weatherman Frank <a href="https://www.frankdeboosere.be/vragen/vraag231.php">explains the spikes</a> and provides proof towards upwards instead of downwards temperature peaks (in Dutch). At this point, I&rsquo;m just grateful for the much needed sunshine.</p>
<p>Previous month: <a href="/post/2026/02/january-2026/">January 2026</a>.</p>
<h2 id="games-ive-played">Games I&rsquo;ve played</h2>
<p>I&rsquo;m giving up on Ruffy. It&rsquo;s just unplayable on the Switch which is a damn shame as the N64 throwback collect-a-thon 3D platformer with rough edges looks like the perfect fit for the Switch&mdash;and it should be. It&rsquo;s far from a demanding game so the only conclusion I can make is that it was poorly optimized for my platform of choice. And I bought the Limited Run Games physical version&hellip;</p>
<p>Instead, I&rsquo;ve turned to <a href="https://store.steampowered.com/app/4293620/GOBLiiNS6/">Gobliins 6</a>, a quirky French adventure game made by just one guy. It has equally frustrating moments and rough edges but I can more easily forgive it for its faults: it&rsquo;s Gobliins! The fact that after 34 years (!!), there&rsquo;s an official sequel to <em>Gobliins 2: The Prince Buffoon</em> is just crazy. I have fond memories of that game as I used to play it together with my dad on his brand new 486. I didn&rsquo;t understand English nor was I able to solve most time-based puzzles but the Gobliins exposure got permanently burned into my brain&mdash;so much so that its pixel art became a basis for my <a href="https://jefklakscodex.com/">retro blog</a>.</p>
<p>Even though it&rsquo;s advertised to be a Windows-only game, ScummVM has got you covered:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/03/february-2026/gob6.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/03/february-2026/gob6.jpg" loading="lazy" title="In the Fox Bar just after Fingus reunites with Winkle." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>In the Fox Bar just after Fingus reunites with Winkle.</figcaption></figure>
</p>
<p>If Gob6 sells well, Pierre might go ahead and make Gob7 a direct sequel to <em>Goblins Quest 3</em>. Fingus&mdash;err, fingers crossed for Blount&rsquo;s return!</p>
<h2 id="selected-blog-posts">Selected (blog) posts</h2>
<ul>
<li>Let&rsquo;s start with more Gobliins stuff: Michael Klamerus <a href="https://virtualmoose.org/2026/02/21/a-brief-history-of-gobliiins/">summarized the history of the games</a> to bring you up to speed.</li>
<li>Mark self-hosted a book library tool <a href="https://www.markpitblado.me/blog/selfhost-an-ebook-library-with-kobo-and-library-integration/">called Booklore</a> that links to your Kobo account.</li>
<li>Michał Sapka nuances the &ldquo;<a href="https://michal.sapka.pl/weblog/2026/what-i-mean-when-i-say-that-i-hate-genai/">I hate genAI</a>&rdquo; screams of late.</li>
<li>Elmine Wijnia writes in De Stadsbron (in Dutch) <a href="https://destadsbron.nl/nl/OpenStreetMap_is_het_eindelijk_goed_genoeg_om_Google_Maps_te_verwijderen">about OpenStreetMap</a> and wonders whether we can finally get rid of Google Maps.</li>
<li>Space Panda continues <a href="https://spacepanda.se/articles/toxic_pages.html">fighting against bots on their site</a>. It&rsquo;s fun to see the bot honey pots working but aren&rsquo;t we now wasting even more resources doing nothing?</li>
<li>Arjan van der Gaag shares how he <a href="https://arjanvandergaag.nl/blog/using-yasnippet-in-emacs.html">uses snippets in Emacs with Yasnippet</a>. I think I&rsquo;m going to migrate to Tempel.el instead, but that&rsquo;s for another story.</li>
<li>There&rsquo;s an interesting thread on ResetERA about <a href="https://www.resetera.com/threads/old-games-that-have-yet-to-be-replicated.1429336/">old games that have yet to be replicated</a>. Someone mentioned <em>Magic the Gathering: Shandalar</em>!</li>
<li>Jeff Kaufman shared a photo of <a href="https://www.jefftk.com/p/ending-parking-space-saving">two chairs placed on a snowy parking space</a>. Apparently, that&rsquo;s customary to &ldquo;reserve&rdquo; your spot. I&rsquo;ve never seen such a ridiculous selfish act in a while. Is this a typical USA thing?</li>
<li>Wolfgang Ziegler continues his Game Boy modding spree, this time with <a href="https://wolfgang-ziegler.com/blog/game-boy-ips-mod">an IPS screen mod</a>. The result looks stunning!</li>
<li>Hamilton Greene shares <a href="https://hamy.xyz/blog/2026-01_missing-programming-language">his adventure with programming languages</a> and talks about the &ldquo;missing language&rdquo;. I don&rsquo;t agree with his stance but it&rsquo;s interesting nonetheless.</li>
<li>Scott Nesbitt <a href="https://scottnesbitt.online/setup.html">writes on an old Singer desk</a>!</li>
<li>Greg Newman organized the <a href="https://gregnewman.io/blog/emacs-carnival-2025-07-writing-experience/">Emacs writing carnival challenge</a> and shares links of others&rsquo; writing experiences with their favourite editor (25 entries). Greg also designed the Org-mode unicorn logo!</li>
<li>Speaking of which; James Dyer shows <a href="https://www.emacs.dyerdwelling.family/emacs/20240827210257-emacs--enhancing-eshell-to-be-more-fishy/">his streamlined Eshell configuration</a> that inspired me to hack together my own. To be continued in a future blog post, whether you&rsquo;ll like it or not.</li>
<li>Markus Dosch shares his <code>$SHELL</code> journey <a href="https://www.markusdosch.com/2022/10/customizing-my-shell-from-bash-to-zsh-to-fish/">from Bash to Zsh and now Fish</a>. I&rsquo;m slowly but surely getting fed up with Zsh and all those semi-required plugins so I might switch to Fish as well. But actually&hellip; I switched to Eshell. You didn&rsquo;t see that coming, did you?</li>
<li>Henrique Dias <a href="https://hacdias.com/2026/02/21/redesign/">redesigned his website</a> and the result looks very good, congrats! I especially like the fact that the new theme takes advantage of wide screens (note to self).</li>
<li>Michael Stapelberg <a href="https://michael.stapelberg.ch/posts/2026-01-04-wayland-sway-in-2026/">tried out Wayland</a> and concludes that it&rsquo;s still not ready yet. X11 is not dead yet.</li>
</ul>
<h2 id="other-random-links">Other random links</h2>
<ul>
<li>I found the <a href="https://lfx.rushstack.io/pages/concepts/pnpm_lockfile/">Lockfile Explorer documentation</a> on pnpm lockfiles to be very thorough and insightful.</li>
<li><a href="https://github.com/jeffvli/feishin">Feishin</a> is a modern rewrite of Sonixd, a Subsonic-compatible music desktop client that looks promising. I&rsquo;ve been a Navidrome user for five years now but am looking for a good client that supports offline playback. <a href="https://github.com/jeffvli/feishin/issues/47">It doesn&rsquo;t (yet)</a>.</li>
<li>Related: the <a href="https://www.symfonium.app/">Symfonium</a> Android app that does do caching. I&rsquo;m using Substreamer for that and that works well enough.</li>
<li><a href="https://github.com/Genymobile/scrcpy/">scrcpy</a> is a tiny Android-based screen sharing tool that I use in classes to project my Android screen. Handy!</li>
<li>Another tool for presenting: <a href="https://github.com/keycastr/keycastr">keycastr</a> helped me teach students how to use shortcuts.</li>
<li>I might have already shared this, but you should <a href="https://github.com/astral-sh/uv">replace pip with uv</a>: it&rsquo;s +10x faster and can also manage your project&rsquo;s <code>venv</code>.</li>
<li>Oh, and in case you haven&rsquo;t already, <a href="https://bun.com/docs/pm/cli/install">replace npm with bun</a>.</li>
<li>Discord&rsquo;s age verification facial recognition tool <a href="https://github.com/promptpirate-x/discord-id-bypass-tool">got bypassed pretty fast</a>&mdash;rightfully so.</li>
</ul>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/metapost">metapost</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 4 March 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Favourites%20of%20February%202026">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>An Album For Every Year Of My Life</title>
      <link>https://brainbaking.com/post/2026/03/an-album-for-every-year-of-my-life/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Mon, 02 Mar 2026 15:00:10 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/03/an-album-for-every-year-of-my-life/</guid>
      
        
          <category domain="https://brainbaking.com/tags/music">music</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>Inspired by Tom&rsquo;s <a href="https://record.club/ttntm/lists/album-for-every-year-of-life">One Album for Every Year of Life</a> compilation, Robert <a href="https://schafe-sind-bessere-rasenmaeher.de/posts/an-album-for-every-year/">created his own</a> list. It&rsquo;s been a while since I last published a list related to music so here&rsquo;s my own that should contain 40 items. This was a much more challenging exercise than I initially thought. It took me almost an entire day to compile the list and it still contains holes. In any case, scrolling through the list is another way to reveal the <a href="/post/2024/09/a-historical-summary-of-my-music-tastes/">evolution of my musical taste</a>.</p>
<p>Each row includes a sample track I picked out for your listening pleasure. Every link redirects to YouTube to keep things as simple as possible. The idea is that these samples make the list a bit more interesting for people who are looking into expanding their musical tastes.</p>
<h2 id="the-eighties">The Eighties</h2>
<p>
<figure><a href="https://brainbaking.com/post/2026/03/an-album-for-every-year-of-my-life/80s.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/03/an-album-for-every-year-of-my-life/80s.jpg" loading="lazy" title="Album art: the eighties." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>Album art: the eighties.</figcaption></figure>
</p>
<small>
<table>
  <thead>
      <tr>
          <th>Year</th>
          <th>Artist</th>
          <th>Title</th>
          <th>Genre</th>
          <th>Sample</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>1985</td>
          <td>Iron Maiden</td>
          <td>Live After Death</td>
          <td>Heavy Metal</td>
          <td><a href="https://www.youtube.com/watch?v=inKtFIKe68o">2 Minutes To Midnight</a></td>
      </tr>
      <tr>
          <td>1986</td>
          <td>Genesis</td>
          <td>Invisible Touch</td>
          <td>Pop Rock</td>
          <td><a href="https://www.youtube.com/watch?v=C19InkgElIE">Land of Confusion</a></td>
      </tr>
      <tr>
          <td>1987</td>
          <td>Michael Jackson</td>
          <td>Thriller</td>
          <td>Pop</td>
          <td><a href="https://www.youtube.com/watch?v=h_D3VFfhvs4">Smooth Criminal</a></td>
      </tr>
      <tr>
          <td>1988</td>
          <td>Pet Shop Boys</td>
          <td>Introspective</td>
          <td>Synth-Pop</td>
          <td><a href="https://www.youtube.com/watch?v=wDe60CbIagg">You Were Always On My Mind</a></td>
      </tr>
      <tr>
          <td>1989</td>
          <td>Duran Duran</td>
          <td>Decade</td>
          <td>New Wave</td>
          <td><a href="https://www.youtube.com/watch?v=qtAYUnaA9Mg">Girls on Film</a></td>
      </tr>
  </tbody>
</table>
</small>
<p>Very easy to compile. Genres: metal, pop/rock, new wave/synth.</p>
<p>I love eighties music as is apparent by having the GTA Vice City radio stations on repeat for years and years. I kind of cheated by including two compilation albums in this list of which <em>Decade</em> is the first: all the good stuff is from before 1985. There&rsquo;s so much great new wave/synth pop music out there, but I have yet to discover the full length albums as I usually aim for the more popular individual tracks. When I&rsquo;m in the mood, I appreciate the odd metal/hard rock track, but as will become clear in the next section, it&rsquo;s not my main genre.</p>
<h2 id="the-nineties">The Nineties</h2>
<p>
<figure><a href="https://brainbaking.com/post/2026/03/an-album-for-every-year-of-my-life/90s.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/03/an-album-for-every-year-of-my-life/90s.jpg" loading="lazy" title="Album art: the nineties." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>Album art: the nineties.</figcaption></figure>
</p>
<small>
<table>
  <thead>
      <tr>
          <th>Year</th>
          <th>Artist</th>
          <th>Title</th>
          <th>Genre</th>
          <th>Sample</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>1990</td>
          <td>Public Enemy</td>
          <td>Fear of a Black Planet</td>
          <td>Political Rap</td>
          <td><a href="https://www.youtube.com/watch?v=m5t7n-EeE1o">Welcome to Terrordome</a></td>
      </tr>
      <tr>
          <td>1991</td>
          <td>Genesis</td>
          <td>We Can&rsquo;t Dance</td>
          <td>Pop Rock</td>
          <td><a href="https://www.youtube.com/watch?v=hGI2d31M7Ns">I Can&rsquo;t Dance</a></td>
      </tr>
      <tr>
          <td>1992</td>
          <td>Middle of the Road</td>
          <td>The Collection</td>
          <td>Pop</td>
          <td><a href="https://www.youtube.com/watch?v=zjkyc3eWO_A">Sacramento</a></td>
      </tr>
      <tr>
          <td>1993</td>
          <td>Wu-Tang Clan</td>
          <td>Enter The Wu-tang (36 Chambers)</td>
          <td>Hip-Hop</td>
          <td><a href="https://www.youtube.com/watch?v=RrsJj_eUJS4">Tearz</a></td>
      </tr>
      <tr>
          <td>1994</td>
          <td>Gravediggaz</td>
          <td>6 Feet Deep</td>
          <td>Horrorcore</td>
          <td><a href="www.youtube.com/watch?v=2jWLIQtnJbY">1-800 Suicide</a></td>
      </tr>
      <tr>
          <td>1995</td>
          <td>GZA</td>
          <td>Liquid Swords</td>
          <td>Hip-Hop</td>
          <td><a href="https://www.youtube.com/watch?v=5qDhaWqeNMc">Shadowboxin&rsquo;</a></td>
      </tr>
      <tr>
          <td>1996</td>
          <td>2Pac</td>
          <td>All Eyez On Me</td>
          <td>G-Funk</td>
          <td><a href="https://www.youtube.com/watch?v=H1HdZFgR-aA">All Eyez On Me</a></td>
      </tr>
      <tr>
          <td>1997</td>
          <td>Jedi Mind Tricks</td>
          <td>The Psycho-Social, Chemical, Biological &hellip;</td>
          <td>Underground Rap</td>
          <td><a href="https://www.youtube.com/watch?v=QSh-8XvjIyw">The Winds Of War</a></td>
      </tr>
      <tr>
          <td>1998</td>
          <td>Outkast</td>
          <td>Aquemini</td>
          <td>Dirty South</td>
          <td><a href="https://www.youtube.com/watch?v=tMZ5TTDM-Jk">Da Art of Storytellin&rsquo;</a></td>
      </tr>
      <tr>
          <td>1999</td>
          <td>Handsome Boy Modelling School</td>
          <td>So&hellip; How&rsquo;s Your Girl?</td>
          <td>Underground Rap</td>
          <td><a href="https://www.youtube.com/watch?v=gjEmwvsIhuE">The Truth</a></td>
      </tr>
  </tbody>
</table>
</small>
<p>Very easy to compile. Genres: rap overload!</p>
<p>My music nineties are heavily dictated by hip-hop super-groups of which Wu-Tang&rsquo;s <em>Enter The Wu-Tang</em> is the most influential. Since then, I&rsquo;ve been a devout Wu follower as is apparent from the spin-offs (<em>Gravediggaz</em>) and solo albums (<em>Liquid Swords</em>) on this list. Beyond a good doze of underground rap, there&rsquo;s also the king of the G-Funk. I first had the new king listed on 1999 (<em>Dr Dre: Chronic 2001</em>) but Dan The Automator&rsquo;s weird stuff takes more priority.</p>
<p>The few non-rap albums are either compilations (<em>Middle of the Road</em>) that my mother brainwashed me with or late pop rock goodies (I love <em>Genesis</em> but hate their slow songs).</p>
<h2 id="the-noughties">The Noughties</h2>
<p>
<figure><a href="https://brainbaking.com/post/2026/03/an-album-for-every-year-of-my-life/00s.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/03/an-album-for-every-year-of-my-life/00s.jpg" loading="lazy" title="Album Art: the noughties." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>Album Art: the noughties.</figcaption></figure>
</p>
<small>
<table>
  <thead>
      <tr>
          <th>Year</th>
          <th>Artist</th>
          <th>Title</th>
          <th>Genre</th>
          <th>Sample</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>2000</td>
          <td>Swollen Members</td>
          <td>Bad Dreams</td>
          <td>Underground Rap</td>
          <td><a href="www.youtube.com/watch?v=6bpX8MFTahg">Fuel Injected</a></td>
      </tr>
      <tr>
          <td>2001</td>
          <td>Immortal Technique</td>
          <td>Revolutionary Vol. 1</td>
          <td>Political Rap</td>
          <td><a href="https://www.youtube.com/watch?v=TjdV7ARe8fE">Top of the Food Chain</a></td>
      </tr>
      <tr>
          <td>2002</td>
          <td>Jurassic 5</td>
          <td>Power in Numbers</td>
          <td>Alternative Rap</td>
          <td><a href="https://www.youtube.com/watch?v=YietowKD0vo">A Day At The Races</a></td>
      </tr>
      <tr>
          <td>2003</td>
          <td>Hieroglyphics</td>
          <td>Full Circle</td>
          <td>Alternative Rap</td>
          <td><a href="https://www.youtube.com/watch?v=KepFlJ0h6uw">Classic</a></td>
      </tr>
      <tr>
          <td>2004</td>
          <td>Madvillian</td>
          <td>Madvilliany</td>
          <td>Underground Rap</td>
          <td><a href="https://www.youtube.com/watch?v=FoasIcgem0w">Meatgrinder</a></td>
      </tr>
      <tr>
          <td>2005</td>
          <td>Gorillaz</td>
          <td>Demon Days</td>
          <td>Pop Rap</td>
          <td><a href="https://www.youtube.com/watch?v=HyHNuVaZJ-k">Feel Good Inc.</a></td>
      </tr>
      <tr>
          <td>2006</td>
          <td>Ratatat</td>
          <td>Classics</td>
          <td>Alt. Rock/Electronic</td>
          <td><a href="https://www.youtube.com/watch?v=BcoPKWzLjrE">Loud Pipes</a></td>
      </tr>
      <tr>
          <td>2007</td>
          <td>Dubmood</td>
          <td>Lost Floppies Vol. 2</td>
          <td>Electronic Chiptune</td>
          <td><a href="https://www.youtube.com/watch?v=Dwq9juiH28M">Chiptune</a></td>
      </tr>
      <tr>
          <td>2008</td>
          <td>Mark Farina</td>
          <td>Mushroom Jazz 6</td>
          <td>Electronic Downtempo</td>
          <td><a href="https://www.youtube.com/watch?v=YuTDP7IPAbA">Mixtape</a></td>
      </tr>
      <tr>
          <td>2009</td>
          <td>Dual Core</td>
          <td>Next Level</td>
          <td>Hip-Hop</td>
          <td><a href="https://www.youtube.com/watch?v=fwcmQ7Dl5d0">Life&rsquo;s Work</a></td>
      </tr>
  </tbody>
</table>
</small>
<p>Moderately difficult to compile. Genres: alternative/underground rap, electronic.</p>
<p>I faced difficulties filling the latter half of the noughties as my musical brain was stuck in either the golden age of rap (the nineties) or the golden age of synth music (the eighties). Still, this decade includes some of the best albums ever made (<em>Madvilliany</em>) and great super-group deliverables that I&rsquo;ll listen to any day (<em>Jurassic 5</em> &amp; <em>Hieroglyphics</em>).</p>
<p>Much later, I discovered I also love chiptune music and electronic (rock). The inclusions here are recent aquisitions: in the noughties, my mind was still very much set on rap.</p>
<h2 id="the-black-hole">The Black Hole</h2>
<p>
<figure><a href="https://brainbaking.com/post/2026/03/an-album-for-every-year-of-my-life/10s.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/03/an-album-for-every-year-of-my-life/10s.jpg" loading="lazy" title="Album art: the 2010s." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>Album art: the 2010s.</figcaption></figure>
</p>
<small>
<table>
  <thead>
      <tr>
          <th>Year</th>
          <th>Artist</th>
          <th>Title</th>
          <th>Genre</th>
          <th>Sample</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>2010</td>
          <td>RJD2</td>
          <td>The Colossus</td>
          <td>Hip-Hop</td>
          <td><a href="https://www.youtube.com/watch?v=1BJ18RjJZ18">Let There Be Horns</a></td>
      </tr>
      <tr>
          <td>2011</td>
          <td>The Keep</td>
          <td>The Keep EP</td>
          <td>Rock</td>
          <td><a href="https://www.youtube.com/watch?v=6VPRhUjDwMg">Slow in Reverse</a></td>
      </tr>
      <tr>
          <td>2012</td>
          <td>Bossfight</td>
          <td>Caps On, Hats Off</td>
          <td>Electronic Chiptune</td>
          <td><a href="https://www.youtube.com/watch?v=PteZ2d3UeTo">Jack Russel</a></td>
      </tr>
      <tr>
          <td>2013</td>
          <td>Mega Ran &amp; Sammus</td>
          <td>Castlevania: The Nocturnal Cantata</td>
          <td>Hip-Hop</td>
          <td><a href="https://www.youtube.com/watch?v=jwTtqU-3Q-M">100 Years</a></td>
      </tr>
      <tr>
          <td>2014</td>
          <td>Starbomb</td>
          <td>Player Select</td>
          <td>Rock</td>
          <td><a href="https://www.youtube.com/watch?v=35EOUcLzfcw">Smash!</a></td>
      </tr>
      <tr>
          <td>2015</td>
          <td>Keiji Yamagishi</td>
          <td>Retro-Active Pt. 1</td>
          <td>Electronic Chiptune</td>
          <td><a href="https://www.youtube.com/watch?v=QeX-gdJrcno">First Contact</a></td>
      </tr>
      <tr>
          <td>2016</td>
          <td>Ancient Astronauts</td>
          <td>Into Bass &amp; Time</td>
          <td>Hip-Hop</td>
          <td><a href="https://www.youtube.com/watch?v=-f0MTDcCVgc">Still a Soldier</a></td>
      </tr>
      <tr>
          <td>2017</td>
          <td>???</td>
          <td>???</td>
          <td>???</td>
          <td>???</td>
      </tr>
      <tr>
          <td>2018</td>
          <td>Vulfpeck</td>
          <td>Hill Climber</td>
          <td>Funk/Soul</td>
          <td><a href="https://www.youtube.com/watch?v=Nq5LMGtBmis">It Gets Funkier IV</a></td>
      </tr>
      <tr>
          <td>2019</td>
          <td>The Heavy</td>
          <td>Sons</td>
          <td>Rock/Funk</td>
          <td><a href="https://www.youtube.com/watch?v=jLAUDtCqv48">The Thief</a></td>
      </tr>
  </tbody>
</table>
</small>
<p>Difficult to compile. Genres: hip-hop, electronic, funk.</p>
<p><em>Mega Ran</em> is probably my biggest discovery from this time: an MC rapping about video games and remixing classic video game soundtracks? Here&rsquo;s my wallet, where do I sign? More chiptune electronic starts finding its way into my playlist feed, with Cory Wong and his Vulfpeck as the latest funky additions.</p>
<h2 id="contemporary-times">Contemporary Times</h2>
<p>
<figure><a href="https://brainbaking.com/post/2026/03/an-album-for-every-year-of-my-life/20s.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/03/an-album-for-every-year-of-my-life/20s.jpg" loading="lazy" title="Album art: the 2020s." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>Album art: the 2020s.</figcaption></figure>
</p>
<small>
<table>
  <thead>
      <tr>
          <th>Year</th>
          <th>Artist</th>
          <th>Title</th>
          <th>Genre</th>
          <th>Sample</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>2020</td>
          <td>Don Luca</td>
          <td>C Mij Da</td>
          <td>Hip-Hop</td>
          <td><a href="https://www.youtube.com/watch?v=uOGRj4aakS0">Als Ik U Zeg</a></td>
      </tr>
      <tr>
          <td>2021</td>
          <td>Cory Wong</td>
          <td>Cory &amp; The Wongnotes</td>
          <td>Funk/Soul</td>
          <td><a href="https://www.youtube.com/watch?v=gdZkYxLLzWY">Heist</a></td>
      </tr>
      <tr>
          <td>2022</td>
          <td>Czarface</td>
          <td>Czarmageddon!</td>
          <td>Hip-Hop</td>
          <td><a href="https://www.youtube.com/watch?v=sfOPsty3jw4">Walk Thru Walls</a></td>
      </tr>
      <tr>
          <td>2023</td>
          <td>DJ Shadow</td>
          <td>Action Adventure</td>
          <td>Electronic/Hip-Hop</td>
          <td><a href="https://www.youtube.com/watch?v=OSoJadRZb9s">Witches Vs. Warlocks</a></td>
      </tr>
      <tr>
          <td>2024</td>
          <td>???</td>
          <td>???</td>
          <td>???</td>
          <td>???</td>
      </tr>
      <tr>
          <td>2025</td>
          <td>???</td>
          <td>???</td>
          <td>???</td>
          <td>???</td>
      </tr>
      <tr>
          <td>2026</td>
          <td>???</td>
          <td>???</td>
          <td>???</td>
          <td>???</td>
      </tr>
  </tbody>
</table>
</small>
<p>Impossible to compile. Genres: Hip-hop, funk, electronic.</p>
<p>Most albums I buy nowadays are released in the previous decade(s); I&rsquo;m a &ldquo;slow discoverer&rdquo; when it comes to contemporary music: hence the absence of entries in the years 2024, 2025, 2026. If you have any suggestion based on my taste laid out here please let me know.</p>
<p>I&rsquo;m happy to report that hardcore hip-hop is not dead yet. <em>Czarface</em> proves this&mdash;yet another Wu spin-off by original Wu member <em>Inspectah Deck</em> and the duo <em>7L &amp; Esoteric</em>. They consistently put out great comic book inspired stuff. I just learned about <em>Stress Eater</em>, a spin-off involving <em>Kool Keith</em>. Maybe that album should be on 2024 in a few months.</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/music">music</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 2 March 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: An%20Album%20For%20Every%20Year%20Of%20My%20Life">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Managing Multiple Development Ecosystem Installs</title>
      <link>https://brainbaking.com/post/2026/02/managing-multiple-dev-ecosystems/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Thu, 26 Feb 2026 10:22:24 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/02/managing-multiple-dev-ecosystems/</guid>
      
        
          <category domain="https://brainbaking.com/tags/containers">containers</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>In the past year, I occasionally required another Java Development Kit besides the usual one defined in <code>$JAVA_HOME</code> to build certain modules against older versions and certain modules against bleeding edge versions. In the <strong>Java</strong> world, that&rsquo;s rather trivial thanks to IntelliJ&rsquo;s project settings: you can just interactively click through a few panels to install another JDK flavour and get on with your life.</p>
<p>The problem starts once you close IntelliJ and want to do some command line work. Luckily, <a href="https://sdkman.io/">SDKMan</a>, the &ldquo;The Software Development Kit Manager&rdquo;, has got you covered. Want to temporarily change the Java compiler for the current <code>$TERM</code> session? <code>sdk use java 17.0.10-tem</code>. Want to change the default? <code>sdk default java 21.0.5-tem</code>. Easy! <code>$JAVA_HOME</code> will point to <code>~/.sdkman/candidates/java/current</code>, a symlink that gets rewired by SDKMan.</p>
<p>A Java project still needs a dependency management system such as Gradle, but you don&rsquo;t need to install a global specific Gradle version. Instead, <code>./gradlew</code> just points to the jar living at <code>.gradle/wrapper/</code>. Want another one? Change the version number in <code>gradle-wrapper.properties</code> and it&rsquo;ll be auto-downloaded. Using Maven instead? Tough luck! Just kidding: don&rsquo;t use <code>mvn</code> but <code>mvnw</code>, the <a href="https://maven.apache.org/tools/wrapper/">Maven Wrapper</a> that works exactly the same.</p>
<p><strong>.NET</strong> comes with built-in support to change the toolchain (and specify the runtime target), more or less equal to a typical Gradle project. Actually, the <code>dotnet</code> command can both build list its own installed toolchains: <code>dotnet --list-sdks</code> . Yet installing a new one is done by hand. You switch toolchains by specifying the SDK version in a <a href="https://learn.microsoft.com/en-us/dotnet/core/tools/global-json">global.json file</a> and tell the compiler to target a runtime in the <code>.csproj</code> file.</p>
<p>In <strong>Python</strong>, the concept of virtual environments should solve that problem: each project creates its own <code>venv</code> that points to a specific version of Python. Yet I never really enjoyed working with this system: you&rsquo;ve got <code>pip</code>, <code>venv</code>, <code>virtualenv</code>, <code>steuptools</code>, <code>wheels</code>, &hellip;</p>
<p>That confusing mess is solved with a relatively new kid in town: <a href="https://docs.astral.sh/uv/">uv</a>, &ldquo;An extremely fast Python package and project manager, written in Rust.&rdquo; It&rsquo;s more than <code>pip</code> as it also manages your multiple development ecosystems. Want to install a new Python distribution? <code>uv python install 3.10 3.12</code>. Want to temporarily change the Python binary for the current <code>$TERM</code> session? <code>uv python pin 3.10</code>. Creating a new project with <code>uv init</code> will also create a virtual environment, meaning you don&rsquo;t run your stuff with <code>python</code> but with <code>uv run</code> that auto-selects the correct version. Lovely!</p>
<p>What about JS/TS and <strong>Node</strong>? Of course there the options are many: there&rsquo;s <a href="https://www.nvmnode.com/">nvm</a>&mdash;but that&rsquo;s been <a href="https://github.com/coreybutler/nvm-windows/wiki/Runtime">semi-abandoned</a>?&mdash;and of course someone built a Rust-alternative called <a href="https://github.com/Schniz/fnm">fnm</a>, but you can also manage Node versions with <code>pnpm</code>. I personally don&rsquo;t care and use <code>bun</code> instead, which is aimed at not managing but <em>replacing</em> the Node JS runtime. But who will manage the bun versions?</p>
<p><strong>PHP</strong> is more troublesome because it&rsquo;s tied to a web server. Solutions such as <a href="https://herd.laravel.com/">Laravel Nerd</a> combine both PHP and web server dependency management into a sleek looking tool that&rsquo;s &ldquo;free&rdquo;. Of course you can let your OS-system package manager manage your SDK packages: <code>brew install php@8.4</code> and then <code>brew link --overwrite --force php@8.4</code>. That definitely feels a bit more hacky. For PHP, I&rsquo;d even consider Mise. Speaking of which&hellip;</p>
<p>Why use a tool that limits the scope to one specific development environment? If you&rsquo;re a full-stack developer you&rsquo;ll still need to know how to manage both your backend and frontend dev environment. That&rsquo;s not needed with <a href="https://mise.jdx.dev/">Mise-en-place</a>, a tool that manages <em>all these things</em>. <a href="https://asdf-vm.com/">Asdf</a> is another popular one that manages any development environment that doesn&rsquo;t have its own dedicated tool. I personally think that&rsquo;s an extraction layer too far. You&rsquo;ll still need to dissect these tools separately in case things go wrong.</p>
<p>Some ecosystems come with built-in multi-toolkit support, such as <strong>Go</strong>: <code>go install golang.org/dl/go1.26.0@latest</code> simply installs <code>go1.26.0</code> into your <code>~/go/bin</code> directory<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. That means you&rsquo;ve installed the compiler (!) in exactly the same way as any other (global) dependency, how cool is that? The downside of this is that you&rsquo;ll have to remember to type <code>go1.26.0</code> instead of <code>go</code> so there&rsquo;s no symlink rewiring involved. <code>g</code> or <code>gv</code> can do that&mdash;or the above Mise.</p>
<p>But wait, I hear you think, why not just use containers to isolate everything? Spinning up containers to build in an isolated environment: sure, that&rsquo;s standard practice in continuous integration servers, but locally? Really?</p>
<p>Really. Since the inception of <a href="https://containers.dev/">Dev Containers</a> by Microsoft, specifically designed for VS Code, working &ldquo;inside&rdquo; a container is as easy as opening up the project and &ldquo;jumping inside the container&rdquo;. From that moment on, your terminal, IntelliSense, &hellip; runs inside that container. That means you won&rsquo;t have to wrestle Node/PHP versions on your local machine, and you can even use the same container to build your stuff on the CI server. That also means your newly onboarded juniors don&rsquo;t need to wrestle through a week of &ldquo;installing stuff&rdquo;.</p>
<p>Microsoft open sourced the Dev Container specification and the JetBrains folks jumped the gun: it has support for <code>devcontainer.json</code> but I have yet to try it out. Of course the purpose was to integrate this into GitHub: their cloud-based IDE Codespaces makes heavy use of the idea&mdash;and yes, there&rsquo;s an <a href="https://github.com/loft-sh/devpod">open-source alternative</a>.</p>
<p>Is there Emacs support for Dev Containers? Well, Tramp allows you to remotely open and edit any file, also <em>inside a container</em>. So just install the Dev Container CLI, run it and point Emacs to a source file inside it. From then on, everything Emacs does&mdash;including the LSP server, compilation, &hellip;&mdash;happens inside that container. That means you&rsquo;ll also have to install your LSP binaries in there. <a href="https://github.com/johannes-mueller/devcontainer.el">devcontainer.el</a> just wraps complication commands to execute inside the container whilst still letting you edit everything locally in case you prefer a hybrid approach.</p>
<p>And then there&rsquo;s Nix and <a href="https://devenv.sh/">devenv</a>. Whatever that does, it goes way over my head!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>You&rsquo;ll still have to execute <code>go1.26.0 download</code> after that.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/containers">containers</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 26 February 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Managing%20Multiple%20Development%20Ecosystem%20Installs">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Never Blow Up Your Bridges</title>
      <link>https://brainbaking.com/post/2026/02/never-blow-up-your-bridges/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Mon, 23 Feb 2026 15:09:34 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/02/never-blow-up-your-bridges/</guid>
      
        
          <category domain="https://brainbaking.com/tags/work">work</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>Ten years ago, I first met my now colleague who then acted as the internship guide for a couple of graduate students that had their first taste of the industry at my previous (previous) employer. We only had brief contact: I was supposed to guide the interns from the industry side, and he was supposed to guide them from the education side. We shook hands and never saw each other again.</p>
<p>Until four years later, while I was doing my PhD and ended up in the jury for the <a href="https://vlaamseprogrammeerwedstrijd.be">Vlaamse Programmeerwedstrijd</a>, a local programming contest organised by multiple higher education institutions to promote (applied) computer science. It turned out that he was also a jury member, still representing the same institution. We attended a few preparation meetings, executed our roles as jury members for a few years, shook hands and never saw each other again.</p>
<p>Until a couple of months ago, when I was looking to get back into education and asked him if he didn&rsquo;t happen to know of any open vacancy spots. He did. I jumped the gun. Now we&rsquo;re direct colleagues: in fact, this semester, we&rsquo;re teaching a course together. Isn&rsquo;t life strange?</p>
<p>The only job I landed using zero resources but myself was my first job. Seven years later, more than tired of consultancy, I left and joined a smaller product development company where an engineering manager started just before me. That was no coincidence: that same manager and I worked together on multiple projects and it was largely thanks to him that I got in.</p>
<p>Fast forward four more years: I started teaching half-time. It was another colleague who knew I liked transferring knowledge and coaching that sent me the job ad: I wasn&rsquo;t intentionally looking for something like that. A semester later, I quit my job and started combining 50% teaching with a PhD.</p>
<p>Five years later, I started freelancing and found my first client through old contacts in the industry. The recruiter that interviewed me knew me well: she and I actually used to recruit together for another company. The CEO of that company knew me as she managed one of the projects I worked on. A couple of months later, my old research group contacted me, inquiring the development of a specific survey tool.</p>
<p>Fast forward another year. I work for a startup because the owner and I worked together on a project we both have nostalgic feelings about. He called me to ask if I was available for another challenge. When I told my current client I accepted his invitation, they immediately responded with &ldquo;if you&rsquo;re ever done with that, give us a call&rdquo;.</p>
<p>You know the rest. I transitioned <a href="/post/2025/12/i-changed-jobs-again/">back into teaching</a>. But you never know, it might start itching again&hellip;</p>
<p>Never blow up your bridges. If you manage to build a couple, you can always cross them&mdash;and if needed, retrace your steps.</p>
<p>(None of these bridges were built or crossed with the help of <em>LinkedIn</em>. I do not have an account there. Contrary to popular opinion, you don&rsquo;t need a corporate social media account to connect with people.)</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/work">work</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 23 February 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Never%20Blow%20Up%20Your%20Bridges">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>A Note On Presenting Code in Emacs</title>
      <link>https://brainbaking.com/post/2026/02/a-note-on-presenting-code-in-emacs/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Tue, 17 Feb 2026 20:45:29 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/02/a-note-on-presenting-code-in-emacs/</guid>
      
        
          <category domain="https://brainbaking.com/tags/emacs">emacs</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>The other day, I decided it was finally time. It was finally time to open Emacs to demonstrate certain code functionalities in class. The result was predictable: it caused further confusion among already confused students. The root cause wasn&rsquo;t switching out a familiar WebStorm-like environment for an esoteric IDE but rather the way the code was presented.</p>
<p>Most classrooms come equipped with crappy projectors that are experts in washing out colours and blurring otherwise perfectly crisp text. My first instinct after opening up an editor in class is to zoom in. That always worked well enough&mdash;either by pinching on the trackpad (<em>oooh</em> look at that smooth zooming animation in IntelliJ!) or by pressing <code>⌘+</code>. That zoom never worked that great in Sublime as the tree view didn&rsquo;t budge, but it worked well enough for the few lines of code that needed selecting and highlighting.</p>
<p>Naturally, in Emacs, I bound <code>s-+</code> to <code>text-scale-adjust</code> and continued to press <code>⌘+</code> as I have been doing so for the past decade. The story wouldn&rsquo;t end there otherwise there wasn&rsquo;t enough for me to write here. Same problem existed: the tree view didn&rsquo;t budge. But the worst problem was that the line numbers in the fringe didn&rsquo;t zoom either resulting in a very jumpy point every time I navigated to another line. I felt embarrassed.</p>
<p>Also naturally, that evening, more Elisp hacking took place.</p>
<p>The result is <code>bb/presentation-mode</code>, a switch to make ad-hoc theme and window configuration adjustments that turns the editor into something the projector no longer chokes on. Here&rsquo;s a before and after screenshot:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/02/a-note-on-presenting-code-in-emacs/presentation-mode.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/02/a-note-on-presenting-code-in-emacs/presentation-mode.jpg" loading="lazy" title="Left: the default light theme. Right: the same screen with presentation mode enabled." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>Left: the default light theme. Right: the same screen with presentation mode enabled.</figcaption></figure>
</p>
<p>What exactly does this presentation switch do?</p>
<ul>
<li>The obvious text enlargement, but globally this time by styling the <code>'default</code> font directly. There&rsquo;s nothing theme-specific in the presentation function. Instead, I set a flag <code>bb/presentation-mode-active-p</code> and force a theme reload that triggers my usual theme customisation hooks. This also increases the font of the minibuffer which is handy for following what <code>find-file</code> does. I also slightly increased line spacing.</li>
<li>I took some inspiration from the presentation mode in IntelliJ to slightly enlarge and move the modeline to the top (replaced by the LSP breadcrumbs<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> if active as in the screenshot). For brevity, some info in there is removed, such as the perspective name.</li>
<li>Increase the contrast. Since I use Doom themes, <code>doom-darken</code> and <code>doom-lighten</code> are my friends. Based on the current active theme&mdash;<code>is-dark</code> can be deduced with built-in functionality: <code>(eq (frame-parameter nil 'background-mode) 'dark)</code>. Pay special attention to the <code>hl-line</code> face that highlights the current line.</li>
<li>Speaking of contrast, move from a &ldquo;selection mode&rdquo; to a &ldquo;highlight mode&rdquo; by simply changing the background colour of the <code>region</code> face. When I want to direct the students&rsquo; attention to specific lines or blocks of code, I can simply select it. Apparently, Emacs has support for blinking text but that was a bit too much.</li>
<li>Make Treemacs play along. I have a custom treemacs theme customisation hook. Font locks and confusing face inheritance made it difficult to increase this as well.</li>
<li>Hide the <code>tab-line</code> tabs by temporarily disabling that mode.</li>
</ul>
<p>I wanted to maintain the ability to switch between a light/dark mode on the fly even from within presentation mode, and to further zoom in locally with <code>text-scale-adjust</code> if needed without further blowing up the project tree and the modeline.</p>
<p>As usual, you can find my &ldquo;bakemacs&rdquo; Emacs config <a href="https://codeberg.org/wouterg/bakemacs/src/branch/main/config">in the Git repository</a>.</p>
<p>At this point, you might be slightly confused: <em>what do you mean a presentation mode? you&rsquo;re merely zooming in!</em> You are correct. This is not a true presentation mode in the same vein as for instance Ankit Gadiya&rsquo;s <a href="https://ankit.earth/blog/my-emacs-presentation-stack/">Emacs Presentation Stack</a>. I don&rsquo;t want to present text in Org mode that look like slides. Instead, I just want to demo some code. I want to be able to split a window, open an Eshell, run some tests, show where the files are relative to the others in a tree view, and highlight specific functions.</p>
<p>My use case as a teacher is limited to showcasing how very simple projects should work, from the code to the tools around it. It&rsquo;s often hard for students to follow what I&rsquo;m doing if I <em>alt-tab</em> to a terminal, then switch back to an editor, then zoom in, then zoom back out, &hellip; So the plan is to try and come across as a little more consistent. I&rsquo;m not very fluent in Emacs let alone in embedded shells&mdash;dummy or otherwise&mdash;so we&rsquo;ll see how this pans out in the future.</p>
<hr>
<p>Since writing this last week and using my new presentation mode a bit more in class, a few more problems popped up. First, although <code>text-scale-adjust</code> is designed to &ldquo;work buffer-local only&rdquo;, it also scales the line numbers. We knew that, but I still want to zoom in further if needed (most of the time). I was showcasing a REPL in split screen and <code>s-+</code> only zoomed in one of the two visible buffers&hellip; Ouch. Fix:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-elisp" data-lang="elisp"><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> bb/text-scale-all-buffers <span style="color:#eceff4">(</span>level<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a3be8c">&#34;Apply a specific text-scale LEVEL to all buffers.&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span><span style="color:#81a1c1">interactive</span> <span style="color:#a3be8c">&#34;nScale level: &#34;</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span><span style="color:#81a1c1">setq</span> bb/text-scale-current level<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span><span style="color:#81a1c1">dolist</span> <span style="color:#eceff4">(</span>buf <span style="color:#eceff4">(</span><span style="color:#88c0d0">buffer-list</span><span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span><span style="color:#81a1c1">with-current-buffer</span> buf
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">(</span>text-scale-set level<span style="color:#eceff4">))))</span>
</span></span></code></pre></div><p>But then if you open up a new buffer you&rsquo;re screwed again, so you&rsquo;ll need another hook into <code>change-major-mode-after-body-hook</code> to set the scale there. I kind of hacked the buffer-local one to be global except for UI text.</p>
<p>Next problem: zooming in on Markdown files didn&rsquo;t scale code blocks. Huh? After scratching my head a bit, it turned out to be <a href="https://github.com/emacsmirror/mixed-pitch">mixed-pitch</a>&rsquo;s fault, or rather a config error on my part. Do not set <code>mixed-pitch-set-height</code> to <code>t</code>.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>This was in fact another bug as the modeline is very annoying to &ldquo;flip&rdquo;. <code>setq-default</code> isn&rsquo;t enough if existing buffers are already initialized and I ended up looping through all open ones to reconfigure each one.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/emacs">emacs</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 17 February 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: A%20Note%20On%20Presenting%20Code%20in%20Emacs">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Why Parenting Is Similar To JavaScript Development</title>
      <link>https://brainbaking.com/post/2026/02/why-parenting-is-similar-to-javascript-development/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Fri, 13 Feb 2026 11:15:00 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/02/why-parenting-is-similar-to-javascript-development/</guid>
      
        
          <category domain="https://brainbaking.com/tags/javascript">javascript</category>
        
          <category domain="https://brainbaking.com/tags/parenting">parenting</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>Here&rsquo;s a crazy thought: to me, parenting feels very similar to programming in JavaScript. The more I think about it, the more convinced I am.</p>
<p>If you&rsquo;re an old fart that&rsquo;s been coding stuff in JavaScript since its inception, you&rsquo;ll undoubtedly be familiar with <a href="https://www.crockford.com/books.html">Douglas Crockford&rsquo;s bibles</a>, or to be more precise, that one tiny booklet from 2008 <em>JavaScript: The Good Parts</em>. That book covered by a cute O&rsquo;Reilly butterfly is only 172 pages long. Contrast that with any tome attempting to do a &ldquo;definitive guide&rdquo;, like David Flanagan&rsquo;s, which is 1093 pages thick. Ergo, one starts thinking: only <code>16%</code> of Javascript is inherently <em>good</em>.</p>
<p>And that was 18 years ago. Since then, the EcmaScript standard threw new stuff on top in a steady yearly fashion, giving us weird and wonderful things (Promise chaining! Constants that aren&rsquo;t constants! Private members with <code>#</code> that look weirder than <code>_</code>! Nullish coalescing?? Bigger integers!) that arguably can be called syntactic sugar to try and disguise the bitter taste that is released slowly but surely if you chew on JS code long enough.</p>
<p>If that&rsquo;s not confusing enough, the JS ecosystem has evolved enormously as well: we now have 20+ languages built on top of JS that compile/transpile to it. We have TypeScript that has its own <code>private</code> keyword that has nothing to do with <code>#</code>, go nuts! We have ClojureScript that lets you write your React Native components in Clojure that compiles to JS that compiles to Java with Expo that compiles your app! We have <code>bun</code> and <code>deno</code> and <code>esbuild</code> and god-knows-what-else that replaces <code>npx</code> and possibly also <code>webpack</code>? At this point, I&rsquo;m starting to transpile JS into transpiration.</p>
<p>Parenting often feels like <em>Javascript: The Good Parts</em> versus <em>JavaScript: The Definitive Guide</em>. With our two very young children, there are many, many (oh so many) moments where we feel like we&rsquo;re stumbling around in the dark, getting lost in that thick tome that dictates the things that we should be doing. When the eldest has yet another I&rsquo;ll-just-throw-myself-on-the-floor-here moment and the youngest keeps on puking and yelling because he just discovered rolling on his tummy, I forget <em>The Good Parts</em>.</p>
<p>To be perfectly frank, in those moments, I often wonder if Crockford had been lying to us. Are there even any good parts at all? We all know JS was cobbled together overnight because Netscape needed &ldquo;some&rdquo; language to make static languages a bit more dynamic. A language for the masses! What a monster it has become&mdash;in both positive and negative sense.</p>
<p>It often feels like Wouter doesn&rsquo;t exist anymore. Instead, there&rsquo;s only daddy. It has been months since I last touched a book, notebook, or fountain pen. It has been months since my wife &amp; I did something together to strengthen our relationship which currently is being reduced to snapping at each other because we&rsquo;re still not perfectly synced when it comes to educational rules. Perhaps just writing and publishing this is reassurance for myself: proof of existence. Hi! This is not a bot!</p>
<p>JavaScript is a big mess. Parenting feels like that as well. The ecosystem around JS rapidly changes and only the keenest frontend developer is able to keep up. I have no idea how to keep up with parenting. During our day-to-day struggles, you barely notice that the kids are growing and changing, but when you look back, you&rsquo;re suddenly surprised yet another milestone has passed. Is that part of the <em>Good Parts</em> or the <em>Bad Parts</em>?</p>
<p>Maybe Flanagan&rsquo;s <em>Definitive Guide</em> should be used to smack people on the head that do not obey to the latest EcmaScript standard best practices. I often have the feeling of getting smacked on the head when trying to deal with yet another kid emergency situation. I&rsquo;m exhausted. Last week I yelled so hard at our eldest that she and I both started crying&mdash;she on the outside, me on the inside. I have no idea who I am anymore. I&rsquo;m not like that. But it seems that I am. Our children successfully managed to bring out the worst in ourselves, even parts that I didn&rsquo;t even know where there. I&rsquo;ll let you be the judge of whether that bit belongs in the <em>Good Parts</em>.</p>
<p>Yet I love JS. I love its dynamic duck type system (fuck TypeScript), I love its functional <code>map()</code>, <code>filter()</code>, <code>reduce()</code> roots, I love prototypal inheritance. But I often forget about it because it&rsquo;s buried in all that contemporary mud. Of course I love my children, but right now, I can&rsquo;t say that I love parenting, because it&rsquo;s buried in all that attention demanding and shouting that reduces our energy meters to zero in just a few minutes.</p>
<p>My wife made a thoughtful remark the other day:</p>
<blockquote>
<p>We&rsquo;re no longer living. At this point, we&rsquo;re merely surviving. Every single day.</p>
</blockquote>
<p>As I write this, it&rsquo;s almost 17:30 PM. The kids spent the day at my parents so I don&rsquo;t even have the right to complain. Every minute now, they can come back and the bomb will explode again. There&rsquo;s a little voice in my head that says &ldquo;just get to the cooking, get them to eat and shove them in bed. Only an hour and a half left.&rdquo; I don&rsquo;t know if that&rsquo;s sad or not. I need to get cooking. Only an hour and a half left. Don&rsquo;t blame me, I no longer live. We&rsquo;re merely surviving.</p>
<p>If someone manages to write <em>Parenting: The Good Parts</em> in only 172 pages, let me know.</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/javascript">javascript</a> /
                  <a href="https://brainbaking.com/tags/parenting">parenting</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 13 February 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Why%20Parenting%20Is%20Similar%20To%20JavaScript%20Development">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>A Note on File History in Emacs</title>
      <link>https://brainbaking.com/post/2026/02/a-note-on-file-history-in-emacs/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Tue, 10 Feb 2026 17:45:00 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/02/a-note-on-file-history-in-emacs/</guid>
      
        
          <category domain="https://brainbaking.com/tags/emacs">emacs</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>Once you start digging beyond the surface, you discover that an ancient piece of text editing software called Emacs was light years ahead of its time. It already contained a clipboard history (<code>kill-ring</code>) and automatic saves/backups decades before contemporary editors took a half-baked stab at mimicking these features. Granted, I don&rsquo;t make use of the kill ring because Alfred manages that for me across different applications, but it&rsquo;s still pretty damn impressive.</p>
<p>If you manage to stumble past the initial setup, that is. Many default settings in Emacs are&hellip; weird? The first thing to configure to transition to a bit of a sane default system is moving all those <code>.*~</code> and <code>.#*#</code> backup and auto-save files to a central location to stop the editor from littering all over the place. That&rsquo;s pretty easy to do but begs the question why they don&rsquo;t change these defaults? Nobody wants random backup files popping up in their Git change set!</p>
<p>Do you even need those files? The system feels archaic at first, but the more you think about the possibilities, the more brilliant the idea becomes. Let&rsquo;s ignore the auto-save system for now&mdash;that doesn&rsquo;t auto-save but auto-saves an auto-save backup that&rsquo;s not a backup. Got all that?</p>
<p>On every (first) <em>manual</em> <code>save-buffer</code>, a backup file <code>.*~</code> is created or replaced, depending on your configuration. These files can act as your local file history in case you&rsquo;re not rocking a version control system. If you do, Emacs notices this and stops producing backups. I do recommend setting <code>vc-make-backup-files</code> to <code>t</code> as you might lose interesting historical data <em>before</em> doing a commit. That is one of the more useful features of IntelliJ-based IDEs: to go back in time a few minutes to half an hour.</p>
<p>Why would you need that? Emacs has a built-in undo history system! Very true, and perhaps better, as that doesn&rsquo;t require a save, but isn&rsquo;t persistent. I can hear you say it. You&rsquo;re right: <em>there&rsquo;s a package for that</em>. It&rsquo;s called <a href="https://github.com/emacsmirror/undo-fu-session">undo-fu-session</a> and it serialises the undo information without changing any inner logic. This is even more brilliant if coupled with <code>vundo</code> that helps you step through this. If you increase the three related <code>undo-limit</code> settings, you will have a powerful way to go back in time.</p>
<p>Perhaps a bit too powerful? What is a good limit? Contrary to IntelliJ, Emacs does not persist timestamps: it only works with bytes and limits those, so you&rsquo;ll have to write a function that periodically cleans up those persisted backups. But are you going to remove the entire tree or just prune a bit? Because if you don&rsquo;t, this is how your <code>vundo</code> session will look like:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/02/a-note-on-file-history-in-emacs/vundo.png" class="lbox">
		<img src="https://brainbaking.com/post/2026/02/a-note-on-file-history-in-emacs/vundo.png" loading="lazy" title="The vundo tree: a visualised undo tree with a lot of nodes to diff..." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>The vundo tree: a visualised undo tree with a lot of nodes to diff...</figcaption></figure>
</p>
<p>And that&rsquo;s just a clean tree with no branching reapplied undo paths. Good luck trying to hop between different nodes, selecting the right ones to diff and revert to. Without timestamp info, a big undo tree is useless.</p>
<p>So I removed <code>undo-fu-session</code>: too much power, too much responsibility. Let&rsquo;s keep that history local and non-persistent (even with a daemon you&rsquo;ll end up with more than enough). I started fine-tuning the built-in backup settings:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-elisp" data-lang="elisp"><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">setq</span> version-control <span style="color:#8fbcbb">t</span>
</span></span><span style="display:flex;"><span>      backup-by-copying <span style="color:#8fbcbb">t</span>
</span></span><span style="display:flex;"><span>      delete-old-versions <span style="color:#8fbcbb">t</span>
</span></span><span style="display:flex;"><span>      vc-make-backup-files <span style="color:#8fbcbb">t</span>
</span></span><span style="display:flex;"><span>      kept-new-versions <span style="color:#b48ead">10</span>
</span></span><span style="display:flex;"><span>      kept-old-versions <span style="color:#b48ead">2</span><span style="color:#eceff4">)</span>
</span></span></code></pre></div><p>Which translates to:</p>
<ul>
<li>Keep <em>multiple backup files</em>: <code>file.md.~1~</code>, <code>file.md.~2~</code>, &hellip;</li>
<li>Also backup even if it&rsquo;s under version control</li>
<li>Clean up older files: keep the oldest 2 and the last 10.</li>
<li>Copy the file, don&rsquo;t turn the existing one into a backup and save the buffer as the new file.</li>
</ul>
<p>There&rsquo;s a bit of a catch here: Emacs only saves a backup once per editing session and then assumes you&rsquo;re safe. To force it to create a backup every time you save you&rsquo;ll have to add <code>(setq buffer-backed-up nil)</code> to the <code>before-save-hook</code>. Or, as <a href="https://abochannek.github.io/emacs/2022/11/30/emacs-backup.html">I learned from Alex</a>, save with <code>C-u C-u C-x C-s</code>. Ridiculous. GNU Emacs already featured this snapshot backup system in 1985, when I was born!</p>
<p>Fine, we now have a bunch of backup files. Then what? This is where things can get interesting. Since they&rsquo;re just files, you can obviously run a diff tool against them. But which backup file to choose, and how to easily select the right file from the UI and go from there? Consult to the rescue.</p>
<p><a href="https://github.com/minad/consult">Consult</a> is a completing-read on steroids that plugs seamlessly into Vertico, my minibuffer completion framework. It&rsquo;s basically a fuzzy search tool you can throw anything at&mdash;including a list of backup files to choose from. Which is exactly what I did. You can change the label (parse the timestamps), choose a lovely icon if you&rsquo;re using nerd-icons et al., and tell Consult what to do when (1) you preview the candidate and (2) when you select it.</p>
<p>So the plan is this:</p>
<ol>
<li>For the current buffer, find all backup files. Easy: <code>buffer-file-name</code>, substitute a few weird chars into !, read them from <code>backup-directory-alist</code>, done. (This very file has a backup called <code> !brainbaking!content!post!2026!02!a-note-on-file-history-in-emacs.md.~1~</code>)</li>
<li>Sort and properly format a timestamp to show in the Consult minibuffer using <code>file-attribute-modification-time</code>.</li>
<li>When previewed, <code>diff-no-select</code> with the current buffer into a new window on the right.</li>
<li>When selected, make that diff window permanent. When cancelled with <code>C-g</code>, cleanup the mess.</li>
</ol>
<p>The result looks like this:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/02/a-note-on-file-history-in-emacs/consult-result.gif" class="lbox">
		<img src="https://brainbaking.com/post/2026/02/a-note-on-file-history-in-emacs/consult-result.gif" loading="lazy" title="Selecting different backups automatically changes the opened diff on the right." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>Selecting different backups automatically changes the opened diff on the right.</figcaption></figure>
</p>
<p>I have no idea if I butchered <code>consult--read</code>, I tried a few things until it sort-of worked and had some help with the rest. You can find the source somewhere in the <a href="https://codeberg.org/wouterg/bakemacs/src/branch/main/config/autocomplete-minibuffer.el">Bakemacs config files</a>, look for <code>bb/consult-local-history</code>. It could very well be that something like that already exists, but I haven&rsquo;t found it so far. <code>consult-history</code> does something else. <code>diff-backup</code> sounds good but requires you to navigate to the backup file yourself.</p>
<p>The added advantage of <code>diff</code> mode is that you can revert the diff and re-apply specific hunks. The idea that I&rsquo;ll never lose anything stupid I wrote will make me sleep better later tonight. Sublime Text&rsquo;s persistent but unsaved changed file system and IntelliJ&rsquo;s local history saved my ass more than once. The fact that I cobbled together a working thing using Consult makes this even more satisfying.</p>
<p>Isn&rsquo;t fooling around in Emacs the best thing ever? I hope these nerdy posts are not alienating too many faithful <em>Brain Baking</em> readers&hellip; Because, you know, the Lisp Alien mascot? No? Took it too far?</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/emacs">emacs</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 10 February 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: A%20Note%20on%20File%20History%20in%20Emacs">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Creating Buttons To Remember Things</title>
      <link>https://brainbaking.com/post/2026/02/creating-buttons-to-remember-things/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Sat, 07 Feb 2026 14:01:32 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/02/creating-buttons-to-remember-things/</guid>
      
        
          <category domain="https://brainbaking.com/tags/crafting">crafting</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>My wife recently bought a device to scratch her creative crafting itch: a <em>button press</em>. At first, I dismissed it as yet another thing requiring space in her increasingly messy atelier. I don&rsquo;t know how we manage to do it but we seem to be experts in gathering things that gather things themselves: dust.</p>
<p>But now that she finally started doing something with it, I was secretly becoming interested in what it could mean for our scrapbook making. The button press in question is a &ldquo;We R Makers Button Press Bundle All-In-One Kit&rdquo; that comes with press, a few add-on peripherals that allow you to modify how it cuts and presses, and of course the buttons themselves.</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/02/creating-buttons-to-remember-things/button-press.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/02/creating-buttons-to-remember-things/button-press.jpg" loading="lazy" title="The button press in action, about to create a &#39;little monster&#39;." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>The button press in action, about to create a &#39;little monster&#39;.</figcaption></figure>
</p>
<p>Since handling the lever requires a bit of pressure to correctly cut and a second time fit the cut circle inside the button, I yelled <em>TSJAKKA</em> every time she would press it, to great joy of our daughter. She now calls it <em>the Tsjakka</em>. &ldquo;Daddy, can we make another little monster with Tjsakka?&rdquo; Because my first instinct after thinking about what kind of buttons I wanted was to print a variant of the <a href="https://www.lisperati.com/logo.html">Alien Lisp Mascot</a>&mdash;a green monster with five eyes.</p>
<p>Fellow nerds reading this might have covered their entire laptop back with cool looking stickers: a Docker container sticker, an IDEA logo one, the GitHub Octocat, and god knows what else you managed to nab from a conference table. While I always found those laptops to be just cute, I never wanted to soil mine with a sticker of some technology stack that I would grow to hate a few years later. Thanks to a random takeover by Microsoft sharks, for instance. *cough* <a href="/post/2022/07/give-up-github/">Give Up Github</a> *cough*.</p>
<p>So why not a programming language mascot? Java&rsquo;s The Duke? No way, I&rsquo;m not that big of a Java fan. The Gopher perhaps? Better, but no. If I was to wear a badge, smack on a sticker somewhere prominent, it would have to be of something that makes me happy. Go is cool but boring. Java brings in a lot of money but smells like enterprise mud. So far, I haven&rsquo;t encountered a single programming language that truly makes me happy. But Lisp is coming very close. The Lisp Alien it is, then:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/02/creating-buttons-to-remember-things/result.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/02/creating-buttons-to-remember-things/result.jpg" loading="lazy" title="The result: three buttons pinned to the inside of my bike bag." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>The result: three buttons pinned to the inside of my bike bag.</figcaption></figure>
</p>
<p>One of the other two buttons is self-explanatory: the <em>Brain Baking</em> logo. The first one on the upper left is a part of my late father-in-law&rsquo;s master&rsquo;s thesis; an electronic schematic with resistors.</p>
<p>The embossed logo on the button press, below the <em>We R</em> name, reads:</p>
<blockquote>
<p>Memory Keepers.</p>
</blockquote>
<p>Which is exactly what that button is for. They market it as a way to permanently record precious memories&mdash;and wear them <em>on your sleeve</em>. I think it&rsquo;s brilliant. We don&rsquo;t have an endless supply of metal clips and plastic caps to press that memory in so we have to be mindful: which one&rsquo;s do we really want to create? Sure you can buy more and it&rsquo;s not expensive, but that&rsquo;s not the point. The point is that there won&rsquo;t be a Duke on my bag, but there will be a <em>Brain Baking</em> logo. And, apparently, a <code>MAY CONTAIN TRACES OF LISP</code> warning.</p>
<p>Most folks pin these buttons onto the obvious visible part of their bag. But I don&rsquo;t want to come across as a button lunatic (at least not at first sight). A more convincing argument then: the bag I pinned it on is a simple detachable <a href="https://www.decathlon.be/nl/alle-sporten/fietsen/waterdichte-fietstassen">laptop cycle bag</a>. The exterior gets wet now and then. I highly doubt that the button is water resistant. The third but slightly less convincing argument is that the buttons rattle quite a bit as the needle on the back used to pin it onto something sits quite loose in its metal socket. Perhaps that depends from product type to type.</p>
<p>As you might have guessed, our daughter now is dead set on pinning a <em>little monster</em> on her bag she uses carry her lunch to school.</p>
<p>We&rsquo;ll first have to ask Tjsakka to get back to work.</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/crafting">crafting</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 7 February 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Creating%20Buttons%20To%20Remember%20Things">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Favourites of January 2026</title>
      <link>https://brainbaking.com/post/2026/02/january-2026/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Wed, 04 Feb 2026 14:20:00 +0200</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/02/january-2026/</guid>
      
        
          <category domain="https://brainbaking.com/tags/metapost">metapost</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>The end of the start of another year has ended. So now all there is left to do is to look forward to the end of the next month, starting effective immediately, and of course ending after the end of the end we are going to look forward to. Quite the end-eavour. I guess I&rsquo;ll end these ramblings by ending this paragraph. But not before this message of general interest: children can be very end-earing, but sometimes you also want to end their endless whining! <em>Fin.</em></p>
<p>Previous month: <a href="/post/2025/12/december-2025/">December 2025</a>.</p>
<h2 id="games-ive-played">Games I&rsquo;ve played</h2>
<p>Is <a href="/tags/emacs">Emacs</a> a game? I think it is. I spent every precious free minute of my time tinkering with my configuration, exploring and discovering all the weird and cool stuff the editor and the thousands of community-provided packages offer. You can tell when you&rsquo;ve joined the cult when you&rsquo;re exchanging emails with random internet strangers about obscure Elisp functions and even joining the sporadic &ldquo;let&rsquo;s share Emacs learnings!&rdquo; video calls (thanks <a href="https://site.sebasmonia.com/">Seb</a>).</p>
<p>Does receiving pre-ordered games count as <em>played</em>? I removed the shrink wrap from <em>Ruffy</em> and my calendar tells me I should start ordering <em>UFO 50</em> very very soon via <code>fangamer.eu</code>. Now if only that stupid Emacs config would stabilise; perhaps then I could pick up the Switch again&hellip; The intention was to start learning Clojure but I somehow got distracted after learning the Emacs CIDER REPL is the one you want.</p>
<h2 id="selected-blog-posts">Selected (blog) posts</h2>
<ul>
<li>Nathan Rooy created a very cool <a href="https://nry.me/posts/2025-10-09/small-web-screenshots/">One million (small web) screnshots</a> project and explains the technicalities behind it. Browsing to find your blog (mine are in there!) is really cool. It&rsquo;s also funny to discover the GenAI purple-slop-blob. <em>Brain Baking</em> is located just north of a small dark green lake of expired domain name screenshots. <em>Jefklak&rsquo;s Codex</em>, being much more colourful, is located at the far edge, to the right of a small Spaceship-domain-shark lake:</li>
</ul>
<p>
<figure><a href="https://brainbaking.com/post/2026/02/january-2026/screenshotsnryme.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/02/january-2026/screenshotsnryme.jpg" loading="lazy" title="A zoomed-out top-down view of the project, centered on Brain Baking (left) and Jefklak&#39;s Codex (right)." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>A zoomed-out top-down view of the project, centered on Brain Baking (left) and Jefklak&#39;s Codex (right).</figcaption></figure>
</p>
<ul>
<li>Shom Bandopadhaya helped me regain my sanity with the Emacs undo philosophy. <a href="https://shom.dev/posts/20250622_undo-finally-clicked-with-vundo/">Install vundo.</a> Done.</li>
<li>Related: Sacha Chua was writing and <a href="https://sachachua.com/blog/2025/06/thinking-about-time-travel-with-the-emacs-text-editor-and-org-mode/">thinking about time travel with Emacs, Org mode, and backups</a>. I promise there&rsquo;ll be non-Emacs related links in here, somewhere! Keep on digging!</li>
<li>Michael Klamerus reminded me the <a href="https://virtualmoose.org/2026/01/01/biomenace-remastered-thoughts/">BioMenace remaster</a> is already out there. I loved that game as a kid but couldn&rsquo;t get past level 3 or 4. It&rsquo;s known to be extremely difficult. Or I am known to be a noob.</li>
<li>Lars Ingebrigtsen combats link rot with <a href="https://lars.ingebrigtsen.no/2025/02/20/wordpress-link-rot-tweak/">taking screenshots of external links</a>. I wrote <a href="/post/2024/12/how-bad-is-link-rot-at-brain-baking/">about link rot</a> a while ago and I must say that&rsquo;s a genius addition. On hover, a small screenshot appears to permanently frame the thing you&rsquo;re pointing to. I need to think about implementing this myself.</li>
<li>Seb pointed me towards Karthinks&rsquo; <a href="https://karthinks.com/software/emacs-window-management-almanac/">Emacs window management almanac</a>, a wall of text I will have to re-read a couple of times. I did manage to write a few simple window management helper functions that primarily do stuff with only a 2-split, which is good enough.</li>
<li>Mikko shared his <a href="https://mikkosgameblog.com/2026/01/gaming-year-2025/">Board Gaming Year recap of 2025</a>. <em>Forest Shuffle</em> reaching 500 plays is simply insane, even if you take out the BoardGameArena numbers.</li>
<li>Alex Harri spent a lot of time building an <a href="https://alexharri.com/blog/ascii-rendering">image-to-ASCII renderer</a> and explains how the project was approached.</li>
<li>This Precondition <a href="https://precondition.github.io/home-row-mods">Guide to Home Row Mods</a> is really cool and with Karabiner Elements in MacOS totally possible. It will get messy once you start fiddling with the timing.</li>
<li>Elsa Gonsiorowski wrote about <a href="https://www.gonsie.com/blorg/delete-v-kill.html">Emacs Delete vs. Kill</a> which again helped me build a proper mental state of what the hell is going on in this Alien editor.</li>
<li>Matt Might shared <a href="https://matt.might.net/articles/shell-scripts-for-passive-voice-weasel-words-duplicates/">shell scripts to improve your academic writing</a> by simply scanning the text for so-called &ldquo;weasel words&rdquo;.  Bad: <em>We used various methods to isolate four samples</em> Better: <em>We isolated four samples</em>. I must say, academic prose sure could use this script.</li>
<li>Robert Lützner discovered <code>jj</code> and <a href="https://www.schafe-sind-bessere-rasenmaeher.de/tech/why-i-prefer-jujutsu-over-git/">prefers it over Git</a>. I&rsquo;m interested in its interoperability with Git.</li>
<li>Charles Choi <a href="http://yummymelon.com/devnull/tuning-emacs-to-write-prose-in-org-and-markdown.html">tuned Emacs to write prose</a> by modifying quite a few settings I have yet to dig into.</li>
</ul>
<h2 id="other-random-links">Other random links</h2>
<ul>
<li>A friend installed <a href="https://www.pivpn.io/">PiVPN</a> recently. I hadn&rsquo;t heard from that one just yet so perhaps it&rsquo;s worth a mention here.</li>
<li>KeepassXC is getting on my nerves. Perhaps I should simply use <a href="https://www.passwordstore.org/">pass</a>, the standard unix password manager. But it should also be usable by my wife so&hellip; Nah.</li>
<li><a href="https://input.djr.com/">Input</a> is a cool flexible font system designed for code but also offers proportional fonts. I tried it for a while but now prefer&hellip;</li>
<li><a href="https://typeof.net/Iosevka/">Iosevka</a> for my variable pitch font.</li>
<li>Here&rsquo;s a random <a href="https://gitlab.com/publicvoit/orgdown/-/blob/master/doc/Orgdown1-Syntax-Examples.org">Orgdown cheat sheet</a> that might be of use.</li>
<li>With <a href="https://reposense.org/">RepoSense</a> it&rsquo;s easy to visualise programmer activities across Git repositories. We&rsquo;re using it to track student activities and make sure everyone participates.</li>
<li>Tired of configuring tab vs space indent stuff for every programming language? Use <a href="https://editorconfig.org/">EditorConfig</a>, something that works across editors and IDEs.</li>
</ul>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/metapost">metapost</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 4 February 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Favourites%20of%20January%202026">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Banning Syntax Highlighting Steroids</title>
      <link>https://brainbaking.com/post/2026/01/banning-syntax-highlighting-steroids/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Sat, 31 Jan 2026 20:45:44 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/01/banning-syntax-highlighting-steroids/</guid>
      
        
          <category domain="https://brainbaking.com/tags/go">go</category>
        
          <category domain="https://brainbaking.com/tags/php">php</category>
        
          <category domain="https://brainbaking.com/tags/emacs">emacs</category>
        
          <category domain="https://brainbaking.com/tags/syntax">syntax</category>
        
          <category domain="https://brainbaking.com/tags/screenshot">screenshot</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>I&rsquo;ve always flip-flopped between so-called &ldquo;light&rdquo; and &ldquo;dark&rdquo; modes when it comes to code editors. A <a href="/post/2020/11/desktop-screenshots-of-olde/">2004 screenshot of a random C file</a> opened in GVim proves I was an realy adopter of dark mode, although I never really liked the contemporary <a href="https://en.wikipedia.org/wiki/Dracula_(color_scheme)">Dracula themes</a> when they first appeared. Sure, it was cool and modern-looking, but it also felt like plugging in three pairs of Christmas lights for just one tree. At work, I was usually the weird guy who refused to flip IntelliJ to <em>The Dark Side</em>. And now I&rsquo;m primarily running a dark theme in <a href="/tags/emacs">Emacs</a>. Allow me to explain.</p>
<p>After more than a decade of staring at the default dark theme of Sublime Text, I&rsquo;m swithing over, but you probably already know that. I never did any serious code work in my beloved <code>subl</code>: that was mostly for Markdown files and the light edit here and there. For bigger projects, any JetBrains IDEA flavour would do it: I know the shortcuts by heart and &ldquo;it just works&rdquo;. So you&rsquo;ll excuse me for never really paying attention to the syntax highlighting mess that comes with the default dark Sublime theme.</p>
<p>And then I read Tonsky&rsquo;s excellent <a href="https://tonsky.me/blog/syntax-highlighting/">I am sorry, but everyone is getting syntax highlighting wrong</a> post. Being Tonsky, he was of course right&mdash;again. A lightbulb went on somewhere deep within the airy caverns of my brain: &ldquo;Hey, perhaps I&rsquo;m not the only one thinking of Christmas trees when I see a random dark theme&rdquo;.</p>
<p>There are exceptions to the rule. I love the <a href="https://www.nordtheme.com/ports/emacs">Nord theme</a>. I only found out now that of course there&rsquo;s a JetBrains port. Nord is great because it&rsquo;s very much muted, or as they like to call it, &ldquo;An arctic, north-bluish clean and elegant theme&rdquo;. Here&rsquo;s <code>doom-nord</code> in my current Emacs config:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/01/banning-syntax-highlighting-steroids/go-nord.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/01/banning-syntax-highlighting-steroids/go-nord.jpg" loading="lazy" title="The Doom Nord theme: a muted palette of blues." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>The Doom Nord theme: a muted palette of blues.</figcaption></figure>
</p>
<p>Nord radiates calmness. I love it. But sometimes I feel that it&rsquo;s a bit too calm and muted. Sometimes, I miss a dash of colour and frivolity in my coding life, without the exaggeration of many themes such as Dracula et al. In that case, there&rsquo;s <a href="https://github.com/whizkydee/vscode-palenight-theme"> Palenight</a> that throws in a cheerful dash of purple. The <a href="/post/2020/11/desktop-screenshots-of-olde/">2007 GVim on WinXP screenshot</a> proves I was already a fan of purple back then!</p>
<p>While that&rsquo;s great for <code>hl-line</code>, general UI usage, and even the Markdown links, it&rsquo;s a garish mess as soon as you open up a code file. Here&rsquo;s the Palenight Doom Theme in all its Christmas-y glory whilst editing the exact same Go file from the Nord screenshot above:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/01/banning-syntax-highlighting-steroids/go-palenight.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/01/banning-syntax-highlighting-steroids/go-palenight.jpg" loading="lazy" title="The Doom Palenight theme: syntax highlighting is all over the place." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>The Doom Palenight theme: syntax highlighting is all over the place.</figcaption></figure>
</p>
<p>What&rsquo;s all that about? Orange (WARNING!) for variable declarations, bright red (ERROR!) for constants, purple (YAY!) for types&hellip; Needless to say, my first urge was to rapidly switch back to Nord. But I didn&rsquo;t. Instead, I applied Tonsky&rsquo;s rules and modified Palenight into a semi-Alabaster-esque theme:</p>
<ul>
<li>Mute (unset) keywords, everyone knows what <code>func</code> and <code>return</code> does and nobody cares</li>
<li>Replace the error eyebrow-raising colours with a muted blue variant.</li>
<li>Get rid of that weird italic when invoking methods. If it ends in <code>()</code>, you&rsquo;ll know you&rsquo;re calling a method/func, right?</li>
<li>Highlight comments in the warning colour instead, as per Tonsky&rsquo;s advice. It&rsquo;s a brilliant move and forces you to more carefully think about creating and reading comments.</li>
<li>Mute (dim) punctuation. Structural editing and/or your editor should catch you if you fall.</li>
</ul>
<p>The result is this, the same <code>user_handlger.go</code> for the third time:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/01/banning-syntax-highlighting-steroids/go-palenight-mod.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/01/banning-syntax-highlighting-steroids/go-palenight-mod.jpg" loading="lazy" title="A modified Doom Palenight theme taking the Alabaster philosophy into account." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>A modified Doom Palenight theme taking the Alabaster philosophy into account.</figcaption></figure>
</p>
<p>In case you&rsquo;re interested which <code>font-lock</code> faces to alter in Emacs, here&rsquo;s the snippet I use that is designed to work across themes by stealing foreground colours from general things like <code>'warning</code> and <code>'shadow</code>:</p>
<details class="spoiler">
  <summary>(Elisp snippet)</summary>
  <div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-elisp" data-lang="elisp"><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> bb/style-syntax-highlighting <span style="color:#eceff4">()</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a3be8c">&#34;Syntax HL adjustments as per https://tonsky.me/blog/syntax-highlighting/.&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span><span style="color:#81a1c1">let*</span> <span style="color:#eceff4">((</span>fg <span style="color:#eceff4">(</span>face-foreground <span style="color:#a3be8c">&#39;default</span><span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>         <span style="color:#eceff4">(</span>shadow <span style="color:#eceff4">(</span>face-foreground <span style="color:#a3be8c">&#39;shadow</span><span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>         <span style="color:#eceff4">(</span>fg-symbol <span style="color:#eceff4">(</span>face-foreground <span style="color:#a3be8c">&#39;link</span><span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>         <span style="color:#eceff4">(</span>fg-type <span style="color:#eceff4">(</span>face-foreground <span style="color:#a3be8c">&#39;font-lock-preprocessor-face</span><span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>         <span style="color:#eceff4">(</span>fg-name <span style="color:#eceff4">(</span>doom-lighten fg-type <span style="color:#b48ead">0.4</span><span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>         <span style="color:#eceff4">(</span>fg-bright <span style="color:#eceff4">(</span>face-foreground <span style="color:#a3be8c">&#39;warning</span><span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>         <span style="color:#eceff4">(</span>fg-dimmed <span style="color:#eceff4">(</span>doom-lighten shadow <span style="color:#b48ead">0.2</span><span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>	<span style="color:#eceff4">(</span><span style="color:#81a1c1">dolist</span> <span style="color:#eceff4">(</span>face <span style="color:#81a1c1">&#39;</span><span style="color:#eceff4">(</span>font-lock-variable-use-face
</span></span><span style="display:flex;"><span>                    font-lock-keyword-face
</span></span><span style="display:flex;"><span>					lsp-face-highlight-read
</span></span><span style="display:flex;"><span>					lsp-face-highlight-write
</span></span><span style="display:flex;"><span>                    font-lock-operator-face
</span></span><span style="display:flex;"><span>                    font-lock-function-call-face
</span></span><span style="display:flex;"><span>                    font-lock-property-use-face
</span></span><span style="display:flex;"><span>					lsp-face-highlight-textual
</span></span><span style="display:flex;"><span>					lsp-face-semhl-property<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">(</span><span style="color:#81a1c1">when</span> <span style="color:#eceff4">(</span>facep face<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>		<span style="color:#eceff4">(</span>set-face-attribute face <span style="color:#8fbcbb">nil</span> <span style="color:#81a1c1">:foreground</span> fg <span style="color:#81a1c1">:weight</span> <span style="color:#a3be8c">&#39;light</span> <span style="color:#81a1c1">:slant</span> <span style="color:#a3be8c">&#39;unspecified</span><span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span><span style="color:#81a1c1">dolist</span> <span style="color:#eceff4">(</span>face <span style="color:#81a1c1">&#39;</span><span style="color:#eceff4">(</span>font-lock-punctuation-face
</span></span><span style="display:flex;"><span>                    font-lock-delimiter-face
</span></span><span style="display:flex;"><span>                    font-lock-bracket-face<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">(</span>set-face-attribute face <span style="color:#8fbcbb">nil</span> <span style="color:#81a1c1">:foreground</span> fg-dimmed<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span>set-face-attribute <span style="color:#a3be8c">&#39;font-lock-number-face</span> <span style="color:#8fbcbb">nil</span> <span style="color:#81a1c1">:foreground</span> fg-symbol<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span>set-face-attribute <span style="color:#a3be8c">&#39;font-lock-constant-face</span> <span style="color:#8fbcbb">nil</span> <span style="color:#81a1c1">:foreground</span> fg-symbol<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span>set-face-attribute <span style="color:#a3be8c">&#39;font-lock-type-face</span> <span style="color:#8fbcbb">nil</span> <span style="color:#81a1c1">:foreground</span> fg-type<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span>set-face-attribute <span style="color:#a3be8c">&#39;font-lock-property-name-face</span> <span style="color:#8fbcbb">nil</span> <span style="color:#81a1c1">:foreground</span> fg-name <span style="color:#81a1c1">:weight</span> <span style="color:#a3be8c">&#39;light</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span>set-face-attribute <span style="color:#a3be8c">&#39;font-lock-variable-name-face</span> <span style="color:#8fbcbb">nil</span> <span style="color:#81a1c1">:foreground</span> fg-name <span style="color:#81a1c1">:weight</span> <span style="color:#a3be8c">&#39;light</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span>set-face-attribute <span style="color:#a3be8c">&#39;font-lock-comment-face</span> <span style="color:#8fbcbb">nil</span> <span style="color:#81a1c1">:foreground</span> fg-bright<span style="color:#eceff4">)))</span>
</span></span></code></pre></div>
</details>

<p>There&rsquo;s only one slight problem. Sometimes, altering <code>font-lock-function-call-face</code> isn&rsquo;t good enough. Because of <code>lsp-mode</code>, I also had to &ldquo;erase&rdquo; <code>lsp-face-semhl-property</code> and <code>lsp-face-semhl-property</code>.</p>
<p>And then there&rsquo;s still only one bigger problem and that&rsquo;s imports&mdash;especially the <code>use</code> statements in PHP. They&rsquo;re horrible. I mean, even besides the stupid backslash. By default, Palenight chooses not one but <strong>three colours</strong> for a single statement like</p>
<pre tabindex="0"><code>use Filament\Forms\Components\Select;
</code></pre><p>it&rsquo;s not much better in Java. Luckily, thanks to modern syntax tree analysis of Tree-sitter, we can pretty easily define rules for specific nodes in the tree. Explore the tree with <code>treesit-explore-mode</code> and you&rsquo;ll find stuff like</p>
<pre tabindex="0"><code>(program (php_tag)
 (namespace_definition namespace
  name: (namespace_name (name) \ (name) \ (name) \ (name) \ (name))
  ;)
 (namespace_use_declaration use
  (namespace_use_clause
   (qualified_name
    prefix: (namespace_name (name) \ (name) \ (name))
    prefix: \ (name)))
  ;)
</code></pre><p>Tree-sitter even makes the distinction between <code>use</code> and <code>name</code>, but we&rsquo;ll want to mute the entire line, not just a part of it. So we can say something along the lines of <code>(namespace_use_clause [(qualified_name) (name)] @default)</code> which means &ldquo;apply the font <code>default</code> to the <code>namespace_use_clause</code>.&rdquo; Throw that in a <code>php-ts-hook</code> and we&rsquo;re all set:</p>
<details class="spoiler">
  <summary>(Elisp snippet)</summary>
  <div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-elisp" data-lang="elisp"><span style="display:flex;"><span><span style="color:#eceff4">(</span>add-hook <span style="color:#a3be8c">&#39;php-ts-mode-hook</span>
</span></span><span style="display:flex;"><span>          <span style="color:#eceff4">(</span><span style="color:#81a1c1">lambda</span> <span style="color:#eceff4">()</span>
</span></span><span style="display:flex;"><span>            <span style="color:#a3be8c">&#34;Mutes PHP namespaces with treesit queries.&#34;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#eceff4">(</span><span style="color:#81a1c1">setq-local</span> treesit-font-lock-settings
</span></span><span style="display:flex;"><span>                        <span style="color:#eceff4">(</span><span style="color:#88c0d0">append</span> treesit-font-lock-settings
</span></span><span style="display:flex;"><span>                                <span style="color:#eceff4">(</span>treesit-font-lock-rules
</span></span><span style="display:flex;"><span>                                 <span style="color:#81a1c1">:language</span> <span style="color:#a3be8c">&#39;php</span>
</span></span><span style="display:flex;"><span>                                 <span style="color:#81a1c1">:feature</span> <span style="color:#a3be8c">&#39;definition</span>
</span></span><span style="display:flex;"><span>                                 <span style="color:#81a1c1">:override</span> <span style="color:#8fbcbb">t</span>
</span></span><span style="display:flex;"><span>                                 <span style="color:#81a1c1">&#39;</span><span style="color:#eceff4">((</span>namespace_definition <span style="color:#eceff4">[</span><span style="color:#a3be8c">&#34;namespace&#34;</span> <span style="color:#a3be8c">&#34;;&#34;</span><span style="color:#eceff4">]</span> @default<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>                                   <span style="color:#eceff4">(</span>namespace_name <span style="color:#eceff4">[(</span>name<span style="color:#eceff4">)</span> <span style="color:#a3be8c">&#34;\\&#34;</span><span style="color:#eceff4">]</span> @default<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>                                   <span style="color:#eceff4">(</span>namespace_use_declaration <span style="color:#eceff4">[</span><span style="color:#a3be8c">&#34;use&#34;</span> <span style="color:#a3be8c">&#34;;&#34;</span><span style="color:#eceff4">]</span> @default<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>                                   <span style="color:#eceff4">(</span>namespace_use_clause <span style="color:#eceff4">[(</span>qualified_name<span style="color:#eceff4">)</span> <span style="color:#eceff4">(</span>name<span style="color:#eceff4">)]</span> @default<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>                                   <span style="color:#eceff4">(</span>qualified_name <span style="color:#a3be8c">&#34;\\&#34;</span> @default<span style="color:#eceff4">)))))</span>
</span></span><span style="display:flex;"><span>            <span style="color:#eceff4">(</span>treesit-font-lock-recompute-features<span style="color:#eceff4">)))</span>
</span></span></code></pre></div>
</details>

<p>
<figure><a href="https://brainbaking.com/post/2026/01/banning-syntax-highlighting-steroids/php.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/01/banning-syntax-highlighting-steroids/php.jpg" loading="lazy" title="Editing a PHP file in Palenight. Left: unedited. Right: with muted imports and applied Alabaster logic. " data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>Editing a PHP file in Palenight. Left: unedited. Right: with muted imports and applied Alabaster logic. </figcaption></figure>
</p>
<p>I haven&rsquo;t yet finalised the changes to the syntax highlighting colour palette&mdash;it might be an even better idea to completely dim these imports. Flycheck will add squiggly lines to unused/wrong imports anyway, so do we really need that distinction between unused and used import? Anyway, perhaps it&rsquo;s not worth fiddling with, as you&rsquo;ll only see the <code>use</code> statements for a second just after opening the file but before scrolling down.</p>
<p>Two more minor but significant modifications were needed to make Palenight enjoyable:</p>
<ol>
<li>Darken the default white foreground with 15% to reduce the contrast. That&rsquo;s another reason why I didn&rsquo;t like dark themes.</li>
<li>Experiment with specific fonts. I landed on Jetbrains Mono for my <code>fixed-pitch</code> font, but the <em>light</em> version, not the <em>normal</em> one. The thicker, the more my eyes have to work, but too thin and I can&rsquo;t make out the symbols either.</li>
</ol>
<p>Picking a font for editing deserves its own blog post. Stay tuned!</p>
<hr>
<p>Addendum: I forgot to mention that by stripping pretty much all colours from syntax highlight font faces, your <code>.el</code> files will look really boring. By default, &ldquo;constants&rdquo; (<code>nil</code>, <code>t</code>)/numbers and punctuation <code>()</code> aren&rsquo;t treated with anything special, so if you want to highlight the former and dim the latter, you&rsquo;ll need to rely on <code>font-lock-add-keywords</code> and throw in some regex:</p>
<details class="spoiler">
  <summary>(Elisp snippet)</summary>
  <div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-elisp" data-lang="elisp"><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">use-package</span> elisp-mode
</span></span><span style="display:flex;"><span>  <span style="color:#81a1c1">:ensure</span> <span style="color:#8fbcbb">nil</span>
</span></span><span style="display:flex;"><span>  <span style="color:#81a1c1">:config</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> bb/font-lock-el-parens <span style="color:#eceff4">()</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a3be8c">&#34;Add font-lock rule to dim parentheses in Elisp.&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span>font-lock-add-keywords <span style="color:#a3be8c">&#39;emacs-lisp-mode</span>
</span></span><span style="display:flex;"><span>                            <span style="color:#81a1c1">&#39;</span><span style="color:#eceff4">((</span><span style="color:#a3be8c">&#34;(\\|)&#34;</span> <span style="color:#81a1c1">.</span> <span style="color:#a3be8c">&#39;font-lock-punctuation-face</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>                              <span style="color:#eceff4">(</span><span style="color:#a3be8c">&#34;\\_&lt;[0-9]+\\(\\.[0-9]+\\)?\\_&gt;&#34;</span> <span style="color:#81a1c1">.</span> <span style="color:#a3be8c">&#39;font-lock-number-face</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>                              <span style="color:#eceff4">(</span><span style="color:#a3be8c">&#34;\\_&lt;\\(t\\|nil\\)\\_&gt;&#34;</span> <span style="color:#81a1c1">.</span> <span style="color:#a3be8c">&#39;font-lock-constant-face</span><span style="color:#eceff4">))))</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>add-hook <span style="color:#a3be8c">&#39;emacs-lisp-mode-hook</span> <span style="color:#88c0d0">#&#39;</span>bb/font-lock-el-parens<span style="color:#eceff4">))</span>
</span></span></code></pre></div>
</details>



          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/go">go</a> /
                  <a href="https://brainbaking.com/tags/php">php</a> /
                  <a href="https://brainbaking.com/tags/emacs">emacs</a> /
                  <a href="https://brainbaking.com/tags/syntax">syntax</a> /
                  <a href="https://brainbaking.com/tags/screenshot">screenshot</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 31 January 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Banning%20Syntax%20Highlighting%20Steroids">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Apple Ruined My Mechanical Keyboard Experience (A NuPhy Halo75 Review)</title>
      <link>https://brainbaking.com/post/2026/01/apple-ruined-my-mechanical-keyboard-experience-a-nuphy-halo-75-review/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Wed, 28 Jan 2026 15:17:38 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/01/apple-ruined-my-mechanical-keyboard-experience-a-nuphy-halo-75-review/</guid>
      
        
          <category domain="https://brainbaking.com/tags/keyboards">keyboards</category>
        
          <category domain="https://brainbaking.com/tags/macos">macos</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>My trusty external Apple Magic Keyboard disappeared into a drawer somewhere in the summer of 2024. It has never left that drawer until a few weeks ago, when I was so fed up with my inability to type correctly on the new mechanical keyboard that I decided it was time to go back to the Apple roots.</p>
<p>The next minute, it disappeared again into the same drawer. NuPhy wins, even though I&rsquo;m not a satisfied customer, but as we&rsquo;ll soon learn, that has nothing to do with the excellent design and make of the keyboard, but everything with the way I interact with my &ldquo;modern&rdquo; setup. That&rsquo;s in quotes just in case someone reminds me that an M1 chip is six years old by now. I know, and the MacBook is still doing more than fine, so I intend to keep it around for at least another year or two.</p>
<p>All other PC towers here house AGP (cutting-edge!), PCI (wow!), or even VLB expansion cards. Needless to say, I don&rsquo;t have any modern computer: my sole work mate is my &ldquo;old&rdquo; Apple laptop. Why do I bring this up? Because that&rsquo;s exactly where all the problems start. My interaction with the laptop isn&rsquo;t limited to my home office where the new mechanical keyboard, an Apple touchpad, and a DELL work station screen complete the setup. Most of my interaction happens directly <em>on</em> the laptop: in and around classrooms at work, and in lazy mode on the couch.
Long story short: 69% of my typing happens on the built-in Apple keyboard. That&rsquo;s very important because of <em>context switching</em>.  I only recently learned that the NuPhy I bought came with an ANSI key layout that&rsquo;s mostly used in the US, while here in Europe we&rsquo;re mostly accustomed to ISO key layouts. Whoops&hellip; While both are fairly standard QUERTY keyboards, the placement of a few buttons is very irritating when constantly switching between mechanical keyboard and laptop keyboard. Observe:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/01/apple-ruined-my-mechanical-keyboard-experience-a-nuphy-halo-75-review/magic-keyboard-vs-nuphy.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/01/apple-ruined-my-mechanical-keyboard-experience-a-nuphy-halo-75-review/magic-keyboard-vs-nuphy.jpg" loading="lazy" title="The Apple Magic Keyboard (above) and the NuPhy Halo 75 (below). Quite a hefty difference. Literally." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>The Apple Magic Keyboard (above) and the NuPhy Halo 75 (below). Quite a hefty difference. Literally.</figcaption></figure>
</p>
<p>What&rsquo;s the biggest difference? Let&rsquo;s reformulate that question: what&rsquo;s the most annoying difference? Here&rsquo;s what I came up with:</p>
<ul>
<li>What the hell is that ` backtick doing all the way above <code>TAB</code>?</li>
<li>Where is my <code>FN</code> button? Oh, there, on the right. Wait, where&rsquo;s my right <code>OPT</code> key? Simply gone?</li>
<li>What the hell is that \ backslash doing all the way above <code>ENTER</code>?</li>
</ul>
<p>There are a few big advantages to using ANSI though. The arrow keys are obviously much easier to hit, and the huge left <code>SHIFT</code> is very comfortable to use. Unless I want to hit ` and muscle memory has me move the left pinkie towards that area.</p>
<p>And then I learned about <a href="https://karabiner-elements.pqrs.org/">Karabiner Elements</a>, a tool to customize the keyboard for macOS. Yes, you can do that at hardware-level on the NuPhy with <a href="https://usevia.app/">VIA</a>, but then I&rsquo;d still be hitting the wrong keys 69% of the time. In a first attempt, I mapped a press of the big <code>SHIFT</code> key to the backtick, and the right <code>SHIFT</code> to backslash. I quickly learned that wasn&rsquo;t a very bright idea as apparently I hit <code>SHIFT</code> often without even noticing it, when deciding whether to uppercase something. The result was a wall of text sprinkled with the odd backtick here and there.</p>
<p>The dual key role Karabiner can offer is very handy for choosing a leader key in Emacs without wanting to rebind the <code>CMD</code> key. For example, on key press, it now sends <code>&lt;f13&gt;</code> (left) and <code>&lt;f16&gt;</code> (right), a key that&rsquo;s not used that I can map in Emacs. Why not <code>&lt;f14&gt;</code>? Because I needed that one to get the brightness controls working in VIA.</p>
<p>My second attempt now turns the ISO into a bit more of an ANSI keyboard, by mapping the weird useless plus symbol next to <code>1/!</code> to ` and by configuring a sacrificial swap; the right <code>OPT</code> for <code>FN</code>. The physical <code>FN</code> switch on the laptop now acts as <code>CTRL</code>, since hitting <code>CTRL</code>&mdash;something you do way too much when using Emacs&mdash;is much easier on the NuPhy. Here&rsquo;s how that looks like in <code>karabiner.json</code>:</p>
<details class="spoiler">
  <summary>(karabiner.json config snippet)</summary>
  <div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>  <span style="color:#81a1c1">&#34;description&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;ANSI-to-ISO emulation + Emacs Leader key hacks&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>  <span style="color:#81a1c1">&#34;manipulators&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;description&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;§ to ` (ANSI/ISO alignment)&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;type&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;basic&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;from&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#81a1c1">&#34;key_code&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;non_us_backslash&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>        <span style="color:#81a1c1">&#34;modifiers&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;optional&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>            <span style="color:#a3be8c">&#34;any&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#eceff4">]</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">},</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;to&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;key_code&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;grave_accent_and_tilde&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">]</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">},</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;description&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;MacBook Fn (far left) to Left Control (ANSI/ISO alignment)&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;type&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;basic&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;from&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#81a1c1">&#34;apple_vendor_top_case_key_code&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;keyboard_fn&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>        <span style="color:#81a1c1">&#34;modifiers&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;optional&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>            <span style="color:#a3be8c">&#34;any&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#eceff4">]</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">},</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;to&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;key_code&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;left_control&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">]</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">},</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;description&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;MacBook Right Opt to Fn (ANSI/ISO alignment)&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;type&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;basic&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;from&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#81a1c1">&#34;key_code&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;right_option&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>        <span style="color:#81a1c1">&#34;modifiers&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;optional&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>            <span style="color:#a3be8c">&#34;any&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#eceff4">]</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">},</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;to&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;apple_vendor_top_case_key_code&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;keyboard_fn&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">]</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">},</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;description&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;Caps Lock: Tap for Escape, Hold for Control&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;from&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#81a1c1">&#34;key_code&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;caps_lock&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>        <span style="color:#81a1c1">&#34;modifiers&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;optional&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>            <span style="color:#a3be8c">&#34;any&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#eceff4">]</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">},</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;to&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;key_code&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;left_control&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">],</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;to_if_alone&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;key_code&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;escape&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">],</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;type&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;basic&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">},</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;description&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;Left Command: Tap for f13 (Emacs leader), Hold for Cmd&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;from&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#81a1c1">&#34;key_code&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;left_command&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>        <span style="color:#81a1c1">&#34;modifiers&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;optional&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>            <span style="color:#a3be8c">&#34;any&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#eceff4">]</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">},</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;to&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;key_code&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;left_command&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;lazy&#34;</span><span style="color:#eceff4">:</span> <span style="color:#81a1c1;font-weight:bold">true</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">],</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;to_if_alone&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;key_code&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;f13&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">],</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;type&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;basic&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">},</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;description&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;Right Command: Tap for f16 (Emacs leader), Hold for Option.&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;from&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#81a1c1">&#34;key_code&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;right_command&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>        <span style="color:#81a1c1">&#34;modifiers&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;optional&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>            <span style="color:#a3be8c">&#34;any&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#eceff4">]</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">},</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;to&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;key_code&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;left_option&#34;</span><span style="color:#eceff4">,</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;lazy&#34;</span><span style="color:#eceff4">:</span> <span style="color:#81a1c1;font-weight:bold">true</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">],</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;to_if_alone&#34;</span><span style="color:#eceff4">:</span> <span style="color:#eceff4">[</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">{</span>
</span></span><span style="display:flex;"><span>          <span style="color:#81a1c1">&#34;key_code&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;f16&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">],</span>
</span></span><span style="display:flex;"><span>      <span style="color:#81a1c1">&#34;type&#34;</span><span style="color:#eceff4">:</span> <span style="color:#a3be8c">&#34;basic&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">}</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">]</span>
</span></span><span style="display:flex;"><span><span style="color:#eceff4">}</span>
</span></span></code></pre></div>
</details>

<p>Again, I&rsquo;m not sure if I&rsquo;m completely satisfied with this setup. I basically &ldquo;lost&rdquo; quick access to brightness and volume settings with <code>FN</code> as I&rsquo;m left-handed and muscle memory for hitting those combinations has been baked in for more than ten years. I think I can also map <code>CTRL+F1</code> to send out <code>display_brightness_increment</code>, but at this point, it feels more like an instable hacky solution than anything else.</p>
<p>So I switched back to the Magic Keyboard to see if I could get without the NuPhy. And it turns out that I can&rsquo;t for a few other important reasons:</p>
<ul>
<li>Once you&rsquo;re used to the Cherry Red &ldquo;thock&rdquo; sound of the mechanical keys, you&rsquo;ll want to cry after hearing the annoying &ldquo;click&rdquo; sound of the Magic keys.</li>
<li>Fuck those tiny arrow keys. Although they are the same on the built-in keyboard, it somehow feels worse.</li>
</ul>
<p>The build quality of the NuPhy Halo 75 is exceptional. The keyboard is as heavy as it should be, the keys feel very satisfying to press, the key press sound is superb, that spacebar is amazing and very stable, and the RGB lights are completely useless but fun.</p>
<p>Problem number two approaches: regularly switching keyboards, especially from full profile to completely flat ones such as the ones from Apple, is a <em>very bad idea</em>. The total travel distance of the built-in and the Magic keyboard is extremely short whilst the total travel distance of the NuPhy Halo75&mdash;even though they list 0.5mm on <a href="https://nuphy.com/products/halo75">their product page</a>, which is more likely switch tolerance&mdash;is much bigger. They&rsquo;re full height mechanical keys, so that&rsquo;s not a big surprise. And I have to emphasise that I like typing on these full height keys. My friend&mdash;the one responsible for me spending money on yet another keyboard&mdash;has the low profile NuPhy variant, which doesn&rsquo;t come with a very appealing sound profile.</p>
<p>Yet precisely because of this difference, I more often hit the wrong key or even completely miss key strokes. When I spend more time with the NuPhy, the problem becomes less apparent, but after another few days at work or on the couch, sliding the NuPhy on is usually paired with cursing. Unfortunately, that&rsquo;s a problem Karabiner can&rsquo;t solve.</p>
<p>I can only conclude that Apple ruined my mechanical keyboard experience. It&rsquo;s not my hands, it&rsquo;s the bloody muscle memory trained by working on Apple laptops for the past fifteen years. So I&rsquo;m not getting rid of the NuPhy and that Magic keyboard stays in that drawer indefinitely.</p>
<p>You didn&rsquo;t see that coming, did you? I love typing on this thing I&rsquo;m typing this sentence on right now. It&rsquo;s just too satisfying. I can put up with some more cursing, and my wife isn&rsquo;t working from home right now so we&rsquo;re all good. The green Mojito theme is just lovely. Because of the angle and the height of the keyboard, the wrist rest is not optional, so don&rsquo;t forget to add another <code>$29</code>.</p>
<p>Jokes aside, I wonder what my options are. Since I&rsquo;ll likely be working on laptops in the near future, I guess the switch-keyboard-error-rate likely won&rsquo;t go away. I do think that the next keyboard will be an ISO one, or the next MacBook will be an ANSI one, to at least line up those discrepancies. Perhaps I should go with a split keyboard and a completely different layout? I wonder if the folks hammering on those keys all day do still use their built-in laptop keyboard.</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/keyboards">keyboards</a> /
                  <a href="https://brainbaking.com/tags/macos">macos</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 28 January 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Apple%20Ruined%20My%20Mechanical%20Keyboard%20Experience%20%28A%20NuPhy%20Halo75%20Review%29">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Keiji Yamagishi&#39;s Retro-Active Was Last Year&#39;s Most Played Album</title>
      <link>https://brainbaking.com/post/2026/01/keiji-yamagishis-retro-active-was-last-years-most-played-album/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Sat, 24 Jan 2026 09:08:41 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/01/keiji-yamagishis-retro-active-was-last-years-most-played-album/</guid>
      
        
          <category domain="https://brainbaking.com/tags/music">music</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>Fans of retro games will no doubt recognise the name: the Japanese video game composer and programmer Keiji Yamagishi is famous for his work on Ninja Gaiden and many other great (S)NES soundtracks during from tenure at Tecmo. Yamagishi-san moved on to produce his own chiptune music together with Brave Wave Productions when the gaming industry moved on from composing music in only eight bits.</p>
<p>His 2015 solo debut duo album, <em>Retro-Active Pt. 1</em> and <em>Retro-Active Pt. 2</em> has been on the daily playlist ever since I bought it. I&rsquo;m a sucker for 8-bit chiptunes neatfully mixed together with contemporary beats, which is exactly what you&rsquo;ll be paying for here. The first track on the first part, aptfully called <em>First Contact</em>, is enough to give you a taste of what you&rsquo;ll be in for:</p>
<figure>
	<a href="https://www.youtube.com/watch?v=QeX-gdJrcno" class="lbox"><img loading="lazy" class="img-responsive" src="https://brainbaking.com/post/2026/01/keiji-yamagishis-retro-active-was-last-years-most-played-album/yt-QeX-gdJrcno.jpg" title="YouTube video QeX-gdJrcno">
	</a>
	</figure>

<p>It doesn&rsquo;t stop there: Yamagishi-san collaborated with multiple other big hitters from the (retro) video game music world, such as Manami Matsumae (Mega Man, Trip World, Derby Stallion, &hellip;) and Ryuichi Nitta, his trusty co-composer who also worked on Ninja Gaiden.</p>
<p>It&rsquo;s best to let the music do the talking here. If the first track from <em>Pt. 1</em> hasn&rsquo;t convinced you, perhaps the first track from <em>Pt. 2</em>, <em>Thought Police</em>, will:</p>
<figure>
	<a href="https://www.youtube.com/watch?v=foABYpX8F44" class="lbox"><img loading="lazy" class="img-responsive" src="https://brainbaking.com/post/2026/01/keiji-yamagishis-retro-active-was-last-years-most-played-album/yt-foABYpX8F44.jpg" title="YouTube video foABYpX8F44">
	</a>
	</figure>

<p>I also love the album cover art. If you simply can&rsquo;t get enough, there&rsquo;s a remixed version Brave Wave also put out that I have yet to discover. As always, both albums are available at Bandcamp. It looks like Keiji Yamagishi released a third related album in 2019 called <a href="https://bravewave.bandcamp.com/album/the-retro-active-experience">The Retro-Active Experience</a> which is a compilation of the first two and a few remixes. That&rsquo;ll be my reward for writing this and searching for the accompanied links. A quote from a random review left behind on Bandcamp:</p>
<blockquote>
<p>&ldquo;Yamagishi is a living legend.&rdquo; – CHIPTUNES WIN, Glenntai</p>
</blockquote>
<p>Indeed.</p>
<p>Happy Saturday!</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/music">music</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 24 January 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Keiji%20Yamagishi%27s%20Retro-Active%20Was%20Last%20Year%27s%20Most%20Played%20Album">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Another Major Bike Service</title>
      <link>https://brainbaking.com/post/2026/01/another-major-bike-service/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Tue, 20 Jan 2026 14:50:03 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/01/another-major-bike-service/</guid>
      
        
          <category domain="https://brainbaking.com/tags/bike">bike</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>Last month I handed in my bike for another major repair service. It was sorely needed: a slight push on the pedals caused the chain to drop a gear, the front light wiring was broken since forever, and shifting in general always required two good clicks on the handlebar instead of just one.</p>
<p>This year, the bike turns ten. The previous one was stolen on a weekday evening after parking it right across the old courthouse&mdash;isn&rsquo;t that ironic? Of course that was entirely my fault: I kind of might have slightly forgotten to lock it. But still, who does that?</p>
<p>The local bicycle repair expert had their hands full: the entire back cassette gear together with the chain was replaced, the seat post was replaced (I didn&rsquo;t even know it was broken), the front light rewired, the brakes needed new blocks (I thought I replaced these two months ago? Maybe I need to break less often), and the right shifter on the bar got replaced. Everything together cost me about <code>€190</code>. The result is a spotless gear system that&rsquo;s lovely to drive:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/01/another-major-bike-service/bike-chain.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/01/another-major-bike-service/bike-chain.jpg" loading="lazy" title="A closeup of the replaced cassette gear and chain." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>A closeup of the replaced cassette gear and chain.</figcaption></figure>
</p>
<p>Yes, there once was a chain guard/fender in front of that chain protecting it from mud but that brittle plastic thing broke down long ago. This does mean the chain is open for attacks from road salt after snowy days like last week. I forgot to clean it and in just three days the entire chain was covered in rust&mdash;the <em>new</em> chain! After another trip to the bike shop for more mud remover and chain protector/oil, that problem was luckily solved.</p>
<p>My wife laughs at me for regularly cleaning and oiling the gears and chain. I <em>hate</em> a squeaky bike. I shudder when encountering other cyclists with poorly maintained bikes that you can hear weeping (weep-weep-weep) as they push their pedals. I want to hear exactly nothing and feel nothing but smoothness when I exert force on my pedals. For some reason, that&rsquo;s hugely satisfying for me. So yes, I try to keep the mud and sand out. But somehow, I forgot about the road salt: if you zoom in on the above photo you&rsquo;ll still spot spots (ha!) of rust here and there. I guess that means I&rsquo;ll be repeating the cleaning process later today.</p>
<p>The reason why the entire cassette was replaced is that apparently, the wear and tear on the gears gradually reduce the short edges of the gear that fit into the chain into very spiky ones. As a result, as you push on the pedals to move the chain, the gear no longer consistently &ldquo;locks&rdquo; into it, causing slipping. If you sometimes &ldquo;fall through&rdquo; when biking, it&rsquo;s time to inspect the gears. Did a cogwheel transform into a giant shuriken that would make every ninja jealous? Then perhaps it&rsquo;s time to visit the bike shop.</p>
<p>This wasn&rsquo;t the first time the chain and gear(s) got replaced&mdash;the last time was in 2021. The not cheap price tag does raise the question whether buying a new bike is the better option, but I really like my current bike. Besides, spreading the repair cost out on four-ish years makes it much more bearable. Riding the new bike to and from work on a daily basis would deteriorate the cogwheels just as fast unless I buy a very fancy e-bike with a belt drive. Also, small repairs like chain adjustments I can do myself. At least I think I can.</p>
<p>I don&rsquo;t have any fancy biking stats to share: I don&rsquo;t keep track of that. For me, my bike symbolises simplicity and freedom. I hope to be able to ride the Trek<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> for at least five more years.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I just found out that Trek is an American brand, while here in Belgium and The Netherlands we basically drown in excellent bike manufacturers. I&rsquo;ll take note of that should I ever decide to replace it.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/bike">bike</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 20 January 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Another%20Major%20Bike%20Service">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Customizing The Emacs Email Experience With Mu4e</title>
      <link>https://brainbaking.com/post/2026/01/customizing-the-emacs-email-experience-with-mu4e/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Thu, 15 Jan 2026 09:30:56 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/01/customizing-the-emacs-email-experience-with-mu4e/</guid>
      
        
          <category domain="https://brainbaking.com/tags/emacs">emacs</category>
        
          <category domain="https://brainbaking.com/tags/email">email</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>You all knew this was coming. After <a href="/post/2026/01/thinking-about-email-workflows/">thinking about my email workflow</a> I had to put it to practice. The grand plan was to force myself to learn more about Emacs by doing email in it with the added advantage of freeing up Mac Mail to manage my Exchange work emails there. Anything is better than staring at that dreaded Outlook web interface.</p>
<p>There are tons of cool blog posts out there about <code>mbsync</code>, <code>mu</code>, and <code>mu4e</code> configuration&mdash;this one&rsquo;s mine. Most focus on how to set up mbsync which is the CLI tool that syncs your IMAP account with a local folder for mu to index. The process is fairly straightforward: the only tricky thing to do is use macOS&rsquo;s password keyring to store the IMAP password and export a copy of the certificates for the handshake:</p>
<pre tabindex="0"><code>IMAPAccount brainbaking
Host imap.myserver.org
User wouter@myserver.org
PassCmd &#34;security find-generic-password -s mu4e-brainbaking-mailbox -a wouter@brainbaking.com -w&#34;
Port 993
TLSType IMAPS
AuthMechs Login
CertificateFile ~/Databases/maildir/certificates/root-certificates.pem
</code></pre><p>Instead, I&rsquo;d like to focus on <code>mu4e</code> configuration, as most of my sweat originated from that direction. You can find the full config at <a href="https://codeberg.org/wouterg/bakemacs/src/branch/main/config/mailbox.el">my &ldquo;bakemacs&rdquo; Codeberg repository</a>. I customized the hell out of it.</p>
<h2 id="vertical-layout">Vertical Layout</h2>
<p>First and foremost, I hate the default UI of mu4e. Splitting windows horizontally when opening an email just feels like a giant amount of wasted space. Any other sane email client splits vertically, usually in the popular three-column mode. The first column, a quick jump to your folders, isn&rsquo;t needed thanks to the shortcuts.</p>
<p>Changing the split config is very easy: <code>(setq mu4e-split-view 'vertical)</code>. Fiddle with <code>mu4e-headers-visible-columns</code> to get that percentage header/view just right (mine&rsquo;s at <code>40</code>):</p>
<p>But then the first buffer becomes completely useless because mu4e&rsquo;s header columns are sorted in a weird way. The from and subject columns are last which will be covered by the mail you just opened. Quickly scrolling through mails with <code>n</code> (next) and <code>p</code> (previous) loses its meaning. But mixing that up isn&rsquo;t that easy as the last column with a width of <code>nil</code> is the only one that can take up the remaining room. Additionally, since I use <code>consult-mu</code>, I want the headers to be consistent.</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-lisp" data-lang="lisp"><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> bb/mu4e-header-layout <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">&amp;optional</span> for-consult<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a3be8c">&#34;Calculate header widths based on current frame width.
</span></span></span><span style="display:flex;"><span><span style="color:#a3be8c">If FOR-CONSULT is non-nil, use :date instead of :human-date.&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">let*</span> <span style="color:#eceff4">((</span>width <span style="color:#eceff4">(</span>frame-width<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>         <span style="color:#eceff4">(</span>fixed-space <span style="color:#eceff4">(</span><span style="color:#88c0d0">+</span> <span style="color:#b48ead">20</span> <span style="color:#b48ead">12</span> <span style="color:#b48ead">12</span> <span style="color:#b48ead">6</span><span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>         <span style="color:#eceff4">(</span>subject-width <span style="color:#eceff4">(</span><span style="color:#88c0d0">max</span> <span style="color:#b48ead">20</span> <span style="color:#eceff4">(</span><span style="color:#88c0d0">-</span> width fixed-space <span style="color:#b48ead">10</span><span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>         <span style="color:#eceff4">(</span>date-field <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">if</span> for-consult <span style="color:#a3be8c">:date</span> <span style="color:#a3be8c">:human-date</span><span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>    <span style="color:#81a1c1">`</span><span style="color:#eceff4">((</span><span style="color:#a3be8c">:from</span>       <span style="color:#81a1c1">.</span> <span style="color:#b48ead">20</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">(</span><span style="color:#a3be8c">:subject</span>    <span style="color:#81a1c1">.</span> <span style="color:#81a1c1">,</span>subject-width<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">(</span><span style="color:#a3be8c">:flags</span>      <span style="color:#81a1c1">.</span> <span style="color:#b48ead">6</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">(</span><span style="color:#a3be8c">:short-maildir</span> <span style="color:#81a1c1">.</span> <span style="color:#b48ead">12</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>	  <span style="color:#eceff4">(</span><span style="color:#81a1c1">,</span>date-field <span style="color:#81a1c1">.</span> <span style="color:#b48ead">12</span><span style="color:#eceff4">))))</span>
</span></span></code></pre></div><p>Wait a minute, what&rsquo;s <code>:short-maildir</code>? That doesn&rsquo;t exist! Well, it does now:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-lisp" data-lang="lisp"><span style="display:flex;"><span><span style="color:#616e87;font-style:italic">;; unclutter that :maildir column please</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>add-to-list <span style="color:#a3be8c">&#39;mu4e-header-info-custom</span>
</span></span><span style="display:flex;"><span>               <span style="color:#81a1c1">&#39;</span><span style="color:#eceff4">(</span><span style="color:#a3be8c">:short-maildir</span> <span style="color:#81a1c1">.</span>
</span></span><span style="display:flex;"><span>								<span style="color:#eceff4">(</span><span style="color:#a3be8c">:name</span> <span style="color:#a3be8c">&#34;Short Maildir&#34;</span>
</span></span><span style="display:flex;"><span>								 <span style="color:#a3be8c">:shortname</span> <span style="color:#a3be8c">&#34;Folder&#34;</span>
</span></span><span style="display:flex;"><span>								 <span style="color:#a3be8c">:help</span> <span style="color:#a3be8c">&#34;Maildir without account prefix&#34;</span>
</span></span><span style="display:flex;"><span>								 <span style="color:#a3be8c">:function</span> <span style="color:#eceff4">(</span><span style="color:#81a1c1">lambda</span> <span style="color:#eceff4">(</span>msg<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>											 <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">let</span> <span style="color:#eceff4">((</span>maildir <span style="color:#eceff4">(</span>mu4e-message-field msg <span style="color:#a3be8c">:maildir</span><span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>											   <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">if</span> maildir
</span></span><span style="display:flex;"><span>												   <span style="color:#eceff4">(</span>replace-regexp-in-string <span style="color:#a3be8c">&#34;^/?brainbaking/?&#34;</span> <span style="color:#a3be8c">&#34;&#34;</span> maildir<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>												 <span style="color:#a3be8c">&#34;&#34;</span><span style="color:#eceff4">))))))</span>
</span></span></code></pre></div><p>No wonder the <code>:maildir</code> column isn&rsquo;t used by default. Then, wire the header layout function to both <code>mu4e-headers-fields</code> and <code>consult-mu-headers-fields</code>. The result:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/01/customizing-the-emacs-email-experience-with-mu4e/mu4e-splitscreen.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/01/customizing-the-emacs-email-experience-with-mu4e/mu4e-splitscreen.jpg" loading="lazy" title="mu4e:view with a mu4e:headers buffer to the left." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>mu4e:view with a mu4e:headers buffer to the left.</figcaption></figure>
</p>
<p>To discourage Emacs from opening the HTML version first in case both MIME parts are there just like in the screenshot, set <code>mm-discouraged-alternatives '(&quot;text/html&quot; &quot;text/richtext&quot;)</code>. If you receive a lot of HTML email with weird CSS colors, this might be handy too:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-lisp" data-lang="lisp"><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> bb/mu4e-view-force-clean-html <span style="color:#eceff4">()</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a3be8c">&#34;Render HTML using current theme colors by disabling SHR colors.&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>interactive<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span><span style="color:#88c0d0">require</span> <span style="color:#a3be8c">&#39;shr</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">let</span> <span style="color:#eceff4">((</span>shr-use-colors <span style="color:#8fbcbb">nil</span><span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span>mu4e-view-refresh<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>message <span style="color:#a3be8c">&#34;HTML colors stripped.&#34;</span><span style="color:#eceff4">))</span>
</span></span></code></pre></div><h2 id="threading-niceties">Threading Niceties</h2>
<p>Mu4e feels like a classic eighties text-based terminal app. No wonder conversation mode doesn&rsquo;t exist&mdash;but it makes up for that with the shortcuts (once you&rsquo;re familiar with them) and the threading view options it provides.</p>
<p>Yet my <code>bb/mu4e-header-layout</code> completely screwed up that because the last column isn&rsquo;t the &ldquo;flexible&rdquo; column anymore. Whoops. Most other blog posts seem to prefer horizontal splits as well. Digging into <code>mu4e-thread.el</code>, I discover a way to simply overwrite the logic:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-lisp" data-lang="lisp"><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>with-eval-after-load <span style="color:#a3be8c">&#39;mu4e-thread</span>
</span></span><span style="display:flex;"><span>	<span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> mu4e-thread-fold-info <span style="color:#eceff4">(</span><span style="color:#88c0d0">count</span> unread<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>      <span style="color:#a3be8c">&#34;A compact, single-line replacement for folded thread info fixing custom col logic.&#34;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">let</span> <span style="color:#eceff4">((</span>msg <span style="color:#eceff4">(</span><span style="color:#88c0d0">format</span> <span style="color:#a3be8c">&#34;\t[+%d%s messages in thread]\n&#34;</span> <span style="color:#88c0d0">count</span> <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">if</span> <span style="color:#eceff4">(</span><span style="color:#88c0d0">&gt;</span> unread <span style="color:#b48ead">0</span><span style="color:#eceff4">)</span> <span style="color:#eceff4">(</span><span style="color:#88c0d0">format</span> <span style="color:#a3be8c">&#34;, %d!&#34;</span> unread<span style="color:#eceff4">)</span> <span style="color:#a3be8c">&#34;&#34;</span><span style="color:#eceff4">))))</span>
</span></span><span style="display:flex;"><span>		<span style="color:#eceff4">(</span>propertize msg <span style="color:#a3be8c">&#39;face</span> <span style="color:#a3be8c">&#39;mu4e-thread-fold-face</span><span style="color:#eceff4">))))</span>
</span></span></code></pre></div><p>There, better. How about we add a quick way to fold and unfold all these conversations?</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-lisp" data-lang="lisp"><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> bb/mu4e-toggle-thread-folding <span style="color:#eceff4">()</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a3be8c">&#34;Toggle between folding and unfolding all threads.&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>interactive<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">if</span> mu4e-thread--fold-status
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">(</span>mu4e-thread-unfold-all<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>	<span style="color:#eceff4">(</span>mu4e-thread-fold-all<span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> bb/mu4e-toggle-thread-related <span style="color:#eceff4">()</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a3be8c">&#34;Toggle mu4e-headers-include-related and refresh the view.&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>interactive<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">setq</span> mu4e-headers-include-related <span style="color:#eceff4">(</span><span style="color:#88c0d0">not</span> mu4e-headers-include-related<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>mu4e-headers-rerun-search<span style="color:#eceff4">))</span>
</span></span></code></pre></div><p><code>include-related</code> integrates your sent mails into the thread just like a conversation but quickly turns the view into a mess, hence the toggle. I bound these to <code>z</code> and <code>Z</code>. The result:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/01/customizing-the-emacs-email-experience-with-mu4e/mu4e-threading.gif" class="lbox">
		<img src="https://brainbaking.com/post/2026/01/customizing-the-emacs-email-experience-with-mu4e/mu4e-threading.gif" loading="lazy" title="Showcasing the threading and related threading toggles in mu4e:view mode." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>Showcasing the threading and related threading toggles in mu4e:view mode.</figcaption></figure>
</p>
<p>The decent column colours come from the package <code>mu4e-column-faces</code>. The flags can be souped up with fancy variants by setting <code>mu4e-use-fancy-chars</code> and pairing simple with fancy char (e.g. <code>mu4e-headers-attach-mark '(&quot;a&quot; . &quot;📎&quot;)</code>). I prefer using nerd icons like everywhere else but haven&rsquo;t yet figured out how to do so.</p>
<h2 id="syncing-spam-rules">Syncing, Spam, Rules</h2>
<p>You can simply instruct mu4e to use an external syncing tool by setting <code>mu4e-get-mail-command</code> to <code>&quot;mbsync -a&quot;</code>. I used to hack it with the value <code>&quot;true&quot;</code> and then add an Elisp hook to execute the shell command myself in order to jam in <code>bogofilter</code> as a spam filter but that screws up the async fetch logic. The problems don&rsquo;t stop with spam filtering: I also want to apply some simple rules that automatically move incoming mails to certain IMAP folders. Mu4e doesn&rsquo;t work like that, you&rsquo;re supposed to use labels and leave things as is, but I&rsquo;d rather not.</p>
<p>With some help from my friend Gemini to identify the right functions, I came up with this:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-lisp" data-lang="lisp"><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> bb/mu4e-filter-inbox <span style="color:#eceff4">()</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a3be8c">&#34;Move files manually and strip UIDs with a silent Bogofilter check.&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>interactive<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">let*</span> <span style="color:#eceff4">((</span>match-count <span style="color:#b48ead">0</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>         <span style="color:#eceff4">(</span>base-dir <span style="color:#eceff4">(</span>mu4e-root-maildir<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>         <span style="color:#eceff4">(</span>mu-find-cmd <span style="color:#eceff4">(</span><span style="color:#88c0d0">format</span> <span style="color:#a3be8c">&#34;mu find maildir:%s --format=plain --fields=l&#34;</span> mu4e-inbox-folder<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>         <span style="color:#eceff4">(</span>paths <span style="color:#eceff4">(</span>split-string <span style="color:#eceff4">(</span>shell-command-to-string mu-find-cmd<span style="color:#eceff4">)</span> <span style="color:#a3be8c">&#34;\n&#34;</span> <span style="color:#8fbcbb">t</span><span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span><span style="color:#81a1c1">dolist</span> <span style="color:#eceff4">(</span>old-path paths<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>	  <span style="color:#616e87;font-style:italic">;; bogofilter output: 0 = spam, 1 = ham, 2 = unsure.</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">let*</span> <span style="color:#eceff4">((</span>is-spam <span style="color:#eceff4">(</span><span style="color:#88c0d0">=</span> <span style="color:#b48ead">0</span> <span style="color:#eceff4">(</span>call-process <span style="color:#a3be8c">&#34;bogofilter&#34;</span> <span style="color:#8fbcbb">nil</span> <span style="color:#8fbcbb">nil</span> <span style="color:#8fbcbb">nil</span> <span style="color:#a3be8c">&#34;&lt;&#34;</span> old-path<span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>             <span style="color:#eceff4">(</span>target-dir <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">if</span> is-spam <span style="color:#a3be8c">&#34;/brainbaking/Junk/new&#34;</span>
</span></span><span style="display:flex;"><span>                           <span style="color:#eceff4">(</span>bb/mu4e--match-rule old-path mu4e-inbox-rules<span style="color:#eceff4">))))</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">(</span><span style="color:#81a1c1">when</span> target-dir
</span></span><span style="display:flex;"><span>          <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">let*</span> <span style="color:#eceff4">((</span>filename <span style="color:#eceff4">(</span>file-name-nondirectory old-path<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>                 <span style="color:#eceff4">(</span>clean-name <span style="color:#eceff4">(</span>replace-regexp-in-string <span style="color:#a3be8c">&#34;,U=[0-9]+&#34;</span> <span style="color:#a3be8c">&#34;&#34;</span> filename<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>                 <span style="color:#eceff4">(</span>new-path <span style="color:#eceff4">(</span>concat base-dir <span style="color:#eceff4">(</span>expand-file-name clean-name target-dir<span style="color:#eceff4">))))</span>
</span></span><span style="display:flex;"><span>            <span style="color:#eceff4">(</span><span style="color:#88c0d0">rename-file</span> old-path new-path <span style="color:#8fbcbb">t</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>            <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">setq</span> match-count <span style="color:#eceff4">(</span><span style="color:#88c0d0">1+</span> match-count<span style="color:#eceff4">))))))</span>
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span><span style="color:#81a1c1">when</span> <span style="color:#eceff4">(</span><span style="color:#88c0d0">&gt;</span> match-count <span style="color:#b48ead">0</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">progn</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">(</span>mu4e-update-index<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">(</span>message <span style="color:#a3be8c">&#34;Filtered %d messages.&#34;</span> match-count<span style="color:#eceff4">)))))</span>
</span></span></code></pre></div><p>That&rsquo;s hooked into <code>mu4e-index-updated-hook</code>. What does this thing do?</p>
<ol>
<li>Find all email paths in the inbox folder (<code>mu4e-inbox-folder</code> is a custom var I made up) using <code>mu find</code>. I failed to find something working that mu4e provided.</li>
<li>For each path, ask bogofilter if this is spam. If yes, move to <code>/Junk/new</code>. If no, check the rules to see where it should end up in.</li>
<li>Move with <code>rename-file</code>, but strip the mu suffixes that already gave it an ID as this otherwise confuses mbsync/mu because we moved the file ourselves.</li>
<li>Re-index if anything happened to keep things in sync.</li>
</ol>
<p>Matching for rules is fairly straightforward:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-lisp" data-lang="lisp"><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> bb/mu4e--match-rule <span style="color:#eceff4">(</span>file rules<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a3be8c">&#34;Search the first 10000 chars of FILE for RULES.
</span></span></span><span style="display:flex;"><span><span style="color:#a3be8c">Return the target folder or nil.&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>with-temp-buffer
</span></span><span style="display:flex;"><span>    <span style="color:#616e87;font-style:italic">;; a peu pres the header area (2000 was too narrow) to avoid dumping the entire mail in there</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span>insert-file-contents file <span style="color:#8fbcbb">nil</span> <span style="color:#b48ead">0</span> <span style="color:#b48ead">10000</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">let</span> <span style="color:#eceff4">((</span>target <span style="color:#8fbcbb">nil</span><span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">(</span><span style="color:#81a1c1">dolist</span> <span style="color:#eceff4">(</span>rule rules target<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">(</span>goto-char <span style="color:#eceff4">(</span>point-min<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">(</span><span style="color:#81a1c1">when</span> <span style="color:#eceff4">(</span>re-search-forward <span style="color:#eceff4">(</span><span style="color:#88c0d0">car</span> rule<span style="color:#eceff4">)</span> <span style="color:#8fbcbb">nil</span> <span style="color:#8fbcbb">t</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>          <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">setq</span> target <span style="color:#eceff4">(</span><span style="color:#88c0d0">cdr</span> rule<span style="color:#eceff4">)))))))</span>
</span></span><span style="display:flex;"><span>		  
</span></span><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">setq</span>   mu4e-inbox-rules <span style="color:#81a1c1">&#39;</span><span style="color:#eceff4">((</span><span style="color:#a3be8c">&#34;^From:.*Limited Run Games&#34;</span> <span style="color:#81a1c1">.</span> <span style="color:#a3be8c">&#34;/brainbaking/Mailinglists/new&#34;</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>						   <span style="color:#eceff4">(</span><span style="color:#a3be8c">&#34;^From:.*SBS&#34;</span> <span style="color:#81a1c1">.</span> <span style="color:#a3be8c">&#34;/brainbaking/Mailinglists/cur&#34;</span><span style="color:#eceff4">)))</span>
</span></span></code></pre></div><p>The function inserts the first 10k chars of the email file itself into a temp buffer and uses regex to match the rules. A few caveats: <code>From:</code> occurs more than once in a raw email file, search for the beginning of a line. Also, the first 2k chars wasn&rsquo;t enough, some headers contain a lot of junk. You could just as well dump everything in there but the limit is there just in case.</p>
<p>But what if we move an email to the junk folder ourselves&mdash;shouldn&rsquo;t we train bogofilter to identify future mails like that as spam? Ah yes:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-lisp" data-lang="lisp"><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> bb/mu4e-train-on-move <span style="color:#eceff4">(</span>docid msg target<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a3be8c">&#34;Train bogofilter when moving to spam/inbox.&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">let*</span> <span style="color:#eceff4">((</span>rel-path <span style="color:#eceff4">(</span>mu4e-message-field msg <span style="color:#a3be8c">:path</span><span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>		 <span style="color:#eceff4">(</span>abs-path <span style="color:#eceff4">(</span>expand-file-name rel-path <span style="color:#eceff4">(</span>mu4e-root-maildir<span style="color:#eceff4">))))</span>
</span></span><span style="display:flex;"><span>	<span style="color:#eceff4">(</span><span style="color:#81a1c1">cond</span>
</span></span><span style="display:flex;"><span>	 <span style="color:#616e87;font-style:italic">;; Moving TO Junk</span>
</span></span><span style="display:flex;"><span>	 <span style="color:#eceff4">((</span><span style="color:#88c0d0">string=</span> target mu4e-spam-folder<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">progn</span>
</span></span><span style="display:flex;"><span>		<span style="color:#eceff4">(</span>shell-command <span style="color:#eceff4">(</span><span style="color:#88c0d0">format</span> <span style="color:#a3be8c">&#34;bogofilter -s &lt; %s&#34;</span> <span style="color:#eceff4">(</span>shell-quote-argument abs-path<span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>		<span style="color:#eceff4">(</span>message <span style="color:#a3be8c">&#34;Bogofilter: Trained SPAM (%s)&#34;</span> abs-path<span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>	 <span style="color:#616e87;font-style:italic">;; Moving TO Inbox</span>
</span></span><span style="display:flex;"><span>	 <span style="color:#eceff4">((</span><span style="color:#88c0d0">string=</span> target mu4e-inbox-folder<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>	  <span style="color:#eceff4">(</span>shell-command <span style="color:#eceff4">(</span><span style="color:#88c0d0">format</span> <span style="color:#a3be8c">&#34;bogofilter -n &lt; %s&#34;</span> <span style="color:#eceff4">(</span>shell-quote-argument abs-path<span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>	  <span style="color:#eceff4">(</span>message <span style="color:#a3be8c">&#34;Bogofilter: Trained HAM (%s)&#34;</span> abs-path<span style="color:#eceff4">)))))</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#616e87;font-style:italic">;; hook this thing in like this:</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>with-eval-after-load <span style="color:#a3be8c">&#39;mu4e</span>
</span></span><span style="display:flex;"><span>	<span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">let</span> <span style="color:#eceff4">((</span>move-mark <span style="color:#eceff4">(</span>alist-get <span style="color:#a3be8c">&#39;move</span> mu4e-marks<span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">(</span><span style="color:#81a1c1">setf</span> <span style="color:#eceff4">(</span>alist-get <span style="color:#a3be8c">&#39;move</span> mu4e-marks<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>			<span style="color:#eceff4">(</span>plist-put move-mark <span style="color:#a3be8c">:action</span>
</span></span><span style="display:flex;"><span>                       <span style="color:#eceff4">(</span><span style="color:#81a1c1">lambda</span> <span style="color:#eceff4">(</span>docid msg target<span style="color:#eceff4">)</span> <span style="color:#616e87;font-style:italic">;; train and do the original server move</span>
</span></span><span style="display:flex;"><span>						 <span style="color:#eceff4">(</span>bb/mu4e-train-on-move docid msg target<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>						 <span style="color:#eceff4">(</span>mu4e--server-move docid target<span style="color:#eceff4">))))))</span>
</span></span></code></pre></div><p>I don&rsquo;t know if the hook hack is the right thing to do but this works.</p>
<h2 id="fixing-annoyances">Fixing Annoyances</h2>
<p>More annoyances? You&rsquo;d be starting to wonder why use mu4e at all, right? Because we can and because it&rsquo;s Lisp!</p>
<p>When marking mails for actions such as deleting and moving, after pressing <code>x</code> to execute all marks you still have to confirm with <code>y</code> or <code>n</code>. I hate that: I want <code>x</code> and that&rsquo;s it. Another hack to the rescue:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-lisp" data-lang="lisp"><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> bb/mu4e-mark-execute <span style="color:#eceff4">()</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a3be8c">&#34;Execute mu4e mark all without asking for confirmation.&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>interactive<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>mu4e-mark-execute-all <span style="color:#8fbcbb">t</span><span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#616e87;font-style:italic">;; hook this thing in like this:</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a3be8c">:bind</span> <span style="color:#eceff4">(</span><span style="color:#a3be8c">:map</span> mu4e-main-mode-map
</span></span><span style="display:flex;"><span>		 <span style="color:#eceff4">(</span><span style="color:#a3be8c">&#34;u&#34;</span> <span style="color:#81a1c1">.</span> mu4e-update-mail-and-index<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>		 <span style="color:#a3be8c">:map</span> mu4e-headers-mode-map
</span></span><span style="display:flex;"><span>         <span style="color:#eceff4">(</span><span style="color:#a3be8c">&#34;z&#34;</span> <span style="color:#81a1c1">.</span> bb/mu4e-toggle-thread-folding<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>         <span style="color:#eceff4">(</span><span style="color:#a3be8c">&#34;Z&#34;</span> <span style="color:#81a1c1">.</span> bb/mu4e-toggle-thread-related<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>		 <span style="color:#eceff4">(</span><span style="color:#a3be8c">&#34;s-f&#34;</span> <span style="color:#81a1c1">.</span> <span style="color:#88c0d0">#&#39;</span>consult-mu<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>		 <span style="color:#eceff4">(</span><span style="color:#a3be8c">&#34;x&#34;</span> <span style="color:#81a1c1">.</span> bb/mu4e-mark-execute<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>		 <span style="color:#a3be8c">:map</span> mu4e-view-mode-map
</span></span><span style="display:flex;"><span>		 <span style="color:#eceff4">(</span><span style="color:#a3be8c">&#34;x&#34;</span> <span style="color:#81a1c1">.</span> bb/mu4e-mark-execute<span style="color:#eceff4">))</span>
</span></span></code></pre></div><p>The <code>:bind</code> solves another annoyance: updating in main mode is bound to the <code>U</code> key but I don&rsquo;t need that stinkin&rsquo; uppercase there. Also, since <code>s-f</code> is my <code>consult-line</code> anywhere else because I&rsquo;m coming from a more traditional editor, I have it pop up <code>consult-mu</code> here instead.</p>
<p>While debugging the spam filter function I occasionally required the full path of the open mail. Here&rsquo;s a handy function that adds it to your kill ring (that&rsquo;s Emacs l33t speak for &ldquo;clipboard history&rdquo;):</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-lisp" data-lang="lisp"><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> bb/mu4e-copy-message-path <span style="color:#eceff4">()</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a3be8c">&#34;Copy the path of the current message to the `kill-ring`.&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>interactive<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">let</span> <span style="color:#eceff4">((</span>path <span style="color:#eceff4">(</span>mu4e-message-field <span style="color:#eceff4">(</span>mu4e-message-at-point<span style="color:#eceff4">)</span> <span style="color:#a3be8c">:path</span><span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span>kill-new path<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span>message <span style="color:#a3be8c">&#34;Copied: %s&#34;</span> path<span style="color:#eceff4">)))</span>
</span></span></code></pre></div><h2 id="autocompleting-mac-contacts">Autocompleting Mac Contacts</h2>
<p>We&rsquo;re almost there. Yesterday I had the luminous idea to integrate Mac Contacts with mu4e. By default, when you enable auto-completion in compose mode, <code>TAB</code> fetches data from mu&rsquo;s indexes. That means you&rsquo;ll see email addresses from folks you&rsquo;ve already exchanged mails with. But I might have contacts saved (wired to our own CardDav server) where that&rsquo;s not the case. I discovered that this functionality is actually built into Emacs with <code>eudcb-macos-contacts</code>. Except that that didn&rsquo;t work.</p>
<p>Well, it didn&rsquo;t at first because I had Emacs running as a daemon using <code>launchctl</code> which is very strictly sandboxed and blocks any access to Contacts even though I explicitly approved it in the security settings. Now I run it as a simple login items startup shell script meaning it runs under my account.</p>
<p>And then it still didn&rsquo;t run <em>smoothly</em>: the autocomplete took 4 seconds to load because <code>eudcb</code> is ridiculously slow. So I went the other route and tried <code>contacts-cli</code>, a small tool that fetches info from Contacts leveraging Swift&rsquo;s native Mac-compliant capabilities. And that didn&rsquo;t work either because I couldn&rsquo;t get the tool to run. So I rolled my own, or rather, let Gemini do most of the rolling, as I don&rsquo;t know anything about Swift let alone the Mac-specific interfaces. It came up with a small script that I simply embedded into Elisp as a string:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-lisp" data-lang="lisp"><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> bb/mac-contacts-query <span style="color:#eceff4">(</span>str<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a3be8c">&#34;Query macOS contacts for STR using a native Swift snippet.&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span><span style="color:#81a1c1">unless</span> <span style="color:#eceff4">(</span><span style="color:#81a1c1">or</span> <span style="color:#eceff4">(</span><span style="color:#8fbcbb">null</span> str<span style="color:#eceff4">)</span> <span style="color:#eceff4">(</span>string-empty-p <span style="color:#eceff4">(</span><span style="color:#88c0d0">string-trim</span> str<span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">let*</span> <span style="color:#eceff4">((</span>swift-code <span style="color:#eceff4">(</span><span style="color:#88c0d0">format</span> <span style="color:#a3be8c">&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#a3be8c">import Contacts
</span></span></span><span style="display:flex;"><span><span style="color:#a3be8c">let store = CNContactStore()
</span></span></span><span style="display:flex;"><span><span style="color:#a3be8c">let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactEmailAddressesKey] as [CNKeyDescriptor]
</span></span></span><span style="display:flex;"><span><span style="color:#a3be8c">let predicate = CNContact.predicateForContacts(matchingName: \&#34;%s\&#34;)
</span></span></span><span style="display:flex;"><span><span style="color:#a3be8c">if let contacts = try? store.unifiedContacts(matching: predicate, keysToFetch: keys) {
</span></span></span><span style="display:flex;"><span><span style="color:#a3be8c">    for c in contacts {
</span></span></span><span style="display:flex;"><span><span style="color:#a3be8c">        for e in c.emailAddresses {
</span></span></span><span style="display:flex;"><span><span style="color:#a3be8c">            let name = \&#34;\\(c.givenName) \\(c.familyName)\&#34;.trimmingCharacters(in: .whitespaces)
</span></span></span><span style="display:flex;"><span><span style="color:#a3be8c">            print(\&#34;\\(name) &lt;\\(e.value)&gt;\&#34;)
</span></span></span><span style="display:flex;"><span><span style="color:#a3be8c">        }
</span></span></span><span style="display:flex;"><span><span style="color:#a3be8c">    }
</span></span></span><span style="display:flex;"><span><span style="color:#a3be8c">}&#34;</span> str<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>           <span style="color:#eceff4">(</span>cmd <span style="color:#eceff4">(</span><span style="color:#88c0d0">format</span> <span style="color:#a3be8c">&#34;echo %s | swift -&#34;</span> <span style="color:#eceff4">(</span>shell-quote-argument swift-code<span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>           <span style="color:#eceff4">(</span>results <span style="color:#eceff4">(</span>shell-command-to-string cmd<span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">(</span><span style="color:#81a1c1">unless</span> <span style="color:#eceff4">(</span>string-empty-p <span style="color:#eceff4">(</span><span style="color:#88c0d0">string-trim</span> results<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>        <span style="color:#eceff4">(</span>delete-dups <span style="color:#eceff4">(</span>split-string <span style="color:#eceff4">(</span><span style="color:#88c0d0">string-trim</span> results<span style="color:#eceff4">)</span> <span style="color:#a3be8c">&#34;\n&#34;</span> <span style="color:#8fbcbb">t</span><span style="color:#eceff4">))))))</span>
</span></span></code></pre></div><p>The output of <code>(bb/mac-contacts-query &quot;wouter&quot;)</code> then becomes <code>(&quot;Wouter Groeneveld &lt;emailaddress@domain.be&gt;&quot;)</code>. Cool! But how do we hook this into the existing mu4e autocomplete that already serves mu&rsquo;s indexed email addresses? Use <a href="https://github.com/minad/cape">Cape&rsquo;s Super-Capf</a> that merges stuff into a giant completion at point function:</p>
<div class="highlight"><pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-lisp" data-lang="lisp"><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> bb/mac-contacts-capf <span style="color:#eceff4">()</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a3be8c">&#34;Cape-compatible CAPF for macOS contacts via Swift.&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span><span style="color:#81a1c1;font-weight:bold">let</span> <span style="color:#eceff4">((</span>bounds <span style="color:#eceff4">(</span>bounds-of-thing-at-point <span style="color:#a3be8c">&#39;symbol</span><span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>    <span style="color:#616e87;font-style:italic">;; Check if we are actually in a header field (To, Cc, Bcc)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#eceff4">(</span><span style="color:#81a1c1">when</span> <span style="color:#eceff4">(</span><span style="color:#81a1c1">and</span> bounds <span style="color:#eceff4">(</span>save-excursion
</span></span><span style="display:flex;"><span>                        <span style="color:#eceff4">(</span>beginning-of-line<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>                        <span style="color:#eceff4">(</span>looking-at <span style="color:#a3be8c">&#34;^\\(To\\|Cc\\|Bcc\\):&#34;</span><span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>      <span style="color:#eceff4">(</span><span style="color:#8fbcbb">list</span> <span style="color:#eceff4">(</span><span style="color:#88c0d0">car</span> bounds<span style="color:#eceff4">)</span> <span style="color:#eceff4">(</span><span style="color:#88c0d0">cdr</span> bounds<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>            <span style="color:#eceff4">(</span>bb/mac-contacts-query <span style="color:#eceff4">(</span>buffer-substring-no-properties <span style="color:#eceff4">(</span><span style="color:#88c0d0">car</span> bounds<span style="color:#eceff4">)</span> <span style="color:#eceff4">(</span><span style="color:#88c0d0">cdr</span> bounds<span style="color:#eceff4">)))</span>
</span></span><span style="display:flex;"><span>            <span style="color:#a3be8c">:exclusive</span> <span style="color:#a3be8c">&#39;no</span>
</span></span><span style="display:flex;"><span>            <span style="color:#a3be8c">:company-kind</span> <span style="color:#eceff4">(</span><span style="color:#81a1c1">lambda</span> <span style="color:#eceff4">(</span>_<span style="color:#eceff4">)</span> <span style="color:#a3be8c">&#39;email</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>            <span style="color:#a3be8c">:annotation-function</span> <span style="color:#eceff4">(</span><span style="color:#81a1c1">lambda</span> <span style="color:#eceff4">(</span>_<span style="color:#eceff4">)</span> <span style="color:#a3be8c">&#34; [Mac]&#34;</span><span style="color:#eceff4">)))))</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#eceff4">(</span><span style="color:#81a1c1">defun</span> bb/mu4e-compose-setup <span style="color:#eceff4">()</span>
</span></span><span style="display:flex;"><span>  <span style="color:#a3be8c">&#34;Setup mu4e compose mode (proper corfu, spell et al stuff).&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>setq-local corfu-auto <span style="color:#8fbcbb">nil</span>
</span></span><span style="display:flex;"><span>			  completion-cycle-threshold <span style="color:#8fbcbb">nil</span>
</span></span><span style="display:flex;"><span>			  completion-at-point-functions <span style="color:#eceff4">(</span><span style="color:#8fbcbb">list</span>
</span></span><span style="display:flex;"><span>											 <span style="color:#eceff4">(</span>cape-capf-super
</span></span><span style="display:flex;"><span>											  <span style="color:#eceff4">(</span>cape-capf-properties <span style="color:#88c0d0">#&#39;</span>mu4e-complete-contact <span style="color:#a3be8c">:company-kind</span> <span style="color:#eceff4">(</span><span style="color:#81a1c1">lambda</span> <span style="color:#eceff4">(</span>_<span style="color:#eceff4">)</span> <span style="color:#a3be8c">&#39;email</span><span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>											  <span style="color:#88c0d0">#&#39;</span>bb/mac-contacts-capf<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>											 <span style="color:#88c0d0">#&#39;</span>message-completion-function
</span></span><span style="display:flex;"><span>											 <span style="color:#88c0d0">#&#39;</span>ispell-completion-at-point<span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>auto-fill-mode <span style="color:#b48ead">-1</span><span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>toggle-input-method<span style="color:#eceff4">)</span>
</span></span><span style="display:flex;"><span>  <span style="color:#eceff4">(</span>corfu-mode <span style="color:#b48ead">1</span><span style="color:#eceff4">))</span>
</span></span><span style="display:flex;"><span><span style="color:#eceff4">(</span>add-hook <span style="color:#a3be8c">&#39;mu4e-compose-mode-hook</span> <span style="color:#88c0d0">#&#39;</span>bb/mu4e-compose-setup<span style="color:#eceff4">)</span>
</span></span></code></pre></div><p>There, more annoyances fixed by disabling auto fill mode and telling Corfu to stay put until I press <code>TAB</code> myself. The keen Elisper will notice that we also wrapped the default <code>mu4e-complete-contact</code> to be able to inject a <code>:company-kind</code> lambda. This adds a nice icon to keep things consistent. Yes, you&rsquo;re right, <code>'email</code> is a symbol that doesn&rsquo;t exist in <code>nerd-icons</code>&mdash;just define it yourself with <code>'(email :style &quot;cod&quot; :icon &quot;mail&quot; :face font-lock-variable-name-face)</code>. The result:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/01/customizing-the-emacs-email-experience-with-mu4e/mu4e-autocomplete.gif" class="lbox">
		<img src="https://brainbaking.com/post/2026/01/customizing-the-emacs-email-experience-with-mu4e/mu4e-autocomplete.gif" loading="lazy" title="Autocompleting email addresses in the To: field in mu4e:compose mode." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>Autocompleting email addresses in the To: field in mu4e:compose mode.</figcaption></figure>
</p>
<p>Note the two test emails appearing with <code> [Mac]</code> suffixes: these come from Mac Contacts, while the first email address is a bogus one I emailed to in order to showcase the <code>capf</code> merge. The first time this triggers it&rsquo;s still a bit slow because of the Swift interpreter. I guess I can look into compiling that somehow? For now, I hope not to mess too much with the config anymore and to actually, you know, use it? Ah, the Emacs curse&hellip;</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/emacs">emacs</a> /
                  <a href="https://brainbaking.com/tags/email">email</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 15 January 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Customizing%20The%20Emacs%20Email%20Experience%20With%20Mu4e">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Favourites of December (And a Short 2025 Recap)</title>
      <link>https://brainbaking.com/post/2026/01/december-2025-and-a-recap/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Sat, 10 Jan 2026 11:47:07 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/01/december-2025-and-a-recap/</guid>
      
        
          <category domain="https://brainbaking.com/tags/metapost">metapost</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>A late happy new year to everyone! I almost forgot to publish last month&rsquo;s favourite (blog) posts, and since last month was the last one of 2025, let&rsquo;s do a short recap as well. Previous month&rsquo;s recap: <a href="/post/2025/12/november-2025">November 2025</a>.</p>
<p>Last year was another eventful year. Browse the full <a href="/post/2025/">2025 Brain Baking archive</a> for more juicy details. I selected one post per month that for me stands out:</p>
<ul>
<li>In January, I had the idea to <a href="/post/2025/01/you-should-compile-your-own-philosophy/">compile your own philosophy</a>. So far, I have collected lots of notes and summarised too many previous ones, but nothing has been published yet.</li>
<li>In February, I shared <a href="/post/2025/02/my-stationary-drawers/">my stationary drawers</a>. I should really clean out all those fountain pens.</li>
<li>In March, I dug up a photo of <a href="/post/2025/03/my-first-console/">my first console</a>, the SEGA Genesis/MegaDrive.</li>
<li>In April, I learned that <a href="/post/2025/04/my-sourdough-starter-has-twins/">my sourdough starter has twins</a> somewhere in Switzerland.</li>
<li>In May, more <a href="/post/2025/05/writing-is-taking-a-stab-at-immortality/">thoughts about writing and publishing</a> popped up.</li>
<li>In June, I debunked (or confirmed?) the fact that <a href="/post/2025/06/do-freelance-consultants-earn-more-than-their-employee-counterparts/">IT freelancers earn more than their employee counterparts</a>.</li>
<li>In July, I got influenced by other board game enthusiasts and admitted to <a href="/post/2025/07/too-many-games-too-little-time/">having too many games and too little time</a>.</li>
<li>In August, we welcomed our second little one and I <a href="/post/2025/08/forty/">turned forty</a>&mdash;in that order. Yes, that is important to me.</li>
<li>In September, I wrote too many articles about <a href="/post/2025/09/the-flemish-trick-taking-tradition/">trick taking games and local traditions</a>.</li>
<li>In October, I fondly looked back at years of <a href="/post/2025/10/i-owe-warez-for-properly-discovering-crpgs/">downloading warez software</a>.</li>
<li>In November, I recovered my late father-in-law&rsquo;s <a href="/post/2025/11/the-1994-ibm-pc-invoice/">1994 IBM PC invoice</a>.</li>
<li>In December, I started <a href="/post/2025/12/properly-preparing-tea-while-shaving-a-yak/">shaving Emacs yaks</a>. I haven&rsquo;t stopped ever since.</li>
</ul>
<p>Our son also kicked me out of my cosy home office upstairs. Luckily, our renovations were finished in time, so we moved the living room and I <a href="/post/2025/10/my-desk-setup-in-2025/">took the old space hostage</a>. One of the advantages of directly staring at a larger window is being able to admire the seasonal view:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/01/december-2025-and-a-recap/snow-desk.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/01/december-2025-and-a-recap/snow-desk.jpg" loading="lazy" title="The window at my desk showcases snowy trees." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>The window at my desk showcases snowy trees.</figcaption></figure>
</p>
<p>For 2026, I only wish for one thing: <em>stability</em>. Let&rsquo;s stop the craziness and try to get things settled down. No more kids, renovations, job changes, broken bicycles, and serious sickness please. Just, you know, breathing. <em>Whoosah</em>.</p>
<h2 id="selected-blog-posts">Selected (blog) posts</h2>
<p>Last month I joined the Advent of Code challenge using Clojure, a language I know absolutely nothing about. Since then I&rsquo;ve been obsessed with Lisp-based dialects. Forgive me if most of the links below are programming-oriented: it&rsquo;s been invigorating to learn something new and actually enjoy a programming language for a chance. It&rsquo;s the reason I&rsquo;m typing this in Emacs now, although I haven&rsquo;t even installed CIDER yet. All in due time&hellip;</p>
<ul>
<li>Nick George reports on <a href="https://nickgeorge.net/programming/custom-static-clojure-websites-an-update/">building static websites with Clojure</a>.</li>
<li>Nathan Marz describes how <a href="http://nathanmarz.com/blog/clojures-missing-piece.html">he invented Specter</a> to fill Clojure&rsquo;s mutability hole. I don&rsquo;t understand 90% of the technicalities there, but one day, I will.</li>
<li>More Clojure stuff. Sorry&hellip; Mikko Koski helped me get started: <a href="https://www.mikkokoski.com/blog/8-tips-for-advent-of-code-2022/index.html">8 tips for Advent of Code 2022</a> in Clojure.</li>
<li>A more official one, but just as interesting: the <a href="https://clojure.org/news/2024/12/02/state-of-clojure-2024">State of Clojure 2024 results</a>. 76% of the people using it build web apps, 40% is on Emacs/CIDER, and Babashka is super popular!</li>
<li>This <a href="https://solhsa.com/aoc/">Advent of Code GIF archive</a> is crazy.</li>
<li>Victor Dorneanu wrote about his <a href="https://blog.dornea.nu/2024/02/22/from-doom-to-vanilla-emacs/">Doom Emacs to Vanilla</a> migration. I tried Doom/Spacemacs for about one whole day and then started back from scratch, but damn, it&rsquo;s <em>very</em> challenging, even though you can &ldquo;do what you want&rdquo;&mdash;if you&rsquo;re an Emacs/Elisp acolyte, that is. I&rsquo;m planning to get babtized in the Emacs Church very soon.</li>
<li>Alice from The Wallflower Digest shares her thoughts about <a href="https://thewallflowerdigest.co.uk/life/blog/personal-curriculums/">personal curriculums</a>; a way to get started with <em>deliberate</em> life-long learning. (via <a href="https://joelchrono.xyz/">Joel</a>, I think?)</li>
<li>Karthinks found <a href="https://karthinks.com/software/fifteen-ways-to-use-embark/">fifteen ways to use Embark</a>, a wonderful context-aware Emacs package.</li>
<li>More &ldquo;Emacs from scratch&rdquo; blogs to share: this one&rsquo;s <a href="https://arne.me/blog/emacs-from-scratch-part-one-foundations">from Arne</a> and lies out the foundations in case you want to get started. Thanks, Arne. You&rsquo;re in my RSS feed now.</li>
<li>Frank Meeuwsen writes (in Dutch) <a href="https://blog.frankmeeuwsen.com/2025/12/24/hoe-aitools-de-derde-golf.html">about AI tooling</a> and how they democratise digital literacy. Or rather, how they <em>should</em>.</li>
<li>Gregory J. Stein wrote a guide on <a href="https://cachestocaches.com/2017/3/complete-guide-email-emacs-using-mu-and/">email in Emacs using Mu and Mu4e</a>. I have more thoughts on that saved for a separate blog post.</li>
<li>If you&rsquo;d like to know how many Emacs packages you&rsquo;re currently rocking, Manuel Uberti <a href="https://manueluberti.eu/posts/2021-09-01-package-report/">has an Elisp <code>defun</code> for you</a> (via <a href="https://site.sebasmonia.com/">Sebastián</a>)</li>
<li>Kristoffer Balintona helped me better understand the <a href="https://kristofferbalintona.me/posts/202202211546/">Vertico completion-at-point-function stack</a>.</li>
</ul>
<p>Ok that was definitely too much Emacs stuff. The lack of other links shows how much I&rsquo;ve been obsessed with the editor lately. No <em>other random links</em> for this month!</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/metapost">metapost</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 10 January 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Favourites%20of%20December%20%28And%20a%20Short%202025%20Recap%29">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>Thinking about email workflows</title>
      <link>https://brainbaking.com/post/2026/01/thinking-about-email-workflows/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Wed, 07 Jan 2026 20:20:48 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/01/thinking-about-email-workflows/</guid>
      
        
          <category domain="https://brainbaking.com/tags/email">email</category>
        
          <category domain="https://brainbaking.com/tags/emacs">emacs</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>This <a href="/post/2025/12/getting-emacs-and-macos-to-play-nice">Emacs thing</a> is getting out of hand and eating away all my free time. Now I know what they mean with the saying &ldquo;diving into a rabbit hole&rdquo; (and never seeing the bottom of it). We&rsquo;re at 1k lines of Elisp code and I still add items to the <code>TODO</code> list that don&rsquo;t work well enough on a daily basis. For some weird reason, I decided to try my hand at using Emacs as an email client as well.</p>
<p>Anyway, we can save those boring technical details for another post you can safely skip then, but for now, let&rsquo;s stick with the philosophical implications of messing with my email schedule and/or habits. I&rsquo;ve had some dirty habits that I thought kicked the bucket way back in 2021 when I <a href="/post/2022/02/visualizing-personal-data-takeouts">threw out everything Google-related</a>. Except that I didn&rsquo;t throw out much&mdash;I just started doing something else.</p>
<p>My Google &amp; GMail account still lives but now primarily serves as yet another spam address. But I forgot to clean up and process the archive! I had another account lying around (<code>jefklak@gmail.com</code>) that I stopped using in 2013-ish but I forgot to clean up and process those archives as well! The Google Takeout as backup I saved, but the original ones I didn&rsquo;t delete, meaning my data was still out there. Whoops. The question is: what to do with a bunch of very old emails? Do you save them all? Locally or centrally? Which ones?</p>
<p>I had to think about this because the Emacs package I use&mdash;excellent Dutch software called <a href="https://djcbsoftware.nl/code/mu/mu4e/index.html">mu4e</a>&mdash;works with IMAP. I still rocked POP3 so I moved to IMAP. But in IMAP, you synchronize between client and server, meaning most stuff stays on the server which I don&rsquo;t like. Why keep an <code>/Archive</code> IMAP folder in there just accumulating junk to wire up and down? And should I dump my GMail archive in there as well?</p>
<p>Since moving from GMail (<a href="/post/2023/01/goodbye-protonmail">and then Protonmail</a>), my preferred mail client has been Apple Mail. I want a proper application for working with email, not a webapp, and I don&rsquo;t want any email near my smartphone (so I don&rsquo;t really care about syncing that much, which is why I stayed with POP). Nothing is stopping you from creating a folder &ldquo;On My Mac&rdquo; and moving stuff in there instead of pressing the <em>Archive</em> button&mdash;in that way, the email disappears from the server. But then it ends up in a proprietary database format. Now, it&rsquo;s all just flat text files syncing with <code>mbsync</code> and auto-backed up with various stuff.</p>
<p>But perhaps you still want a semi-permanent archive folder to sync just in case? I&rsquo;m a zero inbox kind of guy: once the mail has been dealt with, it needs to go:</p>
<ol>
<li>Is it spam? Move to junk &amp; have your filter learn from it.</li>
<li>Is it a short thing that you can answer (if needed) and forget about? Delete.</li>
<li>Is it informational/an invite/whatever that you can move to a calendar? Do it &amp; delete.</li>
<li>Is it an invoice/whatever where you can save the attach into the DEVONThink inbox? Do it &amp; delete.</li>
<li>Is it a receipt without attach? Print as PDF and treat as above.</li>
<li>Is it an email from family full of photos of last Saturday&rsquo;s party? Save them all to your NAS where Photoprism can find them &amp; delete.</li>
<li>Is it from an ongoing project that you still need to keep as evidence just in case? Move to the &ldquo;projects&rdquo; folder.</li>
<li>Is it an exciting email from friends, co-bloggers, et al.? Answer &amp; archive to save.</li>
</ol>
<p>That means my folders look like this:</p>
<pre tabindex="0"><code>- Archive/
- brainbaking/
	| Drafts/
	| INBOX/
	| Junk/
	| Mailinglists/
	| Projects/
	| Sent/
	| TempArchive/
	| Trash/
</code></pre><p>Why isn&rsquo;t <code>Archive/</code> inside the <code>brainbaking/</code> folder? Because that&rsquo;s outside IMAP sync zone. <code>TempArchive/</code> is there in case I need something synced, but it&rsquo;s rarely used and I plan to delete it in the coming months. <code>Projects/</code> will serve as the semi-saved &ldquo;ongoing thing but don&rsquo;t need to deal with right now but can&rsquo;t get rid of just yet&rdquo; folder.</p>
<p>But what about <code>Mailinglists/</code>? That&rsquo;s simple: I set up rules that automatically move emails to that folder to only occasionally glance at. For example, our daughter&rsquo;s preschool loves to send at least four days a week titled &ldquo;NEW MESSAGE IN PARENT PLATFORM!!!!!ONE!!11&rdquo;. Ah, and yes, that Limited Run Games mailing list? *Cough*. Yeah, that one that I shouldn&rsquo;t be looking at. In it goes: at least it&rsquo;s not staring at me in <code>INBOX/</code>.</p>
<p>Now about that (local) archive. Why keep emails around? Several reasons:</p>
<ul>
<li>I can&rsquo;t say goodbye to them. Several conversations with my late father-in-law and other deceased where I honestly don&rsquo;t have the courage to trash them permanently.</li>
<li>They were meaningful to me. Same as above, I guess, except for these people are still alive? I like keeping emails from lovely folks around.</li>
<li>They might still have a practical use. Since all mails are indexed by <code>mu</code>, I can quickly whip up a search and find stuff not stored elsewhere. It should, though.</li>
</ul>
<p>That being said, I am an opponent of blindfully preserving everything &ldquo;just in case&rdquo;. You don&rsquo;t need that email invoice if you have the invoice stored. You don&rsquo;t need that project mail if the project was done and buried five years ago. You don&rsquo;t need those superficial &ldquo;sure I&rsquo;ll be there&rdquo; appointment emails once the event is over. I hate it when people say <em>Just Save Everything, Dude, It&rsquo;s GMail!</em>. To me, that sounds like <em>I&rsquo;m Too Lazy To Filter, Dude! Where&rsquo;s My Stuff?</em> &mdash;although that&rsquo;s also a perfectly valid strategy.</p>
<p>But then again, that might just be me. How do you deal with your emails? What&rsquo;s your grand archival plan? Send me a mail and let me know! If it&rsquo;s interesting enough I&rsquo;ll promise to keep it indefinitely.</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/email">email</a> /
                  <a href="https://brainbaking.com/tags/emacs">emacs</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 7 January 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: Thinking%20about%20email%20workflows">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    <item>
      <title>2025 In Board Games</title>
      <link>https://brainbaking.com/post/2026/01/2025-in-board-games/</link>
      <comments>https://dosgame.club/@jefklak</comments>
      <pubDate>Sat, 03 Jan 2026 20:15:00 +0100</pubDate>
      <dc:creator>Wouter Groeneveld</dc:creator>
      <guid isPermaLink="true">https://brainbaking.com/post/2026/01/2025-in-board-games/</guid>
      
        
          <category domain="https://brainbaking.com/tags/boardgames">boardgames</category>
        
          <category domain="https://brainbaking.com/tags/lists">lists</category>
        
          <category domain="https://brainbaking.com/tags/yearnote">yearnote</category>
        
      

      
      <description>
          <![CDATA[ 
          <p>This post is the board game counterpart of the previous <a href="/post/2025/12/2025-in-video-games">2025 In Video Games</a> end of year note. There hasn&rsquo;t been a <em>Board Game Shelf Analysis</em> post in 2025 for some reason so I can&rsquo;t point you to recent photos of my collection. Because of two very young kids our board game time has been reduced to almost nothing, but nonetheless, I/we&rsquo;ve managed to squeeze in about 150 plays. That&rsquo;s even better than last year!</p>
<p>Here&rsquo;s a collage of all board games I played in 2025 along with the amount of plays on the bottom right of each cover, ranked from most played to least:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/01/2025-in-board-games/bgstats.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/01/2025-in-board-games/bgstats.jpg" loading="lazy" title="Board game plays in the last year: 150 plays." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>Board game plays in the last year: 150 plays.</figcaption></figure>
</p>
<p>A few side notes. For some weird reason, the play count is not accurate. For example, BGG records I&rsquo;ve played Regicide four times, which is correct. Still, the BG Stats app refuses to print out a nice yearly overview with accurate numbers. Also, note that most games that are heavily played (on the top) are <em>short games</em>. That&rsquo;s for a very good reason! Mage Knight, a notoriously long-winded one, was played exactly once to see how stuff works. I guess that means there&rsquo;s a lot of room for more joyful gaming and I don&rsquo;t need to spend more money to reap those benefits!</p>
<p>Since getting together becomes more difficult with a crying toddler and baby, squeezing in quick solo (card) games became the norm: Kingdom Legacy (10 plays), Reforest (9), Conservas (8) are all examples of those that can be played on the coach. Yet I&rsquo;m still proud that we played some more heavy hitters like SETI (5) and&hellip; wait&hellip; Great Western Trail (2)? Ok fine, SETI is the only bigger game that appeared once in a while.</p>
<p><a href="/post/2024/12/2024-in-board-games">Compared to 2024</a>, the &ldquo;one-off&rdquo; plays weren&rsquo;t that dramatic. It still fills one third of the above image but we replayed more games than we did test new ones and that&rsquo;s a good thing. the H-index for 2025 was 5, which I could have gamed by playing one more round of French Quarter. Here&rsquo;s the <a href="https://www.timjeanes.com/bggstats/">BGG Plays tool</a> graph:</p>
<p>
<figure><a href="https://brainbaking.com/post/2026/01/2025-in-board-games/bggplays.jpg" class="lbox">
		<img src="https://brainbaking.com/post/2026/01/2025-in-board-games/bggplays.jpg" loading="lazy" title="Visualizing plays logged on BoardGameGeek including a 10x10 challenge highlight." data-pagefind-index-attrs="title">
	</a>
	
		<figcaption>Visualizing plays logged on BoardGameGeek including a 10x10 challenge highlight.</figcaption></figure>
</p>
<p>The tail end isn&rsquo;t as long as in 2024 and I managed to colour in almost all die in the 10x10 challenge rectangle! If you watch closely you&rsquo;ll see that most of these die are one-sided meaning a solo play session. Games like Conservas and Kingdom Legacy are very quick and quite casual which plays (ha!) in their favour of returning to the table (or couch) the next evening.</p>
<p>There haven&rsquo;t been any big campaign games like last year&rsquo;s Gloomhaven: Jaws of the Lion&mdash;thank god for that. Dorfromantik Sakura that I picked up <a href="/post/2025/10/spiel-essen-2025">in SPIEL Essen this year</a> is strictly speaking campaign-based but very light to the touch and we enjoy it quite a lot. We&rsquo;re very close to unlocking box 3 and it&rsquo;s possible to start multiple campaigns for other friend groups.</p>
<p>As was the case last year, 6/159 or 3.7% of the plays were three-player or higher sessions. That&rsquo;s marginally better than last year&rsquo;s 2%. I&rsquo;ve come to accept that buying games that are only great with three or more will never end up in our shelf as they&rsquo;ll barely see the daylight. Hopefully a friend reading this will buy Cosmic Encounter and invite me over.</p>
<p>So which of these plays were <em>new</em> plays&mdash;or to put it differently: which of the games are my &ldquo;new&rdquo; 2025 GOTY games? I&rsquo;ll once again split this between games I played but don&rsquo;t own:</p>
<ul>
<li>💖 <strong>SETI: Search for Extraterrestrial Intelligence</strong>&mdash;clearly <em>the</em> Euro game of the year, what a banger. A must play.</li>
<li>💖 <strong>The Lord of the Rings: The Fellowship of the Ring Trick Taking Game</strong>&mdash;what can I say, I love <a href="/post/2025/09/the-flemish-trick-taking-tradition">trick taking games</a>.</li>
<li>💖 <strong>The Castles of Burgundy: Special Edition</strong>&mdash;a classic in a gigantic box that plays itself. It was the first time this year I played a proper <em>Burgundy</em> game.</li>
</ul>
<p>And the games we enjoyed the most and also own:</p>
<ul>
<li>💖 <strong>Dorfromantik Sakura</strong>&mdash;We have yet to discover most of what the game has to offer and already like it a lot.</li>
<li>💖 <strong>Reforest</strong>&mdash;Last year I nominated <em>Forest Shuffle</em> but perhaps I even like this nature-themed card placement game more.</li>
</ul>
<p>The jury is still out on Mage Knight (will probably love this), Great Western Trail, Terraforming Mars: Ares Expedition and all the other low play ones. We like Sky Team a lot but if you play it too often or play multiple sessions in rapid succession it can become boring.</p>
<p>It&rsquo;s very clear for me: SETI is my GOTY. It feels weird not to own it but it would be silly to buy it as one of my regular co-players owns it.</p>
<p>Games I didn&rsquo;t care for and will probably be looking to sell: Click A Tree (first play was disappointing), Cascadia: Rolling Hills (a mediocre roll-and-write), Let&rsquo;s Go! To Japan (not mine but it didn&rsquo;t click for me even though the art is great), Ora et Labora (an old friend that became a big long slog), and Conservas (it&rsquo;s very good but once you finish the campaign and know how it works it&rsquo;s dull).</p>
<p>It seems that we did buy quite a few <a href="/post/2025/02/roll-and-writes-board-games-lite">roll and write games</a>: Dinosaur Island is very cool, Rajas of the Ganges is good but not great, and I had high hopes for French Quarter as the designer is the one who invented previous year&rsquo;s GOTY Three Sisters. For me, I don&rsquo;t think any other roll and write will ever beat that game.</p>
<p>I&rsquo;m looking forward to receiving the wonderfully weird Dark Venture skirmish game, unwrapping Spirit Island and Earthborne Rangers, and buying The Fate of the Fellowship!</p>


          
          <p>
            Related topics: /
                  <a href="https://brainbaking.com/tags/boardgames">boardgames</a> /
                  <a href="https://brainbaking.com/tags/lists">lists</a> /
                  <a href="https://brainbaking.com/tags/yearnote">yearnote</a> /</span>
          </p>
          
          <p>
            By <a href="/about">Wouter Groeneveld</a> on 3 January 2026.&nbsp;
            <a href="mailto:hifromrss@brainbaking.com?subject=Re: 2025%20In%20Board%20Games">Reply via email</a>.
          </p>
          ]]>
      </description>
    </item>
    
    
    
    
  </channel>
</rss>
