<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Blåhaj Pen Reader</title>
    <link>https://pen.blahaj.zone</link>
    <description>Read the latest posts from Blåhaj Pen.</description>
    <pubDate>Fri, 12 Jun 2026 22:42:26 +0000</pubDate>
    <item>
      <title>To Who Farted At Our Backrooms Theater</title>
      <link>https://pen.blahaj.zone/foxfire/to-who-farted-at-our-backrooms-theater</link>
      <description>&lt;![CDATA[Thank you for inadvertently personalizing the experience of our entire audience, at perhaps the best possible moment in the film to pull it off. The noble sacrifice of your dignity—and presumably many future nights laying awake about it—was worth the cost of admission all on its own. Your flatulence single-handedly elevated the cinema of over a hundred individuals, and I hope that you can look back on your mishap with a smile someday soon. However, I&#39;m getting ahead of myself. Let&#39;s set the scene for my dear readers!!--more--&#xA;&#xA;The Backrooms is a slow building psychological horror, and by this part in the film, tensions are beginning to rise for our characters. We&#39;re met with the aftermath of a nightmare, and a shaken person moving quietly down a dark hallway. Our audience is quiet, suspense is high, and the mood is merely bracing for what&#39;s next. Enter our gaseous compatriot, who was likely under the assumption they could let out a tapered fart without disturbing anyone. Alas, perhaps at the quietest and darkest the theater has been, their cheeks ripple through the room—cutting the cheese and tension simultaneously.&#xA;&#xA;I can only imagine the face you must&#39;ve had when someone damn near the opposite end of the room belted out &#34;dude, someone just farted,&#34; and having the entire room fall to hysterics for what felt like nearly a minute. Then, as the laughing grew choked and began to wane, the audience decided to break out into applause for the deed. I&#39;m not sure who it was that started it, but it was devilishly funny; so funny that it spread like wildfire—it was an ovation! I can earnestly say that this was both louder and longer than the applause at the credits of the movie. I was holding back tears of laughter while clapping along. &#xA;&#xA;Then, as we all finally settle back to Earth—and realize there&#39;s a movie we kind of wanted to watch—we get one more cherry on top of the whole ordeal. From the same corner the fart came from, someone lets out a hushed &#34;aw dude, it stinks.&#34; I hope you could still view the film from however far back you must&#39;ve sunk into your chair, after dealing with all of that. Take pride in your contribution to the score of The Backrooms. Frankly, I think you deserve an entry in the credits for your performance; your timing and audio production were top-notch. ]]&gt;</description>
      <content:encoded><![CDATA[<p>Thank you for inadvertently personalizing the experience of our entire audience, at perhaps the best possible moment in the film to pull it off. The noble sacrifice of your dignity—and presumably many future nights laying awake about it—was worth the cost of admission all on its own. Your flatulence single-handedly elevated the cinema of over a hundred individuals, and I hope that you can look back on your mishap with a smile someday soon. However, I&#39;m getting ahead of myself. Let&#39;s set the scene for my dear readers!</p>

<p>The Backrooms is a slow building psychological horror, and by this part in the film, tensions are beginning to rise for our characters. We&#39;re met with the aftermath of a nightmare, and a shaken person moving quietly down a dark hallway. Our audience is quiet, suspense is high, and the mood is merely bracing for what&#39;s next. Enter our gaseous compatriot, who was likely under the assumption they could let out a tapered fart without disturbing anyone. Alas, perhaps at the quietest and darkest the theater has been, their cheeks ripple through the room—cutting the cheese and tension simultaneously.</p>

<p>I can only imagine the face you must&#39;ve had when someone damn near the opposite end of the room belted out “dude, someone just farted,” and having the entire room fall to hysterics for what felt like nearly a minute. Then, as the laughing grew choked and began to wane, the audience decided to break out into applause for the deed. I&#39;m not sure who it was that started it, but it was devilishly funny; so funny that it spread like wildfire—it was an <em>ovation!</em> I can earnestly say that this was both louder <em>and</em> longer than the applause at the credits of the movie. I was holding back tears of laughter while clapping along.</p>

<p>Then, as we all finally settle back to Earth—and realize there&#39;s a movie we kind of wanted to watch—we get one more cherry on top of the whole ordeal. From the same corner the fart came from, someone lets out a hushed “aw dude, it stinks.” I hope you could still view the film from however far back you must&#39;ve sunk into your chair, after dealing with all of that. Take pride in your contribution to the score of The Backrooms. Frankly, I think you deserve an entry in the credits for your performance; your timing and audio production were top-notch.</p>
]]></content:encoded>
      <author>Foxfire</author>
      <guid>https://pen.blahaj.zone/read/a/chz0p70qhx</guid>
      <pubDate>Sat, 30 May 2026 22:14:01 +0000</pubDate>
    </item>
    <item>
      <title>Observation and Documentation</title>
      <link>https://pen.blahaj.zone/the-gnu-linux-diary/observation-and-documentation</link>
      <description>&lt;![CDATA[An excerpt from my my diary, from the 20th of February, 2024.&#xA;&#xA;Hey, did you know this environment has a recent files folder, and that it’s cross compatible with literally all apps on the system? Super cool, except I guess anything amorous will also appear there too. Whatever, this is free software after all. I’m not exactly beaming this info to John Microsoft anymore. I suppose I don’t mind catching a glimpse of a picture or two while opening a file, if I choose to go to the recent tab; it’s my machine, and only I use it. Speaking of using my machine, I haven’t exactly been using LibreOffice like I had intended to. Let’s get caught up with my mood calendar in Calc, and then maybe start a new project in Writer. I figure it’s been about a week now, so let’s start writing down some of the stuff I’ve been doing in my new GNU/Linux system, with all the ups and downs of my adventure.!--more--&#xA;&#xA;I imagine that will be fun, and also give me some added reason to be active in using the system, as opposed to purely watching videos and visiting other websites. I have to say, LibreOffice is a little off within Windows, not in the sense that it’s unusable, but just that some GUI elements don’t work as you’d expect, or don’t look quite right.  No problem if you leave it on light mode and don’t try to scroll the default text format, but...yeah. On GNU/Linux—presumably its real home—it’s more responsive, everything works exactly as expected, and dark mode looks lovely! This is an excellent collection of tools which I’ve been, and will continue to use frequently for all of my needs. I wrote my first entry today, but it is likely going to be the biggest one, so I’d consider that a good success! ]]&gt;</description>
      <content:encoded><![CDATA[<p><em>An excerpt from my my diary, from the 20th of February, 2024.</em></p>

<p>Hey, did you know this environment has a recent files folder, and that it’s cross compatible with literally all apps on the system? Super cool, except I guess anything amorous will also appear there too. Whatever, this is free software after all. I’m not exactly beaming this info to John Microsoft anymore. I suppose I don’t mind catching a glimpse of a picture or two while opening a file, if I choose to go to the recent tab; it’s my machine, and only I use it. Speaking of using my machine, I haven’t exactly been using LibreOffice like I had intended to. Let’s get caught up with my mood calendar in Calc, and then maybe start a new project in Writer. I figure it’s been about a week now, so let’s start writing down some of the stuff I’ve been doing in my new GNU/Linux system, with all the ups and downs of my adventure.</p>

<p>I imagine that will be fun, and also give me some added reason to be active in using the system, as opposed to purely watching videos and visiting other websites. I have to say, LibreOffice is a little off within Windows, not in the sense that it’s unusable, but just that some GUI elements don’t work as you’d expect, or don’t look quite right.  No problem if you leave it on light mode and don’t try to scroll the default text format, but...yeah. On GNU/Linux—presumably its real home—it’s more responsive, everything works exactly as expected, and dark mode looks lovely! This is an excellent collection of tools which I’ve been, and will continue to use frequently for all of my needs. I wrote my <a href="https://pen.blahaj.zone/the-gnu-linux-diary/the-plunge" rel="nofollow">first entry</a> today, but it is likely going to be the biggest one, so I’d consider that a good success!</p>
]]></content:encoded>
      <author>The GNU/Linux Diary</author>
      <guid>https://pen.blahaj.zone/read/a/3ctltkrkt2</guid>
      <pubDate>Fri, 29 May 2026 01:02:17 +0000</pubDate>
    </item>
    <item>
      <title>Steam Rises</title>
      <link>https://pen.blahaj.zone/the-gnu-linux-diary/steam-rises</link>
      <description>&lt;![CDATA[An excerpt from my my diary, from the 18th of February, 2024.&#xA;&#xA;Be me, hear about how Steam is revolutionizing the availability of playable games on the GNU/Linux platform, install Steam. I figure getting the proper .deb over the Flatpak makes more sense, given all of my stuff is on an external drive, and maybe it would need to break sand-boxing in other ways to do emulation? I’m not sure, but may as well go for it just in case. Steam installs easy enough, and I check off a setting to utilize Proton experimental. However, literally just enabling this was a huge problem. You might think it’d just download and install, but actually no; it kept stalling in a manner which was literally unable to progress. I couldn’t uninstall it, couldn’t reset—couldn’t do anything at all. I tried killing Steam several times, but it just hung instantly on the install process at 56% when reloading. Tried clearing the cache and restarting; it retries and then fails to install, hanging at 56% again.!--more--&#xA;&#xA;Okay great, isn’t installation pretty much just moving these files around anyway? It’s not as if it’s registry entries on Windows after all, so maybe I can just move whatever it’s frozen on? I figure out the Steam download directory and the correct ID—hardly difficult as it’s the only folder there—move everything, clear cache, kill Steam, and restart it. At this point I’m just begging for this thing to work. Steam starts up, it restarts everything, my face sinks, but then it fully installs. Thank heavens, it finally got itself working! Alright, maybe let’s try some random games...all of them fail for different reasons. Maybe I need to fully re-download them or something; these are directly off of my Windows install, after all. But whatever, let’s try some obvious stuff, like games made by Steam. Portal runs fine, Half Life too. Gary’s Mod? Yup, works. I’ll probably have to comb through it more, and figure out what does and doesn’t work at some point, but at least the program is installed and ready to be tinkered with, I guess. &#x9;&#xA;&#xA;Okay, how about a second Hail Mary since the first one worked: what about Steam VR? I’ve heard VR is an absolute nightmare to get working—and I’m not particularly big on VR anyway—but I have some hardware to try, so let’s see if anything works. I install it, run it, plug in my Vive Cosmos, and it’s sort of in limbo with missing drivers. Okay great, let’s get those drivers! Oh wait, just kidding, there are no drivers for GNU/Linux! Only thing that even came close was something called OpenHMD, which is a FOSS project with extremely limited functionality from several years ago, according to GitHub. Official Ubuntu site linked says...2016 release? I’ll probably have to come back to this. Also, I’ve got a fun new error here. Closing Steam VR leaves some remnant window with an unknown process I can’t terminate. Wonderful, guess I’ll have to restart if I want that black window box gone; thankfully it takes literal seconds to reboot Pop!_OS. Figure I may as well try my old headset too, my first gen Oculus before it got bought out by Meta. That doesn’t even get detected as missing drivers, it’s just nothing. Ah well, VR is not a deal breaker. &#xA;&#xA;Perhaps I should take a break and look at some art, maybe save some stuff to—wait. I can’t drag and drop in my operating system‽ I haven’t made any sort of modifications to my browser or file browsing environment, so I find it extremely unlikely this is on me. Apparently I’m not the only one with this issue, but it seems to come down to the current desktop environment, which I’d have to modify in order to resolve. Kind of annoying, and I don’t really want to modify the system much, as I am still very new to it in general. I can still save images just fine, so I suppose I can spare the several extra seconds of detour for now. Hopefully an update will resolve this in the future, and maybe I could reach out on proper channels about it if it persists. ]]&gt;</description>
      <content:encoded><![CDATA[<p><em>An excerpt from my my diary, from the 18th of February, 2024.</em></p>

<p>Be me, hear about how Steam is revolutionizing the availability of playable games on the GNU/Linux platform, install Steam. I figure getting the proper .deb over the Flatpak makes more sense, given all of my stuff is on an external drive, and maybe it would need to break sand-boxing in other ways to do emulation? I’m not sure, but may as well go for it just in case. Steam installs easy enough, and I check off a setting to utilize Proton experimental. However, literally just enabling this was a huge problem. You might think it’d just download and install, but actually no; it kept stalling in a manner which was literally unable to progress. I couldn’t uninstall it, couldn’t reset—couldn’t do anything at all. I tried killing Steam several times, but it just hung instantly on the install process at 56% when reloading. Tried clearing the cache and restarting; it retries and then fails to install, hanging at 56% again.</p>

<p>Okay great, isn’t installation pretty much just moving these files around anyway? It’s not as if it’s registry entries on Windows after all, so maybe I can just move whatever it’s frozen on? I figure out the Steam download directory and the correct ID—hardly difficult as it’s the only folder there—move everything, clear cache, kill Steam, and restart it. At this point I’m just begging for this thing to work. Steam starts up, it restarts everything, my face sinks, but then it fully installs. Thank heavens, it finally got itself working! Alright, maybe let’s try some random games...all of them fail for different reasons. Maybe I need to fully re-download them or something; these are directly off of my Windows install, after all. But whatever, let’s try some obvious stuff, like games made <em>by</em> Steam. Portal runs fine, Half Life too. Gary’s Mod? Yup, works. I’ll probably have to comb through it more, and figure out what does and doesn’t work at some point, but at least the program is installed and ready to be tinkered with, I guess.</p>

<p>Okay, how about a second Hail Mary since the first one worked: what about Steam VR? I’ve heard VR is an absolute nightmare to get working—and I’m not particularly big on VR anyway—but I have some hardware to try, so let’s see if anything works. I install it, run it, plug in my Vive Cosmos, and it’s sort of in limbo with missing drivers. Okay great, let’s get those drivers! Oh wait, just kidding, there are no drivers for GNU/Linux! Only thing that even came close was something called <a href="https://github.com/OpenHMD/OpenHMD" rel="nofollow">OpenHMD</a>, which is a FOSS project with extremely limited functionality from several years ago, according to GitHub. Official Ubuntu site linked says...2016 release? I’ll probably have to come back to this. Also, I’ve got a fun new error here. Closing Steam VR leaves some remnant window with an unknown process I can’t terminate. Wonderful, guess I’ll have to restart if I want that black window box gone; thankfully it takes literal seconds to reboot Pop!_OS. Figure I may as well try my old headset too, my first gen Oculus before it got bought out by Meta. That doesn’t even get detected as missing drivers, it’s just nothing. Ah well, VR is not a deal breaker.</p>

<p>Perhaps I should take a break and look at some art, maybe save some stuff to—wait. I can’t <em>drag and drop</em> in my operating system‽ I haven’t made any sort of modifications to my browser or file browsing environment, so I find it extremely unlikely this is on me. Apparently I’m not the only one with this issue, but it seems to come down to the current desktop environment, which I’d have to modify in order to resolve. Kind of annoying, and I don’t really want to modify the system much, as I am still very new to it in general. I can still save images just fine, so I suppose I can spare the several extra seconds of detour for now. Hopefully an update will resolve this in the future, and maybe I could reach out on proper channels about it if it persists.</p>
]]></content:encoded>
      <author>The GNU/Linux Diary</author>
      <guid>https://pen.blahaj.zone/read/a/difzzcz4xz</guid>
      <pubDate>Sat, 16 May 2026 17:45:04 +0000</pubDate>
    </item>
    <item>
      <title>Resurrecting E-waste With Q4OS</title>
      <link>https://pen.blahaj.zone/foxfire/resurrecting-e-waste-with-q4os</link>
      <description>&lt;![CDATA[Towards the end of last year, I was requested to get some data off of an old computer for a relative. It was an HP from the late 2000s, and time had clearly not been kind to the device. Either that, or it was an economy class tower, which even back in the day would&#39;ve been sluggish to use. What I can tell you is that it took several minutes to fully load into its Windows 7 installation. Its strained hobbling to the finish line left me with a desktop that—even with performance optimizations I went through—was just barely tolerable to navigate with. I had my fun using a classic exploit to bypass the login with a burned Windows 7 DVD I hadn&#39;t used in over 15 years, absconded with the important data, and left the PC to collect dust. Recently however, a bout of spring cleaning gave me a thought: could it run a current GNU/Linux system?!--more--&#xA;&#xA;I had to use that DVD, because this device is old enough that the BIOS doesn&#39;t have the capacity to boot from a USB stick. If there&#39;s any hope that this can be usable in 2026, I want to find out! With that being said, I set off to work seeing if there was anything even remotely lightweight enough to attempt at all. To my surprise, I was quickly able to find a few options, but the one I ultimately decided upon was Q4OS. I figured a Debian based i386 system, with very minimal packages, and a desktop environment forked from a early 2000&#39;s KDE project would be about as good of a shot as I was going to get. &#xA;&#xA;While I was burning myself a nice DVD of that on my other computer, I was also thinking about what other problems could be hammering this at-risk doorstop. I ended up making a short itinerary which might address some of the speed issues:&#xA;&#xA;A thorough dust cleaning.&#xA;Replacing the HDD with an SSD.&#xA;Removing and reapplying CPU thermal paste.&#xA;&#xA;Surprisingly, the device was rather clean when I opened it! I still had dust to clean—particularly from the fans—but compared to what I was expecting, I was fairly shocked. Perhaps it&#39;s been sealed in a box for a long time, but who knows. What I do know is that I can easily fish out one of the tiny SSDs from my assortment of computer parts. I was actually a little concerned I wouldn&#39;t be able to use the connections for more &#34;modern&#34; 2.5&#34; and 3.5&#34; drives, but thankfully that wasn&#39;t an issue. It just slipped right in, and I just let it stick out haphazardly of the drive bay, since it has no support for a 2.5&#34; drive. Not like it has any moving parts anyway, what could possibly go wrong?&#xA;&#xA;The final bit I figured was the most important—assuming there was any easy fixes left—as poor thermals on a CPU can bottleneck it severely. After taking off the thermal block, I was greeted with a lovely patch of what was effectively dust on the core and the thermal block. I gave that baby a nice alcohol swab, and threw on some fancy expensive thermal paste. It was just gathering dust after my last cooling system replacement anyway, so why not get a little fancy with it I suppose. I closed the cleaned up fossil, grabbed my freshly minted Q4OS DVD, and hope things work according to plan.&#xA;&#xA;Photograph of a computer motherboard, focused on the CPU cooling fan. It has a small bottle of thermal paste on top of it.&#xA;&#xA;  &#34;All pasted up!&#34;&#xA;&#xA;The PC thankfully POSTs as expected, and I&#39;m able to load the DVD pretty quickly! Everything installs to the SSD, and before I know it, I&#39;m able to check out the system on my device. First of all, I cannot stress how fast this boot is in comparison to what it was before. I went from the better part of 10 minutes to get to the desktop on Windows 7, to 25 seconds from power on to desktop. It&#39;s not the speeds of a modern M.2 or anything, but for a current GNU/Linux distribution on a budget device from almost 20 years ago—it&#39;s incredible. Not only that, but it&#39;s responsive too, with Trinity showing little signs of sluggishness moving windows or navigating the system at all. &#xA;&#xA;Photograph of a cell phone in front of a computer monitor, it has a timer which has 25.83 seconds on it. It&#39;s timing the boot of the device.&#xA;&#xA;  &#34;Certified speed demon.&#34;&#xA;&#xA;But, okay, the base environment works well; applications need to work also. I don&#39;t expect this thing to be a workhorse, but I would need it to run a modern browser, and perhaps some other local applications. Surprisingly, it does pull this off! I wrote something in LibreOffice Writer, I navigated a number of sites and watched PeerTube videos in Chromium (sadly Firefox had issues), listened to music, and even opened my KeePass file! The last one was funny, as it really showcased how slow this device is. My decryption is based on one second of CPU load for my computer from 2016, and it takes this device 45 seconds to open it—almost twice the boot time!&#xA;&#xA;The only major issue I noticed was that 1080p 60 FPS videos glitch out on VLC. Given that the load of even 720p videos is nearly 60% of my CPU, I assume this is some sort of hardware limitation, or perhaps something to do with codecs? Not interested in installing anything proprietary though, and perhaps it&#39;s just not available for this flavor of effectively very old device cut back Debian. It&#39;s not even the most recent Debian base I should add, just a still supported one for the next couple of years. In the end though, I&#39;ve proven that this old PC didn&#39;t have to be a paperweight at all; it&#39;s perfectly capable of running modern software. I&#39;m impressed, and a bit emboldened to see what other old computers are out there I could breathe life back into. I&#39;m actually writing this blog entry on the late 2000s PC while watching a PeerTube art stream in another tab.&#xA;&#xA;I feel like I should use this PC for something more, but I&#39;m not quite sure just what yet. Only time will tell, but I&#39;ll keep putting mileage into it, and see where the wind takes me.&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Towards the end of last year, I was requested to get some data off of an old computer for a relative. It was an HP from the late 2000s, and time had clearly not been kind to the device. Either that, or it was an economy class tower, which even back in the day would&#39;ve been sluggish to use. What I can tell you is that it took several <strong>minutes</strong> to fully load into its Windows 7 installation. Its strained hobbling to the finish line left me with a desktop that—even with performance optimizations I went through—was just barely tolerable to navigate with. I had my fun using a classic exploit to bypass the login with a burned Windows 7 DVD I hadn&#39;t used in over 15 years, absconded with the important data, and left the PC to collect dust. Recently however, a bout of spring cleaning gave me a thought: could it run a <em>current</em> GNU/Linux system?</p>

<p>I had to use that DVD, because this device is old enough that the BIOS doesn&#39;t have the capacity to boot from a USB stick. If there&#39;s any hope that this can be usable in 2026, I want to find out! With that being said, I set off to work seeing if there was anything even remotely lightweight enough to attempt at all. To my surprise, I was quickly able to find a few options, but the one I ultimately decided upon was <a href="https://www.q4os.org/" rel="nofollow">Q4OS</a>. I figured a Debian based i386 system, with very minimal packages, and a <a href="https://www.trinitydesktop.org/" rel="nofollow">desktop environment</a> forked from a early 2000&#39;s KDE project would be about as good of a shot as I was going to get.</p>

<p>While I was burning myself a nice DVD of that on my other computer, I was also thinking about what other problems could be hammering this at-risk doorstop. I ended up making a short itinerary which might address some of the speed issues:</p>
<ul><li>A thorough dust cleaning.</li>
<li>Replacing the HDD with an SSD.</li>
<li>Removing and reapplying CPU thermal paste.</li></ul>

<p>Surprisingly, the device was rather clean when I opened it! I still had dust to clean—particularly from the fans—but compared to what I was expecting, I was fairly shocked. Perhaps it&#39;s been sealed in a box for a long time, but who knows. What I <em>do</em> know is that I can easily fish out one of the tiny SSDs from my assortment of computer parts. I was actually a little concerned I wouldn&#39;t be able to use the connections for more “modern” 2.5” and 3.5” drives, but thankfully that wasn&#39;t an issue. It just slipped right in, and I just let it stick out haphazardly of the drive bay, since it has no support for a 2.5” drive. Not like it has any moving parts anyway, what could <em>possibly</em> go wrong?</p>

<p>The final bit I figured was the most important—assuming there was any easy fixes left—as poor thermals on a CPU can bottleneck it severely. After taking off the thermal block, I was greeted with a lovely patch of what was effectively dust on the core and the thermal block. I gave that baby a nice alcohol swab, and threw on some fancy expensive thermal paste. It was just gathering dust after my last cooling system replacement anyway, so why not get a little fancy with it I suppose. I closed the cleaned up fossil, grabbed my freshly minted Q4OS DVD, and hope things work according to plan.</p>

<p><img src="https://furries.club/system/media_attachments/files/116/553/469/217/053/870/original/01d0dacef9e508de.jpg" alt="Photograph of a computer motherboard, focused on the CPU cooling fan. It has a small bottle of thermal paste on top of it."></p>

<blockquote><p>“All pasted up!”</p></blockquote>

<p>The PC thankfully POSTs as expected, and I&#39;m able to load the DVD pretty quickly! Everything installs to the SSD, and before I know it, I&#39;m able to check out the system on my device. First of all, I cannot stress how fast this boot is in comparison to what it was before. I went from the better part of 10 minutes to get to the desktop on Windows 7, to <strong>25 seconds</strong> from power on to desktop. It&#39;s not the speeds of a modern M.2 or anything, but for a current GNU/Linux distribution on a budget device from almost 20 years ago—it&#39;s incredible. Not only that, but it&#39;s responsive too, with Trinity showing little signs of sluggishness moving windows or navigating the system at all.</p>

<p><img src="https://furries.club/system/media_attachments/files/116/553/469/459/717/864/original/7ee300aaca5b3053.jpg" alt="Photograph of a cell phone in front of a computer monitor, it has a timer which has 25.83 seconds on it. It&#39;s timing the boot of the device."></p>

<blockquote><p>“Certified speed demon.”</p></blockquote>

<p>But, okay, the base environment works well; applications need to work also. I don&#39;t expect this thing to be a workhorse, but I would need it to run a modern browser, and perhaps some other local applications. Surprisingly, it does pull this off! I wrote something in LibreOffice Writer, I navigated a number of sites and watched PeerTube videos in Chromium (sadly Firefox had issues), listened to music, and even opened my KeePass file! The last one was funny, as it really showcased how slow this device is. My decryption is based on one second of CPU load for my computer from <em>2016</em>, and it takes this device <strong>45 seconds</strong> to open it—almost twice the boot time!</p>

<p>The only major issue I noticed was that 1080p 60 FPS videos glitch out on VLC. Given that the load of even 720p videos is nearly 60% of my CPU, I assume this is some sort of hardware limitation, or perhaps something to do with codecs? Not interested in installing anything proprietary though, and perhaps it&#39;s just not available for this flavor of effectively very old device cut back Debian. It&#39;s not even the most recent Debian base I should add, just a still supported one for the next couple of years. In the end though, I&#39;ve proven that this old PC didn&#39;t have to be a paperweight at all; it&#39;s perfectly capable of running modern software. I&#39;m impressed, and a bit emboldened to see what other old computers are out there I could breathe life back into. I&#39;m actually writing this blog entry on the late 2000s PC while watching a PeerTube art stream in another tab.</p>

<p>I feel like I should use this PC for something more, but I&#39;m not quite sure just what yet. Only time will tell, but I&#39;ll keep putting mileage into it, and see where the wind takes me.</p>
]]></content:encoded>
      <author>Foxfire</author>
      <guid>https://pen.blahaj.zone/read/a/vj0wcbqeqz</guid>
      <pubDate>Sun, 10 May 2026 23:42:33 +0000</pubDate>
    </item>
    <item>
      <title>Artistic Endeavors</title>
      <link>https://pen.blahaj.zone/the-gnu-linux-diary/artistic-endeavors</link>
      <description>&lt;![CDATA[An excerpt from my my diary, from the 18th of February, 2024.&#xA;&#xA;I’ve been putting it off too long, perhaps because it concerns me a fair bit. I need to be able to use my tablet, in order for this to be even remotely viable long term. Digital art is basically my only hobby at this point; without my tablet functioning, this whole project is going to come crashing down. The one thing I believe I have going for me, is that it’s an old Huion device with no screen; an incredibly basic tablet with only a few buttons and a drawing area. While rummaging through the settings, I noticed that there’s an entire segment dedicated to Wacom tablet configuration. I’m assuming this isn’t literally only for Wacom, but maybe it’s specific drivers which also have generic support as well? Fingers crossed tight...let’s plug my tablet in!!--more-- Thank god, it’s registered right out of the box, though with no keys assigned. No worries there, this is extremely configurable! I open Krita, get the shortcuts, assign the keys, and set the draw area to a single monitor of my choice! No extra proprietary software needed, like I had on Windows for Huion, and I’m good to go! I didn’t see soft button support—the areas at the top of the drawing area which could be tapped—but I always had those disabled, as they were both finicky and a nuisance to me anyway.&#xA;&#xA;Now that I’ve got my tablet configured, I suppose the best way to test it would be to start making an artistic project in Krita. Nothing wild, just a sketch to get my bearings, and ensure things feel as I’d expect. I settle on drawing my sona doing something silly and evil, which ended up being Foxfire running away with an over-sized bag of money. I find a pretty convincing looking pencil brush and get to it; things are feeling pretty great! I can absolutely see myself being able to use this for artistic projects in the future, this is right on point with what I was expecting. Not really sure what else to add, but things just worked well, and I listened to some tunes while doing it too. Ended up adding a cute phrase next to the sketch that says “be gay, do crime.” I think that summarizes my idea perfectly.&#xA;&#xA;A pencil styled digital sketch of an anthro fox, Foxfire. He has slanted eyes which complete an evil smile, carrying an oversized bag with a dollar sign on it. He&#39;s wearing a striped shirt, akin to old cartoon and film prisoners, and he&#39;s running away from somewhere unseen. There is no background, but there is text to the left of him which reads: BE GAY, DO CRIME.&#xA;&#xA;  &#34;Absconding with funds.&#34;]]&gt;</description>
      <content:encoded><![CDATA[<p><em>An excerpt from my my diary, from the 18th of February, 2024.</em></p>

<p>I’ve been putting it off too long, perhaps because it concerns me a fair bit. I need to be able to use my tablet, in order for this to be even remotely viable long term. Digital art is basically my <em>only</em> hobby at this point; without my tablet functioning, this whole project is going to come crashing down. The one thing I believe I have going for me, is that it’s an old Huion device with no screen; an incredibly basic tablet with only a few buttons and a drawing area. While rummaging through the settings, I noticed that there’s an entire segment dedicated to Wacom tablet configuration. I’m assuming this isn’t literally only for Wacom, but maybe it’s specific drivers which also have generic support as well? Fingers crossed tight...let’s plug my tablet in! Thank god, it’s registered right out of the box, though with no keys assigned. No worries there, this is extremely configurable! I open Krita, get the shortcuts, assign the keys, and set the draw area to a single monitor of my choice! No extra proprietary software needed, like I had on Windows for Huion, and I’m good to go! I didn’t see soft button support—the areas at the top of the drawing area which could be tapped—but I always had those disabled, as they were both finicky and a nuisance to me anyway.</p>

<p>Now that I’ve got my tablet configured, I suppose the best way to test it would be to start making an artistic project in Krita. Nothing wild, just a sketch to get my bearings, and ensure things feel as I’d expect. I settle on drawing my sona doing something silly and evil, which ended up being Foxfire running away with an over-sized bag of money. I find a pretty convincing looking pencil brush and get to it; things are feeling pretty great! I can absolutely see myself being able to use this for artistic projects in the future, this is right on point with what I was expecting. Not really sure what else to add, but things just worked well, and I listened to some tunes while doing it too. Ended up adding a cute phrase next to the sketch that says “be gay, do crime.” I think that summarizes my idea perfectly.</p>

<p><img src="https://pawb.fun/system/media_attachments/files/111/957/823/622/936/047/original/a1cf9221614fcb49.png" alt="A pencil styled digital sketch of an anthro fox, Foxfire. He has slanted eyes which complete an evil smile, carrying an oversized bag with a dollar sign on it. He&#39;s wearing a striped shirt, akin to old cartoon and film prisoners, and he&#39;s running away from somewhere unseen. There is no background, but there is text to the left of him which reads: BE GAY, DO CRIME."></p>

<blockquote><p>“Absconding with funds.”</p></blockquote>
]]></content:encoded>
      <author>The GNU/Linux Diary</author>
      <guid>https://pen.blahaj.zone/read/a/8rk90867ri</guid>
      <pubDate>Sun, 10 May 2026 13:36:38 +0000</pubDate>
    </item>
    <item>
      <title>Designing Dragon Stickers</title>
      <link>https://pen.blahaj.zone/reilyhh/designing-dragon-stickers</link>
      <description>&lt;![CDATA[I fucking love dragons. I wanted to use Volpeon&#39;s dragon emojis but they didn&#39;t feel personal enough.&#xA;&#xA;And, I&#39;ve played a lot with dragon builders and creators, and after creating another dragon in the great and awesome Dragon Builder by MonsterDungeonSoup, I finally had enough inspiration to cobble together... This!&#xA;&#xA;Older Versions and Improvements&#xA;&#xA;How do you put lipstick on a dragon&#39;s mouth? Well I followed this awesome drawing searched for &#34;dragon&#34; and &#34;lipstick&#34; then clicked the sexiest dragon I first saw :3c&#xA;&#xA;I&#39;m dragon, rawwwr&#xA;&#xA;pfp.png&#xA;&#xA;The last one was named Jenny, this one will be named, emm Juliane! Juliane comes from Julius which has an origin to Jule, Jupiter, god of the whatever. I like Jupiter, cool planet. So I made a couple of stickers:&#xA;&#xA;juliane-stickers.png&#xA;&#xA;And here are Jenny&#39;s stickers. As you can see, they are variations form the dragon builder I mentioned above. I also tweaked it a bit in GIMP to add mouths. &#xA;&#xA;jenny-stickers.png&#xA;&#xA;and these were before the ones above, made in Dragon Creator on itch.io by dragonita and tweaked heavily in GIMP:&#xA;&#xA;jenny-dragon-creator-1.png&#xA;jenny-dragon-creator-2.png&#xA;&#xA;In Conclusion&#xA;&#xA;My point is, do whatever you have to do to express yourself! Roleplay as characters, steal OCs (but never claim their art as your own lol), crop images, smish smash them in an unholy frankestein-eqsue sticker creation! Until you get bored enough and make your own stickers! Or get really good at character creation and image manipulation!&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>I fucking love dragons. I wanted to use <a href="https://volpeon.ink/emojis/drgn/" rel="nofollow">Volpeon&#39;s</a> dragon emojis but they didn&#39;t feel personal enough.</p>

<p>And, I&#39;ve played a lot with dragon builders and creators, and after creating another dragon in the great and awesome <a href="https://www.monsterbrainsoup.com/dragon-builder/" rel="nofollow">Dragon Builder by MonsterDungeonSoup</a>, I finally had enough inspiration to cobble together... This!</p>

<h2 id="older-versions-and-improvements">Older Versions and Improvements</h2>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/29/2026/04/3a912e90-aabb-44.png" alt=""></p>

<p>How do you put lipstick on a dragon&#39;s mouth? Well I followed this <a href="https://e926.net/posts/5848036?q=dragon+lipstick" rel="nofollow">awesome drawing</a> searched for “dragon” and “lipstick” then clicked the sexiest dragon I first saw :3c</p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/29/2026/04/e64456cc-7d5d-4d.png" alt=""></p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/29/2026/04/29e26094-ef82-45.png" alt=""></p>

<h2 id="i-m-dragon-rawwwr">I&#39;m dragon, rawwwr</h2>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/29/2026/04/c6d536e0-d163-46.png" alt="pfp.png"></p>

<p>The last one was named Jenny, this one will be named, emm Juliane! Juliane comes from Julius which has an origin to Jule, Jupiter, god of the whatever. I like Jupiter, cool planet. So I made a couple of stickers:</p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/29/2026/04/05addce3-5269-4a.png" alt="juliane-stickers.png"></p>

<p>And here are Jenny&#39;s stickers. As you can see, they are variations form the dragon builder I mentioned above. I also tweaked it a bit in GIMP to add mouths.</p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/29/2026/04/3d371c37-ccde-48.png" alt="jenny-stickers.png"></p>

<p>and these were before the ones above, made in <a href="https://dragonita.itch.io/dragon-creator" rel="nofollow">Dragon Creator on itch.io by dragonita</a> and tweaked heavily in GIMP:</p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/29/2026/04/64de7378-c8b3-43.png" alt="jenny-dragon-creator-1.png">
<img src="https://l8b5.c11.e2-2.dev/writemedia/29/2026/04/7bf0413d-b6d8-48.png" alt="jenny-dragon-creator-2.png"></p>

<h2 id="in-conclusion">In Conclusion</h2>

<p>My point is, do whatever you have to do to express yourself! Roleplay as characters, steal OCs (but never claim their art as your own lol), crop images, smish smash them in an unholy frankestein-eqsue sticker creation! Until you get bored enough and make your own stickers! Or get really good at character creation and image manipulation!</p>
]]></content:encoded>
      <author>reilyh</author>
      <guid>https://pen.blahaj.zone/read/a/m9k7keuwdw</guid>
      <pubDate>Thu, 30 Apr 2026 20:32:48 +0000</pubDate>
    </item>
    <item>
      <title>Wholesome News: Ducking Rescue </title>
      <link>https://pen.blahaj.zone/foxfire/wholesome-news-ducking-rescue</link>
      <description>&lt;![CDATA[Every so often, I&#39;ll stumble across a simple, feel-good story about an animal being rescued by some folks, after getting caught in some sort of predicament. Often times, it&#39;s unfortunate interactions with human infrastructure—and this is no different—but I can still appreciate that some of us care enough to give aid when the need arises. After all these years, I&#39;ve finally had my own personal experience with a rescue, so I feel obligated to share the story here.!--more--&#xA;&#xA;Let&#39;s set the scene. It&#39;s the early morning, and a mother duck is taking a stroll across a stretch of pavement. She reaches a storm drain, and her large waders give her no trouble, as she waddles across the holes with ease. Unbeknownst to her however, the dozen ducklings she had in tow are having a lot more trouble navigating the obstacle; in fact, all of them slip right into the water a few feet below! They&#39;re all unharmed, but the chicks are too young to fly, and the mother is too large to retrieve them. Not being willing to abandon her babies, she stands outside the storm drain, and the quacking commotion catches the attention of some customers and employees. &#xA;&#xA;This is where I finally am made aware of the situation by a rather distressed employee, who mentions what&#39;s happening and wants to save them. They weren&#39;t able to leave their post, and since there wasn&#39;t anyone else around, I suppose they thought it best to ask me if I could flag down the fire department when they arrived. I hadn&#39;t yet seen the duck, but you better believe I went right out there, and waited the several minutes it took to wave my hands, and get them up to speed with the info I had. I wasn&#39;t even the only person waiting, as a couple folks were already nearby—perhaps a little too close—to our rather stressed mom, and her crying babies. Thankfully, I think they were just concerned and curious, as letting them know the situation, and asking to give her some breathing room, was enough to keep things in check until the fire truck pulled up.&#xA;&#xA;I was interested to see how they intended to save the ducklings, but it seems as if, like birds of their own, they decided to wing it. The only thing that was certain, was removing the grate from the storm drain. Now I&#39;ve seen city workers do this before, where they&#39;ll use a special metal bar to levy the grate upward, and then shimmy the thing to the side if necessary for access. This is not what the fire department did; I couldn&#39;t even tell you if the guys had the tool on board. One of the bigger gentleman simply grabbed the large metal grate with his bare hands, lifted that thing straight up, and placed it off to the side. I wasn&#39;t sure it&#39;d even come off without a special prying tool, but I guess all you really need is brute strength! To quote one of the other firemen, who was right beside him when he decided to just casually do that on his own: &#xA;&#xA;  &#34;That guy is a monster!&#34; &#xA;&#xA;I figured they had it covered, but asked if I could help with anything, or if I should get out of their way. Surprisingly, they did want me to see if there were some tools around to help scoop the ducklings out, like a net or rakes. I went to go search; no nets, but some rakes, and some handled dustpans too, which could be a makeshift bucket perhaps! In that time, another solution was found though, and I suppose there&#39;s no reason why they wouldn&#39;t be trying all sorts of stuff in the heat of the moment. How&#39;d they start bringing the ducklings back to the surface, and back to mom? A pole, with a tiny metal bucket duct taped to the end of it! I&#39;m pretty certain that thing was made right on the spot, so maybe one of the other onlookers had something on hand from their car. Either way, within a few minutes, all twelve of the adorable babies were pulled out of the hole! Funnily enough, after mom got about half of them, she began to waddle off—albeit rather slowly. I&#39;m not exactly sure what the logic was, but I suppose she got the better half of the litter, and thought that was good enough! A couple of people had to carry the little ducklings over, and then we had to encourage them to waddle away from us, and back to her. One in particular kept turning back at us, but eventually decided to join the rest of their family. &#xA;&#xA;We all had our moments of cute noises and thanks, I waved off the fire department, and now I&#39;m going to be enjoying this little slice of human decency for as long as I can. It feels hard to find these days, but being face to face with several people who were concerned about helping little creatures...that meant a lot. I suppose those articles about saving cats from trees and ducklings from drains really do happen from time to time. I obviously don&#39;t want to see more animals falling prey to simply existing near us, but I am glad good-natured folks deal with the fallout when it does.]]&gt;</description>
      <content:encoded><![CDATA[<p>Every so often, I&#39;ll stumble across a simple, feel-good story about an animal being rescued by some folks, after getting caught in some sort of predicament. Often times, it&#39;s unfortunate interactions with human infrastructure—and this is no different—but I can still appreciate that some of us care enough to give aid when the need arises. After all these years, I&#39;ve finally had my own personal experience with a rescue, so I feel obligated to share the story here.</p>

<p>Let&#39;s set the scene. It&#39;s the early morning, and a mother duck is taking a stroll across a stretch of pavement. She reaches a storm drain, and her large waders give her no trouble, as she waddles across the holes with ease. Unbeknownst to her however, the dozen ducklings she had in tow are having a lot more trouble navigating the obstacle; in fact, all of them slip right into the water a few feet below! They&#39;re all unharmed, but the chicks are too young to fly, and the mother is too large to retrieve them. Not being willing to abandon her babies, she stands outside the storm drain, and the quacking commotion catches the attention of some customers and employees.</p>

<p>This is where I finally am made aware of the situation by a rather distressed employee, who mentions what&#39;s happening and wants to save them. They weren&#39;t able to leave their post, and since there wasn&#39;t anyone else around, I suppose they thought it best to ask me if I could flag down the fire department when they arrived. I hadn&#39;t yet seen the duck, but you better believe I went right out there, and waited the several minutes it took to wave my hands, and get them up to speed with the info I had. I wasn&#39;t even the only person waiting, as a couple folks were already nearby—perhaps a little <em>too</em> close—to our rather stressed mom, and her crying babies. Thankfully, I think they were just concerned and curious, as letting them know the situation, and asking to give her some breathing room, was enough to keep things in check until the fire truck pulled up.</p>

<p>I was interested to see how they intended to save the ducklings, but it seems as if, like birds of their own, they decided to wing it. The only thing that was certain, was removing the grate from the storm drain. Now I&#39;ve seen city workers do this before, where they&#39;ll use a special metal bar to levy the grate upward, and then shimmy the thing to the side if necessary for access. This is <em>not</em> what the fire department did; I couldn&#39;t even tell you if the guys had the tool on board. One of the bigger gentleman simply grabbed the large metal grate with his bare hands, lifted that thing straight up, and placed it off to the side. I wasn&#39;t sure it&#39;d even come off without a special prying tool, but I guess all you really need is brute strength! To quote one of the other firemen, who was right beside him when he decided to just casually do that on his own:</p>

<blockquote><p>“That guy is a monster!”</p></blockquote>

<p>I figured they had it covered, but asked if I could help with anything, or if I should get out of their way. Surprisingly, they did want me to see if there were some tools around to help scoop the ducklings out, like a net or rakes. I went to go search; no nets, but some rakes, and some handled dustpans too, which could be a makeshift bucket perhaps! In that time, another solution was found though, and I suppose there&#39;s no reason why they wouldn&#39;t be trying all sorts of stuff in the heat of the moment. How&#39;d they start bringing the ducklings back to the surface, and back to mom? A pole, with a tiny metal bucket duct taped to the end of it! I&#39;m pretty certain that thing was made right on the spot, so maybe one of the other onlookers had something on hand from their car. Either way, within a few minutes, all twelve of the adorable babies were pulled out of the hole! Funnily enough, after mom got about half of them, she began to waddle off—albeit rather slowly. I&#39;m not exactly sure what the logic was, but I suppose she got the better half of the litter, and thought that was good enough! A couple of people had to carry the little ducklings over, and then we had to encourage them to waddle away from us, and back to her. One in particular kept turning back at us, but eventually decided to join the rest of their family.</p>

<p>We all had our moments of cute noises and thanks, I waved off the fire department, and now I&#39;m going to be enjoying this little slice of human decency for as long as I can. It feels hard to find these days, but being face to face with several people who were concerned about helping little creatures...that meant a lot. I suppose those articles about saving cats from trees and ducklings from drains really <em>do</em> happen from time to time. I obviously don&#39;t want to see <em>more</em> animals falling prey to simply existing near us, but I am glad good-natured folks deal with the fallout when it does.</p>
]]></content:encoded>
      <author>Foxfire</author>
      <guid>https://pen.blahaj.zone/read/a/wng8dzcs1z</guid>
      <pubDate>Tue, 28 Apr 2026 23:34:29 +0000</pubDate>
    </item>
    <item>
      <title>DVDs and Music Bees</title>
      <link>https://pen.blahaj.zone/the-gnu-linux-diary/dvds-and-music-bees</link>
      <description>&lt;![CDATA[An excerpt from my my diary, from the 17th of February, 2024.&#xA;&#xA;Today, I got a request from a family member to create a DVD, from several short videos of him playing on the guitar. I figure this shouldn’t be a big deal, but I was incorrect. Apparently, authoring DVDs is a giant pain in the ass—at least with the media I was given. All of these clips were in some strange AVI formatted video, which was massive, and didn’t even want to play properly in some media programs. I imagine the best course of action would be to just re-encode this mess, maybe into MP4 with ffmpeg, and just be done with it, especially as I wasn’t confident it’d fit on the DVD without modification. Okay, so let’s hop into the terminal and get ffmpeg installed. What’s even nicer about this, is it’s very easy to just open a terminal right in the directory, and modify my existing scripts.!--more-- I probably should just make my batch files bash ones instead sometime, but whatever, it’s running! Nice and simple—or so I thought—as when I checked the converted output, the audio just became a wall of white noise.&#xA;&#xA;Okay great, something must be wrong with the GNU/Linux installation...I guess? I try I few different encoding and re-encoding settings, they all fail the same way, I decide this isn’t my project anyway, and just boot back into Windows. I run ffmpeg again, it still fails miserably; honestly, that’s a huge relief. The files are just awful, thank god it’s not an OS related issue. This is where I find out some video programs fail to play it, and that Audacity imports the track as white noise too. Lovely, so how the heck will I be able to cut and convert this stuff into a proper format then? Strangely enough, it was Microsoft’s proprietary video clip tool that actually managed to do it, after messing with it a bit to make it think the entire video was a clip to convert. I have no idea why that worked, but oh well, at least I can use some free DVD authoring software. This isn’t really related to GNU/Linux any further, but let’s just say this was an absolute nightmare, and it took five burns to get a single usable configuration. It was like a balancing act of preserving re-encoding failures and successes, along with DVD commands which I guess weren’t added by default.&#xA;&#xA;Okay, shows over, back to Pop!_OS, that’s the point of this, after all! Well actually, wait, since I’m here, now would be a great time to export my MusicBee ratings into a simple playlist format like .m3u. After that, I could look for a proper music app for my new system! I got my playlists ready, so it’s time to jump back in. Now I’m looking for something free and open source, something which has automatic playlists for ratings, the ability to rate music, and ideally has some customization features. Looking around online, it seems like the most popular one that fits this bill is Clementine. Oddly, they seemingly haven’t had an official release for several years, despite very recent active work in the GitHub repository. Not really sure what’s up with that, but I could grab some prerelease installation if necessary.&#xA;&#xA;I do see a flatpak from not too long ago on the Pop shop, and figure that should be more than enough to evaluate if it will work for me. It can recognize my library no problem, though tag embedded ratings seem to differ from MusicBee, which is fine, as I could simply import the playlists...right? Well no, they just don’t function properly at all. This is a problem, .m3u files are pretty basic, it’s literally just directories isn’t it? I took some random album, saved an .m3u playlist in Clementine, and well—it’s a mess. There’s so much extra baggage saved here, which would make conversion unreasonable between what I have from MusicBee, and this. It’s a pretty big deal, and unfortunately a deal breaker, but I did see a fork of Clementine with far more recent releases from this month! It’s called Strawberry, and little did I know, it would actually bridge the gap I needed, saving the day. &#xA;&#xA;Strawberry is similar as you might imagine; it feels a little nicer, and has some extra features, but otherwise I figured this might be pointless. My thought was maybe the .m3u playlists would differ, because the info preserved in Clementine was pretty needless. To my actual shock, the Hail Mary I wagered was dead on. The playlists here and from MusicBee are identical, aside from a single line at the top for external directories, #EXTM3U, which is trivial to append. Now we’re getting to business, so I alter the directories to match my new drives, import the playlist, and...there are broken entries. Thankfully, I pick up almost immediately what happened, but unfortunately there’s no automated way to resolve the conflict. The problem is that MusicBee isn’t case sensitive, while Strawberry is, so any song I updated capitalization for in the folder structure, never updated the data within MusicBee. This seems like a Strawberry oversight more than anything, but whatever, I can deal with this type of problem.&#xA;&#xA;I pop open the native text editor, and get to work replacing capitalization for a number of songs, in literally every rating playlist. After deleting and importing a couple times, all of the errors are resolved, I can select all, and then set every single song’s rating to the correct value! Fantastic stuff, and then I can make auto playlists if I need to export the data in the future. It took a number of hours, but thousands of entries are all imported, meaning my local favorites and rated tracks are all ready to go now! This is extremely important, because it means I can now ditch my Windows music collection, and progress it entirely with free software utilizing GNU/Linux. I do have some issues to resolve, mainly revolving around other satellite tools and tagging, but at the very least, the biggest hurdle has been crossed! Also—added bonus—my FiiO hardware works better than it did before. It has special modes for higher res audio playbacks (e.g. 24bit / 96khz), which never worked in Windows, but are plug and play here. I found this out by listening to a recent album I got called Jet Flight, and seeing the green color I should when such audio is passed through the DAC.]]&gt;</description>
      <content:encoded><![CDATA[<p><em>An excerpt from my my diary, from the 17th of February, 2024.</em></p>

<p>Today, I got a request from a family member to create a DVD, from several short videos of him playing on the guitar. I figure this shouldn’t be a big deal, but I was incorrect. Apparently, authoring DVDs is a giant pain in the ass—at least with the media I was given. All of these clips were in some strange AVI formatted video, which was massive, and didn’t even want to play properly in some media programs. I imagine the best course of action would be to just re-encode this mess, maybe into MP4 with ffmpeg, and just be done with it, especially as I wasn’t confident it’d fit on the DVD without modification. Okay, so let’s hop into the terminal and get ffmpeg installed. What’s even nicer about this, is it’s very easy to just open a terminal right in the directory, and modify my existing scripts. I probably should just make my batch files <em>bash</em> ones instead sometime, but whatever, it’s running! Nice and simple—or so I thought—as when I checked the converted output, the audio just became a wall of white noise.</p>

<p>Okay great, something must be wrong with the GNU/Linux installation...I guess? I try I few different encoding and re-encoding settings, they all fail the same way, I decide this isn’t my project anyway, and just boot back into Windows. I run ffmpeg again, it still fails miserably; honestly, that’s a huge relief. The files are just awful, thank god it’s not an OS related issue. This is where I find out some video programs fail to play it, and that Audacity imports the track as white noise too. Lovely, so how the heck will I be able to cut and convert this stuff into a proper format then? Strangely enough, it was Microsoft’s proprietary video clip tool that actually managed to do it, after messing with it a bit to make it think the entire video was a clip to convert. I have no idea why that worked, but oh well, at least I can use some free DVD authoring software. This isn’t really related to GNU/Linux any further, but let’s just say this was an absolute nightmare, and it took five burns to get a single usable configuration. It was like a balancing act of preserving re-encoding failures and successes, along with DVD commands which I guess weren’t added by default.</p>

<p>Okay, shows over, back to Pop!_OS, that’s the point of this, after all! Well actually, wait, since I’m here, now would be a <em>great</em> time to export my MusicBee ratings into a simple playlist format like .m3u. After that, I could look for a proper music app for my new system! I got my playlists ready, so it’s time to jump back in. Now I’m looking for something free and open source, something which has automatic playlists for ratings, the ability to rate music, and ideally has some customization features. Looking around online, it seems like the most popular one that fits this bill is <a href="https://www.clementine-player.org/" rel="nofollow">Clementine</a>. Oddly, they seemingly haven’t had an official release for several years, despite very recent active work in the GitHub repository. Not really sure what’s up with that, but I could grab some prerelease installation if necessary.</p>

<p>I do see a flatpak from not too long ago on the Pop shop, and figure that should be more than enough to evaluate if it will work for me. It can recognize my library no problem, though tag embedded ratings seem to differ from MusicBee, which is fine, as I could simply import the playlists...right? Well no, they just don’t function properly at all. This is a problem, .m3u files are pretty basic, it’s literally just directories isn’t it? I took some random album, saved an .m3u playlist in Clementine, and well—it’s a mess. There’s so much extra baggage saved here, which would make conversion unreasonable between what I have from MusicBee, and this. It’s a pretty big deal, and unfortunately a deal breaker, but I did see a fork of Clementine with far more recent releases from this month! It’s called <a href="https://www.strawberrymusicplayer.org/" rel="nofollow">Strawberry</a>, and little did I know, it would actually bridge the gap I needed, saving the day.</p>

<p>Strawberry is similar as you might imagine; it feels a little nicer, and has some extra features, but otherwise I figured this might be pointless. My thought was maybe the .m3u playlists would differ, because the info preserved in Clementine was pretty needless. To my actual shock, the Hail Mary I wagered was dead on. The playlists here and from MusicBee are identical, aside from a single line at the top for external directories, <code>#EXTM3U</code>, which is trivial to append. Now we’re getting to business, so I alter the directories to match my new drives, import the playlist, and...there are broken entries. Thankfully, I pick up almost immediately what happened, but unfortunately there’s no automated way to resolve the conflict. The problem is that MusicBee <em>isn’t</em> case sensitive, while Strawberry <strong>is</strong>, so any song I updated capitalization for in the folder structure, never updated the data within MusicBee. This seems like a Strawberry oversight more than anything, but whatever, I can deal with this type of problem.</p>

<p>I pop open the native text editor, and get to work replacing capitalization for a number of songs, in literally every rating playlist. After deleting and importing a couple times, all of the errors are resolved, I can select all, and then set every single song’s rating to the correct value! Fantastic stuff, and then I can make auto playlists if I need to export the data in the future. It took a number of hours, but thousands of entries are all imported, meaning my local favorites and rated tracks are all ready to go now! This is extremely important, because it means I can now ditch my Windows music collection, and progress it entirely with free software utilizing GNU/Linux. I do have some issues to resolve, mainly revolving around other satellite tools and tagging, but at the very least, the biggest hurdle has been crossed! Also—added bonus—my FiiO hardware works better than it did before. It has special modes for higher res audio playbacks (e.g. 24bit / 96khz), which never worked in Windows, but are plug and play here. I found this out by listening to a recent album I got called Jet Flight, and seeing the green color I should when such audio is passed through the DAC.</p>
]]></content:encoded>
      <author>The GNU/Linux Diary</author>
      <guid>https://pen.blahaj.zone/read/a/20hmkffd0t</guid>
      <pubDate>Sat, 25 Apr 2026 18:22:27 +0000</pubDate>
    </item>
    <item>
      <title>On Content Warnings and Spoilers</title>
      <link>https://pen.blahaj.zone/reilyhh/on-content-warnings-and-spoilers</link>
      <description>&lt;![CDATA[I take content warnings and spoilers very seriously. I think they protect the user themselves, and not just the users around them. I&#39;ve had many times where I vented about something traumatic, or said some bad news, only for my eyes to slightly go up and read that all over again. So by having spoilers, I was able to protect myself from re-reading sensitive content. &#xA;&#xA;!--more--&#xA;The key thing about content/trigger warnings I think is &#34;Readiness&#34;. Yes, sure, it is to protect some folks from being triggered by the content due to having bad past experiences with it. But I also think that it&#39;s there to give users a choice, do you want to read something that might upset you or not? Like you might not have any bad past experiences with X, Y, and Z, but what if you just woke up, and the first thing you were greeted with was a bad case of X, Y, or Z? Or if you expected to see a wholesome chat room with kitty cuddles and meows only to see unspoilered sensitive content. That surprise, that shock, I don&#39;t like that.&#xA;&#xA;Here&#39;s a post on how to spoiler things on Matrix chatting clients, and the last two sections cover the internet in general.]]&gt;</description>
      <content:encoded><![CDATA[<p>I take content warnings and spoilers very seriously. I think they protect the user themselves, and not just the users around them. I&#39;ve had many times where I vented about something traumatic, or said some bad news, only for my eyes to slightly go up and read that all over again. So by having spoilers, I was able to protect myself from re-reading sensitive content.</p>



<p>The key thing about content/trigger warnings I think is “Readiness”. Yes, sure, it is to protect some folks from being triggered by the content due to having bad past experiences with it. But I also think that it&#39;s there to give users a choice, do you want to read something that might upset you or not? Like you might not have any bad past experiences with X, Y, and Z, but what if you just woke up, and the first thing you were greeted with was a bad case of X, Y, or Z? Or if you expected to see a wholesome chat room with kitty cuddles and meows only to see unspoilered sensitive content. That surprise, that shock, I don&#39;t like that.</p>

<p><a href="https://pen.blahaj.zone/reilyhh/matrix-tips-and-tricks" rel="nofollow">Here&#39;s a post</a> on how to spoiler things on Matrix chatting clients, and the last two sections cover the internet in general.</p>
]]></content:encoded>
      <author>reilyh</author>
      <guid>https://pen.blahaj.zone/read/a/ywmbw3nwjs</guid>
      <pubDate>Sat, 25 Apr 2026 16:45:37 +0000</pubDate>
    </item>
    <item>
      <title>Matrix Tips and Tricks!</title>
      <link>https://pen.blahaj.zone/reilyhh/matrix-tips-and-tricks</link>
      <description>&lt;![CDATA[Spoilers!&#xA;&#xA;For spoilering you could use the following format:&#xA;&#xA;!--more--&#xA;&#xA;Double Pipes&#xA;&#xA;If your client support this syntax ||spoilered text|| you should write like this:&#xA; CW/TW: Description Of The Warning ||Actual Content||&#xA;&#xA;The /spoiler Command&#xA;&#xA;If your client does not support that syntax, check if your client provides a /spoiler command: &#xA;in that case you should send a message that details the CW/TW then reply to it using the /spoiler command&#xA;&#xA;Long Text and Other Forms of Media&#xA;&#xA;An excellent way would be to use https://trggr.link/ you could write CW/TWs for any kind of media: images, videos, large text, etc.&#xA;&#xA;Although keep in mind that trggr isn&#39;t a file hosting service, it only supports text. To send sensitive media, upload to an external file host, like https://catbox.moe or other file hosting services.&#xA;&#xA;Stickers&#xA;&#xA;I am known as the sticker girl, I&#39;ve been mostly collecting images on the internet, cropping them, sometimes editing them slightly to fit my needs. I even drew some stickers. So here&#39;s what I learned:&#xA;&#xA;[This section is under construction]&#xA;&#xA;Matrix Blocking With /ignore&#xA;&#xA;PSA: The /ignore command exists and yall may use it liberally. &#xA;&#xA;If a user is toxic and no mods are around, feel free to use it after notifying a mod.&#xA;&#xA;If yall dislike the content, words, or language of a certain person, yall should first ask them to accomedate yall. If they don’t, ignore them. Common examples are users who don’t use content warnings for sensitive content, even after being told to do so.&#xA;&#xA;Temporary ignores are a thing too, if need arises.&#xA;&#xA;On fluffy, yall may also use “Set as low priority” to make a room go to the bottom of yall’s room list, like if a difficult conversation is happening.&#xA;&#xA;The /ignore command doesn’t make the conversation as fragmented as yall would think so, it’s not like the person who yall have blocked has anything meaningful to contribute, and yall would still be able to see their read reciepts and know that they’re talking.&#xA;&#xA;For Appie, after she left the modding team, she blocked a couple of users, and finally feels safe enoguh to be in some rooms. She couldn’t do this previously because as a mod, she thought she had to be able to interact with all users.&#xA;&#xA;Stay safe out there, and protect yall’s minds ❤️&#xA;&#xA;#matrix, #matrixchat, #contentWarning, #contentWarnings, #spoilers, #psa&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="spoilers">Spoilers!</h2>

<p>For spoilering you could use the following format:</p>



<p><strong>Double Pipes</strong></p>

<p>If your client support this syntax ||spoilered text|| you should write like this:
 CW/TW: Description Of The Warning ||Actual Content||</p>

<p><strong>The <code>/spoiler</code> Command</strong></p>

<p>If your client does not support that syntax, check if your client provides a /spoiler command:
in that case you should send a message that details the CW/TW then reply to it using the /spoiler command</p>

<p><strong>Long Text and Other Forms of Media</strong></p>

<p>An excellent way would be to use <a href="https://trggr.link/" rel="nofollow">https://trggr.link/</a> you could write CW/TWs for any kind of media: images, videos, large text, etc.</p>

<p>Although keep in mind that trggr isn&#39;t a file hosting service, it only supports text. To send sensitive media, upload to an external file host, like <a href="https://catbox.moe" rel="nofollow">https://catbox.moe</a> or other file hosting services.</p>

<h2 id="stickers">Stickers</h2>

<p>I am known as the sticker girl, I&#39;ve been mostly collecting images on the internet, cropping them, sometimes editing them slightly to fit my needs. I even drew some stickers. So here&#39;s what I learned:</p>

<p>[This section is under construction]</p>

<h2 id="matrix-blocking-with-ignore">Matrix Blocking With /ignore</h2>

<p>PSA: The /ignore command exists and yall may use it liberally.</p>
<ul><li><p>If a user is toxic and no mods are around, feel free to use it after notifying a mod.</p></li>

<li><p>If yall dislike the content, words, or language of a certain person, yall should first ask them to accomedate yall. If they don’t, ignore them. Common examples are users who don’t use content warnings for sensitive content, even after being told to do so.</p></li>

<li><p>Temporary ignores are a thing too, if need arises.</p></li></ul>

<p>On fluffy, yall may also use “Set as low priority” to make a room go to the bottom of yall’s room list, like if a difficult conversation is happening.</p>

<p>The /ignore command doesn’t make the conversation as fragmented as yall would think so, it’s not like the person who yall have blocked has anything meaningful to contribute, and yall would still be able to see their read reciepts and know that they’re talking.</p>

<p>For Appie, after she left the modding team, she blocked a couple of users, and finally feels safe enoguh to be in some rooms. She couldn’t do this previously because as a mod, she thought she had to be able to interact with all users.</p>

<p>Stay safe out there, and protect yall’s minds ❤️</p>

<p>#matrix, #matrixchat, #contentWarning, #contentWarnings, #spoilers, #psa</p>
]]></content:encoded>
      <author>reilyh</author>
      <guid>https://pen.blahaj.zone/read/a/qtk0xmye5t</guid>
      <pubDate>Sat, 25 Apr 2026 15:11:35 +0000</pubDate>
    </item>
    <item>
      <title>FINALLY!</title>
      <link>https://pen.blahaj.zone/reilyhh/finally</link>
      <description>&lt;![CDATA[NO MORE DEALING WITH CSS DEMONS! AAAAAAAH I CAN WRITE STUFF NOW!]]&gt;</description>
      <content:encoded><![CDATA[<p>NO MORE DEALING WITH CSS DEMONS! AAAAAAAH I CAN WRITE STUFF NOW!</p>
]]></content:encoded>
      <author>reilyh</author>
      <guid>https://pen.blahaj.zone/read/a/a2myksf19j</guid>
      <pubDate>Sat, 25 Apr 2026 14:55:00 +0000</pubDate>
    </item>
    <item>
      <title>First Hardware Casualty</title>
      <link>https://pen.blahaj.zone/the-gnu-linux-diary/first-hardware-casualty</link>
      <description>&lt;![CDATA[An excerpt from my my diary, from the 16th of February, 2024.&#xA;&#xA;You know, it’s been a few days since I’ve installed this system, and I only just now realized something: hibernation actually works on my device perfectly. I always, and I mean always, have issues with hibernation on my desktop Windows systems. Clearly it works for a lot of people— because I don’t hear about this being an issue—but for me, across multiple versions and computers, hibernation breaks. I’ve always opted to either leave my stuff running, or turn it off entirely, because I will basically have to restart the device anyway if I try to use hibernation mode. On Pop!_OS though? Oh wow, it works flawlessly, boots back up in a few seconds, and everything is just excellent; I am honestly stunned. !--more--&#xA;&#xA;I figured I’d have to disable it, but it’s worked properly a few times already, and it’s just everything I could ever hope for. Also, can I talk to you about my lord and savior: integrated dark mode? Holy hell, everything is dark, and it is amazing. I was waiting for literally over a decade just for partial integration of dark mode into native Windows apps. I cannot stress enough how much I love this. Everything integrated is dark, everything I download is dark—I am in heaven.&#xA;&#xA;Alright, so I downloaded OBS a couple days ago, right? There’s another bit of hardware I need to set up: my AVerMedia capture card. Let’s plug that bad boy in and set up a scene. Oh wait, nothing is detected; I suppose I need some drivers or something. Let’s do some digging! Several minutes of digging later and...well, shit. This hardware company gives no fucks about GNU/Linux systems, and also has some proprietary nonsense going on I guess. Only lead I have is a GitHub project which is years out of production, that modifies a specific no longer hosted driver, that is related, but not actually for the 4k card I purchased. Okay, let’s check the repository—oh, no releases. I guess I could follow the compilation instructions, it says it should just work. Shocker to no one, the years out of date un-compiled code failed to build, seemingly citing several unaccounted for variables (not missing dependencies).&#xA;&#xA;It did say if it fails to try the Fedora branch. Alright, I’m on Ubuntu, but what the heck, ./build.sh go ahead and make my day. Oh, never mind, it already broke. I’m not in a position to resolve whatever issues these are, and a slightly less out of date fork mentioning kernel changes, makes me even more wary. I’m in way over my head here. For completion sake, I download the fork and see if it compiles, though alas, it also fails. But hey, I tried dang it, that accounts for something right? Man, this card was like $150, I guess I’ll just have to look for something that actually respects my freedom in the future. Considering it was plug and play with Windows though, I’m honestly surprised this was my first hardware casualty. More unconventional stuff I literally had to download drivers for works out of the box, but this was a bridge too far. Honestly, much better this than my audio gear; I’m happy, all things considered. ]]&gt;</description>
      <content:encoded><![CDATA[<p><em>An excerpt from my my diary, from the 16th of February, 2024.</em></p>

<p>You know, it’s been a few days since I’ve installed this system, and I only just now realized something: hibernation actually works on my device perfectly. I always, and I mean <em>always</em>, have issues with hibernation on my desktop Windows systems. Clearly it works for a lot of people— because I don’t hear about this being an issue—but for me, across multiple versions and computers, hibernation breaks. I’ve always opted to either leave my stuff running, or turn it off entirely, because I will basically have to restart the device anyway if I try to use hibernation mode. On Pop!_OS though? Oh wow, it works flawlessly, boots back up in a few seconds, and everything is just excellent; I am honestly stunned. </p>

<p>I figured I’d have to disable it, but it’s worked properly a few times already, and it’s just everything I could ever hope for. Also, can I talk to you about my lord and savior: integrated dark mode? Holy hell, everything is dark, and it is <em>amazing</em>. I was waiting for literally over a decade just for partial integration of dark mode into native Windows apps. I cannot stress enough how much I love this. Everything integrated is dark, everything I download is dark—I am in heaven.</p>

<p>Alright, so I downloaded OBS a couple days ago, right? There’s another bit of hardware I need to set up: my AVerMedia capture card. Let’s plug that bad boy in and set up a scene. Oh wait, nothing is detected; I suppose I need some drivers or something. Let’s do some digging! Several minutes of digging later and...well, shit. This hardware company gives no fucks about GNU/Linux systems, and also has some proprietary nonsense going on I guess. Only lead I have is a GitHub project which is years out of production, that modifies a specific <em>no longer hosted</em> driver, that is related, but not actually for the 4k card I purchased. Okay, let’s check the repository—oh, no releases. I guess I could follow the compilation instructions, it says it should just work. Shocker to no one, the years out of date un-compiled code failed to build, seemingly citing several unaccounted for variables (not missing dependencies).</p>

<p>It did say if it fails to try the Fedora branch. Alright, I’m on Ubuntu, but what the heck, <code>./build.sh</code> go ahead and make my day. Oh, never mind, it already broke. I’m not in a position to resolve whatever issues these are, and a slightly less out of date fork mentioning kernel changes, makes me even more wary. I’m in way over my head here. For completion sake, I download the fork and see if it compiles, though alas, it also fails. But hey, I <em>tried</em> dang it, that accounts for something right? Man, this card was like $150, I guess I’ll just have to look for something that actually respects my freedom in the future. Considering it was plug and play with Windows though, I’m honestly surprised this was my first hardware casualty. More unconventional stuff I literally had to download drivers for works out of the box, but this was a bridge too far. Honestly, much better this than my audio gear; I’m happy, all things considered.</p>
]]></content:encoded>
      <author>The GNU/Linux Diary</author>
      <guid>https://pen.blahaj.zone/read/a/q6wweaokyt</guid>
      <pubDate>Tue, 21 Apr 2026 23:26:40 +0000</pubDate>
    </item>
    <item>
      <title>A Discord Survey Response</title>
      <link>https://pen.blahaj.zone/foxfire/a-discord-survey-response</link>
      <description>&lt;![CDATA[In early January of 2026, the communications tech giant Discord posted a survey regarding various types of AI integration on their platform. The questions posed included several invasive monitoring ideas, such as analysis of audio and video chats, seemingly in real time, with no distinction for private servers—or direct messages.&#xA;&#xA;Seemingly due to overwhelming backlash, the survey was taken down a mere several hours after it initially launched. In the free form section at the end, I wrote a couple paragraphs airing my concerns. While I&#39;ve entirely moved to Matrix now, I still felt it worthwhile to respond, and also to mirror this text elsewhere.!--more--&#xA;&#xA;As a large, centralized corporation housing an enormous amount of personal data of users—including that of minors—I am incredibly concerned with any AI integration into Discord whatsoever. The thought of any person having the ability to offload data, particularly from private servers or private messages, into some other company&#39;s data centers for processing, is a privacy nightmare. With some of the features considered within this very survey, it sounds like even voice and video chats may become rife with direct processing to such companies. I cannot imagine whoever you partnered with would sit idly by while such massive natural human data streams come in, without harvesting them for who knows what.&#xA;&#xA;Even if you hypothetically added an opt-out, and I were to trust that this genuinely prevented the transfer of data, the vast majority of people will leave settings as default—having the effects of this without necessarily even realizing the ramifications. It may also violate the consent of others, dependent on if someone who chooses to have AI highlights or summaries, have information included from participants who have chosen to opt-out. This would defeat the entire purpose of turning it off, beyond a veneer of a few hidden buttons; this would obviously be very problematic.&#xA;&#xA;Additionally, I fundamentally am tied to Discord for communication between people, and only people. AI generated stickers, emoji, messages, or any other sort of non-human output, are directly at odds with the only thing I care about doing on the platform: talking to actual people. Groups of friends or communities create their own in-jokes and memes, and it is this human interaction which spurs the creation of things which we collectively enjoy. When I use a custom emoji or sticker, there is a story as to why it&#39;s there, and who created it. If there are people who wish to use generative models in spite of that, I would encourage them to use a local only, open weight, generative model they have full control over on their own computer.&#xA;&#xA;I certainly don&#39;t want to further platform and normalize the generative models of the multi-trillion dollar AI market bubble, which is almost certainly what would be the case for any AI integration that is done by Discord. This bubble is causing lots of problems currently, and I expect those problems to get worse before they get better. Look no further than the gaming demographic Discord used to be aimed at; SSD and RAM prices are at astronomical levels right now, purely because of backroom AI data center deals. I am appalled by the prospect of further rewarding this behavior as it continues to put strain on the general populace, with deep pocket investors begging us to take part in their self-serving, prospective profiteering.]]&gt;</description>
      <content:encoded><![CDATA[<p><em>In early January of 2026, the communications tech giant Discord posted a survey regarding various types of AI integration on their platform. The questions posed included several invasive monitoring ideas, such as analysis of audio and video chats, seemingly in real time, with no distinction for private servers—or direct messages.</em></p>

<p><em>Seemingly due to overwhelming backlash, the survey was taken down a mere several hours after it initially launched. In the free form section at the end, I wrote a couple paragraphs airing my concerns. While I&#39;ve entirely moved to Matrix now, I still felt it worthwhile to respond, and also to mirror this text elsewhere.</em></p>

<p>As a large, centralized corporation housing an enormous amount of personal data of users—including that of minors—I am incredibly concerned with any AI integration into Discord whatsoever. The thought of any person having the ability to offload data, particularly from private servers or private messages, into some other company&#39;s data centers for processing, is a privacy nightmare. With some of the features considered within this very survey, it sounds like even voice and video chats may become rife with direct processing to such companies. I cannot imagine whoever you partnered with would sit idly by while such massive natural human data streams come in, without harvesting them for who knows what.</p>

<p>Even if you hypothetically added an opt-out, and I were to trust that this genuinely prevented the transfer of data, the vast majority of people will leave settings as default—having the effects of this without necessarily even realizing the ramifications. It may also violate the consent of others, dependent on if someone who chooses to have AI highlights or summaries, have information included from participants who have chosen to opt-out. This would defeat the entire purpose of turning it off, beyond a veneer of a few hidden buttons; this would obviously be very problematic.</p>

<p>Additionally, I fundamentally am tied to Discord for communication between people, and only people. AI generated stickers, emoji, messages, or any other sort of non-human output, are directly at odds with the only thing I care about doing on the platform: talking to actual people. Groups of friends or communities create their own in-jokes and memes, and it is this human interaction which spurs the creation of things which we collectively enjoy. When I use a custom emoji or sticker, there is a story as to why it&#39;s there, and who created it. If there are people who wish to use generative models in spite of that, I would encourage them to use a local only, open weight, generative model they have full control over on their own computer.</p>

<p>I certainly don&#39;t want to further platform and normalize the generative models of the multi-trillion dollar AI market bubble, which is almost certainly what would be the case for any AI integration that is done by Discord. This bubble is causing lots of problems currently, and I expect those problems to get worse before they get better. Look no further than the gaming demographic Discord used to be aimed at; SSD and RAM prices are at astronomical levels right now, purely because of backroom AI data center deals. I am appalled by the prospect of further rewarding this behavior as it continues to put strain on the general populace, with deep pocket investors begging us to take part in their self-serving, prospective profiteering.</p>
]]></content:encoded>
      <author>Foxfire</author>
      <guid>https://pen.blahaj.zone/read/a/kjxrmgkn1n</guid>
      <pubDate>Tue, 21 Apr 2026 22:48:42 +0000</pubDate>
    </item>
    <item>
      <title>Hello world!</title>
      <link>https://pen.blahaj.zone/reilyhh/hello-world</link>
      <description>&lt;![CDATA[I did an oopsie again and forgot my password for &#34;reilyh&#34; for pen.blahaj.zone. Oh well :P&#xA;!--more--]]&gt;</description>
      <content:encoded><![CDATA[<p>I did an oopsie again and forgot my password for “reilyh” for pen.blahaj.zone. Oh well :P
</p>
]]></content:encoded>
      <author>reilyh</author>
      <guid>https://pen.blahaj.zone/read/a/78lfgmtngt</guid>
      <pubDate>Sat, 18 Apr 2026 16:36:42 +0000</pubDate>
    </item>
    <item>
      <title>To The Yellowjacket I Met Today</title>
      <link>https://pen.blahaj.zone/foxfire/to-the-yellowjacket-i-met-today</link>
      <description>&lt;![CDATA[I barely noticed you by the window sill at my workplace. I was surprised a creature as large as you could be so inconspicuous; I&#39;m so used to your vigor and curiosity. You weren&#39;t moving, and I had thought you already passed away. Instead, you were so weak, I accidentally flipped you over from a puff of air, to check that very thing. The inside of a building is an insidious place for insects—a prison beyond understanding. You were succumbing to its uncaring walls, and my guilt weighed more than my fear.!--more--&#xA;&#xA;I found a small piece of wood, and placed it just above you. As if you understood the instruction, you quickly moved your legs upward, and stuck to it. I took you outside to some flowers; you seemed curious, but didn&#39;t wish to leave the wood after a few minutes of facing them. Perhaps you just needed more time to rest, more time away from the sun-baked windows which were cooking you alive. I gave you shade nearby, and found some small rain puddles to coat my hands with, hopefully to give you some hydration. Just some small droplets and flicks of the fingers, hoping you might ingest some beads of water, as you gained more strength. &#xA;&#xA;I wasn&#39;t sure if you&#39;d make it, but I saw you breathing—I saw you holding on. Earnestly, I just hoped that whatever happened was better than the uncaring hand you were dealt until this point. When I checked on you after my lunch, you were nowhere to be seen. I&#39;m holding on to hope that you regained your strength, and eventually flew away. We all live and die, but the pointless cruelty of dehydrating on a window sill is too much. You just wanted to live and forage, and instead we trapped you in a labyrinth of suffering. Who would&#39;ve even cared if your corpse were there instead, had I missed you today? Why do we often feel so little for the countless other inhabitants of our world? &#xA;&#xA;I hope you got your second chance.]]&gt;</description>
      <content:encoded><![CDATA[<p>I barely noticed you by the window sill at my workplace. I was surprised a creature as large as you could be so inconspicuous; I&#39;m so used to your vigor and curiosity. You weren&#39;t moving, and I had thought you already passed away. Instead, you were so weak, I accidentally flipped you over from a puff of air, to check that very thing. The inside of a building is an insidious place for insects—a prison beyond understanding. You were succumbing to its uncaring walls, and my guilt weighed more than my fear.</p>

<p>I found a small piece of wood, and placed it just above you. As if you understood the instruction, you quickly moved your legs upward, and stuck to it. I took you outside to some flowers; you seemed curious, but didn&#39;t wish to leave the wood after a few minutes of facing them. Perhaps you just needed more time to rest, more time away from the sun-baked windows which were cooking you alive. I gave you shade nearby, and found some small rain puddles to coat my hands with, hopefully to give you some hydration. Just some small droplets and flicks of the fingers, hoping you might ingest some beads of water, as you gained more strength.</p>

<p>I wasn&#39;t sure if you&#39;d make it, but I saw you breathing—I saw you holding on. Earnestly, I just hoped that whatever happened was better than the uncaring hand you were dealt until this point. When I checked on you after my lunch, you were nowhere to be seen. I&#39;m holding on to hope that you regained your strength, and eventually flew away. We all live and die, but the pointless cruelty of dehydrating on a window sill is too much. You just wanted to live and forage, and instead we trapped you in a labyrinth of suffering. Who would&#39;ve even cared if your corpse were there instead, had I missed you today? Why do we often feel so little for the countless other inhabitants of our world?</p>

<p>I hope you got your second chance.</p>
]]></content:encoded>
      <author>Foxfire</author>
      <guid>https://pen.blahaj.zone/read/a/icwi08khzc</guid>
      <pubDate>Sat, 18 Apr 2026 00:49:34 +0000</pubDate>
    </item>
    <item>
      <title>I was planning to finish Gojira&#39;s discography.</title>
      <link>https://pen.blahaj.zone/reilyh/i-was-planning-to-finish-gojiras-discography</link>
      <description>&lt;![CDATA[I was planning to finish Gojira&#39;s discography. I may update this page in the future to flesh things out a bit.&#xA;Intro To Metal&#xA;&#xA;So Gojira was my first introduction to metal. I think I was looking for jawharp metal tracks, and &#34;Amazonia&#34; showed up, I said &#34;fuck it we ball&#34; and listened to the whole album. I then listened to &#34;Magma&#34;, and I liked my &#34;Silvera&#34; and my &#34;Stranded&#34;. I also listened to &#34;The Way Of All Flesh&#34; and only liked &#34;Oroborus&#34;. But after a whole year, after I listened to so much more metal, I really like &#34;The Way Of All Flesh&#34;. And so I started to crave earlier Gojira, and I found out about &#34;From Mars To Sirius&#34; &lt;3&#xA;&#xA;!--more--&#xA;!-- rest of the content --&#xA;Favorite Tracks&#xA;&#xA;If I have to to choose ~one~ ~three~ tracks from each album it would be:&#xA;&#xA;From Mars To Sirius:&#xA;This album is great, has beautiful lyrics, I have so much to say about it! Granted I listened to it without reading the lyrics, so my only impression of this album is the riffs.&#xA;&#xA;Ocean Planet: The intro, and especially the part at 3:50, &#34;Whyyyyy do they call me there!!!!&#34; I teared at that part. I kinda feel like that whale being stuck alone.&#xA;&#xA;Backbone.&#xA;Unicron: Because it has really beautiful whale songs, and just a good break for what is to come.&#xA;&#xA;L&#39;Enfant Sauvage:&#xA;&#xA;Explosia: Really shines at 0:35 and and 4:05, especially the ending of the song, with these beautiful, I think they&#39;re called gallops. Anyway they&#39;re cool and I like them.&#xA;The Axe&#xA;Planned Obsolescence&#xA;Pain Is a Master&#xA;Born In Winter&#xA;&#xA;The Way Of All Flesh&#xA;&#xA;This is the album that I a most familiar with.&#xA;&#xA;Oroborus: This track, holy fuck. That haunting part at 3:08? Fucking liquid gold.&#xA;Toxic garbage Island: Other than the bad ass name, the intro is really poweful. Part at 0:52 &lt;3. Also &#34;PLAAAASTIC BAG IN THE SEEAAAAAAA&#34;&#xA;A sight to behold: Now this is a track that deserves a place in the hall of lyrics. I mean:&#xA;The way I see things is so simple&#xA;The fact I&#39;m walking standing on this land&#xA;Exhausted is the realm of nature, friends are dying&#xA;The living creatures on our side&#xA;The way I see myself so confused so sophisticated&#xA;I have to stay away from me&#xA;But I still don&#39;t get the point&#xA;What&#39;s worth destroying all the worlds&#xA;Try not to get it anymore&#xA;&#xA;The way I see things is so simple&#xA;The fact I&#39;m walking standing on this land&#xA;...&#xA;The way I see myself so confused so sophisticated&#xA;&#xA;That right there, is what I will take to my grave.&#xA;&#xA;This track is truley, a sight to behold.&#xA;&#xA;Yama&#39;s messengers: &#34;I&#39;m scared to death when I see them arrive!&#34; Part at 0:46, 2:14. &#34;I&#39;ve killed so many, I don&#39;t want to count&#34;!&#xA;The silver cord: Always love some instrumental metal that I can play loudly and no one would complain.&#xA;Adoration for none: Baddass title, amazing vocal style at the start. The part from 0:54 all the way for like a minute, is fucking, wow. Also:&#xA;Nature is my only master&#xA;I will bow to no one&#xA;...&#xA;Crave for freedom build my own life&#xA;Adoration for none&#xA;&#xA;Words of. Fucking. Power.&#xA;&#xA;And 2:08!&#xA;&#xA;This track is just so differenet from the rest of the album, I adore it so much.&#xA;&#xA;The art of dying: :) sick ass drum work. Really beautiful opening riffs, 4:12?&#xA;Riff goes crazy&#xA;Take no possessions, I would rather travel light&#xA;&#xA;Then &#34;AAAAAAART OF DYING!!!!!!&#34;&#xA;&#xA;Esoteric surgery: &#34;You have the power to heal yourself.&#34;&#xA;Gojira - Vacuity&#xA;Gojira - Wolf down the earth&#xA;The way of all flesh: Is this what dying feels like?&#xA;&#xA;So in search of something more similar to Gojira&#39;s early albums, I turned to the bands that they take their inspiration from: Mastodon and Meshuggah.&#xA;&#xA;But more on that later, as I still have &#34;Magma&#34; and &#34;Fortitude&#34; and I&#39;m not that eager to do them. Don&#39;t get me wrong, &#34;Stranded&#34; was one my favorite earlier metal tracks, and maybe it still is. Idk.&#xA;&#xA;I also need to learn about song structure and general metal terminology, &#34;riff&#34; and &#34;part&#34; are absolutely not a proper way to describe songs.]]&gt;</description>
      <content:encoded><![CDATA[<p>I was planning to finish Gojira&#39;s discography. I may update this page in the future to flesh things out a bit.</p>

<h1 id="intro-to-metal">Intro To Metal</h1>

<p>So Gojira was my first introduction to metal. I think I was looking for jawharp metal tracks, and “Amazonia” showed up, I said “fuck it we ball” and listened to the whole album. I then listened to “Magma”, and I liked my “Silvera” and my “Stranded”. I also listened to “The Way Of All Flesh” and only liked “Oroborus”. But after a whole year, after I listened to so much more metal, I really like “The Way Of All Flesh”. And so I started to crave earlier Gojira, and I found out about “From Mars To Sirius” &lt;3</p>





<h3 id="favorite-tracks">Favorite Tracks</h3>

<p>If I have to to choose ~one~ ~three~ tracks from each album it would be:</p>

<h4 id="from-mars-to-sirius">From Mars To Sirius:</h4>

<p>This album is great, has beautiful lyrics, I have so much to say about it! Granted I listened to it without reading the lyrics, so my only impression of this album is the riffs.</p>
<ul><li><p>Ocean Planet: The intro, and especially the part at 3:50, “Whyyyyy do they call me there!!!!” I teared at that part. I kinda feel like that whale being stuck alone.</p></li>

<li><p>Backbone.</p></li>

<li><p>Unicron: Because it has really beautiful whale songs, and just a good break for what is to come.</p></li></ul>

<h4 id="l-enfant-sauvage">L&#39;Enfant Sauvage:</h4>
<ul><li>Explosia: Really shines at 0:35 and and 4:05, especially the ending of the song, with these beautiful, I think they&#39;re called gallops. Anyway they&#39;re cool and I like them.</li>
<li>The Axe</li>
<li>Planned Obsolescence</li>
<li>Pain Is a Master</li>
<li>Born In Winter</li></ul>

<h4 id="the-way-of-all-flesh">The Way Of All Flesh</h4>

<p>This is the album that I a most familiar with.</p>
<ul><li>Oroborus: This track, holy fuck. That haunting part at 3:08? Fucking liquid gold.</li>
<li>Toxic garbage Island: Other than the bad ass name, the intro is really poweful. Part at 0:52 &lt;3. Also “PLAAAASTIC BAG IN THE SEEAAAAAAA”</li>
<li>A sight to behold: Now this is a track that deserves a place in the hall of lyrics. I mean:
<code>
The way I see things is so simple
The fact I&#39;m walking standing on this land
Exhausted is the realm of nature, friends are dying
The living creatures on our side
The way I see myself so confused so sophisticated
I have to stay away from me
But I still don&#39;t get the point
What&#39;s worth destroying all the worlds
Try not to get it anymore
</code></li></ul>

<pre><code>The way I see things is so simple
The fact I&#39;m walking standing on this land
...
The way I see myself so confused so sophisticated
</code></pre>

<p>That right there, is what I will take to my grave.</p>

<p>This track is truley, a sight to behold.</p>
<ul><li>Yama&#39;s messengers: “I&#39;m scared to death when I see them arrive!” Part at 0:46, 2:14. “I&#39;ve killed so many, I don&#39;t want to count”!</li>
<li>The silver cord: Always love some instrumental metal that I can play loudly and no one would complain.</li>
<li>Adoration for none: Baddass title, amazing vocal style at the start. The part from 0:54 all the way for like a minute, is fucking, wow. Also:
<code>
Nature is my only master
I will bow to no one
...
Crave for freedom build my own life
Adoration for none
</code></li></ul>

<p>Words of. Fucking. Power.</p>

<p>And 2:08!</p>

<p>This track is just so differenet from the rest of the album, I adore it so much.</p>
<ul><li>The art of dying: :) sick ass drum work. Really beautiful opening riffs, 4:12?
<code>I won&#39;t bring no material in the after life
*Riff goes crazy*
Take no possessions, I would rather travel light
</code></li></ul>

<p>Then “AAAAAAART OF DYING!!!!!!”</p>
<ul><li>Esoteric surgery: “You have the power to heal yourself.”</li>
<li>Gojira – Vacuity</li>
<li>Gojira – Wolf down the earth</li>
<li>The way of all flesh: Is this what dying feels like?</li></ul>

<p>So in search of something more similar to Gojira&#39;s early albums, I turned to the bands that they take their inspiration from: Mastodon and Meshuggah.</p>

<p>But more on that later, as I still have “Magma” and “Fortitude” and I&#39;m not that eager to do them. Don&#39;t get me wrong, “Stranded” was one my favorite earlier metal tracks, and maybe it still is. Idk.</p>

<p>I also need to learn about song structure and general metal terminology, “riff” and “part” are absolutely not a proper way to describe songs.</p>
]]></content:encoded>
      <author>reilyh</author>
      <guid>https://pen.blahaj.zone/read/a/ei9f0v5jp4</guid>
      <pubDate>Thu, 12 Mar 2026 02:23:07 +0000</pubDate>
    </item>
    <item>
      <title>Dragons I made in DragonCreator</title>
      <link>https://pen.blahaj.zone/reilyh/dragons-i-made-in-dragoncreator</link>
      <description>&lt;![CDATA[Here&#39;s a cool dragon creator on itch.io&#xA;&#xA;This page will be updated a lot in the future as I make more dragons, or like, find more dragon creators.&#xA;&#xA;Vampire Dragon.png&#xA;Black Hole Dragon.png&#xA;Midnight Carp Dragon.png&#xA;Giraffe Dragon.png&#xA;&#xA;Human Dragon.png&#xA;&#xA;Radioactive Dragon.png&#xA;&#xA;Satan Dragon.png&#xA;&#xA;Snow Dragon.png&#xA;&#xA;Cthulu Dragon.png&#xA;&#xA;Cthulu Dragon - Alt Color.png&#xA;&#xA;Suzie Dragon.png&#xA;&#xA;Kris Dragon.png&#xA;&#xA;4 Color Dragon.png&#xA;&#xA;2 Color Dragon - Black and White.png&#xA;&#xA;Human Dragon - Mark 2.png&#xA;&#xA;---&#xA;&#xA;and here&#39;s the code for these designs: &#xA;&#xA;110q&amp;Nw04J00000200000f0000c08D000068000V00040J001000000000000000000000008gTkTk0000Tk00%%XLX-XzDzDPPPPD-K5D-8fPP00f8PP0000f8PP008gTkTk0000TkD-0000f8PP00TkTk0000TkD-0000f8PP00TkTk0000TkD-PPPP8gTkTk0000Tkf8XL8gTkTk0000Tkf8XLppTkTk0000TkTkTk00 | Vampire Dragon&#xA;12cv&amp;md39MJ0G3kw11110kHX2xx0;mJtV0.4;m3TGV0.w:00fc02h000Jfhh00J0c41JJ40000J?~40000J?00-00NPJ?sg4Nsg~44Nsg8N4Nsg004N~40000f8PP0000sg00000000~400008Nsg00sg00000000~400008Nsg00sg000000008N00jL008NTk0000Tk8Nsg00sgTk0000Tk8Nsg008N000000TkJdsg00 | Black Hole Dragon&#xA;12cd8m051J00000t000000QJ01w0000H41p6&amp;J6nv41r8:003c00JS4w0c003468D20c0J00J5xXxX0000xX44G&amp;9!xX~r~rf8PPPPf8PPPPf8PP00f8PP0000f8PP00J5J5xX0000J544000044PP00J5xX0000J544000044PP00J5xX0000J5J59!c&amp;4444Tk0000Tkf8PP4444Tk0000Tkf8PPJ5xXxX00004444Tk00 | Midnight Carp Dragon&#xA;110c:-0M4J00S600000000Pr00K08009B000hm009B040z053D0N00000000000000000000y,Ddp40000Y04000Y2JLP5%~Dd40PPDd8JPPf8PP00f8PP0000f8PP00y,Y2Nx0000Y0zD0000DJp400Y2Nx0000Y0zD0000DJp400Y2Nx0000Y0f8PPPPy,,8Y20000Nxf8PPy,,8Y20000Nxf8PPppTkTk0000TkTkTk00 | Giraffe Dragon&#xA;1106JN0545S0J40200030f52008080J5D000Nw005D0409w13d0000000000000000000000.R43Jf0000Tk436%%%x5l%~f8PPPP~R~6PPJfNf00NfJf0000f8PP00DKDKDK0000TkzD0000JfPP00DKDK0000TkzD0000JfPP00DKDK0000Tkf8PPPPDK%%.R0000,D80PPDK.R,D0000DK80PPppTkTk0000TkTkTk00 | Human Dragon&#xA;11cc8XK39JS0D34B03030fPX2xn80cS000120004c004J;05Mh0Pk01:M0!D00J0c471yJ00ZhRcRc0000RcRcRcRcx5l%~vlRcRcRcPPRcf8PP00RcRc0000f8PP00VKTkTk0000TkDh0000ZhRc00TkTk0000TkDh0000ZhRc00TkTk0000TkVKPPRcVKZhZh0000RcRcRcVKZhZh0000RcRcRcZhDhRc0000RcTkvl00 | Radioactive Dragon&#xA;110v&amp;Ndv5MSfP5JZ01210f221S;09m1F0064-00TF0048xJ1c7020000LwccL0N0m010J000c0DLc00000DLDzr0r0DPJg,DDLPPDLc0c0DLP00DLPP0000DLP00c0DLTk0000TkP0000DLP00DLTk0000TkP0000DLP00DLTk0000TkDLPPPc0DLw00000,DDLPc0DLDL0000,DDLPppTkTk0000TkTkTk00 | Satan Dragon&#xA;10cs&amp;Sdv43039fVv30300f9X1rd0880FG0m4-:2dFG0rNB030m0D00000000000000000000FZfs8M00008M%:FZFZx5l%~fs%%PPFZfsPPfs%%00f8PP0000f8PP00FZFZFZ0000fsfs0000FZfs00FZFZ0000fsfs0000FZfs00FZFZ0000fsFZPPfszZ%%FZ0000fsf8PPzZ%%FZ0000fsf8PPppTkTk0000TkTkTk00 | Snow Dragon&#xA;11cc:JwhC0S0006.03030pHB04!c0c9t0004:001G0050:J0Md01V&amp;08d0000000080000009PL8L80000TkL8L8L89PL8Ph9PL8Ph9PPPL8f8PP009PL80000f8PP009PL8Tk0000TkzD00009PF.00L8Tk0000TkzD00009PF.00L8Tk0000TkYPhPP9PL8Ph0000Tk9PL89PL8Ph0000Tk9PL89PPhPh0000TkL8Ph00 | Cthulu Dragon&#xA;11cc:JwhC0S0006.03030pHB04!c0c9t0054:00PG0050:J0Md01V&amp;08d000000008000000PhL8L80000TkL8L8L89PL8PhPh9PPhPhPP9Pf8PP009PL80000f8PP00PhYTk0000TkY00009PF.00YTk0000TkY00009PF.00YTk0000TkYPhPPPh9PL80000Tk9PL8Ph9PL80000Tk9PL8PhL8L80000TkL8Ph00 | Cthulu Dragon - Alt Color&#xA;110h:SJK4J81Ggm010100f2S10-c1001G0144:051G041;c17k0400000000000000000000~FhR0d0000~F0d~.0dN:hR~.hRhRPPhRPPhRhRhR00hRPP0000f8PP000d~FhR0000N:N:0000hRhR00~FhR0000N:N:0000hRhR00~FhR0000N:~.PPPP0d~.~F0000~.f8PP0d~.~F0000~.f8PPppTkTk0000TkTkTk00 | Suzie Dragon&#xA;110jN8c080S1Ggm010100f7k08J00800B0k00m2S0B0h0p0B060N000000000000000000004Pb~b~00004P00%000T&amp;:9zv4PPPPP4PPPPP03PP004PPP0000f8PP004PT&amp;030000:9zv00004PPP00T&amp;030000:9zv00004PPP00T&amp;030000:9f8PPPP4Pzvzv0000b~f8PP0303zv0000T&amp;f8PPppTkTk0000TkTkTk00 | Kris Dragon&#xA;110c8hK1NJ1Ggrp12120fQN1fN008J0V0641m0T0V05J&amp;01gw0600000000000000000000XMFlJ70000J7J7KxKxJ7XMKxJ7XMKxf8PPPPJ7XM00J7XM0000f8PP00XMJ7J70000KxKx0000J7XM00J7J70000KxKx0000J7XM00J7J70000KxJ7XMXMXMJ7Fl0000KxJ7XMXMJ7Fl0000KxJ7XMXMTkTk0000TkTkTk00 | 4 Color Dragon&#xA;120smJcg1MJ1Kh0410100fPQ0Mn008JG00K4:015G00QN!013m04lN4c0000000000000000?FDD0000DD?FDD?F?FD?FPPf8PPPPD?F00D?F0000f8PP00D?FD0000?F?F0000D?F00?FD0000?F?F0000D?F00?FD0000?FD?F?F?FDD0000?Ff8PP?FDD0000?Ff8PPD?FD0000DTk?F00 | 2 Color Dragon - Black and White&#xA;1105JJJc8403J4S213230f941w04:80GG004::01GG040;w1gl0600000000000000000000!!!nJJ0000!n00jf%~x5l%~JJPPSdJJSdPPJJSd00f8PP0000f8PP00!!x.JJ0000Sd!n0000JJSd00x.JJ0000Sd!n0000JJSd00x.JJ0000Sdf8PPPP!!jNx.0000?tJJSd!!jNx.0000?tJJSd!!TkTk0000TkTkTk00 | Human Dragon - Mark 2&#xA;`]]&gt;</description>
      <content:encoded><![CDATA[<p>Here&#39;s a cool <a href="https://dragonita.itch.io/dragon-creator" rel="nofollow">dragon creator</a> on itch.io</p>

<p>This page will be updated a lot in the future as I make more dragons, or like, find more dragon creators.</p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/4/2026/02/68e8ed19-849e-4a.png" alt="Vampire Dragon.png">
<img src="https://l8b5.c11.e2-2.dev/writemedia/4/2026/02/2f45cc53-a5be-45.png" alt="Black Hole Dragon.png">
<img src="https://l8b5.c11.e2-2.dev/writemedia/4/2026/02/5af966d3-5532-4f.png" alt="Midnight Carp Dragon.png">
<img src="https://l8b5.c11.e2-2.dev/writemedia/4/2026/02/c84e5a4c-20bd-42.png" alt="Giraffe Dragon.png"></p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/4/2026/02/63d26741-63d6-49.png" alt="Human Dragon.png"></p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/4/2026/02/53921810-d6ad-4e.png" alt="Radioactive Dragon.png"></p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/4/2026/02/520fcb52-9aca-44.png" alt="Satan Dragon.png"></p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/4/2026/02/25dd9b23-d8b6-49.png" alt="Snow Dragon.png"></p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/4/2026/02/af02e8e3-35b8-45.png" alt="Cthulu Dragon.png"></p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/4/2026/02/12986e32-9be5-41.png" alt="Cthulu Dragon - Alt Color.png"></p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/4/2026/02/b03ef552-79ad-47.png" alt="Suzie Dragon.png"></p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/4/2026/02/11fc9b43-17b0-4d.png" alt="Kris Dragon.png"></p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/4/2026/02/755991b4-e053-48.png" alt="4 Color Dragon.png"></p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/4/2026/02/f79ae0ae-1f5a-43.png" alt="2 Color Dragon - Black and White.png"></p>

<p><img src="https://l8b5.c11.e2-2.dev/writemedia/4/2026/02/077c14d5-0340-4c.png" alt="Human Dragon - Mark 2.png"></p>

<hr>

<p>and here&#39;s the code for these designs:</p>

<pre><code>110q&amp;Nw04J00000200000f0000c08D000068000V00040J001000000000000000000000008gTkTk0000Tk00%%XLX-X_zDzDPPPPD-K5D-8fPP00f8PP0000f8PP008gTkTk0000TkD-0000f8PP00TkTk0000TkD-0000f8PP00TkTk0000TkD-PPPP8gTkTk0000Tkf8XL8gTkTk0000Tkf8XLppTkTk0000TkTkTk00 | Vampire Dragon
12cv&amp;md39MJ0G3kw11110kHX2xx0;mJtV0.4;m3TGV0.w:00fc02h000Jfhh00J0c41JJ40000J?~40000J?00_-00NPJ?sg4Nsg~44Nsg8N4Nsg004N~40000f8PP0000sg00000000~400008Nsg00sg00000000~400008Nsg00sg000000008N00jL008NTk0000Tk8Nsg00sgTk0000Tk8Nsg008N000000TkJdsg00 | Black Hole Dragon
12cd8m051J00000t000000QJ01w0000H41p6&amp;J6nv41r8:003c00JS4w0c003468D20c0J00J5xXxX0000xX44G&amp;9!xX~r~rf8PPPPf8PPPPf8PP00f8PP0000f8PP00J5J5xX0000J544000044PP00J5xX0000J544000044PP00J5xX0000J5J59!c&amp;4444Tk0000Tkf8PP4444Tk0000Tkf8PPJ5xXxX00004444Tk00 | Midnight Carp Dragon
110c:-0M4J00S600000000Pr00K08009B000hm009B040z053D0N00000000000000000000y,Ddp40000Y04000Y2JLP5%~Dd40PPDd8JPPf8PP00f8PP0000f8PP00y,Y2Nx0000Y0zD0000DJp400Y2Nx0000Y0zD0000DJp400Y2Nx0000Y0f8PPPPy,,8Y20000Nxf8PPy,,8Y20000Nxf8PPppTkTk0000TkTkTk00 | Giraffe Dragon
1106JN0545S0J40200030f52008080J5D000Nw005D0409w13d0000000000000000000000.R43Jf0000Tk436%%%x5_l%~f8PPPP~R~6PPJfNf00NfJf0000f8PP00DKDKDK0000TkzD0000JfPP00DKDK0000TkzD0000JfPP00DKDK0000Tkf8PPPPDK%%.R0000,D80PPDK.R,D0000DK80PPppTkTk0000TkTkTk00 | Human Dragon
11cc8XK39JS0D34B03030fPX2xn80cS000120004c004J;05Mh0Pk01:M0!D00J0c471yJ00ZhRcRc0000RcRcRcRcx5_l%~vlRcRcRcPPRcf8PP00RcRc0000f8PP00VKTkTk0000TkDh0000ZhRc00TkTk0000TkDh0000ZhRc00TkTk0000TkVKPPRcVKZhZh0000RcRcRcVKZhZh0000RcRcRcZhDhRc0000RcTkvl00 | Radioactive Dragon
110v&amp;Ndv5MSfP5JZ01210f221S;09m1F0064-00TF0048xJ1c7020000LwccL0N0m010J000c0DLc00000DLDzr0r0DPJg,DDL_P_PDLc0c0DL_P00DLPP0000DL_P00c0DLTk0000Tk_P0000DL_P00DLTk0000Tk_P0000DL_P00DLTk0000TkDLPP_Pc0DLw00000,DDL_Pc0DLDL0000,DDL_PppTkTk0000TkTkTk00 | Satan Dragon
10cs&amp;Sdv43039fVv30300f9X1rd0880FG0m4-:2dFG0rNB030m0D00000000000000000000FZfs8M00008M%:FZFZx5_l%~fs%%PPFZfsPPfs%%00f8PP0000f8PP00FZFZFZ0000fsfs0000FZfs00FZFZ0000fsfs0000FZfs00FZFZ0000fsFZPPfszZ%%FZ0000fsf8PPzZ%%FZ0000fsf8PPppTkTk0000TkTkTk00 | Snow Dragon
11cc:JwhC0S0006.03030pHB04!c0c9t0004:001G0050:J0Md01V&amp;08d0000000080000009PL8L80000TkL8L8L89PL8Ph9PL8Ph9PPPL8f8PP009PL80000f8PP009PL8Tk0000TkzD00009PF.00L8Tk0000TkzD00009PF.00L8Tk0000TkY_PhPP9PL8Ph0000Tk9PL89PL8Ph0000Tk9PL89PPhPh0000TkL8Ph00 | Cthulu Dragon
11cc:JwhC0S0006.03030pHB04!c0c9t0054:00PG0050:J0Md01V&amp;08d000000008000000PhL8L80000TkL8L8L89PL8PhPh9PPhPhPP9Pf8PP009PL80000f8PP00PhY_Tk0000TkY_00009PF.00Y_Tk0000TkY_00009PF.00Y_Tk0000TkY_PhPPPh9PL80000Tk9PL8Ph9PL80000Tk9PL8PhL8L80000TkL8Ph00 | Cthulu Dragon - Alt Color
110h:SJK4J81Ggm010100f2S10-c1001G0144:051G041;c17k0400000000000000000000~FhR0d0000~F0d~.0dN:hR~.hRhRPPhRPPhRhRhR00hRPP0000f8PP000d~FhR0000N:N:0000hRhR00~FhR0000N:N:0000hRhR00~FhR0000N:~.PPPP0d~.~F0000~.f8PP0d~.~F0000~.f8PPppTkTk0000TkTkTk00 | Suzie Dragon
110jN8c080S1Ggm010100f7k08J00800B0k00m2S0B0h0p0B060N000000000000000000004Pb~b~00004P00%000T&amp;:9zv4PPPPP4PPPPP03PP004PPP0000f8PP004PT&amp;030000:9zv00004PPP00T&amp;030000:9zv00004PPP00T&amp;030000:9f8PPPP4Pzvzv0000b~f8PP0303zv0000T&amp;f8PPppTkTk0000TkTkTk00 | Kris Dragon
110c8hK_1NJ1Ggrp12120fQN1fN008J0V0641m0T0V05J&amp;01gw0600000000000000000000XMFlJ70000J7J7KxKxJ7XMKxJ7XMKxf8PPPPJ7XM00J7XM0000f8PP00XMJ7J70000KxKx0000J7XM00J7J70000KxKx0000J7XM00J7J70000KxJ7XMXMXMJ7Fl0000KxJ7XMXMJ7Fl0000KxJ7XMXMTkTk0000TkTkTk00 | 4 Color Dragon
120smJcg1MJ1Kh0410100fPQ0Mn008JG00K4:015G00QN!013m04lN4c0000000000000000?FD_D_0000D_D_?FD_D_?F?FD_?FPPf8PPPPD_?F00D_?F0000f8PP00D_?FD_0000?F?F0000D_?F00?FD_0000?F?F0000D_?F00?FD_0000?FD_?F?F?FD_D_0000?Ff8PP?FD_D_0000?Ff8PPD_?FD_0000D_Tk?F00 | 2 Color Dragon - Black and White
1105JJJc8403J4S213230f941w04:80GG004::01GG040;w1gl0600000000000000000000!!!nJJ0000!n00jf%~x5_l%~JJPPSdJJSdPPJJSd00f8PP0000f8PP00!!x.JJ0000Sd!n0000JJSd00x.JJ0000Sd!n0000JJSd00x.JJ0000Sdf8PPPP!!jNx.0000?tJJSd!!jNx.0000?tJJSd!!TkTk0000TkTkTk00 | Human Dragon - Mark 2
</code></pre>
]]></content:encoded>
      <author>reilyh</author>
      <guid>https://pen.blahaj.zone/read/a/3bqbqi0k0t</guid>
      <pubDate>Sat, 14 Feb 2026 21:47:05 +0000</pubDate>
    </item>
    <item>
      <title>Hello world! This looks so fucking awesome~✨✨✨✨</title>
      <link>https://pen.blahaj.zone/reilyh/hello-world-this-looks-so-fucking-awesome</link>
      <description>&lt;![CDATA[Hello world! This looks so fucking awesome~✨✨✨✨]]&gt;</description>
      <content:encoded><![CDATA[<p>Hello world! This looks so fucking awesome~✨✨✨✨</p>
]]></content:encoded>
      <author>reilyh</author>
      <guid>https://pen.blahaj.zone/read/a/d2vck69urh</guid>
      <pubDate>Fri, 13 Feb 2026 18:35:11 +0000</pubDate>
    </item>
    <item>
      <title>Installing a Patroni cluster on Ubuntu</title>
      <link>https://pen.blahaj.zone/supakaity/installing-a-patroni-cluster-on-ubuntu</link>
      <description>&lt;![CDATA[So I&#39;ve recently been quizzed on the exact process I use to install our Postgres cluster, and after telling everyone how easy it was, I was asked to explain the process.&#xA;&#xA;It&#39;s not procrastination, it&#39;s something else... I swear!&#xA;Unfortunately I just have a bunch of embarrassing text files full of commands to run, so I decided it&#39;s about time I document it.&#xA;Perfect opportunity to install that federated personal blog I&#39;ve been thinking about for 6 months!&#xA;Except it doesn&#39;t work quite the way I want it to and doesn&#39;t support images or profile avatars...&#xA;Perfect opportunity to write an image hosting service that I can integrate with the blog software!&#xA;Except it doesn&#39;t count likes or show replies with my post...&#xA;Perfect opportunity to add the bits and pieces needed to track federated likes and replies!&#xA;Except now how do I let people who are seeing my blog post make likes and replies on their home instances?&#xA;Perfect opportunity to research URI scheme protocol handlers and redirector sites!&#xA;Except none of them work how I want them to work...&#xA;Perfect opportunity to design a new way to implement the draft protocol as a proof of concept/bootstrap project!&#xA;Except I promised to finish this article on the Patroni cluster thing by tonight.&#xA;&#xA;Argh... it&#39;s tough living with my brain, I now have another 3 unfinished projects. I don&#39;t know how Ada puts up with it... she showed me this picture...&#xA;distracted.png&#xA;I hate that I resemble this so much.&#xA;&#xA;Okay, so installing Patroni is really easy, writing about it requires much more effort.&#xA;&#xA;What is Patroni?&#xA;This is a really good question and it gets to the heart of the matter.&#xA;Patroni is a Postgres cluster manager.&#xA;You give it a bunch of hosts and tell it to run a Postgres cluster on them, and it manages the whole thing. Kinda like how a RAID controller manages an array of (not-so-inexpensive) disks.&#xA;If there&#39;s no database there, it&#39;ll start it up, join the cluster, download a copy of the data, and begin replication.&#xA;If there&#39;s a database there but it gets wrecked, it&#39;ll automatically rebuild it for you.&#xA;We&#39;ll also install useful other bits of software like HAProxy which points a certain port at the current primary and another port at the secondary.&#xA;If you&#39;ve ever had the joy of using any of the many Kubernetes operators for Postgres, it&#39;s like that, but for bare metal. When you&#39;re working on a budget, sometimes you can&#39;t afford the overhead of Kubernetes. If this was a project for a client, I&#39;d probably steer them towards the self-healing nature of a Kubernetes cluster + operator.&#xA;&#xA;Installing&#xA;I&#39;m going to take you through the process of setting up a brand new cluster of 3 servers.&#xA;I&#39;ve got these servers on an internal network:&#xA;db-cluster-1 10.19.96.3&#xA;db-cluster-2 10.19.96.4&#xA;db-cluster-3 10.19.96.5&#xA;&#xA;Run on all 3 hosts:&#xA;&#xA;As we&#39;re running Ubuntu, I&#39;m going to do a quick upgrade on them to get all the latest updates first.&#xA;apt update &amp;&amp; apt upgrade -y &amp;&amp; reboot&#xA;&#xA;Now it&#39;s time to make sure all the hosts know how to contact each other, even if/when DNS goes down.&#xA;&#xA;cat &lt;EOF   /etc/hosts&#xA;&#xA;Database hosts&#xA;10.19.96.3 db-cluster-1&#xA;10.19.96.4 db-cluster-2&#xA;10.19.96.5 db-cluster-3&#xA;EOF&#xA;&#xA;for i in 1 2 3; do&#xA;  ping -c 1 db-cluster-$i&#xA;done&#xA;&#xA;If you&#39;re running a firewall (hopefully you are), let&#39;s open up some ports well need:&#xA;for p in 2379 2380 8008; do&#xA;  ufw allow in proto tcp from 10.19.96.0/20 to any port $p&#xA;done&#xA;for p in 5000 5001; do&#xA;  ufw allow in proto tcp from any to any port $p&#xA;done&#xA;ufw status&#xA;NOTE: If you&#39;re putting a load balancer in front, you&#39;ll probably want to lock down the port 5000/5001 to just it, or otherwise just your application&#39;s network. &#xA;&#xA;Let&#39;s now get Percona rocking. Percona is a Postgres database with extra optimizations, this is what we will control with our Patroni controller to turn into a cluster.&#xA;&#xA;curl -O https://repo.percona.com/apt/percona-releaselatest.genericall.deb&#xA;apt install -y gnupg2 lsb-release ./percona-releaselatest.genericall.deb&#xA;apt update&#xA;percona-release setup ppg-16&#xA;&#xA;Now it&#39;s time to install our HAProxy software and configure it. This config will setup a proxy with 3 ports, the stats at port 7000, the primary at port 5000 and the standbys at port 5001.&#xA;&#xA;The standbys will use the health check on http://localhost:8008/replica which will return a 200 OK if that server is currently a replica node.&#xA;&#xA;If there are no replicas available, then it falls back to any available node (even the primary) to service standby nodes as a fail safe so your applications that are configured to talk to a read node don&#39;t get locked out.&#xA;&#xA;apt install -y percona-haproxy&#xA;cat &lt;EOF  /etc/haproxy/haproxy.cfg&#xA;global&#xA;    maxconn 500&#xA;&#xA;defaults&#xA;    log global&#xA;    mode tcp&#xA;    retries 2&#xA;    timeout client 30m&#xA;    timeout connect 4s&#xA;    timeout server 30m&#xA;    timeout check 5s&#xA;&#xA;listen stats&#xA;    mode http&#xA;    bind :7000&#xA;    stats enable&#xA;    stats uri /&#xA;&#xA;listen primary&#xA;    bind :5000&#xA;    option httpchk /primary&#xA;    http-check expect status 200&#xA;    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions&#xA;    server db-cluster-1 db-cluster-1:5432 maxconn 500 check port 8008&#xA;    server db-cluster-2 db-cluster-2:5432 maxconn 500 check port 8008&#xA;    server db-cluster-3 db-cluster-3:5432 maxconn 500 check port 8008&#xA;&#xA;listen standbys&#xA;    balance roundrobin&#xA;    bind *:5001&#xA;    option httpchk /replica&#xA;    http-check expect status 200&#xA;    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions&#xA;    server db-cluster-1 db-cluster-1:5432 maxconn 500 check port 8008&#xA;    server db-cluster-2 db-cluster-2:5432 maxconn 500 check port 8008&#xA;    server db-cluster-3 db-cluster-3:5432 maxconn 500 check port 8008&#xA;    server db-cluster-1-standby db-cluster-1:5432 maxconn 500 backup&#xA;    server db-cluster-2-standby db-cluster-2:5432 maxconn 500 backup&#xA;    server db-cluster-3-standby db-cluster-3:5432 maxconn 500 backup&#xA;EOF&#xA;systemctl restart haproxy&#xA;&#xA;Now we&#39;re going to install all the fun bits, and immediately disable them since they&#39;ll need some configuring first.&#xA;&#xA;apt install -y percona-patroni etcd etcd-server etcd-client percona-pgbackrest&#xA;systemctl stop {etcd,patroni,postgresql}&#xA;systemctl disable {etcd,patroni,postgresql}&#xA;&#xA;Also we&#39;ll remove the existing (default) Postgres folder... if this is a new server this should not be a problem, if you&#39;ve got an existing Postgres installed, what the hell are you thinking testing on this server!?&#xA;&#xA;rm -rf /var/lib/postgresql/15/main&#xA;&#xA;We need some token/passwords, so lets generate them now on any machine (even your own) run the following command (once):&#xA;&#xA;cat &lt;&lt;EOF&#xA;&#xA;Run these commands on each server&#xA;export DATADIR=/opt/data&#xA;export ETCDTOKEN=$(openssl rand -hex 16)&#xA;export REPLICATORPASS=$(openssl rand -hex 16)&#xA;export SUPERUSERPASS=$(openssl rand -hex 16)&#xA;export HOST=\$(hostname -s)&#xA;export INTERNALIP=\$(getent hosts \$(hostname -s) | grep -v &#39;^127.0.&#39; | cut -d \  -f 1)&#xA;echo &#34;I am \$HOST at \$INTERNALIP (please check)&#34;&#xA;EOF&#xA;&#xA;Copy the output of that and run it on all 3 servers.&#xA;&#xA;We need to create a Patroni config now so our servers will be able to start up later:&#xA;&#xA;cat &lt;EOF  /etc/patroni/patroni.yml&#xA;namespace: mycompany&#xA;scope: db-cluster&#xA;name: ${HOST}&#xA;&#xA;restapi:&#xA;    listen: 0.0.0.0:8008&#xA;    connectaddress: ${INTERNALIP}:8008&#xA;&#xA;etcd3:&#xA;    host: ${INTERNALIP}:2379&#xA;&#xA;bootstrap:&#xA;  # this section will be written into Etcd:/namespace/scope/config after initializing new cluster&#xA;  dcs:&#xA;      ttl: 30&#xA;      loopwait: 10&#xA;      retrytimeout: 10&#xA;      maximumlagonfailover: 1048576&#xA;&#xA;      postgresql:&#xA;          usepgrewind: true&#xA;          useslots: true&#xA;          parameters:&#xA;              wallevel: replica&#xA;              hotstandby: &#34;on&#34;&#xA;              walkeepsegments: 10&#xA;              maxwalsenders: 5&#xA;              maxreplicationslots: 10&#xA;              walloghints: &#34;on&#34;&#xA;              loggingcollector: &#39;on&#39;&#xA;              maxwalsize: &#39;10GB&#39;&#xA;              archivemode: &#34;on&#34;&#xA;              archivetimeout: 600s&#xA;              archivecommand: &#34;cp -f %p ${DATADIR}/archived/%f&#34;&#xA;&#xA;      recoveryconf:&#xA;            restorecommand: cp ${DATADIR}/archived/%f %p&#xA;&#xA;  # some desired options for &#39;initdb&#39;&#xA;  initdb: # Note: It needs to be a list (some options need values, others are switches)&#xA;      encoding: UTF8&#xA;      locale: enUS.UTF-8&#xA;      data-checksums&#xA;&#xA;postgresql:&#xA;    clustername: cluster1&#xA;    listen: 0.0.0.0:5432&#xA;    connectaddress: ${INTERNALIP}:5432&#xA;    datadir: ${DATADIR}/pg&#xA;    bindir: /usr/lib/postgresql/16/bin&#xA;    pgpass: /tmp/pgpass&#xA;    authentication:&#xA;        replication:&#xA;            username: replicator&#xA;            password: ${REPLICATORPASS}&#xA;        superuser:&#xA;            username: postgres&#xA;            password: ${SUPERUSERPASS}&#xA;    parameters:&#xA;        unixsocketdirectories: &#34;/var/run/postgresql/&#34;&#xA;    createreplicamethods:&#xA;        basebackup&#xA;    basebackup:&#xA;        checkpoint: &#39;fast&#39;&#xA;&#xA;    pghba:&#xA;      local all all  peer&#xA;      local replication all  peer&#xA;      host replication replicator 127.0.0.1/32 trust&#xA;      host replication replicator 0.0.0.0/0 scram-sha-256&#xA;      host all all 0.0.0.0/0 scram-sha-256&#xA;      host all all ::0/0 scram-sha-256&#xA;&#xA;    watchdog:&#xA;      mode: required # Allowed values: off, automatic, required&#xA;      device: /dev/watchdog&#xA;      safetymargin: 5&#xA;&#xA;tags:&#xA;    nofailover: false&#xA;    noloadbalance: false&#xA;    clonefrom: true&#xA;    nosync: false&#xA;EOF&#xA;&#xA;And we want to add a service to prep watchdog etc for Patroni.&#xA;&#xA;cat &lt;EOF  /etc/systemd/system/patroni-prep.service&#xA;[Unit]&#xA;Description=Prepare system for Patroni (softdog, watchdog, postgresql dirs)&#xA;Before=patroni.service&#xA;DefaultDependencies=no&#xA;After=local-fs.target&#xA;&#xA;[Service]&#xA;Type=oneshot&#xA;RemainAfterExit=yes&#xA;ExecStart=/bin/bash -c &#39;/usr/sbin/modprobe softdog; chown postgres /dev/watchdog; mkdir -p /var/run/postgresql; chown postgres /var/run/postgresql&#39;&#xA;&#xA;[Install]&#xA;WantedBy=multi-user.target&#xA;EOF&#xA;systemctl daemon-reload&#xA;systemctl enable patroni-prep&#xA;&#xA;One host at a time now:&#xA;&#xA;Up until now, we&#39;ve been running commands on all hosts (possibly in parallel), but now we&#39;re getting to the bootstrap part where things start deviating.&#xA;&#xA;db-cluster-1&#xA;&#xA;This is our seed server that will initialize and create our cluster. We want to initialize our etcd server here:&#xA;&#xA;cat &lt;EOF  /etc/etcd/etcd.conf.yaml&#xA;name: &#39;db-cluster-1&#39;&#xA;initial-cluster-token: ${ETCDTOKEN}&#xA;initial-cluster-state: new&#xA;initial-cluster: db-cluster-1=http://db-cluster-1:2380&#xA;data-dir: /var/lib/etcd&#xA;initial-advertise-peer-urls: http://db-cluster-1:2380&#xA;listen-peer-urls: http://0.0.0.0:2380&#xA;advertise-client-urls: http://db-cluster-1:2379&#xA;listen-client-urls: http://0.0.0.0:2379&#xA;&#xA;Storage quota (8GB = 8589934592 bytes)&#xA;quota-backend-bytes: 8589934592&#xA;&#xA;Enable automatic compaction every hour&#xA;auto-compaction-mode: periodic&#xA;auto-compaction-retention: &#34;1h&#34;&#xA;auto-defrag-interval: &#34;24h&#34;&#xA;EOF&#xA;sudo systemctl enable --now etcd&#xA;&#xA;After a few seconds lets run these 2 commands:&#xA;&#xA;etcdctl member list -w table&#xA;etcdctl endpoint status -w table&#xA;&#xA;You should see something like this (one member, and it&#39;s the leader):&#xA;root@db-cluster-1:~# etcdctl member list -w fields&#xA;&#34;ClusterID&#34; : 8919193014159237326&#xA;&#34;MemberID&#34; : 17956751917787781469&#xA;&#34;Revision&#34; : 0&#xA;&#34;RaftTerm&#34; : 2&#xA;&#34;ID&#34; : 17956751917787781469&#xA;&#34;Name&#34; : &#34;db-cluster-1&#34;&#xA;&#34;PeerURL&#34; : &#34;http://db-cluster-1:2380&#34;&#xA;&#34;ClientURL&#34; : &#34;http://db-cluster-1:2379&#34;&#xA;&#34;IsLearner&#34; : false&#xA;&#xA;root@db-cluster-1:~# etcdctl endpoint status -w fields&#xA;&#34;ClusterID&#34; : 8919193014159237326&#xA;&#34;MemberID&#34; : 17956751917787781469&#xA;&#34;Revision&#34; : 1&#xA;&#34;RaftTerm&#34; : 2&#xA;&#34;Version&#34; : &#34;3.5.24&#34;&#xA;&#34;DBSize&#34; : 20480&#xA;&#34;Leader&#34; : 17956751917787781469&#xA;&#34;IsLearner&#34; : false&#xA;&#34;RaftIndex&#34; : 4&#xA;&#34;RaftTerm&#34; : 2&#xA;&#34;RaftAppliedIndex&#34; : 4&#xA;&#34;Errors&#34; : []&#xA;&#34;Endpoint&#34; : &#34;127.0.0.1:2379&#34;&#xA;&#xA;We&#39;re now going to add our next member to this cluster so when they start up, the server will know them.&#xA;&#xA;etcdctl member add db-cluster-2 --peer-urls=http://db-cluster-2:2380&#xA;&#xA;db-cluster-2&#xA;&#xA;Lets now join our second etcd to this cluster...&#xA;&#xA;cat &lt;EOF  /etc/etcd/etcd.conf.yaml&#xA;name: &#39;db-cluster-2&#39;&#xA;initial-cluster-token: ${ETCDTOKEN}&#xA;initial-cluster-state: existing&#xA;initial-cluster: db-cluster-1=http://db-cluster-1:2380,db-cluster-2=http://db-cluster-2:2380&#xA;data-dir: /var/lib/etcd&#xA;initial-advertise-peer-urls: http://db-cluster-2:2380&#xA;listen-peer-urls: http://0.0.0.0:2380&#xA;advertise-client-urls: http://db-cluster-2:2379&#xA;listen-client-urls: http://0.0.0.0:2379&#xA;&#xA;Storage quota (8GB = 8589934592 bytes)&#xA;quota-backend-bytes: 8589934592&#xA;&#xA;Enable automatic compaction every hour&#xA;auto-compaction-mode: periodic&#xA;auto-compaction-retention: &#34;1h&#34;&#xA;auto-defrag-interval: &#34;24h&#34;&#xA;EOF&#xA;sudo systemctl enable --now etcd&#xA;&#xA;After a few seconds lets run these 2 commands:&#xA;&#xA;etcdctl member list -w table&#xA;etcdctl endpoint status -w table&#xA;&#xA;You should now see that there&#39;s 2 members, and presumably you&#39;re not the leader.&#xA;&#xA;We&#39;re now going to add our final member to this cluster, from db-cluster-2&#xA;&#xA;etcdctl member add db-cluster-3 --peer-urls=http://db-cluster-3:2380&#xA;&#xA;db-cluster-3&#xA;&#xA;Lets now join our third etcd to this cluster...&#xA;&#xA;cat &lt;EOF  /etc/etcd/etcd.conf.yaml&#xA;name: &#39;db-cluster-3&#39;&#xA;initial-cluster-token: ${ETCDTOKEN}&#xA;initial-cluster-state: existing&#xA;initial-cluster: db-cluster-1=http://db-cluster-1:2380,db-cluster-2=http://db-cluster-2:2380,db-cluster-3=http://db-cluster-3:2380&#xA;data-dir: /var/lib/etcd&#xA;initial-advertise-peer-urls: http://db-cluster-3:2380&#xA;listen-peer-urls: http://0.0.0.0:2380&#xA;advertise-client-urls: http://db-cluster-3:2379&#xA;listen-client-urls: http://0.0.0.0:2379&#xA;&#xA;Storage quota (8GB = 8589934592 bytes)&#xA;quota-backend-bytes: 8589934592&#xA;&#xA;Enable automatic compaction every hour&#xA;auto-compaction-mode: periodic&#xA;auto-compaction-retention: &#34;1h&#34;&#xA;auto-defrag-interval: &#34;24h&#34;&#xA;EOF&#xA;sudo systemctl enable --now etcd&#xA;&#xA;After a few seconds lets run these 2 commands:&#xA;&#xA;etcdctl member list -w table&#xA;etcdctl endpoint status -w table&#xA;&#xA;By this stage you should know what to expect.&#xA;&#xA;db-cluster-1&#xA;&#xA;Back on the first node, it&#39;s time to start up the very first Patroni instance (This will initialize the base database tables etc, and make the server the stand-alone primary).&#xA;&#xA;mkdir -p ${DATADIR}/archived&#xA;chown -R postgres:postgres ${DATADIR}&#xA;systemctl enable --now patroni&#xA;journalctl -f -u patroni&#xA;&#xA;Wait for journal to say something like no action. I am (db-cluster-1), the leader with the lock, then exit and run the following command:&#xA;&#xA;patronictl -c /etc/patroni/patroni.yml list&#xA;&#xA;You should get something that looks like:&#xA;Cluster: db-cluster (7593587474928070257) ---+----+-------------+-----+------------+-----+&#xA;| Member       | Host       | Role   | State   | TL | Receive LSN | Lag | Replay LSN | Lag |&#xA;+--------------+------------+--------+---------+----+-------------+-----+------------+-----+&#xA;| db-cluster-1 | 10.19.96.3 | Leader | running |  1 |             |     |            |     |&#xA;+--------------+------------+--------+---------+----+-------------+-----+------------+-----+&#xA;&#xA;db-cluster-2&#xA;&#xA;Run:&#xA;&#xA;mkdir -p ${DATADIR}/archived&#xA;chown -R postgres:postgres ${DATADIR}&#xA;systemctl enable --now patroni&#xA;journalctl -f -u patroni&#xA;&#xA;Wait for I am (db-cluster-2), a secondary, and following a leader. You can go back to the first server and watch patronictl list command to see progress.&#xA;&#xA;db-cluster-3&#xA;&#xA;Do the same as for db-cluster-2&#xA;&#xA;Testing the connection&#xA;&#xA;root@db-cluster-3:~# PGPASSWORD=$SUPERUSERPASS psql -h db-cluster-2 -p 5000  -U postgres \&#xA;  -c &#39;SELECT CURRENTUSER user, inetserveraddr() ip, inetserverport() port;&#39;&#xA;   user   |     ip     | port&#xA;----------+------------+------&#xA; postgres | 10.19.96.3 | 5432&#xA;(1 row)&#xA;&#xA;root@db-cluster-3:~# PGPASSWORD=$SUPERUSERPASS psql -h db-cluster-2 -p 5001  -U postgres \&#xA;  -c &#39;SELECT CURRENTUSER user, inetserveraddr() ip, inetserverport() port;&#39;&#xA;   user   |     ip     | port&#xA;----------+------------+------&#xA; postgres | 10.19.96.5 | 5432&#xA;(1 row)&#xA;&#xA;Job done&#xA;&#xA;That&#39;s pretty much it. From any server in the cluster you can manage the cluster using the patronictl command.]]&gt;</description>
      <content:encoded><![CDATA[<p>So I&#39;ve recently been quizzed on the exact process I use to install our Postgres cluster, and after telling everyone how easy it was, I was asked to explain the process.</p>

<h2 id="it-s-not-procrastination-it-s-something-else-i-swear">It&#39;s not procrastination, it&#39;s something else... I swear!</h2>

<p>Unfortunately I just have a bunch of embarrassing text files full of commands to run, so I decided it&#39;s about time I document it.
Perfect opportunity to install that federated personal blog I&#39;ve been thinking about for 6 months!
Except it doesn&#39;t work quite the way I want it to and doesn&#39;t support images or profile avatars...
Perfect opportunity to write an image hosting service that I can integrate with the blog software!
Except it doesn&#39;t count likes or show replies with my post...
Perfect opportunity to add the bits and pieces needed to track federated likes and replies!
Except now how do I let people who are seeing my blog post make likes and replies on their home instances?
Perfect opportunity to research URI scheme protocol handlers and redirector sites!
Except none of them work how I want them to work...
Perfect opportunity to design a new way to implement the draft protocol as a proof of concept/bootstrap project!
Except I promised to finish this article on the Patroni cluster thing by tonight.</p>

<p>Argh... it&#39;s tough living with my brain, I now have another 3 unfinished projects. I don&#39;t know how Ada puts up with it... she showed me this picture...
<img src="https://l8b5.c11.e2-2.dev/writemedia/2/2026/01/506631c6-b5b3-48.png" alt="distracted.png">
I hate that I resemble this so much.</p>

<p>Okay, so installing Patroni is really easy, writing about it requires much more effort.</p>

<h2 id="what-is-patroni">What is Patroni?</h2>

<p>This is a really good question and it gets to the heart of the matter.
Patroni is a Postgres cluster manager.
You give it a bunch of hosts and tell it to run a Postgres cluster on them, and it manages the whole thing. Kinda like how a RAID controller manages an array of (not-so-inexpensive) disks.
If there&#39;s no database there, it&#39;ll start it up, join the cluster, download a copy of the data, and begin replication.
If there&#39;s a database there but it gets wrecked, it&#39;ll automatically rebuild it for you.
We&#39;ll also install useful other bits of software like HAProxy which points a certain port at the current primary and another port at the secondary.
If you&#39;ve ever had the joy of using any of the many Kubernetes operators for Postgres, it&#39;s like that, but for bare metal. When you&#39;re working on a budget, sometimes you can&#39;t afford the overhead of Kubernetes. If this was a project for a client, I&#39;d probably steer them towards the self-healing nature of a Kubernetes cluster + operator.</p>

<h2 id="installing">Installing</h2>

<p>I&#39;m going to take you through the process of setting up a brand new cluster of 3 servers.
I&#39;ve got these servers on an internal network:
– db-cluster-1 10.19.96.3
– db-cluster-2 10.19.96.4
– db-cluster-3 10.19.96.5</p>

<h3 id="run-on-all-3-hosts">Run on all 3 hosts:</h3>

<p>As we&#39;re running Ubuntu, I&#39;m going to do a quick upgrade on them to get all the latest updates first.</p>

<pre><code class="language-bash">apt update &amp;&amp; apt upgrade -y &amp;&amp; reboot
</code></pre>

<p>Now it&#39;s time to make sure all the hosts know how to contact each other, even if/when DNS goes down.</p>

<pre><code class="language-bash">cat &lt;&lt;EOF &gt;&gt; /etc/hosts

# Database hosts
10.19.96.3 db-cluster-1
10.19.96.4 db-cluster-2
10.19.96.5 db-cluster-3
EOF

for i in 1 2 3; do
  ping -c 1 db-cluster-$i
done
</code></pre>

<p>If you&#39;re running a firewall (hopefully you are), let&#39;s open up some ports well need:</p>

<pre><code class="language-bash">for p in 2379 2380 8008; do
  ufw allow in proto tcp from 10.19.96.0/20 to any port $p
done
for p in 5000 5001; do
  ufw allow in proto tcp from any to any port $p
done
ufw status
</code></pre>

<p>NOTE: If you&#39;re putting a load balancer in front, you&#39;ll probably want to lock down the port 5000/5001 to just it, or otherwise just your application&#39;s network.</p>

<p>Let&#39;s now get Percona rocking. Percona is a Postgres database with extra optimizations, this is what we will control with our Patroni controller to turn into a cluster.</p>

<pre><code class="language-bash">curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb
apt install -y gnupg2 lsb-release ./percona-release_latest.generic_all.deb
apt update
percona-release setup ppg-16
</code></pre>

<p>Now it&#39;s time to install our HAProxy software and configure it. This config will setup a proxy with 3 ports, the stats at port 7000, the primary at port 5000 and the standbys at port 5001.</p>

<p>The standbys will use the health check on <a href="http://localhost:8008/replica" rel="nofollow">http://localhost:8008/replica</a> which will return a 200 OK if that server is currently a replica node.</p>

<p>If there are no replicas available, then it falls back to any available node (even the primary) to service standby nodes as a fail safe so your applications that are configured to talk to a read node don&#39;t get locked out.</p>

<pre><code class="language-bash">apt install -y percona-haproxy
cat &lt;&lt;EOF &gt; /etc/haproxy/haproxy.cfg
global
    maxconn 500

defaults
    log global
    mode tcp
    retries 2
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s

listen stats
    mode http
    bind *:7000
    stats enable
    stats uri /

listen primary
    bind *:5000
    option httpchk /primary
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server db-cluster-1 db-cluster-1:5432 maxconn 500 check port 8008
    server db-cluster-2 db-cluster-2:5432 maxconn 500 check port 8008
    server db-cluster-3 db-cluster-3:5432 maxconn 500 check port 8008

listen standbys
    balance roundrobin
    bind *:5001
    option httpchk /replica
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server db-cluster-1 db-cluster-1:5432 maxconn 500 check port 8008
    server db-cluster-2 db-cluster-2:5432 maxconn 500 check port 8008
    server db-cluster-3 db-cluster-3:5432 maxconn 500 check port 8008
    server db-cluster-1-standby db-cluster-1:5432 maxconn 500 backup
    server db-cluster-2-standby db-cluster-2:5432 maxconn 500 backup
    server db-cluster-3-standby db-cluster-3:5432 maxconn 500 backup
EOF
systemctl restart haproxy
</code></pre>

<p>Now we&#39;re going to install all the fun bits, and immediately disable them since they&#39;ll need some configuring first.</p>

<pre><code class="language-bash">apt install -y percona-patroni etcd etcd-server etcd-client percona-pgbackrest
systemctl stop {etcd,patroni,postgresql}
systemctl disable {etcd,patroni,postgresql}
</code></pre>

<p>Also we&#39;ll remove the existing (default) Postgres folder... if this is a new server this should not be a problem, if you&#39;ve got an existing Postgres installed, what the hell are you thinking testing on this server!?</p>

<pre><code class="language-bash">rm -rf /var/lib/postgresql/15/main
</code></pre>

<p>We need some token/passwords, so lets generate them now on any machine (even your own) run the following command (once):</p>

<pre><code class="language-bash">cat &lt;&lt;EOF

# Run these commands on each server
export DATA_DIR=/opt/data
export ETCD_TOKEN=$(openssl rand -hex 16)
export REPLICATOR_PASS=$(openssl rand -hex 16)
export SUPERUSER_PASS=$(openssl rand -hex 16)
export HOST=\$(hostname -s)
export INTERNAL_IP=\$(getent hosts \$(hostname -s) | grep -v &#39;^127.0.&#39; | cut -d \  -f 1)
echo &#34;I am \$HOST at \$INTERNAL_IP (please check)&#34;
EOF
</code></pre>

<p>Copy the output of that and run it on all 3 servers.</p>

<p>We need to create a Patroni config now so our servers will be able to start up later:</p>

<pre><code class="language-bash">cat &lt;&lt;EOF &gt; /etc/patroni/patroni.yml
namespace: mycompany
scope: db-cluster
name: ${HOST}

restapi:
    listen: 0.0.0.0:8008
    connect_address: ${INTERNAL_IP}:8008

etcd3:
    host: ${INTERNAL_IP}:2379

bootstrap:
  # this section will be written into Etcd:/&lt;namespace&gt;/&lt;scope&gt;/config after initializing new cluster
  dcs:
      ttl: 30
      loop_wait: 10
      retry_timeout: 10
      maximum_lag_on_failover: 1048576

      postgresql:
          use_pg_rewind: true
          use_slots: true
          parameters:
              wal_level: replica
              hot_standby: &#34;on&#34;
              wal_keep_segments: 10
              max_wal_senders: 5
              max_replication_slots: 10
              wal_log_hints: &#34;on&#34;
              logging_collector: &#39;on&#39;
              max_wal_size: &#39;10GB&#39;
              archive_mode: &#34;on&#34;
              archive_timeout: 600s
              archive_command: &#34;cp -f %p ${DATA_DIR}/archived/%f&#34;

      recovery_conf:
            restore_command: cp ${DATA_DIR}/archived/%f %p

  # some desired options for &#39;initdb&#39;
  initdb: # Note: It needs to be a list (some options need values, others are switches)
      - encoding: UTF8
      - locale: en_US.UTF-8
      - data-checksums

postgresql:
    cluster_name: cluster_1
    listen: 0.0.0.0:5432
    connect_address: ${INTERNAL_IP}:5432
    data_dir: ${DATA_DIR}/pg
    bin_dir: /usr/lib/postgresql/16/bin
    pgpass: /tmp/pgpass
    authentication:
        replication:
            username: replicator
            password: ${REPLICATOR_PASS}
        superuser:
            username: postgres
            password: ${SUPERUSER_PASS}
    parameters:
        unix_socket_directories: &#34;/var/run/postgresql/&#34;
    create_replica_methods:
        - basebackup
    basebackup:
        checkpoint: &#39;fast&#39;

    pg_hba:
      - local all all  peer
      - local replication all  peer
      - host replication replicator 127.0.0.1/32 trust
      - host replication replicator 0.0.0.0/0 scram-sha-256
      - host all all 0.0.0.0/0 scram-sha-256
      - host all all ::0/0 scram-sha-256

    watchdog:
      mode: required # Allowed values: off, automatic, required
      device: /dev/watchdog
      safety_margin: 5

tags:
    nofailover: false
    noloadbalance: false
    clonefrom: true
    nosync: false
EOF
</code></pre>

<p>And we want to add a service to prep watchdog etc for Patroni.</p>

<pre><code class="language-bash">cat &lt;&lt;EOF &gt; /etc/systemd/system/patroni-prep.service
[Unit]
Description=Prepare system for Patroni (softdog, watchdog, postgresql dirs)
Before=patroni.service
DefaultDependencies=no
After=local-fs.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash -c &#39;/usr/sbin/modprobe softdog; chown postgres /dev/watchdog; mkdir -p /var/run/postgresql; chown postgres /var/run/postgresql&#39;

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable patroni-prep
</code></pre>

<h3 id="one-host-at-a-time-now">One host at a time now:</h3>

<p>Up until now, we&#39;ve been running commands on all hosts (possibly in parallel), but now we&#39;re getting to the bootstrap part where things start deviating.</p>

<h4 id="db-cluster-1">db-cluster-1</h4>

<p>This is our seed server that will initialize and create our cluster. We want to initialize our etcd server here:</p>

<pre><code class="language-bash">cat &lt;&lt;EOF &gt; /etc/etcd/etcd.conf.yaml
name: &#39;db-cluster-1&#39;
initial-cluster-token: ${ETCD_TOKEN}
initial-cluster-state: new
initial-cluster: db-cluster-1=http://db-cluster-1:2380
data-dir: /var/lib/etcd
initial-advertise-peer-urls: http://db-cluster-1:2380
listen-peer-urls: http://0.0.0.0:2380
advertise-client-urls: http://db-cluster-1:2379
listen-client-urls: http://0.0.0.0:2379

# Storage quota (8GB = 8589934592 bytes)
quota-backend-bytes: 8589934592

# Enable automatic compaction every hour
auto-compaction-mode: periodic
auto-compaction-retention: &#34;1h&#34;
auto-defrag-interval: &#34;24h&#34;
EOF
sudo systemctl enable --now etcd
</code></pre>

<p>After a few seconds lets run these 2 commands:</p>

<pre><code class="language-bash">etcdctl member list -w table
etcdctl endpoint status -w table
</code></pre>

<p>You should see something like this (one member, and it&#39;s the leader):</p>

<pre><code>root@db-cluster-1:~# etcdctl member list -w fields
&#34;ClusterID&#34; : 8919193014159237326
&#34;MemberID&#34; : 17956751917787781469
&#34;Revision&#34; : 0
&#34;RaftTerm&#34; : 2
&#34;ID&#34; : 17956751917787781469
&#34;Name&#34; : &#34;db-cluster-1&#34;
&#34;PeerURL&#34; : &#34;http://db-cluster-1:2380&#34;
&#34;ClientURL&#34; : &#34;http://db-cluster-1:2379&#34;
&#34;IsLearner&#34; : false

root@db-cluster-1:~# etcdctl endpoint status -w fields
&#34;ClusterID&#34; : 8919193014159237326
&#34;MemberID&#34; : 17956751917787781469
&#34;Revision&#34; : 1
&#34;RaftTerm&#34; : 2
&#34;Version&#34; : &#34;3.5.24&#34;
&#34;DBSize&#34; : 20480
&#34;Leader&#34; : 17956751917787781469
&#34;IsLearner&#34; : false
&#34;RaftIndex&#34; : 4
&#34;RaftTerm&#34; : 2
&#34;RaftAppliedIndex&#34; : 4
&#34;Errors&#34; : []
&#34;Endpoint&#34; : &#34;127.0.0.1:2379&#34;
</code></pre>

<p>We&#39;re now going to add our next member to this cluster so when they start up, the server will know them.</p>

<pre><code class="language-bash">etcdctl member add db-cluster-2 --peer-urls=http://db-cluster-2:2380
</code></pre>

<h4 id="db-cluster-2">db-cluster-2</h4>

<p>Lets now join our second etcd to this cluster...</p>

<pre><code class="language-bash">cat &lt;&lt;EOF &gt; /etc/etcd/etcd.conf.yaml
name: &#39;db-cluster-2&#39;
initial-cluster-token: ${ETCD_TOKEN}
initial-cluster-state: existing
initial-cluster: db-cluster-1=http://db-cluster-1:2380,db-cluster-2=http://db-cluster-2:2380
data-dir: /var/lib/etcd
initial-advertise-peer-urls: http://db-cluster-2:2380
listen-peer-urls: http://0.0.0.0:2380
advertise-client-urls: http://db-cluster-2:2379
listen-client-urls: http://0.0.0.0:2379

# Storage quota (8GB = 8589934592 bytes)
quota-backend-bytes: 8589934592

# Enable automatic compaction every hour
auto-compaction-mode: periodic
auto-compaction-retention: &#34;1h&#34;
auto-defrag-interval: &#34;24h&#34;
EOF
sudo systemctl enable --now etcd
</code></pre>

<p>After a few seconds lets run these 2 commands:</p>

<pre><code class="language-bash">etcdctl member list -w table
etcdctl endpoint status -w table
</code></pre>

<p>You should now see that there&#39;s 2 members, and presumably you&#39;re not the leader.</p>

<p>We&#39;re now going to add our final member to this cluster, from db-cluster-2</p>

<pre><code class="language-bash">etcdctl member add db-cluster-3 --peer-urls=http://db-cluster-3:2380
</code></pre>

<h4 id="db-cluster-3">db-cluster-3</h4>

<p>Lets now join our third etcd to this cluster...</p>

<pre><code class="language-bash">cat &lt;&lt;EOF &gt; /etc/etcd/etcd.conf.yaml
name: &#39;db-cluster-3&#39;
initial-cluster-token: ${ETCD_TOKEN}
initial-cluster-state: existing
initial-cluster: db-cluster-1=http://db-cluster-1:2380,db-cluster-2=http://db-cluster-2:2380,db-cluster-3=http://db-cluster-3:2380
data-dir: /var/lib/etcd
initial-advertise-peer-urls: http://db-cluster-3:2380
listen-peer-urls: http://0.0.0.0:2380
advertise-client-urls: http://db-cluster-3:2379
listen-client-urls: http://0.0.0.0:2379

# Storage quota (8GB = 8589934592 bytes)
quota-backend-bytes: 8589934592

# Enable automatic compaction every hour
auto-compaction-mode: periodic
auto-compaction-retention: &#34;1h&#34;
auto-defrag-interval: &#34;24h&#34;
EOF
sudo systemctl enable --now etcd
</code></pre>

<p>After a few seconds lets run these 2 commands:</p>

<pre><code class="language-bash">etcdctl member list -w table
etcdctl endpoint status -w table
</code></pre>

<p>By this stage you should know what to expect.</p>

<h4 id="db-cluster-1-1">db-cluster-1</h4>

<p>Back on the first node, it&#39;s time to start up the very first Patroni instance (This will initialize the base database tables etc, and make the server the stand-alone primary).</p>

<pre><code class="language-bash">mkdir -p ${DATA_DIR}/archived
chown -R postgres:postgres ${DATA_DIR}
systemctl enable --now patroni
journalctl -f -u patroni
</code></pre>

<p>Wait for journal to say something like <code>no action. I am (db-cluster-1), the leader with the lock</code>, then exit and run the following command:</p>

<pre><code class="language-bash">patronictl -c /etc/patroni/patroni.yml list
</code></pre>

<p>You should get something that looks like:</p>

<pre><code>+ Cluster: db-cluster (7593587474928070257) ---+----+-------------+-----+------------+-----+
| Member       | Host       | Role   | State   | TL | Receive LSN | Lag | Replay LSN | Lag |
+--------------+------------+--------+---------+----+-------------+-----+------------+-----+
| db-cluster-1 | 10.19.96.3 | Leader | running |  1 |             |     |            |     |
+--------------+------------+--------+---------+----+-------------+-----+------------+-----+
</code></pre>

<h4 id="db-cluster-2-1">db-cluster-2</h4>

<p>Run:</p>

<pre><code class="language-bash">mkdir -p ${DATA_DIR}/archived
chown -R postgres:postgres ${DATA_DIR}
systemctl enable --now patroni
journalctl -f -u patroni
</code></pre>

<p>Wait for <code>I am (db-cluster-2), a secondary, and following a leader</code>. You can go back to the first server and watch patronictl list command to see progress.</p>

<h4 id="db-cluster-3-1">db-cluster-3</h4>

<p>Do the same as for db-cluster-2</p>

<h2 id="testing-the-connection">Testing the connection</h2>

<pre><code>root@db-cluster-3:~# PGPASSWORD=$SUPERUSER_PASS psql -h db-cluster-2 -p 5000  -U postgres \
&gt; -c &#39;SELECT CURRENT_USER user, inet_server_addr() ip, inet_server_port() port;&#39;
   user   |     ip     | port
----------+------------+------
 postgres | 10.19.96.3 | 5432
(1 row)

root@db-cluster-3:~# PGPASSWORD=$SUPERUSER_PASS psql -h db-cluster-2 -p 5001  -U postgres \
&gt; -c &#39;SELECT CURRENT_USER user, inet_server_addr() ip, inet_server_port() port;&#39;
   user   |     ip     | port
----------+------------+------
 postgres | 10.19.96.5 | 5432
(1 row)
</code></pre>

<h2 id="job-done">Job done</h2>

<p>That&#39;s pretty much it. From any server in the cluster you can manage the cluster using the <code>patronictl</code> command.</p>
]]></content:encoded>
      <author>supakaity</author>
      <guid>https://pen.blahaj.zone/read/a/xfb369it0e</guid>
      <pubDate>Sat, 10 Jan 2026 02:05:13 +0000</pubDate>
    </item>
    <item>
      <title>Pen testing</title>
      <link>https://pen.blahaj.zone/supakaity/pen-testing</link>
      <description>&lt;![CDATA[Pun... intended. Ada told me if the first post on this site isn&#39;t titled &#34;Pen Testing&#34;, we&#39;ll be getting divorced or something like that. It may have just been abject disappointment in me; same thing really!&#xA;&#xA;Anyhow, welcome to the latest mini project in the Blåhaj line of projects. This one is a blog! No, no, no... not like a global fedi-micro-blog-feed-roll thing like Mastodon, Misskey or Sharkey. A personal blog.&#xA;&#xA;You see the thing with microblogs is all your useless musings get lost in time amongst all the other useless musings of all the other random people out there. This site is more about creating a permanent home for your most treasured, slightly less than completely useless ramblings. Where you can pin them up on the internet and be mildly proud of how clever you are and point your friends at them proudly.&#xA;&#xA;Think of this as a federation-first version of Medium, Wordpress or Ghost, all of which are nominally federable, however for them it&#39;s more of a tack-on &#34;look we did federation, more money now?&#34; type deal.&#xA;&#xA;Anyhow we hope you&#39;ll enjoy being here, posting things, reading stuff from other like minded individuals, and will be proud to call this place home.]]&gt;</description>
      <content:encoded><![CDATA[<p>Pun... intended. Ada told me if the first post on this site isn&#39;t titled “Pen Testing”, we&#39;ll be getting divorced or something like that. It may have just been abject disappointment in me; same thing really!</p>

<p>Anyhow, welcome to the latest mini project in the Blåhaj line of projects. This one is a blog! No, no, no... not like a global fedi-micro-blog-feed-roll thing like Mastodon, Misskey or Sharkey. A <strong>personal blog</strong>.</p>

<p>You see the thing with microblogs is all your useless musings get lost in time amongst all the other useless musings of all the other random people out there. This site is more about creating a permanent home for your most treasured, slightly less than completely useless ramblings. Where you can pin them up on the internet and be mildly proud of how clever you are and point your friends at them proudly.</p>

<p>Think of this as a federation-first version of Medium, Wordpress or Ghost, all of which are nominally federable, however for them it&#39;s more of a tack-on “look we did federation, more money now?” type deal.</p>

<p>Anyhow we hope you&#39;ll enjoy being here, posting things, reading stuff from other like minded individuals, and will be proud to call this place home.</p>
]]></content:encoded>
      <author>supakaity</author>
      <guid>https://pen.blahaj.zone/read/a/dsgjv2w8fv</guid>
      <pubDate>Thu, 08 Jan 2026 11:45:54 +0000</pubDate>
    </item>
  </channel>
</rss>