<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Discontent</title>
    <link>https://discontent.fedward.org/</link>
    <description></description>
    <pubDate>Wed, 03 Jun 2026 19:08:57 +0000</pubDate>
    <item>
      <title>Making Linux Startup a Little Less … Linuxy</title>
      <link>https://discontent.fedward.org/making-linux-startup-a-little-less-linuxy</link>
      <description>&lt;![CDATA[but in the most Linuxy way possible&#xA;&#xA;I&#39;ve been using elementary OS on an old MacBook Pro and there&#39;s surprisingly little that I hate about it. That, of course, has given me time to find things that I don&#39;t quite like as much as I want to and then poke around and see if I can make them better. Last week&#39;s effort was some fine tuning of my keyboard layout that resulted in me filing a bug report, but it also meant that I had many opportunities to be disappointed by the system&#39;s appearance during startup.&#xA;!--more--&#xA;The Linux startup experience is defined in two different places. If you want the experience to seem as seamless as possible, you have to fix both of them.&#xA;&#xA;The first part of the puzzle is the boot loader, Grub. Grub is one of those things where somebody made a better boot loader than the one that had come before it), but stopped just after the point they&#39;d made a better thing. As a functional boot loader Grub is fine, but it operates strictly in text mode and its default font can be tiny on a modern computer with a high resolution display. If you spend any time looking at it at all (such as when you&#39;re testing settings that require a reboot, or if you&#39;re switching back and forth between operating systems on the same computer), you start to wonder why it still looks like that. I started to wonder, anyway.&#xA;&#xA;Some distributions package a larger font for Grub to use, but if your distribution doesn&#39;t have a large enough font, you can change it. The grub-mkfont command is provided for this purpose, because Grub can&#39;t just use a regular font (because of course it can&#39;t). I followed these instructions on Stack Exchange to make a Grub-compatible font.&#xA;&#xA;While you&#39;re editing /etc/default/grub to point it at your new, larger font, you can also set a background image for Grub with the GRUBBACKGROUND=&#34;/path/to/your/image&#34;. So I did that and used the same image I use as my wallpaper when I&#39;m logged in. Then I ran sudo update-grub, rebooted, and discovered that I couldn&#39;t read Grub&#39;s white text against the sky in my wallpaper photo. So I made a copy of my wallpaper photo, opened it in an editor, and overlaid a black, slightly translucent box over it. But how did I figure out what size to make the box? Are the margins for Grub&#39;s old school ASCII box documented anywhere? It does not seem like they are.&#xA;&#xA;So I downloaded a wallpaper that looked like a black and white sheet of grid paper, sized for my display. I measured the size of the grid in a photo editor (each square seemed to be 40 × 40 pixels), temporarily made it my Grub wallpaper, and then took a photo of it.&#xA;&#xA;A photo of an old MacBook Pro showing the Grub boot loader on top of a black and white grid&#xA;I wish I were joking&#xA;&#xA;Then I counted boxes (eyeballing the fractions), divided by 40, and used those numbers to get an approximate size for the overlay. It took a few iterations to fine tune the image so the overlay fit precisely into Grub&#39;s ASCII box, but it looks nice now.&#xA;&#xA;A photo of Mt. Moran, a large mountain in Grand Teton National Park, with the mountain reflected in the waters of Oxbow Bend. It is just after the sun has set behind the Teton Range and the sky is pink.&#xA;The image file itself, but with no Grub interface. You&#39;ll have to trust me that the overlay is the right size for Grub on my screen.&#xA;&#xA;But that&#39;s only the first part of the Linux startup process. Once Grub actually loads an operating system, the operating system takes over the display. In this case, the system is using Plymouth, and even more specifically it is using a Plymouth plugin called two-step. Sadly, Plymouth documentation is scant and two-step itself seems almost entirely undocumented. I couldn&#39;t figure out how to place my wallpaper and get Plymouth to scale it properly for whatever resolution it&#39;s using (which for some reason is not the full resolution of the display) until I read the two-step source code.&#xA;&#xA;It turns out that you can place a background image and get Plymouth to scale it simply by dropping a PNG file named background.png in the active theme&#39;s image directory and adding a single line of code to the theme&#39;s THEMENAME.plymouth file. By the time I found this I&#39;d already cloned the base elementary theme in /usr/share/plymouth/themes/ but in retrospect I could have just added the file to the existing theme. The THEMENAME.plymouth configuration file is a plain text file. Find the [two-step] block and add a single line that says ScaleBackgroundImage=1 and Plymouth will scale your image to fit without you having to do any work. After you add the image and line of code, install it with the command sudo update-initramfs -u and reboot.&#xA;&#xA;Now when my computer starts up, the same image seems to carry through the entire process from the boot loader all the way into my desktop wallpaper. It&#39;s actually three different images (a JPEG with an overlay for GRUB, a PNG for Plymouth, and a JPEG for the wallpaper), and if you sit there watching you can see the screen go blank briefly every time it switches between them. If you&#39;re not watching closely, however, it looks more or less like it&#39;s just one image and other stuff is happening around it. You almost can&#39;t see the duct tape holding it all together.&#xA;&#xA;video src=&#34;https://cloud.overcomplicated.systems/discontent/linuxstartup.mp4&#34; controls type=&#34;video/mp4&#34; alt=&#34;Video showing all of the steps in the startup process&#34;/video&#xA;&#xA;hr&#xD;&#xA;&#xD;&#xA;I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as a href=&#34;https://distraction.party/fedward&#34;fedward@distraction.party/a.]]&gt;</description>
      <content:encoded><![CDATA[<p><em>but in the most Linuxy way possible</em></p>

<p>I&#39;ve been using <a href="https://elementary.io/">elementary OS</a> on <a href="https://discontent.fedward.org/the-year-of-not-that-on-the-desktop">an old MacBook Pro</a> and there&#39;s surprisingly little that I hate about it. That, of course, has given me time to find things that I don&#39;t quite like as much as I want to and then poke around and see if I can make them better. Last week&#39;s effort was some fine tuning of my keyboard layout that resulted in me <a href="https://github.com/elementary/settings-keyboard/issues/568">filing a bug report</a>, but it also meant that I had many opportunities to be disappointed by the system&#39;s appearance during startup.

The Linux startup experience is defined in two different places. If you want the experience to seem as seamless as possible, you have to fix both of them.</p>

<p>The first part of the puzzle is the boot loader, Grub. Grub is one of those things where somebody made a better boot loader than <a href="https://en.wikipedia.org/wiki/LILO_(bootloader)">the one that had come before it</a>, but stopped just after the point they&#39;d made a better thing. As a functional boot loader Grub is fine, but it operates strictly in text mode and its default font can be tiny on a modern computer with a high resolution display. If you spend any time looking at it at all (such as when you&#39;re testing settings that require a reboot, or if you&#39;re switching back and forth between operating systems on the same computer), you start to wonder why it still looks like that. I started to wonder, anyway.</p>

<p>Some distributions package a larger font for Grub to use, but if your distribution doesn&#39;t have a large enough font, you can change it. The <code>grub-mkfont</code> command is provided for this purpose, because Grub can&#39;t just use a regular font (<a href="https://www.gnu.org/software/grub/manual/grub-dev/html_node/Introduction.html">because of course it can&#39;t</a>). I followed <a href="https://unix.stackexchange.com/questions/31672/can-grub-font-size-be-customised">these instructions on Stack Exchange to make a Grub-compatible font</a>.</p>

<p>While you&#39;re editing <code>/etc/default/grub</code> to point it at your new, larger font, you can also set a background image for Grub with the <code>GRUB_BACKGROUND=&#34;/path/to/your/image&#34;</code>. So I did that and used the same image I use as my wallpaper when I&#39;m logged in. Then I ran <code>sudo update-grub</code>, rebooted, and discovered that I couldn&#39;t read Grub&#39;s white text against the sky in my wallpaper photo. So I made a copy of my wallpaper photo, opened it in an editor, and overlaid a black, slightly translucent box over it. But how did I figure out what size to make the box? Are the margins for Grub&#39;s old school ASCII box documented anywhere? It does not seem like they are.</p>

<p>So I downloaded a wallpaper that looked like a black and white sheet of grid paper, sized for my display. I measured the size of the grid in a photo editor (each square seemed to be 40 × 40 pixels), temporarily made it my Grub wallpaper, and then took a photo of it.</p>

<p><img src="https://cloud.overcomplicated.systems/discontent/grubgrid.jpeg" alt="A photo of an old MacBook Pro showing the Grub boot loader on top of a black and white grid">
<em>I wish I were joking</em></p>

<p>Then I counted boxes (eyeballing the fractions), divided by 40, and used those numbers to get an approximate size for the overlay. It took a few iterations to fine tune the image so the overlay fit precisely into Grub&#39;s ASCII box, but it looks nice now.</p>

<p><img src="https://cloud.overcomplicated.systems/discontent/mtmoran-grub-dark.jpeg" alt="A photo of Mt. Moran, a large mountain in Grand Teton National Park, with the mountain reflected in the waters of Oxbow Bend. It is just after the sun has set behind the Teton Range and the sky is pink.">
<em>The image file itself, but with no Grub interface. You&#39;ll have to trust me that the overlay is the right size for Grub on my screen.</em></p>

<p>But that&#39;s only the first part of the Linux startup process. Once Grub actually loads an operating system, the operating system takes over the display. In this case, the system is using <a href="https://www.freedesktop.org/wiki/Software/Plymouth/">Plymouth</a>, and even more specifically it is using a Plymouth plugin called <code>two-step</code>. Sadly, Plymouth documentation is scant and <code>two-step</code> itself seems almost entirely undocumented. I couldn&#39;t figure out how to place my wallpaper and get Plymouth to scale it properly for whatever resolution it&#39;s using (which for some reason is not the full resolution of the display) until I read the <a href="https://gitlab.freedesktop.org/plymouth/plymouth/-/blob/main/src/plugins/splash/two-step/plugin.c">two-step source code</a>.</p>

<p>It turns out that you can place a background image and get Plymouth to scale it simply by dropping a PNG file named <code>background.png</code> in the active theme&#39;s image directory and adding a single line of code to the theme&#39;s <code>THEMENAME.plymouth</code> file. By the time I found this I&#39;d already cloned the base elementary theme in <code>/usr/share/plymouth/themes/</code> but in retrospect I could have just added the file to the existing theme. The <code>THEMENAME.plymouth</code> configuration file is a plain text file. Find the <code>[two-step]</code> block and add a single line that says <code>ScaleBackgroundImage=1</code> and Plymouth will scale your image to fit without you having to do any work. After you add the image and line of code, install it with the command <code>sudo update-initramfs -u</code> and reboot.</p>

<p>Now when my computer starts up, the same image seems to carry through the entire process from the boot loader all the way into my desktop wallpaper. It&#39;s actually three different images (a JPEG with an overlay for GRUB, a PNG for Plymouth, and a JPEG for the wallpaper), and if you sit there watching you can see the screen go blank briefly every time it switches between them. If you&#39;re not watching closely, however, it looks more or less like it&#39;s just one image and other stuff is happening around it. You almost can&#39;t see the duct tape holding it all together.</p>

<video src="https://cloud.overcomplicated.systems/discontent/linux_startup.mp4" controls=""></video>

<hr>

<p>I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as <a href="https://distraction.party/fedward">fedward@distraction.party</a>.</p>
]]></content:encoded>
      <guid>https://discontent.fedward.org/making-linux-startup-a-little-less-linuxy</guid>
      <pubDate>Tue, 02 Jun 2026 03:58:11 +0000</pubDate>
    </item>
    <item>
      <title>Once More, With F(r)ee(BSD)ling</title>
      <link>https://discontent.fedward.org/once-more-with-f-r-ee-bsd-ling</link>
      <description>&lt;![CDATA[Previously on this blog, I wrote about buying some new NAS hardware and installing TrueNAS. I expressed some mild discontent with the fact that TrueNAS is now based on Linux and not FreeBSD (like it used to be), but part of what I wanted out of a NAS was that it be an appliance I didn&#39;t have to manage as intensely as I would if I installed everything myself. Joke&#39;s on me.&#xA;!--more--&#xA;For several months TrueNAS worked more or less the way I wanted it to. In my last post on this subject I addressed the pain points I encountered when setting it up, but as I used it more I kept encountering issues that were harder or more annoying than they should have been. I could usually figure out how I needed to misuse the control interfaces to make something work the way I wanted to, and I ended up with a number of little things configured under the advanced settings interface (like how to get my SuperDrive to work in a way that survives system updates or how to load the right module for the hardware watchdog).&#xA;&#xA;But the reason I needed to configure the hardware watchdog at all was that it was crashing occasionally. After a few crashes I got the hardware watchdog working, and for a few weeks the watchdog would restart the box whenever it crashed. It didn&#39;t last. Eventually it started locking up in such a way that the hardware watchdog never restarted it, and no amount of BIOS resetting fixed it. There was nothing useful in the system logs, so I started to suspect that the crashes might be a hardware issue, and I contacted UGREEN.&#xA;&#xA;UGREEN, however, will only provide active support for their own software (UGOS), so I backed up my TrueNAS configuration and installed UGOS, which wiped out the startup drive in the machine. That&#39;s fine as far as it goes, since I had a backup, but UGOS doesn&#39;t support ZFS. That means that the entire time I had UGOS running I didn&#39;t have access to my existing files or services that depended on them (which is, uh, all of them). I ran UGOS for a few days and encountered no issues, but the system wasn&#39;t under any kind of load so it wasn&#39;t really a great test. After some back and forth with UGREEN and a failed attempt at imaging the startup drive with UGOS installed (so I could easily restore it), I gave up and made an emergency purchase of a new SSD so I could put TrueNAS on that and keep the UGOS SSD around to swap back in when I had more time to test it.&#xA;&#xA;And once again, the box crashed while running TrueNAS, and the watchdog didn&#39;t restart it. At least the fact that TrueNAS was installed on a different SSD ruled that individual component out as the root cause, which was more information than I had before. When I had some downtime I put the UGOS SSD back in the box, and once again it ran for several days without any errors. Meanwhile it couldn&#39;t seem to make it 48 hours without crashing under TrueNAS.&#xA;&#xA;Why was it crashing? Is there a hardware issue that&#39;s only exposed by TrueNAS? Some, maybe even most, of the crashes happened when the system was essentially idle, so it&#39;s hard to point the finger at hardware that fails at idle but only with certain software installed. Is it a software issue? Lots of people run TrueNAS, and I couldn&#39;t find much evidence that other people were having the same problems. Well, there was one guy, but he never posted a followup with any resolution (argh). Is it a problem with some containerized app I had installed? If so, how do I even figure out which one without evidence in the system logs? I don&#39;t really feel like digging through a dozen different containers&#39; log files to try to find a culprit. I don&#39;t even like Docker anyway!&#xA;&#xA;So, since I tend to prefer FreeBSD to Linux anyway (previously), last week I made one last backup of my TrueNAS configuration, wiped the (new) SSD, and installed FreeBSD on it. Since then I&#39;ve been adding back all the services I had under TrueNAS, just mostly by installing them directly and configuring NGINX by hand. I&#39;ve rebooted it a bunch of times over the past week as I&#39;ve made configuration changes, mostly to make sure that services all come back up after a restart, but it hasn&#39;t crashed once. Knock on wood.&#xA;&#xA; Two of the services are containerized, though. I put Nextcloud in a jail because I&#39;ve dealt with PHP and PostgreSQL package weirdness on FreeBSD before, and I wanted to isolate any dependencies or fragile bits, and a jail seemed the best way to limit the scope of those problems. And Immich is pretty much Docker only, so I had to install Linux in a virtual machine, then install Docker in the VM, and use the Docker in the VM to install Immich in a container. I might not have bothered to get immich up if it hadn&#39;t been the single hardest thing about setting up TrueNAS, and I wanted to save all the effort that went into getting my photo library up.&#xA;&#xA;hr&#xD;&#xA;&#xD;&#xA;I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as a href=&#34;https://distraction.party/fedward&#34;fedward@distraction.party/a.]]&gt;</description>
      <content:encoded><![CDATA[<p><em>Previously on this blog</em>, <a href="https://discontent.fedward.org/speed-running-barefoot-through-a-field-of-rakes">I wrote about buying some new NAS hardware and installing TrueNAS</a>. I expressed some mild discontent with the fact that TrueNAS is now based on Linux and not FreeBSD (like it used to be), but part of what I wanted out of a NAS was that it be an appliance I didn&#39;t have to manage as intensely as I would if I installed everything myself. Joke&#39;s on me.

For several months TrueNAS worked more or less the way I wanted it to. In my last post on this subject I addressed the pain points I encountered when setting it up, but as I used it more I kept encountering issues that were harder or more annoying than they should have been. I could usually figure out how I needed to misuse the control interfaces to make something work the way I wanted to, and I ended up with a number of little things configured under the advanced settings interface (like <a href="https://distraction.party/notice/B5xt61dt4DM8gN1H6W">how to get my SuperDrive to work in a way that survives system updates</a> or <a href="https://distraction.party/notice/B4tSZcI4jsK2KJb97Y">how to load the right module for the hardware watchdog</a>).</p>

<p>But the reason I needed to configure the hardware watchdog at all was that it was crashing occasionally. After a few crashes I got the hardware watchdog working, and for a few weeks the watchdog would restart the box whenever it crashed. It didn&#39;t last. Eventually it started locking up in such a way that the hardware watchdog never restarted it, and no amount of BIOS resetting fixed it. There was nothing useful in the system logs, so I started to suspect that the crashes might be a hardware issue, and I contacted UGREEN.</p>

<p>UGREEN, however, will only provide active support for their own software (UGOS), so I backed up my TrueNAS configuration and installed UGOS, which wiped out the startup drive in the machine. That&#39;s fine as far as it goes, since I had a backup, but UGOS doesn&#39;t support ZFS. That means that the entire time I had UGOS running I didn&#39;t have access to my existing files or services that depended on them (which is, uh, all of them). I ran UGOS for a few days and encountered no issues, but the system wasn&#39;t under any kind of load so it wasn&#39;t really a great test. After some back and forth with UGREEN and a failed attempt at imaging the startup drive with UGOS installed (so I could easily restore it), I gave up and made an emergency purchase of a <em>new</em> SSD so I could put TrueNAS on <em>that</em> and keep the UGOS SSD around to swap back in when I had more time to test it.</p>

<p>And once again, the box crashed while running TrueNAS, and the watchdog didn&#39;t restart it. At least the fact that TrueNAS was installed on a different SSD ruled that individual component out as the root cause, which was more information than I had before. When I had some downtime I put the UGOS SSD back in the box, and once again it ran for several days without any errors. Meanwhile it couldn&#39;t seem to make it 48 hours without crashing under TrueNAS.</p>

<p>Why was it crashing? Is there a hardware issue that&#39;s only exposed by TrueNAS? Some, maybe even <em>most</em>, of the crashes happened when the system was essentially idle, so it&#39;s hard to point the finger at hardware that fails at idle but only with certain software installed. Is it a software issue? Lots of people run TrueNAS, and I couldn&#39;t find much evidence that other people were having the same problems. Well, there was <a href="https://forums.truenas.com/t/truenas-scale-crashing-every-day/49931">one guy</a>, but he never posted a followup with any resolution (<a href="https://distraction.party/notice/B682Xz6yuaxI6sdNse">argh</a>). Is it a problem with some containerized app I had installed? If so, how do I even figure out which one without evidence in the system logs? I don&#39;t really feel like digging through a dozen different containers&#39; log files to try to find a culprit. I don&#39;t even like Docker anyway!</p>

<p>So, since I tend to prefer FreeBSD to Linux anyway (<a href="https://discontent.fedward.org/every-decision-results-in-technical-debt">previously</a>), last week I made one last backup of my TrueNAS configuration, wiped the (new) SSD, and installed FreeBSD on it. Since then I&#39;ve been adding back all the services I had under TrueNAS, just mostly* by installing them directly and configuring NGINX by hand. I&#39;ve rebooted it a bunch of times over the past week as I&#39;ve made configuration changes, mostly to make sure that services all come back up after a restart, but it hasn&#39;t crashed once. Knock on wood.</p>

<p><em>* Two of the services are containerized, though. I put <a href="https://nextcloud.com/">Nextcloud</a> in a <a href="https://www.freebsdhandbook.com/jails">jail</a> because I&#39;ve dealt with PHP and PostgreSQL package weirdness on FreeBSD before, and I wanted to isolate any dependencies or fragile bits, and a jail seemed the best way to limit the scope of those problems. And <a href="https://immich.app/">Immich</a> is pretty much Docker only, so I had to install Linux in a virtual machine, then install Docker in the VM, and use the Docker in the VM to install Immich in a container. I might not have bothered to get immich up if it hadn&#39;t been the single hardest thing about setting up TrueNAS, and I wanted to save all the effort that went into getting my photo library up.</em></p>

<hr>

<p>I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as <a href="https://distraction.party/fedward">fedward@distraction.party</a>.</p>
]]></content:encoded>
      <guid>https://discontent.fedward.org/once-more-with-f-r-ee-bsd-ling</guid>
      <pubDate>Thu, 21 May 2026 20:51:59 +0000</pubDate>
    </item>
    <item>
      <title>The Year of &#34;Not That&#34; on the Desktop</title>
      <link>https://discontent.fedward.org/the-year-of-not-that-on-the-desktop</link>
      <description>&lt;![CDATA[Whenever people ask &#34;what operating system do you use&#34; my answer is usually some variant of &#34;all of them.&#34; Except for a brief gap in the late 90s, since my college days my primary desktop operating system has been the Mac. Since that gap in the late 90s (when I actually paid real money for a nice HP) I&#39;ve generally had at least one computer around that could run some version of Windows, but it&#39;s never been my preference. And the running joke of &#34;this could be the year of Linux on the desktop&#34; was always just that: a joke. But I can&#39;t help feeling now that things have changed, because of a confluence of factors.&#xA;!--more--&#xA;I have several old Intel-based Macs that still see some use. I&#39;ve mostly managed to decommission the oldest of them, a Mac mini we used as a home theater PC, replacing it with a NAS. The other two, a MacBook Pro from 2015 (the last model before they switched to the hated butterfly keyboard) and a 5K iMac from 2017, are no longer supported by Apple, but they&#39;re still surprisingly decent computers. It turns out that, for my needs, computers mostly got as fast as I need them to be about a decade ago. We bought an M2 MacBook Air when the battery cells in the old MacBook Pro turned into forbidden pillows but then I ended up replacing the battery just to keep it as a backup. And the 5K iMac still has a beautiful display, so I kind of resent the fact that it&#39;s no longer supported.&#xA;&#xA;I&#39;ve been using OpenCore Legacy Patcher to work around the lack of official support for all the old Macs, but it slows down the software update process, and the software update process on Intel Macs was already slow compared to Apple Silicon (I vaguely recall that Apple introduced some streamlining in Software Update a few years ago and restricted it to Apple Silicon, but this is too hard to find a citation for). With the advent of Liquid Glass I haven&#39;t bothered to update any of the old Macs to macOS 26, so they really are at the end of the line for software updates. And I have to wonder why I would expend the effort anyway, since most of what&#39;s new (like Liquid Glass) isn&#39;t actually better, it&#39;s just change for the sake of change.&#xA;&#xA;Meanwhile, on the Windows side of things, I haven&#39;t updated anything in the house to Windows 11, because none of the hardware in the house is new enough to support it. Again, much like with OpenCore Legacy Patcher, you can just patch the installer and install Windows 11 on &#34;unsupported&#34; hardware, where it apparently runs just fine, but I have no interest in Copilot and I&#39;m not sure what needs are served by Windows 11 other than those of capitalism.&#xA;&#xA;And this is where we are. I don&#39;t want what Apple or Microsoft want to sell me, and it feels like software is just getting worse. Reportedly Apple&#39;s next OS release will be a Snow Leopard style focus on quality instead of new features (🤞🏻), but it&#39;s really starting to feel like Apple is focusing primarily on the funnel into a subscription cloud services, and their cloud services just aren&#39;t good enough for that. I still reluctantly pay for the 2TB iCloud plan because it&#39;s never a good time to ask my wife to migrate, but Apple has broken my music library more times than I care to count, and I&#39;ve got duplicates of a bunch of documents because my Documents folder kept getting cloned instead of synced (so I have a Documents folder that contains multiple, nearly identical, subfolders named Documents - computername).&#xA;&#xA;So I did the unthinkable and installed Linux Mint on the old MacBook Pro and it was … fine? All the hardware works, it starts up fast, and it doesn&#39;t seem to make anything impossible. I even spent some time getting the (few) Windows games I own to run in Lutris and Steam (all but Civilization VI, which requires newer video hardware than this old Mac has. But I also got it for free, so I&#39;m not complaining).&#xA;&#xA;Anyway, Linux Mint Cinnamon has a well deserved reputation as the &#34;just install it, it&#39;s fine&#34; Linux for Windows users, but it&#39;s maybe a little too Windows-y for me. So I looked around for Linux distributions that seem a little more Mac like, and found Zorin and elementary OS. Between the two of them, Zorin defaults to the Brave browser (ew (1), ew (2) although they turn off the misfeatures), while elementary OS has a strong policy against AI contributions, so I figured I&#39;d try installing elementary OS alongside Linux Mint.&#xA;&#xA;I ran into a couple problems with that plan, one of which was more significant than the other. First, it turned out that the installer elementary OS uses is inflexible with its assumptions about storage and EFI partitions, and my existing EFI partition was too small for it. I had to delete my Linux Mint partition and the existing EFI partition, manually create a newer, larger EFI partition, and then assign elementary OS to a new, unformatted partition. After that it installed just fine, but when I reinstalled Linux Mint after that, Linux Mint took ownership of my startup partition. To get it to boot elementary OS by default, I had to boot Linux Mint and change its Grub configuration. There may have been another way to change the default, but this was the first way that worked. Second, elementary OS hides uncommon keyboard layouts from its selection screen and doesn&#39;t have an obvious option to enable them (Linux Mint also hides them, but it has a checkbox for this purpose). I run the Carpalx QGMLWY layout, which is in the uncommon bucket, and the only way I could figure out how to enable it was to edit a file you&#39;re not supposed to edit.&#xA;&#xA;Other than those two configuration issues, I&#39;m actually quite happy with elementary OS and recommend it for the Linux-curious Mac user. The biggest positive in my book is that the trackpad gestures match what I&#39;m used to, so the various two- and three-finger swipes I use for forward and back, or app and space selection, work the way I expect them to. Linux Mint got a few of these gestures right, but I couldn&#39;t figure out where or how to enable the other UI gestures I&#39;m used to. Both distributions give you access to Flatpak apps, so you can pretty much install all the same GUI software on both with the same amount of effort. I have pointed a few default directories in my $HOME folder in both OSes to a shared partition so I&#39;m not downloading all the same stuff twice, but I was able to point Lutris to the same games I had already installed, and everything worked without me having to futz around installing patches and no-CD cracks all over again.&#xA;&#xA;Unfortunately, I don&#39;t think this is the last time I&#39;m going to have to think about what&#39;s in my OS (or what isn&#39;t). I really appreciate how elementary OS has a clear no-AI policy, but I&#39;m not sure how they&#39;re going to get around the AI generated code in the Linux kernel or in systemd. Depending on how things shake out on that front, I might have to spend even more time looking into alternatives.&#xA;&#xA;hr&#xD;&#xA;&#xD;&#xA;I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as a href=&#34;https://distraction.party/fedward&#34;fedward@distraction.party/a.]]&gt;</description>
      <content:encoded><![CDATA[<p>Whenever people ask “what operating system do you use” my answer is usually some variant of “all of them.” Except for a brief gap in the late 90s, since my college days my primary desktop operating system has been the Mac. Since that gap in the late 90s (when I actually paid real money for a nice HP) I&#39;ve generally had at least one computer around that could run some version of Windows, but it&#39;s never been my preference. And the running joke of “this could be the year of Linux on the desktop” was always just that: a joke. But I can&#39;t help feeling now that things have changed, because of a confluence of factors.

I have several old Intel-based Macs that still see some use. I&#39;ve mostly managed to decommission the oldest of them, a <a href="https://discontent.fedward.org/i-hate-computers">Mac mini we used as a home theater PC</a>, replacing it <a href="https://discontent.fedward.org/speed-running-barefoot-through-a-field-of-rakes">with a NAS</a>. The other two, a MacBook Pro from 2015 (the last model before they switched to the hated butterfly keyboard) and a 5K iMac from 2017, are no longer supported by Apple, but they&#39;re still surprisingly decent computers. It turns out that, for my needs, computers mostly got as fast as I need them to be about a decade ago. We bought an M2 MacBook Air when the battery cells in the old MacBook Pro turned into <a href="https://distraction.party/notice/AQ6evwbkI6OZnSAMdc">forbidden pillows</a> but then I ended up replacing the battery just to keep it as a backup. And the 5K iMac still has a beautiful display, so I kind of resent the fact that it&#39;s no longer supported.</p>

<p>I&#39;ve been using <a href="https://dortania.github.io/OpenCore-Legacy-Patcher/">OpenCore Legacy Patcher</a> to work around the lack of official support for all the old Macs, but it slows down the software update process, and the software update process on Intel Macs was already slow compared to Apple Silicon (I vaguely recall that Apple introduced some streamlining in Software Update a few years ago and restricted it to Apple Silicon, but this is too hard to find a citation for). With the advent of Liquid Glass I haven&#39;t bothered to update any of the old Macs to macOS 26, so they really are at the <a href="https://arstechnica.com/gadgets/2025/06/one-last-look-at-software-support-as-macos-26-tahoe-winds-down-the-intel-mac-era/">end of the line</a> for software updates. And I have to wonder why I would expend the effort anyway, since most of what&#39;s new (like Liquid Glass) isn&#39;t actually better, it&#39;s just change for the sake of change.</p>

<p>Meanwhile, on the Windows side of things, I haven&#39;t updated anything in the house to Windows 11, because none of the hardware in the house is new enough to support it. Again, much like with OpenCore Legacy Patcher, you can just patch the installer and install Windows 11 on “unsupported” hardware, where it apparently runs just fine, but I have no interest in Copilot and I&#39;m not sure what needs are served by Windows 11 other than those of capitalism.</p>

<p>And this is where we are. I don&#39;t want what Apple or Microsoft want to sell me, and it feels like software is just getting worse. Reportedly Apple&#39;s next OS release will be a <a href="https://www.macrumors.com/2026/03/15/ios-27-will-reportedly-be-like-mac-os-x-snow-leopard/">Snow Leopard style focus on quality instead of new features</a> (🤞🏻), but it&#39;s really starting to feel like Apple is focusing primarily on the funnel into a subscription cloud services, and their cloud services just aren&#39;t good enough for that. I still reluctantly pay for the 2TB iCloud plan because it&#39;s never a good time to ask my wife to migrate, but Apple has broken my music library more times than I care to count, and I&#39;ve got duplicates of a bunch of documents because my Documents folder kept getting cloned instead of synced (so I have a Documents folder that contains multiple, nearly identical, subfolders named Documents – <em>computername</em>).</p>

<p>So I did the unthinkable and installed Linux Mint on the old MacBook Pro and it was … fine? All the hardware works, it starts up fast, and it doesn&#39;t seem to make anything impossible. I even spent some time getting the (few) Windows games I own to run in Lutris and Steam (all but Civilization VI, which requires newer video hardware than this old Mac has. But I also got it for free, so I&#39;m not complaining).</p>

<p>Anyway, <a href="https://www.linuxmint.com/download.php">Linux Mint Cinnamon</a> has a well deserved reputation as the “just install it, it&#39;s fine” Linux for Windows users, but it&#39;s maybe a little too Windows-y for me. So I looked around for Linux distributions that seem a little more Mac like, and found <a href="https://zorin.com">Zorin</a> and <a href="https://elementary.io">elementary OS</a>. Between the two of them, Zorin defaults to the Brave browser (<a href="https://www.spacebar.news/stop-using-brave-browser/">ew</a> (1), <a href="https://thelibre.news/no-really-dont-use-brave/">ew</a> (2) although they <a href="https://www.theregister.com/2025/04/03/zorin_os_173/">turn off the misfeatures</a>), while elementary OS has a <a href="https://docs.elementary.io/contributor-guide/development/generative-ai-policy">strong policy against AI contributions</a>, so I figured I&#39;d try installing elementary OS alongside Linux Mint.</p>

<p>I ran into a couple problems with that plan, one of which was more significant than the other. First, it turned out that the installer elementary OS uses is inflexible with its assumptions about storage and EFI partitions, and my existing EFI partition was too small for it. I had to delete my Linux Mint partition and the existing EFI partition, manually create a newer, larger EFI partition, and then assign elementary OS to a new, unformatted partition. After that it installed just fine, but when I reinstalled Linux Mint after that, Linux Mint took ownership of my startup partition. To get it to boot elementary OS by default, I had to boot Linux Mint and change its Grub configuration. There may have been another way to change the default, but this was the first way that worked. Second, elementary OS hides uncommon keyboard layouts from its selection screen and doesn&#39;t have an obvious option to enable them (Linux Mint also hides them, but it has a checkbox for this purpose). I run the <a href="https://mk.bcgsc.ca/carpalx/?full_optimization">Carpalx QGMLWY layout</a>, which is in the uncommon bucket, and the only way I could figure out how to enable it was to edit a file you&#39;re not supposed to edit.</p>

<p>Other than those two configuration issues, I&#39;m actually quite happy with elementary OS and recommend it for the Linux-curious Mac user. The biggest positive in my book is that the trackpad gestures match what I&#39;m used to, so the various two- and three-finger swipes I use for forward and back, or app and space selection, work the way I expect them to. Linux Mint got a few of these gestures right, but I couldn&#39;t figure out where or how to enable the other UI gestures I&#39;m used to. Both distributions give you access to Flatpak apps, so you can pretty much install all the same GUI software on both with the same amount of effort. I have pointed a few default directories in my $HOME folder in both OSes to a shared partition so I&#39;m not downloading all the same stuff twice, but I was able to point Lutris to the same games I had already installed, and everything worked without me having to futz around installing patches and no-CD cracks all over again.</p>

<p>Unfortunately, I don&#39;t think this is the last time I&#39;m going to have to think about what&#39;s in my OS (or what isn&#39;t). I really appreciate how elementary OS has a clear no-AI policy, but I&#39;m not sure how they&#39;re going to get around the AI generated code in the <a href="https://docs.kernel.org/process/coding-assistants.html">Linux kernel</a> or in <a href="https://github.com/systemd/systemd/commit/744d589632c545e90ae76853abbfbc90cb530e24">systemd</a>. Depending on how things shake out on that front, I might have to spend even more time looking into <a href="https://noai.starlightnet.work/list.html">alternatives</a>.</p>

<hr>

<p>I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as <a href="https://distraction.party/fedward">fedward@distraction.party</a>.</p>
]]></content:encoded>
      <guid>https://discontent.fedward.org/the-year-of-not-that-on-the-desktop</guid>
      <pubDate>Tue, 21 Apr 2026 15:24:19 +0000</pubDate>
    </item>
    <item>
      <title>Speed Running Barefoot Through a Field of Rakes</title>
      <link>https://discontent.fedward.org/speed-running-barefoot-through-a-field-of-rakes</link>
      <description>&lt;![CDATA[It was getting to be time to decommission an old Mac mini that we use as a DVR and media server, and so I checked prices of new Macs and bought some NAS hardware instead. At the same time I ordered four hard drives and a couple SSDs to populate all its slots; after placing the order, I did more research and realized it probably didn&#39;t include enough RAM (clearly they learned from Apple) and spent a little more money to order that, too. The hardware is great. Installing the drives, the SSDs, and the RAM was easy. But then I installed TrueNAS and things got messy.&#xA;!--more--&#xA;UGREEN&#39;s hardware makes it pretty straightforward to replace their stock OS with something else, and my research had made it pretty clear that the best choice for all the stuff I wanted to do was going to be TrueNAS. I&#39;m a little annoyed that TrueNAS isn&#39;t based on FreeBSD anymore, but none of the FreeBSD-based NAS options that are around seem like smart choices for a new installation right now (TrueNAS CORE is EOL and stuck on an old FreeBSD release; XigmaNAS seems to have just two developers who are working on it in spare time they don&#39;t have; zVault for now is just a debranded TrueNAS CORE, and thus on the same old FreeBSD release). Since the new Linux-based TrueNAS strikeSCALE/strike Community Edition is where the developer attention has gone and where most of the appliance-like features have migrated, that&#39;s where I went, too. And installing it was actually fine!&#xA;&#xA;Until it wasn&#39;t.&#xA;&#xA;Here is a recap of everything that went at least a little stupid if not a lot wrong over the course of installation, setup, and app deployment. Some of these things are like stepping on rakes; some are merely like stepping on stray construction toys in your bare feet.&#xA;&#xA;In the 25.04.1 release, TrueNAS had a broken configuration of acme.sh for Let&#39;s Encrypt, making it impossible to request the certificate that the UI really wants you to have. As of when I set it up a fix had been committed to the next major release, but they hadn&#39;t yet ported it back to the current one. (25.04.2 is out now, presumably with this fix, but I haven&#39;t yet verified that it works). Pain rating: rake.&#xA;&#xA;When setting up storage volumes, I set up the SSD before I set up the hard drives. I told it to use the SSD volume for its &#34;System Dataset.&#34; Then I configured the ZFS volume on the hard drives, and TrueNAS silently assigned its System Dataset to that volume instead of the SSD. This later caused one application setup to fail, which took a while to diagnose and fix. Pain rating: rake.&#xA;&#xA;Related to the above item, whenever you install an app from the catalog the storage location for its data defaults to the System Dataset (labeled &#34;ixVolume&#34;). If the app has multiple storage locations (say, one for configuration, one for data storage), they&#39;ll all default to that. It&#39;s a dumb default. Usually this is just inconvenient, but two apps just flat out refused to launch with their storage located that way. If you find the right page in TrueNAS&#39;s documentation (see next item), you will, in fact, read that you should probably specify a different location for every app. If you should do that, why is ixVolume still the default? Pain rating: rake (once), construction toy (every other time).&#xA;&#xA;I have a pet peeve about interfaces that rely on tooltips but which don&#39;t actually put helpful information in those tooltips. The application installation interface (used both for apps from the catalog and if you&#39;re installing a &#34;custom&#34; app as in item 7 below) is full of the wrong kind of tooltip, where the tooltip just repeats what the control&#39;s label says (e.g. the tooltip on the &#34;Pull Policy&#34; field says &#34;The pull policy for the image.&#34;) If there were a full documentation page somewhere that said how to use all the controls on that page to configure an app, it wouldn&#39;t be so bad, but see the next item.&#xA;&#xA;The primary links to documentation from within the UI all seem to go to the documentation for the EOL Core release and not the current strikeSCALE/strike Community Edition release. And they changed their web strategy between releases, so if you think you can just get the current version by selecting the dropdown at the top of the page, you&#39;re in for a fun surprise when you&#39;re redirected to a useless landing page instead. And if you go to a search engine to find the right instructions, chances are you&#39;re going to find stuff about the next major release (25.10), which is in active development and is apparently getting new architecture for some of the interfaces. If you&#39;re still running 25.04, good luck to you. Pain rating: rake, because this is just a terrible self-own. It&#39;s way too hard to find complete documentation for the current release.&#xA;&#xA;App installations sometimes result in incorrect permissions on the volumes those apps need. Some app installers have an option to fix permissions, but most of them don&#39;t. Pain rating: construction toy.&#xA;&#xA;There are weird gaps in the app catalog. Officially you can just install Docker packages for apps that don&#39;t have catalog entries. There are even two different ways to install a docker package: a cryptic UI with unhelpful tooltips and no current documentation (item 4), or a spot you can paste in a YAML config. I guess the expectation is just that you know how to do that already or that somebody else has already documented it. Docker came along after I&#39;d already sworn off Linux so it&#39;s a gap for me, and I lost a few hours trying to figure out a YAML config just for one app. Pain rating: rake, but one with a handle that only hits you in the thigh and not the face.&#xA;&#xA;If you are going to have multiple apps that host services, you probably want the Nginx Proxy Manager app so you can get to all those services with reasonable URLs and not just ports. But Nginx Proxy Manager by default wants to own ports 80 and 443, which the TrueNAS UI also wants to own. The installation will fail unless you reassign the ports TrueNAS uses before you install the NPM app, but this isn&#39;t documented anywhere. There are forum posts about it, though. There&#39;s also a checkbox in the TrueNAS UI about redirecting traffic from 80 to 443, but it&#39;s incompatible with Nginx Proxy Manager. I see now they&#39;ve changed the language on the tooltip a little, so maybe it&#39;s less broken in 25.04.2. Pain rating: like stepping on a construction toy, then stepping on more of them as you try to get away from the first one.&#xA;&#xA;There were a couple Linux services that were enabled by default that failed on startup because they weren&#39;t configured. I looked into both of them, realized I didn&#39;t need either one (at least one was related to directory-based user authentication I won&#39;t be using), and disabled them. Pain rating: construction toy. If I hadn&#39;t been looking at startup logs while I was setting everything up I might not have known these unnecessary services were failing.&#xA;&#xA;I also encountered some issues that I can&#39;t solely blame on TrueNAS and/or Linux, like an issue with music files I exported from Apple&#39;s &#34;Music&#34; app (still iTunes to me) if they had unicode combining characters in their filenames (think ñ or à). Turns out Apple handles that one way, but to get those files into playlists in Navidrome I had to &#34;precompose&#34; the playlist files. But that&#39;s not as bad as the whole week I spent on a photo export, writing code in a language I only barely know how to use (Python) to automate uploads directly from the Photos app on a Mac to my Immich server. (It&#39;s pretty spiffy, though. It creates albums if they don&#39;t exist and stacks the edited/original/raw versions of every image that has more than one).&#xA;&#xA;I&#39;m basically done with setup now and the thing that cost me the most time was working around Apple software, so most of these complaints are just complaints. But it would be nice not to have complaints at all.&#xA;&#xA;hr&#xD;&#xA;&#xD;&#xA;I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as a href=&#34;https://distraction.party/fedward&#34;fedward@distraction.party/a.]]&gt;</description>
      <content:encoded><![CDATA[<p>It was getting to be time to decommission <a href="https://discontent.fedward.org/i-hate-computers">an old Mac mini</a> that we use as a DVR and media server, and so I checked prices of new Macs and bought some <a href="https://nas.ugreen.com/products/ugreen-nasync-dxp4800-plus-nas-storage">NAS hardware</a> instead. At the same time I ordered four hard drives and a couple SSDs to populate all its slots; after placing the order, <a href="https://discourse.practicalzfs.com/t/should-i-have-bought-more-ram-instead-of-two-ssds/">I did more research</a> and realized it probably didn&#39;t include enough RAM (clearly they learned from Apple) and spent a little more money to order that, too. The hardware is great. Installing the drives, the SSDs, and the RAM was easy. But then I installed TrueNAS and things got messy.

UGREEN&#39;s hardware makes it pretty straightforward to replace their stock OS with something else, and my research had made it pretty clear that the best choice for all the stuff I wanted to do was going to be TrueNAS. I&#39;m a little annoyed that TrueNAS isn&#39;t based on FreeBSD anymore, but none of the FreeBSD-based NAS options that are around seem like smart choices for a new installation right now (<a href="https://www.truenas.com/truenas-core/">TrueNAS CORE</a> is EOL and stuck on an old FreeBSD release; <a href="https://xigmanas.com/xnaswp/">XigmaNAS</a> seems to have just two developers who are working on it in spare time they don&#39;t have; <a href="https://www.zvault.io">zVault</a> for now is just a debranded TrueNAS CORE, and thus on the same old FreeBSD release). Since the new Linux-based TrueNAS <strike>SCALE</strike> <a href="https://www.truenas.com/blog/truenas-community-edition-release-2504/"><em>Community Edition</em></a> is where the developer attention has gone and where most of the appliance-like features have migrated, that&#39;s where I went, too. And installing it was actually fine!</p>

<p>Until it wasn&#39;t.</p>

<p>Here is a recap of everything that went at least a little stupid if not a lot wrong over the course of installation, setup, and app deployment. Some of these things are like stepping on rakes; some are merely like stepping on stray construction toys in your bare feet.</p>
<ol><li><p>In the 25.04.1 release, TrueNAS had a broken configuration of acme.sh for Let&#39;s Encrypt, making it impossible to request the certificate that the UI <em>really</em> wants you to have. As of when I set it up a fix had been committed to the next major release, but they hadn&#39;t yet ported it back to the current one. (25.04.2 is out now, presumably with this fix, but I haven&#39;t yet verified that it works). Pain rating: rake.</p></li>

<li><p>When setting up storage volumes, I set up the SSD before I set up the hard drives. I told it to use the SSD volume for its “System Dataset.” Then I configured the ZFS volume on the hard drives, and TrueNAS silently assigned its System Dataset to that volume instead of the SSD. This later caused one application setup to fail, which took a while to diagnose and fix. Pain rating: rake.</p></li>

<li><p>Related to the above item, whenever you install an app from the catalog the storage location for its data defaults to the System Dataset (labeled “ixVolume”). If the app has multiple storage locations (say, one for configuration, one for data storage), they&#39;ll all default to that. It&#39;s a dumb default. Usually this is just inconvenient, but two apps just flat out refused to launch with their storage located that way. If you find the right page in TrueNAS&#39;s documentation (see next item), you will, in fact, read that you should probably specify a different location for every app. If you should do that, why is ixVolume still the default? Pain rating: rake (once), construction toy (every other time).</p></li>

<li><p>I have a pet peeve about interfaces that rely on tooltips but which don&#39;t actually put helpful information in those tooltips. The application installation interface (used both for apps from the catalog and if you&#39;re installing a “custom” app as in item 7 below) is full of the wrong kind of tooltip, where the tooltip just repeats what the control&#39;s label says (e.g. the tooltip on the “Pull Policy” field says “The pull policy for the image.”) If there were a full documentation page somewhere that said how to use all the controls on that page to configure an app, it wouldn&#39;t be so bad, but see the next item.</p></li>

<li><p>The primary links to documentation from within the UI all seem to go to the documentation for the EOL Core release and not the current <strike>SCALE</strike> <em>Community Edition</em> release. And they changed their web strategy between releases, so if you think you can just get the current version by selecting the dropdown at the top of the page, you&#39;re in for a fun surprise when you&#39;re redirected to a useless landing page instead. And if you go to a search engine to find the right instructions, chances are you&#39;re going to find stuff about the <em>next</em> major release (25.10), which is in active development and is apparently getting new architecture for some of the interfaces. If you&#39;re still running 25.04, good luck to you. Pain rating: rake, because this is just a terrible self-own. It&#39;s way too hard to find complete documentation for the current release.</p></li>

<li><p>App installations sometimes result in incorrect permissions on the volumes those apps need. Some app installers have an option to fix permissions, but most of them don&#39;t. Pain rating: construction toy.</p></li>

<li><p>There are weird gaps in the app catalog. Officially you can just install Docker packages for apps that don&#39;t have catalog entries. There are even two different ways to install a docker package: a cryptic UI with unhelpful tooltips and no current documentation (item 4), or a spot you can paste in a YAML config. I guess the expectation is just that you know how to do that already or that somebody else has already documented it. Docker came along after I&#39;d already <a href="https://discontent.fedward.org/every-decision-results-in-technical-debt">sworn off Linux</a> so it&#39;s a gap for me, and I lost a few hours trying to figure out a YAML config just for one app. Pain rating: rake, but one with a handle that only hits you in the thigh and not the face.</p></li>

<li><p>If you are going to have multiple apps that host services, you probably want the Nginx Proxy Manager app so you can get to all those services with reasonable URLs and not just ports. But Nginx Proxy Manager by default wants to own ports 80 and 443, which the TrueNAS UI also wants to own. The installation will fail unless you reassign the ports TrueNAS uses <em>before</em> you install the NPM app, but this isn&#39;t documented anywhere. There are forum posts about it, though. There&#39;s also a checkbox in the TrueNAS UI about redirecting traffic from 80 to 443, but it&#39;s incompatible with Nginx Proxy Manager. I see now they&#39;ve changed the language on the tooltip a little, so maybe it&#39;s less broken in 25.04.2. Pain rating: like stepping on a construction toy, then stepping on more of them as you try to get away from the first one.</p></li>

<li><p>There were a couple Linux services that were enabled by default that failed on startup because they weren&#39;t configured. I looked into both of them, realized I didn&#39;t need either one (at least one was related to directory-based user authentication I won&#39;t be using), and disabled them. Pain rating: construction toy. If I hadn&#39;t been looking at startup logs while I was setting everything up I might not have known these unnecessary services were failing.</p></li></ol>

<p>I also encountered some issues that I can&#39;t solely blame on TrueNAS and/or Linux, like an issue with music files I exported from Apple&#39;s “Music” app (still iTunes to me) if they had unicode combining characters in their filenames (think ñ or à). Turns out Apple handles that one way, but to get those files into playlists in Navidrome I had to “precompose” the playlist files. But that&#39;s not as bad as the whole week I spent on a photo export, writing code in a language I only barely know how to use (Python) to automate uploads directly from the Photos app on a Mac to my Immich server. (It&#39;s pretty spiffy, though. It creates albums if they don&#39;t exist and stacks the edited/original/raw versions of every image that has more than one).</p>

<p>I&#39;m basically done with setup now and the thing that cost me the most time was working around Apple software, so most of these complaints are just complaints. But it would be nice not to have complaints at all.</p>

<hr>

<p>I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as <a href="https://distraction.party/fedward">fedward@distraction.party</a>.</p>
]]></content:encoded>
      <guid>https://discontent.fedward.org/speed-running-barefoot-through-a-field-of-rakes</guid>
      <pubDate>Wed, 06 Aug 2025 21:24:59 +0000</pubDate>
    </item>
    <item>
      <title>Everybody is Wrong About Cold Brew Coffee</title>
      <link>https://discontent.fedward.org/everybody-is-wrong-about-cold-brew-coffee</link>
      <description>&lt;![CDATA[Fighting Words&#xA;&#xA;A few years ago my wife expressed a preference for iced coffee in the summer, and then as cold brew gained enough in popularity that it started showing up on tap everywhere, she expressed a preference for that over my previous, lazy man&#39;s iced coffee method (namely: brew a pot of hot coffee, then immediately put it in mason jars with as little headroom as possible and refrigerate overnight).&#xA;&#xA;I tried all the most common instructions for cold brew on the internet, and I found that no matter what I did I just wasn&#39;t satisfied with any of them. I&#39;m not going to call out any specific guides to making cold brew concentrate, but here is what I found:&#xA;!--more--&#xA;&#xA;It doesn&#39;t matter how strong you try to brew the concentrate. If you&#39;re making concentrate at all, once you dilute it to drinking strength it just tastes watery.&#xA;On the other hand it&#39;s nearly impossible to predict liquid yield based on the starting weight of ground coffee and water, because the amount of water absorbed by the ground coffee and/or trapped between grains after filtering varies. As a result, some dilution is always going to be necessary to hit a target volume without exceeding it.&#xA;There is a point of diminishing or counterproductive returns: longer brewing times increase unpleasant flavor notes.&#xA;Underextraction is also bad.&#xA;The coffee beans that taste best to me when brewed hot don&#39;t produce a well enough balanced cold brew. Something slightly darker than that preference tastes better when brewed cold, but since light/medium/dark and city/city+/full city are all basically meaningless when comparing different roasters, this still requires experimentation as availability changes.&#xA;&#xA;Note: I didn&#39;t try anything like pressure infusion using a cream whipper and chargers, because it&#39;s such a mess to clean up (and if something goes wrong with your cream whipper, as I witnessed at a liquor industry demo, it&#39;s even more of a mess). You might be able to make good concentrate under lab conditions, but I was looking for something that was both practical in a home kitchen and delicious.&#xA;&#xA;Here&#39;s what I ended up with for one (1) liter of cold brew coffee:&#xA;&#xA;Ingredients&#xA;&#xA;114 grams freshly ground coffee (I grind it like I do for French press, but I also grind more finely for French press than most people do). 114 grams seems like a weird number, but it&#39;s 4 ounces and most whole bean coffee comes in units of 12 or 16 ounces. I don&#39;t recommend pre-ground coffee.&#xA;1150 ml water at room temperature if your jar or brewer has the room; if your container is smaller, try to get at least 900 ml for best results.&#xA;&#xA;Instructions&#xA;&#xA;Combine in a large jar or a dedicated cold brew gadget if you have one. I like to add about half the water, let it bloom for a minute or five, then stir down the bloom and add the rest of the water.&#xA;Steep for 12 hours. There&#39;s some wiggle room: the safe range seems to be between 11 and 14 hours; much shorter than 11 hours and it&#39;ll be weak and acidic; go past 14 and it will start to pick up notes of ash and compost.&#xA;Filter, first through a fine metal strainer and then (if desired) through a paper cone.&#xA;After filtering, check your yield. The coffee will usually trap between 1.6 and 1.7 times its mass in water. If you started with the amounts above you should end up with something between 955 and 970 ml. If you end up with significantly less, check to see if your grounds are still really wet. You can stir them around or try gently pressing on the mass of grounds, but don&#39;t use too much force or you&#39;ll end up with some flavors you don&#39;t want.&#xA;Add a little water as necessary to bring the yield up to 1 liter.&#xA;Chill and serve.&#xA;&#xA;We have an OXO Cold Brew Coffee Maker that takes up a lot of room on the kitchen counter, but it makes the first three steps pretty simple and allows me to make two liters of cold brew at once if I fill it to the top. I fill it most of the way with the &#34;rainmaker&#34; top in place, then remove that and top it off so the liquid comes about ⅛&#34; from the edge, so it doesn&#39;t overflow if the coffee continues to bloom. When filtered the yield is usually around 1.75 L. I top it off to 2 L before decanting into a couple growlers (or, usually, a growler and a nitro keg, but that part is entirely optional).&#xA;&#xA;Enjoy. Or, I dunno, keep making cold brew wrong. I&#39;m not your boss.&#xA;&#xA;hr&#xD;&#xA;&#xD;&#xA;I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as a href=&#34;https://distraction.party/fedward&#34;fedward@distraction.party/a.]]&gt;</description>
      <content:encoded><![CDATA[<p><em>Fighting Words</em></p>

<p>A few years ago my wife expressed a preference for iced coffee in the summer, and then as cold brew gained enough in popularity that it started showing up on tap everywhere, she expressed a preference for that over my previous, lazy man&#39;s iced coffee method (namely: brew a pot of hot coffee, then immediately put it in mason jars with as little headroom as possible and refrigerate overnight).</p>

<p>I tried all the most common instructions for cold brew on the internet, and I found that no matter what I did I just wasn&#39;t satisfied with any of them. I&#39;m not going to call out any specific guides to making cold brew concentrate, but here is what I found:
</p>
<ul><li>It doesn&#39;t matter how strong you try to brew the concentrate. If you&#39;re making concentrate at all, once you dilute it to drinking strength it just tastes watery.</li>
<li>On the other hand it&#39;s nearly impossible to predict liquid yield based on the starting weight of ground coffee and water, because the amount of water absorbed by the ground coffee and/or trapped between grains after filtering varies. As a result, <em>some</em> dilution is always going to be necessary to hit a target volume without exceeding it.</li>
<li>There is a point of diminishing or counterproductive returns: longer brewing times increase unpleasant flavor notes.</li>
<li>Underextraction is also bad.</li>
<li>The coffee beans that taste best to me when brewed hot don&#39;t produce a well enough balanced cold brew. Something <em>slightly</em> darker than that preference tastes better when brewed cold, but since light/medium/dark and city/city+/full city are all basically meaningless when comparing different roasters, this still requires experimentation as availability changes.</li></ul>

<p>Note: I didn&#39;t try anything like pressure infusion using a cream whipper and chargers, because it&#39;s such a mess to clean up (and if something goes wrong with your cream whipper, as I witnessed at a liquor industry demo, it&#39;s even <em>more</em> of a mess). You might be able to make good concentrate under lab conditions, but I was looking for something that was both practical in a home kitchen <em>and</em> delicious.</p>

<p>Here&#39;s what I ended up with for one (1) liter of cold brew coffee:</p>

<h3 id="ingredients">Ingredients</h3>
<ul><li>114 grams freshly ground coffee (I grind it like I do for French press, but I also grind more finely for French press than most people do). 114 grams seems like a weird number, but it&#39;s 4 ounces and most whole bean coffee comes in units of 12 or 16 ounces. I don&#39;t recommend pre-ground coffee.</li>
<li>1150 ml water at room temperature if your jar or brewer has the room; if your container is smaller, try to get at least 900 ml for best results.</li></ul>

<h3 id="instructions">Instructions</h3>
<ul><li>Combine in a large jar or a dedicated cold brew gadget if you have one. I like to add about half the water, let it bloom for a minute or five, then stir down the bloom and add the rest of the water.</li>
<li>Steep for 12 hours. There&#39;s some wiggle room: the safe range seems to be between 11 and 14 hours; much shorter than 11 hours and it&#39;ll be weak and acidic; go past 14 and it will start to pick up notes of ash and compost.</li>
<li>Filter, first through a fine metal strainer and then (if desired) through a paper cone.</li>
<li>After filtering, check your yield. The coffee will usually trap between 1.6 and 1.7 times its mass in water. If you started with the amounts above you should end up with something between 955 and 970 ml. If you end up with significantly less, check to see if your grounds are still really wet. You can stir them around or try gently pressing on the mass of grounds, but don&#39;t use too much force or you&#39;ll end up with some flavors you don&#39;t want.</li>
<li>Add a little water as necessary to bring the yield up to 1 liter.</li>
<li>Chill and serve.</li></ul>

<p>We have an <a href="https://www.oxo.com/cold-brew-coffee-maker.html">OXO Cold Brew Coffee Maker</a> that takes up a lot of room on the kitchen counter, but it makes the first three steps pretty simple and allows me to make two liters of cold brew at once if I fill it to the top. I fill it most of the way with the “rainmaker” top in place, then remove that and top it off so the liquid comes about ⅛” from the edge, so it doesn&#39;t overflow if the coffee continues to bloom. When filtered the yield is usually around 1.75 L. I top it off to 2 L before decanting into a couple growlers (or, usually, a growler and a nitro keg, but that part is <em>entirely</em> optional).</p>

<p>Enjoy. Or, I dunno, keep making cold brew wrong. I&#39;m not your boss.</p>

<hr>

<p>I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as <a href="https://distraction.party/fedward">fedward@distraction.party</a>.</p>
]]></content:encoded>
      <guid>https://discontent.fedward.org/everybody-is-wrong-about-cold-brew-coffee</guid>
      <pubDate>Thu, 12 Jun 2025 15:58:26 +0000</pubDate>
    </item>
    <item>
      <title>Extra Stupid Firewall Tricks</title>
      <link>https://discontent.fedward.org/extra-stupid-firewall-tricks</link>
      <description>&lt;![CDATA[It rhymes with IPv6&#xA;&#xA;What I didn&#39;t mention in the post about port forwarding DNS requests was that the AdGuard Home instance I&#39;m running is running on the same OPNsense firewall as my primary, non-filtered DNS resolver.&#xA;!--more--&#xA;Setting up a virtual IP with an IPv4 address is pretty simple. The main resolver is on the firewall&#39;s primary LAN address (ends in .1, unsurprisingly); the AdGuard virtual interface is on .101 on the same subnet. Setting up IPv6, however, stumped me. I&#39;ve found that even though our IPv4 WAN address tends to survive reboots, we get a new IPv6 prefix with every reboot. IPv6 does some things with prefixing and link-local addresses that I still don&#39;t fully understand. For instance, only four characters in the IPv6 address ever change, but they&#39;re in the middle of the address. I needed to understand enough to make this work, but I didn&#39;t need to understand enough to run a whole IPv6 network.&#xA;&#xA;What I actually needed was an IPv6 address that would stay consistent enough for me to bind a service to it without having that service crash the next time the firewall restarted, but that wouldn&#39;t in the process cause other things on the firewall to go wrong. If I tried to create a new IPv6 address in the same subnet as the main link-local network, things went wrong. I started experimenting. After many false starts, here&#39;s what has ended up working for me. (ORIGINAL: There may be a better, more official, way to accomplish this, but this setup has worked for me for a while now.) UPDATE: Turns out the &#34;correct&#34; way to do this is with an IPv6 address fragment, so I&#39;ve updated a couple steps below.&#xA;&#xA;Set up an IPv4 virtual address on the same LAN subnet. Pick one that won&#39;t be assigned by your DHCP server, but that&#39;s easy enough to remember. It&#39;s important to set the &#34;Deny service binding&#34; checkbox to keep OPNsense from binding other services to the new virtual IP.&#xA;&#xA;Set up an IPv6 virtual address. (DEPRECATED: I copied the existing IPv6 link-local address and changed the beginning of its prefix from fe80 to fd80 but left the rest exactly the same, with a /64 subnet. This makes it easy enough to read just the first and last bits of the binding when looking at interfaces on the firewall. On closer reading now I think I can&#39;t actually use fd80 (see: I don&#39;t fully understand, above), but it was the first thing that actually worked so I&#39;m just going to let it be wrong until something else breaks.)) Turns out you can do this with an IPv6 address fragment. I&#39;m using ::5353/128 for this purpose. Again, click that &#34;Deny service binding&#34; checkbox.&#xA;&#xA;Turn on router advertisement. (DEPRECATED: for the fd80:: prefix with a /64 subnet -- turns out that with an IPv6 fragment you can just use the defaults, but you do need the service turned on so other hosts will know how to reach the IPv6 virtual address fragment created above)&#xA;&#xA;Install the AdGuard Home package for OPNsense (I use the full repo there and not just the AdGuard one, because I also have the Unifi controller running. That&#39;s left as an exercise for the reader).&#xA;&#xA;Enable the &#34;Adguardhome&#34; service but deselect &#34;Primary DNS&#34; so it doesn&#39;t try to bind to the standard ports on the primary LAN interface. It&#39;ll still probably try to bind its management web interface to :80, so have fun figuring out how to get the defaults working temporarily.&#xA;&#xA;To the command line! Edit /usr/local/AdGuardHome/AdGuardHome.yaml and configure its http section to bind to the IPv4 address you created in step 1. Also configure the bindhosts section of the dns section and bind it to both virtual addresses created above. You may or may not be able to do this without just using vi, but I used vi because I have the muscle memory for it.&#xA;&#xA;Once you&#39;ve verified that the service is up and running alongside the built-in Unbound DNS service (one or both may require restarts, and see below for a way to test that they&#39;re both working), you can assign the resolver to individual hosts using your DHCP server of choice, unless the DHCP server of your choice is Kea, which currently lacks this functionality. If you&#39;re using Kea, or you only want to maintain one set of configurations, skip directly to the port forwarding described in my other post.&#xA;&#xA;To verify that both services are running from another computer on the network, you can use the host command on the command line, e.g.: host google.com 192.168.1.1 would ask the primary resolver at .1 (presumably your router; adjust accordingly), while host google.com 192.168.1.101 would ask the AdGuard Home resolver. Substitute the IPv6 address of your router&#39;s primary interface (up to you to figure out) and ::5353 for the virtual interface to check that it&#39;s also working over IPv6, if that&#39;s a thing that matters to you.&#xA;&#xA;After typing all this out I&#39;m sure there has to be a less convoluted way to do what I wanted, but all the services I want to run coexist on the same hardware and everything works after restarts, so I consider this job done for now.&#xA;&#xA;hr&#xD;&#xA;&#xD;&#xA;I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as a href=&#34;https://distraction.party/fedward&#34;fedward@distraction.party/a.]]&gt;</description>
      <content:encoded><![CDATA[<p><em>It rhymes with IPv6</em></p>

<p>What I didn&#39;t mention in <a href="https://discontent.fedward.org/stupid-firewall-tricks">the post about port forwarding DNS requests</a> was that the AdGuard Home instance I&#39;m running is running on the same OPNsense firewall as my primary, non-filtered DNS resolver.

Setting up a virtual IP with an IPv4 address is pretty simple. The main resolver is on the firewall&#39;s primary LAN address (ends in <code>.1</code>, unsurprisingly); the AdGuard virtual interface is on <code>.101</code> on the same subnet. Setting up IPv6, however, stumped me. I&#39;ve found that even though our IPv4 WAN address tends to survive reboots, we get a new IPv6 prefix with every reboot. IPv6 does some things with prefixing and link-local addresses that I still don&#39;t fully understand. For instance, only four characters in the IPv6 address ever change, but they&#39;re in the middle of the address. I needed to understand enough to make this work, but I didn&#39;t need to understand enough to run a whole IPv6 network.</p>

<p>What I actually needed was an IPv6 address that would stay consistent enough for me to bind a service to it without having that service crash the next time the firewall restarted, but that wouldn&#39;t in the process cause other things on the firewall to go wrong. If I tried to create a new IPv6 address in the same subnet as the main link-local network, things went wrong. I started experimenting. After many false starts, here&#39;s what has ended up working for me. (ORIGINAL: <em>There may be a better, more official, way to accomplish this, but this setup has worked for me for a while now.</em>) UPDATE: Turns out the “correct” way to do this is with an IPv6 address fragment, so I&#39;ve updated a couple steps below.</p>
<ol><li><p>Set up an IPv4 <a href="https://docs.opnsense.org/manual/firewall_vip.html">virtual address</a> on the same LAN subnet. Pick one that won&#39;t be assigned by your DHCP server, but that&#39;s easy enough to remember. It&#39;s important to set the “Deny service binding” checkbox to keep OPNsense from binding other services to the new virtual IP.</p></li>

<li><p>Set up an IPv6 virtual address. (DEPRECATED: <em>I copied the existing IPv6 link-local address and changed the beginning of its prefix from <code>fe80</code> to <code>fd80</code> but left the rest exactly the same, with a <code>/64</code> subnet. This makes it easy enough to read just the first and last bits of the binding when looking at interfaces on the firewall. On closer reading now I think I can&#39;t actually use <code>fd80</code> (see: <em>I don&#39;t fully understand</em>, above), but it was the first thing that actually worked so I&#39;m just going to let it be wrong until something else breaks.)</em>) Turns out you can do this with an IPv6 address fragment. I&#39;m using <code>::5353/128</code> for this purpose. Again, click that “Deny service binding” checkbox.</p></li>

<li><p>Turn on <a href="https://docs.opnsense.org/manual/radvd.html">router advertisement</a>. (DEPRECATED: <em>for the <code>fd80::</code> prefix with a <code>/64</code> subnet</em> — turns out that with an IPv6 fragment you can just use the defaults, but you do need the service turned on so other hosts will know how to reach the IPv6 virtual address fragment created above)</p></li>

<li><p>Install the <a href="https://www.routerperformance.net/opnsense-repo/">AdGuard Home package for OPNsense</a> (I use the full repo there and not just the AdGuard one, because I also have the Unifi controller running. That&#39;s left as an exercise for the reader).</p></li>

<li><p>Enable the “Adguardhome” service but deselect “Primary DNS” so it doesn&#39;t try to bind to the standard ports on the primary LAN interface. It&#39;ll still probably try to bind its management web interface to <code>:80</code>, so have fun figuring out how to get the defaults working temporarily.</p></li>

<li><p>To the <a href="https://github.com/AdguardTeam/AdGuardHome/wiki/Configuration">command line</a>! Edit <code>/usr/local/AdGuardHome/AdGuardHome.yaml</code> and configure its <code>http</code> section to bind to the IPv4 address you created in step 1. Also configure the <code>bind_hosts</code> section of the <code>dns</code> section and bind it to both virtual addresses created above. You may or may not be able to do this without just using vi, but I used vi because I have the muscle memory for it.</p></li>

<li><p>Once you&#39;ve verified that the service is up and running alongside the built-in Unbound DNS service (one or both may require restarts, and see below for a way to test that they&#39;re both working), you can assign the resolver to individual hosts using your DHCP server of choice, unless the DHCP server of your choice is Kea, which currently lacks this functionality. If you&#39;re using Kea, or you only want to maintain one set of configurations, skip directly to the <a href="https://discontent.fedward.org/stupid-firewall-tricks">port forwarding described in my other post</a>.</p></li></ol>

<p><em>To verify that both services are running from another computer on the network, you can use the <code>host</code> command on the command line, e.g.: <code>host google.com 192.168.1.1</code> would ask the primary resolver at .1 (presumably your router; adjust accordingly), while <code>host google.com 192.168.1.101</code> would ask the AdGuard Home resolver. Substitute the IPv6 address of your router&#39;s primary interface (up to you to figure out) and <code>::5353</code> for the virtual interface to check that it&#39;s also working over IPv6, if that&#39;s a thing that matters to you.</em></p>

<p>After typing all this out I&#39;m sure there has to be a less convoluted way to do what I wanted, but all the services I want to run coexist on the same hardware and everything works after restarts, so I consider this job done for now.</p>

<hr>

<p>I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as <a href="https://distraction.party/fedward">fedward@distraction.party</a>.</p>
]]></content:encoded>
      <guid>https://discontent.fedward.org/extra-stupid-firewall-tricks</guid>
      <pubDate>Mon, 27 Jan 2025 19:09:15 +0000</pubDate>
    </item>
    <item>
      <title>Stupid Firewall Tricks</title>
      <link>https://discontent.fedward.org/stupid-firewall-tricks</link>
      <description>&lt;![CDATA[I make a lot of technical decisions based on a simple process where I learn about a thing and go, &#34;Oh. Oh, no. Not that.&#34; Then I have to figure out what not-that thing to use instead. Lather, rinse, repeat.&#xA;&#xA;So, for example, my home firewall used to run pfSense. After their shenanigans with OPNsense.com I started to think that maybe I didn&#39;t want to be running pfSense anymore, but switching to something else would have taken time and effort so I just … never got around to it. Then, in a push for profits, pfSense owners Netgate also took a hostile stance towards users of the community edition, but my firewall still worked as it was, so I still didn&#39;t get around to changing it.&#xA;&#xA;Then the FreeBSD WireGuard mess happened and I decided I needed to get away from any code managed by the people responsible. So now I run OPNsense. There&#39;s a common lineage (m0n0wall) and I was able to adapt my configuration without much trouble.&#xA;!--more--&#xA;I&#39;m not super happy about how FreeBSD&#39;s loose management let the WireGuard mess get as bad as it did, but migrating my stuff away from FreeBSD isn&#39;t high on my list of priorities. I&#39;m not picking that battle any time soon. I only started using FreeBSD in the first place because I hated the way systemd was rolled out, but that&#39;s a different rant.&#xA;&#xA;Anyway. My more recent &#34;Oh. Oh, no. Not that&#34; moment came when I discovered that our Chromecast had a trick up its sleeve.&#xA;&#xA;For reasons of security as much as (perhaps even more than) general stubbornness, I run an instance of AdGuard Home for devices on the network that are impossible or impractical to configure to block their own ads. Any &#34;smart&#34; device on the network gets assigned to the AdGuard server instead of the main, unfiltered resolver running on my OPNsense firewall.&#xA;&#xA;A weird unexpected side effect of blocking ads in this way was that several of the apps on our smart TV started crashing less. Since they were often crashing where ad breaks might exist (if we weren&#39;t paying for the ad-free versions, which we mostly are), my theory is that there&#39;s a &#34;load the next thing&#34; subroutine that can&#39;t reliably handle a transitory failure like a network blip at the wrong moment. But if the app can&#39;t connect to the ad server at all, even just for the &#34;you don&#39;t need to display ads&#34; ticket, then it grabs the whole program as one continuous segment. No more &#34;load the next segment&#34; subroutines, fewer crashes as a result. I wouldn&#39;t have predicted this, and for the most part we pay for service tiers without ads, but I&#39;m not getting paid to deal with somebody else&#39;s bugs. Especially when the app loses our playback location when it crashes, resulting in several minutes of fussing just to get back to where we were before the app crashed.&#xA;&#xA;Things were great when I set all this up, and then 48 hours later the Chromecast was showing ads again. It seems that Google anticipated people using things like AdGuard or a Pi-hole, and after some predetermined period of failure the Chromecast will just silently switch its own DNS and route around the blockage. It&#39;s smart, but I&#39;m stubborn.&#xA;&#xA;So I set up a couple new port forwarding rules on my firewall. Here&#39;s what I had to do:&#xA;&#xA;Set up an alias for the AdGuard instance, with both its IPv4 and IPv6 addresses. Call it AdGuard.&#xA;&#xA;Set up another alias for any streaming devices that I want to live in AdGuard jail. I started with IP addresses for this alias, but thanks to IPv6 I&#39;ve now settled on using MAC addresses. Call this one Streamers. Add the MAC addresses for every device you want to send to jail.&#xA;&#xA;Set up a Port Forward rule for traffic:&#xA;a. On the LAN interface;&#xA;b. IPv4/IPv6;&#xA;c. TCP/UDP;&#xA;d. Source: the Streamers alias;&#xA;e. Source port range: Any;&#xA;f. Destination invert: checked (it&#39;s important that this be checked);&#xA;g. Destination: the AdGuard alias;&#xA;h. Destination port range: from DNS to DNS;&#xA;i: Redirect target IP: the AdGuard alias (again);&#xA;j: Redirect target port: DNS.&#xA;&#xA;Copy that rule to a new rule, and change the port selections from DNS to the number 853, which is DNS over TLS.&#xA;&#xA;Put together, these two rules ensure that any DNS traffic from any of the devices in that Streamers alias gets routed to my local AdGuard server.&#xA;&#xA;For the Chromecast specifically, I added one more rule, just to be mean. That rule looks for traffic FROM the Chromecast specifically, TO a GoogleDNS alias (8.8.8.8, 8.8.4.4, 2001:4860:4860::8844, and 2001:4860:4860::8888), on port 443, which is DNS over HTTPS. That traffic, which would normally get routed as normal web requests, also gets forwarded to the AdGuard server. Luckily DNS over HTTPS doesn&#39;t validate the SSL certificate when querying.&#xA;&#xA;So far the only device I&#39;ve seen actual IPv6 traffic from is our new Apple TV, which also aggressively rotates its IPv6 addresses to try to foil tracking, but doing MAC-based filtering has worked exactly as intended. We have some IoT temperature monitors I should probably get the MAC addresses from to put them in jail as well, but I feel the workflow has been proven.&#xA;&#xA;If you want me to use your software as designed, don&#39;t ever make me go, &#34;Oh. Oh, no.&#34;&#xA;&#xA;hr&#xD;&#xA;&#xD;&#xA;I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as a href=&#34;https://distraction.party/fedward&#34;fedward@distraction.party/a.]]&gt;</description>
      <content:encoded><![CDATA[<p>I make a lot of technical decisions based on a simple process where I learn about a thing and go, “Oh. Oh, no. Not that.” Then I have to figure out what not-that thing to use instead. Lather, rinse, repeat.</p>

<p>So, for example, my home firewall used to run pfSense. After <a href="https://opnsense.org/opnsense-com/">their shenanigans with OPNsense.com</a> I started to think that maybe I didn&#39;t want to be running pfSense anymore, but switching to something else would have taken time and effort so I just … never got around to it. Then, in a push for profits, pfSense owners Netgate also took a hostile stance towards users of the community edition, but my firewall still worked as it was, so I still didn&#39;t get around to changing it.</p>

<p>Then <a href="https://arstechnica.com/gadgets/2021/03/buffer-overruns-license-violations-and-bad-code-freebsd-13s-close-call/">the FreeBSD WireGuard mess</a> happened and I decided I needed to get away from any code managed by the people responsible. So now I run OPNsense. There&#39;s a common lineage (<a href="https://docs.opnsense.org/history/thefork.html">m0n0wall</a>) and I was able to adapt my configuration without much trouble.

<em>I&#39;m not super happy about how FreeBSD&#39;s loose management let the WireGuard mess get as bad as it did, but migrating my stuff away from FreeBSD isn&#39;t high on my list of priorities. I&#39;m not picking that battle any time soon. I only started using FreeBSD in the first place because I hated the way systemd was rolled out, but that&#39;s <a href="https://discontent.fedward.org/every-decision-results-in-technical-debt">a different rant</a>.</em></p>

<p>Anyway. My more recent “Oh. Oh, no. Not that” moment came when I discovered that our Chromecast had a trick up its sleeve.</p>

<p>For reasons of security as much as (perhaps even more than) general stubbornness, I run <a href="https://discontent.fedward.org/extra-stupid-firewall-tricks">an instance of AdGuard Home</a> for devices on the network that are impossible or impractical to configure to block their own ads. Any “smart” device on the network gets assigned to the AdGuard server instead of the main, unfiltered resolver running on my OPNsense firewall.</p>

<p>A weird unexpected side effect of blocking ads in this way was that several of the apps on our smart TV started crashing less. Since they were often crashing where ad breaks might exist (if we weren&#39;t paying for the ad-free versions, which we <em>mostly</em> are), my theory is that there&#39;s a “load the next thing” subroutine that can&#39;t reliably handle a transitory failure like a network blip at the wrong moment. But if the app can&#39;t connect to the ad server at all, even just for the “you don&#39;t need to display ads” ticket, then it grabs the whole program as one continuous segment. No more “load the next segment” subroutines, fewer crashes as a result. I wouldn&#39;t have predicted this, and for the most part we pay for service tiers without ads, but I&#39;m not getting paid to deal with somebody else&#39;s bugs. Especially when the app loses our playback location when it crashes, resulting in several minutes of fussing just to get back to where we were before the app crashed.</p>

<p>Things were great when I set all this up, and then 48 hours later the Chromecast was showing ads again. It seems that Google anticipated people using things like AdGuard or a <a href="https://pi-hole.net">Pi-hole</a>, and after some predetermined period of failure the Chromecast will just silently switch its own DNS and route around the blockage. It&#39;s smart, but I&#39;m stubborn.</p>

<p>So I set up a couple new <a href="https://docs.opnsense.org/manual/nat.html#port-forwarding">port forwarding</a> rules on my firewall. Here&#39;s what I had to do:</p>
<ol><li><p>Set up an <a href="https://docs.opnsense.org/manual/aliases.html">alias</a> for the AdGuard instance, with both its IPv4 and IPv6 addresses. Call it <code>AdGuard</code>.</p></li>

<li><p>Set up another alias for any streaming devices that I want to live in AdGuard jail. I started with IP addresses for this alias, but thanks to IPv6 I&#39;ve now settled on using MAC addresses. Call this one <code>Streamers</code>. Add the MAC addresses for every device you want to send to jail.</p></li>

<li><p>Set up a Port Forward rule for traffic:
a. On the <code>LAN</code> interface;
b. <code>IPv4/IPv6</code>;
c. <code>TCP/UDP</code>;
d. Source: the <code>Streamers</code> alias;
e. Source port range: <code>Any</code>;
f. Destination invert: checked (it&#39;s important that this be checked);
g. Destination: the <code>AdGuard</code> alias;
h. Destination port range: from <code>DNS</code> to <code>DNS</code>;
i: Redirect target IP: the <code>AdGuard</code> alias (again);
j: Redirect target port: <code>DNS</code>.</p></li>

<li><p>Copy that rule to a new rule, and change the port selections from DNS to the number <code>853</code>, which is <a href="https://en.wikipedia.org/wiki/DNS_over_TLS">DNS over TLS</a>.</p></li></ol>

<p>Put together, these two rules ensure that any DNS traffic from any of the devices in that Streamers alias gets routed to my local AdGuard server.</p>

<p><em>For the Chromecast specifically, I added one more rule, just to be mean. That rule looks for traffic FROM the Chromecast specifically, TO a GoogleDNS alias (<code>8.8.8.8</code>, <code>8.8.4.4</code>, <code>2001:4860:4860::8844</code>, and <code>2001:4860:4860::8888</code>), on port <code>443</code>, which is <a href="https://developers.google.com/speed/public-dns/docs/doh/">DNS over HTTPS</a>. That traffic, which would normally get routed as normal web requests, also gets forwarded to the AdGuard server. Luckily DNS over HTTPS doesn&#39;t validate the SSL certificate when querying.</em></p>

<p>So far the only device I&#39;ve seen actual IPv6 traffic from is our new Apple TV, which also aggressively rotates its IPv6 addresses to try to foil tracking, but doing MAC-based filtering has worked exactly as intended. We have some IoT temperature monitors I should probably get the MAC addresses from to put them in jail as well, but I feel the workflow has been proven.</p>

<p>If you want me to use your software as designed, don&#39;t ever make me go, “Oh. Oh, no.”</p>

<hr>

<p>I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as <a href="https://distraction.party/fedward">fedward@distraction.party</a>.</p>
]]></content:encoded>
      <guid>https://discontent.fedward.org/stupid-firewall-tricks</guid>
      <pubDate>Mon, 27 Jan 2025 16:45:04 +0000</pubDate>
    </item>
    <item>
      <title>In which I actually have a new bike</title>
      <link>https://discontent.fedward.org/in-which-i-actually-have-a-new-bike</link>
      <description>&lt;![CDATA[Previously, I wrote about trying to buy a new electric gravel bike. Good news! I was successful.&#xA;&#xA;A yellow bicycle in front of a fireplace&#xA;Salsa Confluence GRX 600 2x, in front of our fireplace&#xA;&#xA;Here are some notes on the process and initial impressions of the bike itself.&#xA;!--more--&#xA;The Buying Experience&#xA;&#xA;First, I&#39;m not sure I recommend the experience of buying a bike from REI during a big sale event. Despite being a co-op, they&#39;ve been corporatized to the extent that the bike shop within the DC flagship store is only barely adequately staffed for regular business, which means they&#39;re understaffed for peak times. Before I get into anything else, I do want to say that all my interactions with the staff at the DC flagship store have been great, and I don&#39;t think it&#39;s their fault they&#39;re understaffed for the amount of business the store gets. But the fact is, they&#39;re understaffed for the amount of business the store gets, and it shows.&#xA;&#xA;I suspected they&#39;d be backlogged due to the Member Days event, so I waited a couple days after their automated system told me my bike was at the store, and then I called the store itself to speak to the bike shop about when it might be ready. (Pro tip: if you&#39;re waiting on a bike, call the store and not the 800 number.) When I called that Friday morning, they thought they might get to it that evening. In the process the person I spoke to on the phone pulled up my account and saw that I&#39;d ordered two bikes, and he asked if there was anything different between them. I said that one of them came with extra bonus rewards from the credit card, but I was planning on canceling pickup of the other one. Shortly after that I got a notice that the first order (the one without the extra reward) had been canceled. If I&#39;d known that would be possible I&#39;d have had them cancel it sooner, but I&#39;ve been assured it&#39;s not a problem.&#xA;&#xA;As expected, I didn&#39;t get any notification that it was complete on Friday, and I assumed they&#39;d just be slammed over the weekend so I didn&#39;t call again until the following Monday. When I did, they said it was built but hadn&#39;t been inspected, and there was nobody on the schedule who could inspect it. So it wasn&#39;t ready until Tuesday, a week after they&#39;d received the bike.&#xA;&#xA;When I picked up the bike that Tuesday, I used my free hour of setup to have fenders and pedals installed, and then I started riding home. I made it a couple miles before realizing that one of the two shift/brake lever assemblies wasn&#39;t clamped down tightly enough and would move if I happened to apply force to it (like when I stood on the pedals to cross the street at a green light). So I turned around and rode back to REI, where the same tech who&#39;d installed my fenders again helped me. He seemed personally affronted that the loose assembly had passed inspection, so he took a little extra time to double check all the bolts (again: I have only good things to say about my interactions with the team at this REI location).&#xA;&#xA;Customization&#xA;&#xA;In addition to the fenders and pedals, I also ordered more accessories from REI (using member rewards), as well as lights and a wiring adapter I had to order elsewhere. Here&#39;s what I have so far:&#xA;&#xA;table style=&#34;border: none !important; border-collapse: collapse;&#34;&#xA;tr style=&#34;text-align: left;&#34;thItem/ththRetailer/ththPrice/ththPayment/th/tr&#xA;trtda href=&#34;https://www.salsacycles.com/bikes/confluence-grx-600-2x&#34;Salsa Confluence GRX 600 2x/a/tdtda href=&#34;https://www.rei.com/product/227439/salsa-confluence-grx-600-2x-electric-bike&#34;REI/a/tdtd$3499/tdtdCard/td/tr&#xA;trtda href=&#34;https://ride.shimano.com/products/pd-eh500&#34;Shimano PD-EH500 pedals/a/tdtda href=&#34;https://www.rei.com/product/145394/shimano-pd-eh500-spd-sport-road-pedals&#34;REI/a/tdtd$80/tdtdRewards/td/tr&#xA;trtda href=&#34;https://ridepdw.com/collections/fenders/products/full-metal-fenders-700x55&#34;PDW Full Metal Fenders, 700×55/a/tdtda href=&#34;https://www.rei.com/product/238519/portland-design-works-full-metal-fenders-700c-x-55-mm&#34;REI/a/tdtd$139/tdtdRewards/td/tr&#xA;trtda href=&#34;https://www.salsacycles.com/gear/sideentrywaterbottlecage&#34;Salsa Side Entry Water Bottle Cage/a/tdtda href=&#34;https://www.rei.com/product/153236/salsa-side-entry-water-bottle-cage&#34;REI/a/tdtd$16/tdtdRewards/td/tr&#xA;trtda href=&#34;https://us.knog.com/products/scout&#34;Knog Scout Bike Alarm &amp; Finder/a/tdtda href=&#34;https://www.rei.com/product/223602/knog-scout-bike-alarm-and-finder&#34;REI/a/tdtd$59.95/tdtdRewards/td/tr&#xA;trtda href=&#34;https://www.salsacycles.com/gear/wanderlustrack&#34;Salsa Wanderlust Rack/a/tdtda href=&#34;https://www.rei.com/product/153273/salsa-wanderlust-rack&#34;REI/a/tdtd$99/tdtdRewards/td/tr&#xA;trtda href=&#34;https://www.kryptonitelock.com/en/products/product-information/current-key/002079.html&#34;Kryptonite Mini-7 with 4&#39; Flex Cable/a/tdtda href=&#34;https://www.rei.com/product/188310/kryptonite-evolution-mini-u-lock-with-flex-cable&#34;REI/a/tdtd$97.95/tdtdRewards/td/tr&#xA;trtdMAHLE X35 light wiring adapter/tdtda href=&#34;https://www.treefortbikes.com/MAHLE-Smartbike-Systems-Ebike-Light-Wire-Set-Front&#34;Tree Fort Bikes/a/tdtd$28.99/tdtdCard/td/tr&#xA;trtda href=&#34;https://us.knog.com/products/blinder-e-900-front-ebike-light&#34;Knog Blinder E 900 Front E-Bike Light/a/tdtdKnog/tdtd$60.40/tdtdCard/td/tr&#xA;trtda href=&#34;https://us.knog.com/products/blinder-e-rh-rear-bike-light&#34;Knog Blinder E RH Rear E-Bike Light/a/tdtdKnog/tdtd$34.50/tdtdCard/td/tr&#xA;trtdInstallation of lights and wiring/tdtdREI/tdtd$172/tdtdRewards/td/tr&#xA;/table&#xA;&#xA;As mentioned above, when I picked up the bike I had REI install the fenders. I installed the rear rack myself, attached the front and rear lights as appropriate, and took the bike back to REI to get the lights connected to the bike&#39;s electronic system (a process that requires removal of the pedals, bottom bracket, and battery). Unfortunately, when I installed the rear rack I found that I needed to tap the frame eyelets so the bolts would thread without galling. Since I didn&#39;t own a metric tap and die kit, that&#39;s another $30 out of pocket, but now I own those tools.&#xA;&#xA;Further, the front light&#39;s 8W maximum power draw exceeds the bike&#39;s specifications. It&#39;s possible to configure the light to a total of four power levels (4W, 5W, 7W, and 8W), but while I was testing that I kept getting error messages in the bike&#39;s app. Eventually I realized that if the power draw was too high (7W or 8W), the error would pop up when the lights were turned on; but if the lights were configured to low enough power the error didn&#39;t pop up until I used the bike&#39;s controller to turn the lights off. I can replicate it, so I filed a bug report with the drive system&#39;s manufacturer. (They&#39;ve responded with a theory, and we&#39;ve had some emails back and forth, but this isn&#39;t resolved yet).&#xA;&#xA;Bank Error in Your Favor, Collect $200&#xA;&#xA;Getting paid in scrip instead of actual money isn&#39;t my favorite, but it seems like my hunch was correct that the credits (in whatever form) would pay for most of the accessories I&#39;d be adding to the bike. The breakdown:&#xA;&#xA;$349.90 in a &#34;single use bonus card&#34;;&#xA;$100 in a gift card for using the new REI Rewards credit card somewhere else within the first 60 days;&#xA;$2.21 in rewards for using the REI Rewards credit card somewhere else, just as regular spending;&#xA;$185.45 in rewards for using the REI Rewards card at REI;&#xA;$185.45 in bonus rewards for doing so during the Member Match days.&#xA;&#xA;That&#39;s $823.01 in various benefits, of which I&#39;ve spent $693.41. I did have to pay out of pocket to get lights and the wiring for them, but the bulk of what I&#39;ve &#34;spent&#34; has come out of various rewards. That feels OK. (I&#39;ve also bought some panniers and I want to get some shoes, but neither of those feel like part of the setup since they don&#39;t get permanently attached.)&#xA;&#xA;The amount above also excludes the 2024 member reward expected by March 2025. A 10% reward (&#34;typical, but not guaranteed&#34;) would be $399 based on just the spending totaled above. This definitely softens the blow. Your accessory needs may vary.&#xA;&#xA;But Enough About That. How Does It Ride?&#xA;&#xA;I&#39;m still on the learning curve, but I&#39;m a little surprised how closely it matches the idealized bike in my head.&#xA;&#xA;I wanted something that had a comfortable default position on the hoods for getting around the city, but that gave me the option of the drops when I wanted them, and the fit seems really good for both of those. I had to get REI to raise the seat before I&#39;d gone very far, and I ended up raising it a bit more when I got home, but the bars feel like they&#39;re in a good place. I&#39;m still getting used to having flat pedals without toe clips. I know toe clips are well out of fashion now, but I liked not having to think about where my feet were on the pedals and whether they were likely to slip.&#xA;&#xA;It strikes a really nice balance between being powerful enough to level the hills and being light enough that it feels like a normal bike and not an e-bike. It&#39;s definitely not as punishingly stiff as the new Capital Bikeshare e-bikes are, so it gamely handles DC&#39;s pitted streets. I like the fact it&#39;s possible to customize the level of assistance, but I haven&#39;t yet settled on what levels I like best. I&#39;m currently using the commuter preset but I have to admit that its maximum level of assistance seems like more than I need most of the time. I appreciate the extra help when I&#39;m really feeling fatigued though.&#xA;&#xA;As I focused on my research before buying anything, I noticed that a common complaint about hub motors (as opposed to mid-mount motors) is that they don&#39;t have enough torque at low speed, meaning that they can&#39;t provide enough assistance when you really need it, like going up a hill. In my experience this complaint is unfounded. I don&#39;t think of myself as the fittest, most powerful rider, but I&#39;ve been riding bikes for long enough, and I have an instinctive enough feel for cadence and power output, that even when I&#39;m fatigued I&#39;m not struggling to get up enough speed for the motor to provide enough torque. Cynically, I&#39;d guess this complaint is coming primarily from people who have more experience reading spec sheets than riding hub-motor bikes in person. Low torque at low RPM is just not a problem. Don&#39;t believe the anti-hype.&#xA;&#xA;On the other end, I&#39;ve gone past the 20mph limit of the motor assistance and … it&#39;s fine? Again, maybe this is just because I had a pretty good idea of my own power output before I even chose a bike, or a function of the places I&#39;ve ridden so far, but I can easily get to 19 or 20 MPH on the flat. However the thing attenuates its assistance past that point just feels like pedaling a bike to me. It doesn&#39;t weigh enough to slow me down, and if I feel like I need a more aerodynamic position that&#39;s what the drops are for. The assistance can be dialed up so it&#39;s more than just a tailwind, but it&#39;s not like I feel like I miss the extra power when and if it drops out.&#xA;&#xA;Do I miss having a throttle? I do not. Do I think I need more power? Not so far!&#xA;&#xA;Sadly, I&#39;m not 100% happy with everything.&#xA;&#xA;The paint is terrible, and in addition to the places I know I damaged it (like installing the rear rack), there&#39;s a chip on the bottom of the top tube that I know I didn&#39;t cause. I don&#39;t love the shade of yellow anyway and I know bikes get scarred in use, but the paint really could stand to be better.&#xA;&#xA;The internal control system is acceptable but still somewhat cryptic. The controller is a single button with an LED ring. There&#39;s a paper chart included with the manuals that&#39;s supposed to tell you what all the color codes from the LED ring actually mean, and how you do various things like change the amount of assistance, but everything just feels a little less obvious than it should be. To change the power assistance: press the button quickly to make the thing listen for a command, then press the button a second time to cycle through the power levels (one level per press after the first press, which doesn&#39;t count). To turn the lights on or off: short press to make it listen, then a long press. OK, I guess. It would be so much easier with more buttons and a display that didn&#39;t require you to memorize modes.&#xA;&#xA;The associated app (used for customizing power levels and tracking rides) is … meh. It can save workouts to Apple Fitness, but it only records time and not distance; it doesn&#39;t record your heart rate if you don&#39;t open the Apple Watch app first; if you start a ride from the Watch app the phone app doesn&#39;t actually reflect that. It can send rides to Strava automatically, and it seems to be a little better about sending all the available data there, but I&#39;d prefer not to have Strava in the middle there. There&#39;s also one non-obvious place to customize whether the lights come on automatically or not, but there are two other places to change the power levels. It also seems to be a huge battery drain on my phone. I had an issue this week after locking the assistance when locking up the bike. My phone&#39;s battery was very low because of the rides I&#39;d taken earlier that day, and I&#39;d put it in low power mode. At the start of my ride home I unlocked the assistance so I could ride home, but it seemed that the bike didn&#39;t actually get the command (maybe because my phone was in low power mode?). I rode home wondering why the assistance wasn&#39;t helping me more.&#xA;&#xA;This ride was more difficult than expected&#xA;Apple Fitness cycling workout data, showing a 4.85 mile ride with a gradual climb gaining 251 feet over the length of the ride, an average heart rate of 151 BPM, and an average speed of 11.9 MPH&#xA;&#xA;See? Learning curve.&#xA;&#xA;Anyway, the overall experience is great. I love riding it and I feel like I made the right choice. The app could be better, but it&#39;s actually conceivable that could improve since the manufacturer does seem to care. And if I have it long enough that it needs to be repainted, well, I can pick a different color then.&#xA;&#xA;hr&#xD;&#xA;&#xD;&#xA;I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as a href=&#34;https://distraction.party/fedward&#34;fedward@distraction.party/a.]]&gt;</description>
      <content:encoded><![CDATA[<p><em>Previously</em>, I wrote about <a href="https://discontent.fedward.org/in-which-i-try-to-buy-a-bike">trying to buy a new electric gravel bike</a>. Good news! I was successful.</p>

<p><img src="https://cloud.overcomplicated.systems/akkoma/9be1d22bdcbfc294cd1d2598e31f6d3d9f67f1cb2d2c38fc0f5e07106219a0d1.jpeg" alt="A yellow bicycle in front of a fireplace">
<em>Salsa Confluence GRX 600 2x, in front of our fireplace</em></p>

<p>Here are some notes on the process and initial impressions of the bike itself.
</p>

<h3 id="the-buying-experience">The Buying Experience</h3>

<p>First, I&#39;m not sure I recommend the experience of buying a bike from REI during a big sale event. Despite being a co-op, they&#39;ve been corporatized to the extent that the bike shop within the DC flagship store is only barely adequately staffed for regular business, which means they&#39;re understaffed for peak times. Before I get into anything else, I do want to say that all my interactions with the staff at the DC flagship store have been great, and I don&#39;t think it&#39;s their fault they&#39;re understaffed for the amount of business the store gets. But the fact is, they&#39;re understaffed for the amount of business the store gets, and it shows.</p>

<p>I suspected they&#39;d be backlogged due to the Member Days event, so I waited a couple days after their automated system told me my bike was at the store, and then I called the store itself to speak to the bike shop about when it might be ready. (Pro tip: if you&#39;re waiting on a bike, <a href="https://www.reddit.com/r/REI/comments/1flr8h4/">call the store and not the 800 number</a>.) When I called that Friday morning, they thought they might get to it that evening. In the process the person I spoke to on the phone pulled up my account and saw that I&#39;d ordered two bikes, and he asked if there was anything different between them. I said that one of them came with extra bonus rewards from the credit card, but I was planning on canceling pickup of the other one. Shortly after that I got a notice that the first order (the one without the extra reward) had been canceled. If I&#39;d known that would be possible I&#39;d have had them cancel it sooner, but I&#39;ve been assured it&#39;s not a problem.</p>

<p>As expected, I didn&#39;t get any notification that it was complete on Friday, and I assumed they&#39;d just be slammed over the weekend so I didn&#39;t call again until the following Monday. When I did, they said it was built but hadn&#39;t been inspected, and there was nobody on the schedule who could inspect it. So it wasn&#39;t ready until Tuesday, a week after they&#39;d received the bike.</p>

<p>When I picked up the bike that Tuesday, I used my free hour of setup to have fenders and pedals installed, and then I started riding home. I made it a couple miles before realizing that one of the two shift/brake lever assemblies wasn&#39;t clamped down tightly enough and would move if I happened to apply force to it (like when I stood on the pedals to cross the street at a green light). So I turned around and rode back to REI, where the same tech who&#39;d installed my fenders again helped me. He seemed personally affronted that the loose assembly had passed inspection, so he took a little extra time to double check all the bolts (again: I have only good things to say about my interactions with the team at this REI location).</p>

<h3 id="customization">Customization</h3>

<p>In addition to the fenders and pedals, I also ordered more accessories from REI (using member rewards), as well as lights and a wiring adapter I had to order elsewhere. Here&#39;s what I have so far:</p>

<table style="border: none !important; border-collapse: collapse;">
<tr style="text-align: left;"><th>Item</th><th>Retailer</th><th>Price</th><th>Payment</th></tr>
<tr><td><a href="https://www.salsacycles.com/bikes/confluence-grx-600-2x">Salsa Confluence GRX 600 2x</a></td><td><a href="https://www.rei.com/product/227439/salsa-confluence-grx-600-2x-electric-bike">REI</a></td><td>$3499</td><td>Card</td></tr>
<tr><td><a href="https://ride.shimano.com/products/pd-eh500">Shimano PD-EH500 pedals</a></td><td><a href="https://www.rei.com/product/145394/shimano-pd-eh500-spd-sport-road-pedals">REI</a></td><td>$80</td><td>Rewards</td></tr>
<tr><td><a href="https://ridepdw.com/collections/fenders/products/full-metal-fenders-700x55">PDW Full Metal Fenders, 700×55</a></td><td><a href="https://www.rei.com/product/238519/portland-design-works-full-metal-fenders-700c-x-55-mm">REI</a></td><td>$139</td><td>Rewards</td></tr>
<tr><td><a href="https://www.salsacycles.com/gear/side_entry_water_bottle_cage">Salsa Side Entry Water Bottle Cage</a></td><td><a href="https://www.rei.com/product/153236/salsa-side-entry-water-bottle-cage">REI</a></td><td>$16</td><td>Rewards</td></tr>
<tr><td><a href="https://us.knog.com/products/scout">Knog Scout Bike Alarm &amp; Finder</a></td><td><a href="https://www.rei.com/product/223602/knog-scout-bike-alarm-and-finder">REI</a></td><td>$59.95</td><td>Rewards</td></tr>
<tr><td><a href="https://www.salsacycles.com/gear/wanderlust_rack">Salsa Wanderlust Rack</a></td><td><a href="https://www.rei.com/product/153273/salsa-wanderlust-rack">REI</a></td><td>$99</td><td>Rewards</td></tr>
<tr><td><a href="https://www.kryptonitelock.com/en/products/product-information/current-key/002079.html">Kryptonite Mini-7 with 4&#39; Flex Cable</a></td><td><a href="https://www.rei.com/product/188310/kryptonite-evolution-mini-u-lock-with-flex-cable">REI</a></td><td>$97.95</td><td>Rewards</td></tr>
<tr><td>MAHLE X35 light wiring adapter</td><td><a href="https://www.treefortbikes.com/MAHLE-Smartbike-Systems-Ebike-Light-Wire-Set-Front">Tree Fort Bikes</a></td><td>$28.99</td><td>Card</td></tr>
<tr><td><a href="https://us.knog.com/products/blinder-e-900-front-ebike-light">Knog Blinder E 900 Front E-Bike Light</a></td><td>Knog</td><td>$60.40</td><td>Card</td></tr>
<tr><td><a href="https://us.knog.com/products/blinder-e-rh-rear-bike-light">Knog Blinder E RH Rear E-Bike Light</a></td><td>Knog</td><td>$34.50</td><td>Card</td></tr>
<tr><td>Installation of lights and wiring</td><td>REI</td><td>$172</td><td>Rewards</td></tr>
</table>

<p>As mentioned above, when I picked up the bike I had REI install the fenders. I installed the rear rack myself, attached the front and rear lights as appropriate, and took the bike back to REI to get the lights connected to the bike&#39;s electronic system (a process that requires removal of the pedals, bottom bracket, and battery). Unfortunately, when I installed the rear rack I found that I needed to tap the frame eyelets so the bolts would thread without galling. Since I didn&#39;t own a metric tap and die kit, that&#39;s another $30 out of pocket, but now I own those tools.</p>

<p>Further, the front light&#39;s 8W maximum power draw exceeds the bike&#39;s specifications. It&#39;s possible to configure the light to a total of four power levels (4W, 5W, 7W, and 8W), but while I was testing that I kept getting error messages in the bike&#39;s app. Eventually I realized that if the power draw was too high (7W or 8W), the error would pop up when the lights were turned on; but if the lights were configured to low enough power the error didn&#39;t pop up until I used the bike&#39;s controller to turn the lights off. I can replicate it, so I filed a bug report with the drive system&#39;s manufacturer. (They&#39;ve responded with a theory, and we&#39;ve had some emails back and forth, but this isn&#39;t resolved yet).</p>

<h3 id="bank-error-in-your-favor-collect-200">Bank Error in Your Favor, Collect $200</h3>

<p>Getting paid in scrip instead of actual money isn&#39;t my favorite, but it seems like my hunch was correct that the credits (in whatever form) would pay for most of the accessories I&#39;d be adding to the bike. The breakdown:</p>
<ul><li>$349.90 in a “single use bonus card”;</li>
<li>$100 in a gift card for using the new REI Rewards credit card somewhere else within the first 60 days;</li>
<li>$2.21 in rewards for using the REI Rewards credit card somewhere else, just as regular spending;</li>
<li>$185.45 in rewards for using the REI Rewards card at REI;</li>
<li>$185.45 in bonus rewards for doing so during the Member Match days.</li></ul>

<p>That&#39;s $823.01 in various benefits, of which I&#39;ve spent $693.41. I did have to pay out of pocket to get lights and the wiring for them, but the bulk of what I&#39;ve “spent” has come out of various rewards. That feels OK. (I&#39;ve also bought some panniers and I want to get some shoes, but neither of those feel like part of the setup since they don&#39;t get permanently attached.)</p>

<p>The amount above also excludes the 2024 member reward expected by March 2025. A 10% reward (“typical, but not guaranteed”) would be $399 based on just the spending totaled above. This definitely softens the blow. Your accessory needs may vary.</p>

<h3 id="but-enough-about-that-how-does-it-ride">But Enough About That. How Does It Ride?</h3>

<p>I&#39;m still on the learning curve, but I&#39;m a little surprised how closely it matches the idealized bike in my head.</p>

<p>I wanted something that had a comfortable default position on the hoods for getting around the city, but that gave me the option of the drops when I wanted them, and the fit seems really good for both of those. I had to get REI to raise the seat before I&#39;d gone very far, and I ended up raising it a bit more when I got home, but the bars feel like they&#39;re in a good place. I&#39;m still getting used to having flat pedals without toe clips. I know toe clips are well out of fashion now, but I liked not having to think about where my feet were on the pedals and whether they were likely to slip.</p>

<p>It strikes a really nice balance between being powerful enough to level the hills and being light enough that it feels like a normal bike and not an e-bike. It&#39;s definitely not as punishingly stiff as <a href="https://www.lyft.com/blog/posts/meet-lyfts-new-ebike">the new Capital Bikeshare e-bikes</a> are, so it gamely handles DC&#39;s pitted streets. I like the fact it&#39;s possible to customize the level of assistance, but I haven&#39;t yet settled on what levels I like best. I&#39;m currently using the commuter preset but I have to admit that its maximum level of assistance seems like more than I need most of the time. I appreciate the extra help when I&#39;m really feeling fatigued though.</p>

<p>As I focused on my research before buying anything, I noticed that a common complaint about hub motors (as opposed to mid-mount motors) is that they don&#39;t have enough torque at low speed, meaning that they can&#39;t provide enough assistance when you really need it, like going up a hill. In my experience this complaint is unfounded. I don&#39;t think of myself as the fittest, most powerful rider, but I&#39;ve been riding bikes for long enough, and I have an instinctive enough feel for cadence and power output, that even when I&#39;m fatigued I&#39;m not struggling to get up enough speed for the motor to provide enough torque. Cynically, I&#39;d guess this complaint is coming primarily from people who have more experience reading spec sheets than riding hub-motor bikes in person. Low torque at low RPM is just not a problem. Don&#39;t believe the anti-hype.</p>

<p>On the other end, I&#39;ve gone past the 20mph limit of the motor assistance and … it&#39;s fine? Again, maybe this is just because I had a pretty good idea of my own power output before I even chose a bike, or a function of the places I&#39;ve ridden so far, but I can easily get to 19 or 20 MPH on the flat. However the thing attenuates its assistance past that point just feels like pedaling a bike to me. It doesn&#39;t weigh enough to slow me down, and if I feel like I need a more aerodynamic position that&#39;s what the drops are for. The assistance can be dialed up so it&#39;s more than just a tailwind, but it&#39;s not like I feel like I miss the extra power when and if it drops out.</p>

<p>Do I miss having a throttle? I do not. Do I think I need more power? Not so far!</p>

<p>Sadly, I&#39;m not 100% happy with everything.</p>

<p><a href="https://www.reddit.com/r/salsacycles/comments/1g01f48/has_anyone_experienced_poor_quality_paint/">The paint is terrible</a>, and in addition to the places I know I damaged it (like installing the rear rack), there&#39;s a chip on the bottom of the top tube that I know I didn&#39;t cause. I don&#39;t love the shade of yellow anyway and I know bikes get scarred in use, but the paint really could stand to be better.</p>

<p>The internal control system is acceptable but still somewhat cryptic. The controller is a single button with an LED ring. There&#39;s a paper chart included with the manuals that&#39;s supposed to tell you what all the color codes from the LED ring actually mean, and how you do various things like change the amount of assistance, but everything just feels a little less obvious than it should be. To change the power assistance: press the button quickly to make the thing listen for a command, then press the button a second time to cycle through the power levels (one level per press after the first press, which doesn&#39;t count). To turn the lights on or off: short press to make it listen, then a long press. OK, I guess. It would be so much easier with more buttons and a display that didn&#39;t require you to memorize modes.</p>

<p>The associated app (used for customizing power levels and tracking rides) is … meh. It can save workouts to Apple Fitness, but it only records time and not distance; it doesn&#39;t record your heart rate if you don&#39;t open the Apple Watch app first; if you start a ride from the Watch app the phone app doesn&#39;t actually reflect that. It can send rides to Strava automatically, and it seems to be a little better about sending all the available data there, but I&#39;d prefer not to have Strava in the middle there. There&#39;s also one non-obvious place to customize whether the lights come on automatically or not, but there are two other places to change the power levels. It also seems to be a huge battery drain on my phone. I had an issue this week after locking the assistance when locking up the bike. My phone&#39;s battery was very low because of the rides I&#39;d taken earlier that day, and I&#39;d put it in low power mode. At the start of my ride home I unlocked the assistance so I could ride home, but it seemed that the bike didn&#39;t actually get the command (maybe because my phone was in low power mode?). I rode home wondering why the assistance wasn&#39;t helping me more.</p>

<p><img src="https://cloud.overcomplicated.systems/discontent/harder_than_expected.png" alt="This ride was more difficult than expected">
<em>Apple Fitness cycling workout data, showing a 4.85 mile ride with a gradual climb gaining 251 feet over the length of the ride, an average heart rate of 151 BPM, and an average speed of 11.9 MPH</em></p>

<p>See? Learning curve.</p>

<p>Anyway, the overall experience is great. I love riding it and I feel like I made the right choice. The app could be better, but it&#39;s actually conceivable that could improve since the manufacturer does seem to care. And if I have it long enough that it needs to be repainted, well, I can pick a different color then.</p>

<hr>

<p>I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as <a href="https://distraction.party/fedward">fedward@distraction.party</a>.</p>
]]></content:encoded>
      <guid>https://discontent.fedward.org/in-which-i-actually-have-a-new-bike</guid>
      <pubDate>Fri, 27 Sep 2024 19:28:04 +0000</pubDate>
    </item>
    <item>
      <title>In which I try to buy a bike</title>
      <link>https://discontent.fedward.org/in-which-i-try-to-buy-a-bike</link>
      <description>&lt;![CDATA[I&#39;ve always liked riding bikes. When we were too young for driver&#39;s licenses, my friend Ben and I used to ride our bikes to Wendy&#39;s and try to get them to serve us at the drive-thru. In college I started riding again because it was the best way around (and, eventually, to) campus. My first year in the DC area I didn&#39;t ride much, mostly because I lived in Arlington and worked downtown. When I moved into the District I started riding again, and to this day I&#39;m still riding the 2000 Cannondale M400 MTB I bought to commute on.&#xA;!--more--&#xA;Cannondale M400 bike in our living room, in front of a curio shelf. In the foreground is a large box from Chewy, out of which a cat&#39;s left ear can be seen poking.&#xA;Cannondale M400 bike in our living room, in front of a curio shelf. In the foreground is a large box from Chewy, out of which a cat&#39;s left ear can be seen poking.&#xA;&#xA;The geometry is surprisingly similar to a modern gravel bike, but the stock bars were killing my wrists. I&#39;d idly thought about component upgrades but if I&#39;d switched to drop bars I also would have had to buy new brake levers and shifters, and I still wouldn&#39;t have had disc brakes. I did install a Jones H-Loop bar on a shorter stem, and that mostly fixed my wrist issues. In retrospect I could have gone with an even shorter stem than the one I bought, but I was worried about changing the handling too much.&#xA;&#xA;So anyway, for a few years now, in the back of my mind, I&#39;ve kind of wanted a bike that was &#34;like this, but.&#34; I&#39;d already discovered that the frame geometry was very much like a modern gravel bike (similar seat and head tube angles, wheelbase, and bottom bracket height) so I thought that the drop bars, disc brakes, and stack height of a modern gravel bike would be really nice to have. But I was also wary of falling into the N+1 trap (see below) so I steadfastly refused to think about this except in the most abstract of terms.&#xA;&#xA;  Rule #12 // The correct number of bikes to own is n+1.&#xA;  While the minimum number of bikes one should own is three, the correct number is n+1, where n is the number of bikes currently owned. This equation may also be re-written as s-1, where s is the number of bikes owned that would result in separation from your partner.&#xA;&#xA;A few things just made me change my mind. The Cannondale is starting to have some stacked up maintenance needs that I either don&#39;t have the tools for (squeaky bottom bracket, rims that need some attention) or have lost patience for (sticky shifting between a couple gears that I think means I may need to overhaul the shifter and/or replace the cables). I&#39;ve been using Capital Bikeshare e-bikes more lately when I need to go one-way and that way is uphill, and while the power is nice, the riding experience is awful. Both of those are minor, but the thing that really pushed me over the edge was … an autoimmune disease.&#xA;&#xA;I&#39;d known for a few years (five, it turns out) that my regular blood tests indicated that I had some kind of autoimmune disease, but I&#39;d been able to ignore it. This year the fatigue seemed to be getting a lot worse though, and I talked to my doctor about it, and finally saw a rheumatologist to check out my blood test results. But The New Fatigue™ means I just don&#39;t have the stamina to do rides I&#39;ve done hundreds of times before. Riding back from a (different) doctor&#39;s appointment, I basically bonked, and I felt it for three days afterward instead of recovering as soon as I&#39;d had some rest. This was the first time I&#39;d felt that fatigued for that long. And I hated it.&#xA;&#xA;So I went from &#34;maybe I&#39;d like a new gravel bike, someday&#34; to &#34;I should get an e-bike, like, now.&#34; It was Labor Day weekend and thus time for REI&#39;s annual sale, but the more I looked at commuter/cargo e-bikes the more I realized that if I bought one of those, I&#39;d definitely end up wanting something like a gravel/adventure/all-road e-bike in addition. Which sure smells a lot like the N+1 rule all over again, and I don&#39;t want to fall into that trap. So I wondered, &#34;is an electric gravel bike a decent commuter?&#34; And the internet kind of says yes. Could I have found an N=1 bike?&#xA;&#xA;The answer turned out to be … a qualified maybe? I found a few decent bike models that covered my wishlist (comfortable position, drop bars, disc brakes, 2× drivetrain, not too heavy) but actually being able to buy one (from a local bike shop, not online) and justify the cost ($2.5K was table stakes; $3.5K seemed to be the real going rate) was going to be hard. But then I found a clearance deal on a GT eGrade Bolt. Velofix isn&#39;t so much an LBS (&#34;Local Bike Shop&#34;) as a storage unit and somebody with a van, but they seem to have two mechanics in the DC area and feedback on /r/bikedc wasn&#39;t bad.&#xA;&#xA;A confirmation email showing an order for a GT eGrade Bolt at 33% off retail&#xA;&#xA;One bike, in a good color even, and only available in the size I needed. Was this too good to be true? You bet. It was an inventory error, and GT is out of stock of this old model (and haven&#39;t yet introduced its successor). So my order was canceled and refunded. Cannondale, owned by the same parent company, has an equivalent model, the Topstone Neo SL 2, that has the same 2×10 drivetrain as the discontinued one from GT and I can&#39;t help but think it&#39;s also maybe due for a replacement. Trek&#39;s equivalent, the Domane+ AL 5 is out of stock in my size in every color.&#xA;&#xA;That left me with basically one model I could even try to buy locally, the Salsa Confluence GRX 600 2x, but it&#39;s a new model this year, so it&#39;s full price everywhere. I was about to give up, and then the clock passed midnight and REI&#39;s Member Days deals went live. Extra 10% back if I used their credit card. Getting this year&#39;s model with 20% back to pay for accessories was certainly tempting, but I made myself sleep on it.&#xA;&#xA;The next morning it still didn&#39;t seem like a bad idea, so I figured I&#39;d leave it to the fate of &#34;can I even get approved for the credit card?&#34; No card, no deal (literally). Well, sure enough they approved me for the card and I could get a virtual card number through the app, so I ordered a(nother) bike!&#xA;&#xA;Screenshot of an order confirmation email from REI showing a bike&#xA;&#xA;I went about my day. The next morning I figured I should get a head start picking out accessories like pedals, fenders, and a new lock, so I opened up a new REI tab. And there was a banner saying that there was now a Member Match offer for an additional 10% back in the form of a store bonus card, for purchases made Saturday and Sunday only. The offer was not applicable to previous purchases, but I had the available credit on the new REI Co-op Mastercard I&#39;d just opened the day before. So I ordered my third new bike in three days.&#xA;&#xA;Screenshot of an order confirmation email from REI showing a bike&#xA;Yes, this is actually the same screenshot as the one above it, so your browser doesn&#39;t have to request another image_&#xA;&#xA;It&#39;s absurd. REI won&#39;t let you cancel an order in progress, so my local REI is going to have a spare bike exactly like mine. I feel bad for increasing their overhead, but I didn&#39;t make the rules, and $350 in store credit makes it worthwhile to me.&#xA;&#xA;After years of convincing myself that I didn&#39;t need another bike, it&#39;s definitely weird to have placed three orders in three days just to get to the point of finally owning one more. I wonder if I should sell the Cannondale.&#xA;&#xA;Update: I&#39;ve now posted some impressions of my new bike.&#xA;&#xA;hr&#xD;&#xA;&#xD;&#xA;I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as a href=&#34;https://distraction.party/fedward&#34;fedward@distraction.party/a.]]&gt;</description>
      <content:encoded><![CDATA[<p>I&#39;ve always liked riding bikes. When we were too young for driver&#39;s licenses, my friend Ben and I used to ride our bikes to Wendy&#39;s and try to get them to serve us at the drive-thru. In college I started riding again because it was the best way around (and, eventually, to) campus. My first year in the DC area I didn&#39;t ride much, mostly because I lived in Arlington and worked downtown. When I moved into the District I started riding again, and to this day I&#39;m still riding the <a href="https://vintagecannondale.com/catalog">2000 Cannondale M400</a> MTB I bought to commute on.

<img src="https://cloud.overcomplicated.systems/discontent/bike_and_cat.jpeg" alt="Cannondale M400 bike in our living room, in front of a curio shelf. In the foreground is a large box from Chewy, out of which a cat&#39;s left ear can be seen poking.">
<em>Cannondale M400 bike in our living room, in front of a curio shelf. In the foreground is a large box from Chewy, out of which a cat&#39;s left ear can be seen poking.</em></p>

<p>The geometry is surprisingly similar to a modern gravel bike, but the stock bars were killing my wrists. I&#39;d idly thought about component upgrades but if I&#39;d switched to drop bars I also would have had to buy new brake levers and shifters, and I still wouldn&#39;t have had disc brakes. I did install a <a href="https://jonesbikes.com/h-bars/">Jones H-Loop bar</a> on a shorter stem, and that mostly fixed my wrist issues. In retrospect I could have gone with an even shorter stem than the one I bought, but I was worried about changing the handling too much.</p>

<p>So anyway, for a few years now, in the back of my mind, I&#39;ve kind of wanted a bike that was “like this, but.” I&#39;d already discovered that the frame geometry was very much like a modern gravel bike (similar seat and head tube angles, wheelbase, and bottom bracket height) so I thought that the drop bars, disc brakes, and stack height of a modern gravel bike would be really nice to have. But I was also wary of falling into the N+1 trap (see below) so I steadfastly refused to think about this except in the most abstract of terms.</p>

<blockquote><p><strong>Rule #12 // <a href="https://www.velominati.com">The correct number of bikes to own is n+1</a>.</strong>
While the minimum number of bikes one should own is three, the correct number is n+1, where n is the number of bikes currently owned. This equation may also be re-written as s-1, where s is the number of bikes owned that would result in separation from your partner.</p></blockquote>

<p>A few things just made me change my mind. The Cannondale is starting to have some stacked up maintenance needs that I either don&#39;t have the tools for (squeaky bottom bracket, rims that need some attention) or have lost patience for (sticky shifting between a couple gears that I think means I may need to overhaul the shifter and/or replace the cables). I&#39;ve been using Capital Bikeshare e-bikes more lately when I need to go one-way and that way is uphill, and while the power is nice, the riding experience is awful. Both of those are minor, but the thing that really pushed me over the edge was … an autoimmune disease.</p>

<p>I&#39;d known for a few years (<a href="https://distraction.party/notice/Al8ABiKhUE9Gjv572W">five, it turns out</a>) that my regular blood tests indicated that I had some kind of autoimmune disease, but I&#39;d been able to ignore it. This year the fatigue seemed to be getting a lot worse though, and I talked to my doctor about it, and finally saw a rheumatologist to check out my blood test results. But <a href="https://distraction.party/notice/AlMepsaSUxyMxnxYo4">The New Fatigue™</a> means I just don&#39;t have the stamina to do rides I&#39;ve done hundreds of times before. Riding back from a (different) doctor&#39;s appointment, I basically <a href="https://www.bikeradar.com/advice/fitness-and-training/how-to-avoid-bonking-on-a-bike-ride">bonked</a>, and I felt it for three days afterward instead of recovering as soon as I&#39;d had some rest. This was the first time I&#39;d felt that fatigued for that long. And I hated it.</p>

<p>So I went from “maybe I&#39;d like a new gravel bike, someday” to “I should get an e-bike, like, now.” It was Labor Day weekend and thus time for REI&#39;s annual sale, but the more I looked at commuter/cargo e-bikes the more I realized that if I bought one of those, I&#39;d definitely end up wanting something like a <a href="https://www.bikeradar.com/advice/buyers-guides/all-road-bikes-explained">gravel/adventure/all-road</a> e-bike in addition. Which sure smells a lot like the N+1 rule all over again, and <a href="https://chasingmailboxes.com/2015/03/03/the-truth-and-nonsense-of-the-n1-principle-of-bicycles/">I don&#39;t want to fall into that trap</a>. So I wondered, “is an electric gravel bike a decent commuter?” And the internet kind of says yes. Could I have found an N=1 bike?</p>

<p>The answer turned out to be … a qualified maybe? I found a few decent bike models that covered my wishlist (comfortable position, drop bars, disc brakes, 2× drivetrain, not too heavy) but actually being able to buy one (from a local bike shop, not online) and justify the cost ($2.5K was table stakes; $3.5K seemed to be the real going rate) was going to be hard. But then <a href="https://shopvelofix.com/products/gt-egrade-bolt">I found a clearance deal</a> on a <a href="https://gtbicycles.com/collections/gravel-bikes/products/egrade-bolt?variant=45862852722985">GT eGrade Bolt</a>. Velofix isn&#39;t so much an LBS (“Local Bike Shop”) as a storage unit and somebody with a van, but they seem to have two mechanics in the DC area and feedback on <a href="https://www.reddit.com/r/bikedc/">/r/bikedc</a> wasn&#39;t bad.</p>

<p><img src="https://cloud.overcomplicated.systems/akkoma/06ff3d0dc33cd19b91ec597f3bdcf1cf3e2bbcbdf23b1205d46f9717f138de7f.jpeg" alt="A confirmation email showing an order for a GT eGrade Bolt at 33% off retail"></p>

<p>One bike, in a good color even, and only available in the size I needed. Was this too good to be true? You bet. It was an inventory error, and GT is out of stock of this old model (and haven&#39;t yet introduced its successor). So my order was canceled and refunded. Cannondale, <a href="https://pon.bike/brands">owned by the same parent company</a>, has an equivalent model, the <a href="https://www.cannondale.com/en-us/bikes/electric/e-road/topstone-neo/topstone-neo-sl-2-smu">Topstone Neo SL 2</a>, that has the same 2×10 drivetrain as the discontinued one from GT and I can&#39;t help but think it&#39;s also maybe due for a replacement. Trek&#39;s equivalent, the <a href="https://www.trekbikes.com/us/en_US/bikes/electric-bikes/electric-road-bikes/domane-al-5/p/36145/">Domane+ AL 5</a> is out of stock in my size in every color.</p>

<p>That left me with basically one model I could even try to buy locally, the <a href="https://www.salsacycles.com/bikes/confluence-grx-600-2x">Salsa Confluence GRX 600 2x</a>, but <a href="https://theradavist.com/salsa-cycles-ebike-confluence-gravel-bike/">it&#39;s a new model this year</a>, so it&#39;s full price everywhere. I was about to give up, and then the clock passed midnight and <a href="https://www.rei.com/membership#member-days">REI&#39;s Member Days</a> deals went live. Extra 10% back if I used their credit card. Getting this year&#39;s model with 20% back to pay for accessories was certainly tempting, but I made myself sleep on it.</p>

<p>The next morning it still didn&#39;t seem like a bad idea, so I figured I&#39;d leave it to the fate of “can I even get approved for the credit card?” No card, no deal (literally). Well, sure enough they approved me for the card and I could get a virtual card number through the app, so I ordered a(nother) bike!</p>

<p><img src="https://cloud.overcomplicated.systems/discontent/rei_bike_order.png" alt="Screenshot of an order confirmation email from REI showing a bike"></p>

<p>I went about my day. The next morning I figured I should get a head start picking out accessories like pedals, fenders, and a new lock, so I opened up a new REI tab. And there was a banner saying that there was now a <a href="https://www.rei.com/membership/member-match">Member Match</a> offer for an <em>additional</em> 10% back in the form of a store bonus card, for purchases made Saturday and Sunday only. The offer was not applicable to previous purchases, but I had the available credit on the new REI Co-op Mastercard I&#39;d just opened the day before. So I ordered my third new bike in three days.</p>

<p><img src="https://cloud.overcomplicated.systems/discontent/rei_bike_order.png" alt="Screenshot of an order confirmation email from REI showing a bike">
<em>Yes, this is actually the same screenshot as the one above it, so your browser doesn&#39;t have to request another image</em></p>

<p>It&#39;s absurd. REI won&#39;t let you cancel an order in progress, so my local REI is going to have a spare bike exactly like mine. I feel bad for increasing their overhead, but I didn&#39;t make the rules, and $350 in store credit makes it worthwhile to me.</p>

<p>After years of convincing myself that I didn&#39;t need another bike, it&#39;s definitely weird to have placed three orders in three days just to get to the point of finally owning one more. I wonder if I should <a href="https://www.outsideonline.com/outdoor-gear/bikes-and-biking/how-to-get-rid-of-bikes">sell the Cannondale</a>.</p>

<p>Update: I&#39;ve now posted <a href="https://discontent.fedward.org/in-which-i-actually-have-a-new-bike">some impressions of my new bike</a>.</p>

<hr>

<p>I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as <a href="https://distraction.party/fedward">fedward@distraction.party</a>.</p>
]]></content:encoded>
      <guid>https://discontent.fedward.org/in-which-i-try-to-buy-a-bike</guid>
      <pubDate>Sun, 08 Sep 2024 20:02:25 +0000</pubDate>
    </item>
    <item>
      <title>I hate computers</title>
      <link>https://discontent.fedward.org/i-hate-computers</link>
      <description>&lt;![CDATA[Famously, Macs Just Work™ up until the point they don’t. We have an old (2014) Mac mini connected to the TV to act as a more capable media player and server than an Apple TV would be. Previously, after Apple chose not to fix the webp exploit on its last officially supported OS (Catalina), I used OpenCore Legacy Patcher to standardize on Ventura on every Mac in the house that still gets turned on. This was fine as it goes, and I’m able to install updates without any issues on a similarly unsupported MacBook Pro from 2015.&#xA;&#xA;This week, however, the Mac mini stopped updating. The installer for the latest Safari update crashed without successful completion, and Ventura 13.6.1 wasn’t showing up in Software Update at all. Delving into the Console app I found the root error was the shove process crashing with a doesNotRecognizeSelector error message. I exhausted the amount of time I was willing to spend on it, and that should have been that.&#xA;!--more--&#xA;But then my wife asked for her annual supply of Christmas music from my CD collection, which for disk space reasons is only in my Music-formerly-iTunes library and not hers. (There does not seem to be a good way to share a music library across users, or at least there wasn&#39;t the last time I looked for one). Putting my music on her iPhone requires plugging her iPhone into the computer where the library lives and syncing manually. It&#39;s a pain, but most of the time this doesn&#39;t matter, because we can fill it up with the stuff she likes and forget about it. Unfortunately, the computer where the library lives happens to be the Mac mini that previously failed at Software Update.&#xA;&#xA;That same Mac mini, unsurprisingly, required the installation of some software component so it could connect to her iPhone, and when I tried to install it the same shove process crashed with the same sort of doesNotRecognizeSelector error message.&#xA;&#xA;Good news, everyone! This is not a problem Apple will help you fix. Leaving aside the not-inconsequential issue that Ventura isn&#39;t officially supported on this Mac, their guidance for problems like this is just to reinstall the OS and restore from a backup. I went back to the thumb drive I&#39;d used for the installer, but the installer said that the volume couldn&#39;t be downgraded. Um, what?&#xA;&#xA;So then I downloaded the full 13.6.1 installer and used the media creation tool to put that on my thumb drive instead of whatever older version of Ventura was on there. 13.6.1 is newer than the 13.6 that was installed on the Mac, so that installation should work, right? Wrong. Even the 13.6.1 installer said that the volume couldn&#39;t be downgraded.&#xA;&#xA;At this point I followed the usual guidance and created a new volume on the startup drive, but then the installer said there wasn&#39;t enough room on the volume. After I deleted 4 GB of old media files to clear up the 1.5 GB I needed, the installer still said there wasn&#39;t enough room on the volume. Frustrated, I wiped out the Time Machine snapshots on the original volume and that made enough room for installation.&#xA;&#xA;After letting the installer do its thing, I tried to use Migration Assistant to copy everything from the old startup volume to the new one, but here&#39;s where this gets really weird: Migration Assistant refused to allow me to select the old startup volume, saying it that it was a newer version of the OS and that the current startup volume would need to be upgraded first.&#xA;&#xA;Based on that I&#39;m pretty certain that some indicator of the current installed OS version on the old startup volume has gotten corrupted. But because this is not a problem Apple will in any way help you resolve, what I&#39;m left with is a tedious, manual process to look over the old startup volume and its user directories, find the things that should be copied, and copy them with the correct permissions into the corresponding places on the new startup volume. Several hours of work across three days later, I&#39;ve got most of the important stuff done but I still have some lingering issues.&#xA;&#xA;I thought I had gotten the Music library all set up again, but then it turned out that merely pointing the app at the directory containing all its media wasn&#39;t enough. I had to import all the files that were already in the media directory (almost a thousand albums, more than 12,000 songs, which could play nonstop, without repeat, for 31 days). And of course since it&#39;s a new installation my wife&#39;s iPhone doesn&#39;t recognize it as the library that was previously synced. Doesn&#39;t matter that it&#39;s the same hardware, the same library files copied into the active user&#39;s home directory, and the same media folder on the same hard drive. Now, just to get Christmas music onto her iPhone, I&#39;ve had to take notes (by hand) of what music was already on her phone, set up the sync with the new copy of the same library, and then restore all the old music when adding Christmas music.&#xA;&#xA;Even weirder, there&#39;s a handful of playlists that are either empty now or just don&#39;t show up in the interface where you select which music to sync. The music exists in the library, but the playlists can&#39;t be selected. I think this is caused by a workaround I previously had to put in place for stuff that iTunes Match mismatched (e.g. mono tracks from remastered Beatles albums that iTunes Match replaced with the stereo versions), but I have to stop somewhere. That can be a problem for another day.&#xA;&#xA;Ironically, the non-Apple media server software I use for TV and movies (Emby) worked perfectly once I copied the old configuration directory over, recognizing all the local media directories I&#39;d previously configured. It&#39;s just the Apple software that didn&#39;t work right the first time. There&#39;s probably a lesson in there somewhere.&#xA;&#xA;hr&#xD;&#xA;&#xD;&#xA;I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as a href=&#34;https://distraction.party/fedward&#34;fedward@distraction.party/a.]]&gt;</description>
      <content:encoded><![CDATA[<p>Famously, Macs <a href="https://techcrunch.com/2011/06/08/apple-icloud-google-cloud/">Just Work™</a> up until the point they don’t. We have an old (2014) Mac mini connected to the TV to act as a more capable media player and server than an Apple TV would be. <a href="https://distraction.party/notice/AajgXtY1SVdrpiugOe">Previously</a>, after Apple chose not to fix the webp exploit on its last officially supported OS (Catalina), I used OpenCore Legacy Patcher to standardize on Ventura on every Mac in the house that still gets turned on. This was fine as it goes, and I’m able to install updates without any issues on a similarly unsupported MacBook Pro from 2015.</p>

<p>This week, however, the Mac mini stopped updating. The installer for the latest Safari update crashed without successful completion, and Ventura 13.6.1 wasn’t showing up in Software Update at all. Delving into the Console app I found the root error was the <code>shove</code> process crashing with a <code>doesNotRecognizeSelector</code> error message. I exhausted the amount of time I was willing to spend on it, and that should have been that.

But then my wife asked for her annual supply of Christmas music from my CD collection, which for disk space reasons is only in my Music-formerly-iTunes library and not hers. (There does not seem to be a good way to share a music library across users, or at least there wasn&#39;t the last time I looked for one). Putting my music on her iPhone requires plugging her iPhone into the computer where the library lives and syncing manually. It&#39;s a pain, but most of the time this doesn&#39;t matter, because we can fill it up with the stuff she likes and forget about it. Unfortunately, the computer where the library lives happens to be the Mac mini that previously failed at Software Update.</p>

<p>That same Mac mini, unsurprisingly, required the installation of some software component so it could connect to her iPhone, and when I tried to install it the same <code>shove</code> process crashed with the same sort of <code>doesNotRecognizeSelector</code> error message.</p>

<p>Good news, everyone! This is not a problem Apple will help you fix. Leaving aside the not-inconsequential issue that Ventura isn&#39;t officially supported on this Mac, their guidance for problems like this is just to reinstall the OS and restore from a backup. I went back to the thumb drive I&#39;d used for the installer, but the installer said that the volume couldn&#39;t be downgraded. Um, what?</p>

<p>So then I downloaded the full 13.6.1 installer and used the media creation tool to put that on my thumb drive instead of whatever older version of Ventura was on there. 13.6.1 is newer than the 13.6 that was installed on the Mac, so that installation should work, right? Wrong. Even the 13.6.1 installer said that the volume couldn&#39;t be downgraded.</p>

<p>At this point I followed the usual guidance and created a new volume on the startup drive, but then the installer said there wasn&#39;t enough room on the volume. After I deleted 4 GB of old media files to clear up the 1.5 GB I needed, the installer still said there wasn&#39;t enough room on the volume. Frustrated, I wiped out the Time Machine snapshots on the original volume and that made enough room for installation.</p>

<p>After letting the installer do its thing, I tried to use Migration Assistant to copy everything from the old startup volume to the new one, but here&#39;s where this gets <em>really</em> weird: Migration Assistant refused to allow me to select the old startup volume, saying it that it was a newer version of the OS and that the current startup volume would need to be upgraded first.</p>

<p>Based on that I&#39;m pretty certain that some indicator of the current installed OS version on the old startup volume has gotten corrupted. But because this is not a problem Apple will in any way help you resolve, what I&#39;m left with is a tedious, manual process to look over the old startup volume and its user directories, find the things that should be copied, and copy them with the correct permissions into the corresponding places on the new startup volume. Several hours of work across three days later, I&#39;ve got most of the important stuff done but I still have some lingering issues.</p>

<p>I thought I had gotten the Music library all set up again, but then it turned out that merely pointing the app at the directory containing all its media wasn&#39;t enough. I had to import all the files that were already in the media directory (almost a thousand albums, more than 12,000 songs, which could play nonstop, without repeat, for 31 days). And of course since it&#39;s a new installation my wife&#39;s iPhone doesn&#39;t recognize it as the library that was previously synced. Doesn&#39;t matter that it&#39;s the same hardware, the same library files copied into the active user&#39;s home directory, and the same media folder on the same hard drive. Now, just to get Christmas music onto her iPhone, I&#39;ve had to take notes (by hand) of what music was already on her phone, set up the sync with the new copy of the same library, and then restore all the old music when adding Christmas music.</p>

<p>Even weirder, there&#39;s a handful of playlists that are either empty now or just don&#39;t show up in the interface where you select which music to sync. The music exists in the library, but the playlists can&#39;t be selected. I think this is caused by a workaround I previously had to put in place for stuff that iTunes Match mismatched (e.g. mono tracks from remastered Beatles albums that iTunes Match replaced with the stereo versions), but I have to stop somewhere. That can be a problem for another day.</p>

<p>Ironically, the non-Apple media server software I use for TV and movies (<a href="https://emby.media">Emby</a>) worked perfectly once I copied the old configuration directory over, recognizing all the local media directories I&#39;d previously configured. It&#39;s just the Apple software that didn&#39;t work right the first time. There&#39;s probably a lesson in there somewhere.</p>

<hr>

<p>I don&#39;t have comments on here, but if you want to respond to this post, I&#39;m on the fedi as <a href="https://distraction.party/fedward">fedward@distraction.party</a>.</p>
]]></content:encoded>
      <guid>https://discontent.fedward.org/i-hate-computers</guid>
      <pubDate>Sun, 03 Dec 2023 21:39:22 +0000</pubDate>
    </item>
  </channel>
</rss>