{"version": "https://jsonfeed.org/version/1", "title": "Rys Sommefeldt - Blog", "home_page_url": "https://rys.sommefeldt.com", "feed_url": "https://rys.sommefeldt.com/index.json", "description": "A blog written by a real person", "items": [{"id": "https://rys.sommefeldt.com/post/framework-desktop", "title": "Framework Desktop", "date_published": "2026-02-11T00:00:00+00:00", "url": "https://rys.sommefeldt.com/post/framework-desktop", "content_html": "<p>I like to collect at least one manifestation of the physical products that I&rsquo;ve worked on in my career, but having worked on AMD&rsquo;s Strix Halo high-performance consumer APU as the incumbent lead architect for its GPU, it&rsquo;s been a potentially expensive quest to collect one of those given the comparative performance level and types of products it tends to find itself in. I don&rsquo;t get sent the hardware I help to make as a matter of course any more.</p>\n<p>Known better (and infamously) as the AMD Ryzen AI Max+ line of APUs, Strix Halo has been very popular in mini PCs in particular, especially as the AI boom keeps booming and people look for relatively cost-effective ways to develop and run local models, and the most well-known of those has to be the <a href=\"https://frame.work/gb/en/desktop\">Framework Desktop</a>.</p>\n<p>The Desktop follows Framework&rsquo;s signature philosophical focus on user serviceability and future upgradeability that it pioneered with its laptop products, and while Framework can&rsquo;t apply the full treatment of that approach to the Desktop because AMD have chosen to mandate the LPDDR5X DRAM devices be soldered next to the SoC, almost everything else about it is something the user can work with.</p>\n<figure class=\"archive\">\n                  <img src=\"/images/framework-desktop/fd.png\" alt=\"Framework Desktop components\">\n                  <figcaption><p>Framework Desktop by Framework Computer, CC BY 4.0</p></figcaption>\n               </figure>\n\n<p>They <a href=\"https://github.com/FrameworkComputer/Framework-Desktop\">publish open source CAD files for parts of the chassis and mainboard</a> and also the source for <a href=\"https://github.com/FrameworkComputer/EmbeddedController\">the Desktop&rsquo;s embedded controller firmware</a>, and make individual components of the Desktop available for users to buy separately.</p>\n<p>It&rsquo;s a fairly unique way to sell and support a computer in this day and age and I&rsquo;m a fan of how they do it. That means I&rsquo;d planned to buy one at some point next year when either the price had come down in the face of the AI boom maybe softening, or on a whim at full price if I did well with next year&rsquo;s bonus, as a way to get one of the most exciting things I&rsquo;ve worked on for my collection.</p>\n<p>However the gods of enchanted electrified sand have decided to smile upon me, allowing me get my hands on one sooner than than planned. It&rsquo;s <em>very</em> cool.</p>\n<figure class=\"archive\">\n                  <img src=\"/images/framework-desktop/framework.jpg\" alt=\"Framework Desktop\">\n                  <figcaption><p>Framework Desktop on my desk top</p></figcaption>\n               </figure>\n\n<p>The case has an internal volume of just 4.5L, making it half the size of the FormD T1 I used to <a href=\"/post/rocket\">build Rocket</a>, my latest workstation. The guts of that internal volume are taken up by the heatsink and fan on top of the APU, and the tiny PSU. Unlike the T1, there&rsquo;s no room inside the Framework Desktop case for a full-sized discrete GPU, and that&rsquo;s the main compromise the Desktop makes versus larger systems.</p>\n<p>Strix Halo&rsquo;s GPU\u2014especially the fully enabled one in the AI Max+ 395, 392 and 388 variants of the APU\u2014means that pairing it with a discrete GPU is almost completely unnecessary for all of the sensible uses of the product. If you find yourself lusting after a Ryzen AI Max+ of any kind alongside a discrete GPU, you&rsquo;re probably actually interested in building another kind of computer.</p>\n<p>The whole system topology is so well balanced that you could reasonably argue that the GPU isn&rsquo;t even the star of the show. The CPU cores in the two CCD chiplets are the same fully-featured high-performance Zen5 cores you find in AMD&rsquo;s modern desktop processors, just without the 3D-stacked L3 cache you find on some of those (like the Ryzen 9 9950X3D in Rocket).</p>\n<p>They clock a little lower by default than the equivalent cores in something like a Ryzen 9 9950X, but because of the 256-bit wide LPDDR5X subsystem and high-frequency 32B bi-directional link between each CCD and the IOD (the larger chip where the GPU also lives), the CPU cores have access to a lot more memory bandwidth than almost any other consumer-focused computing platform.</p>\n<p>So if your common CPU workloads are memory bandwidth bound in any way, where they don&rsquo;t fit nicely into the 1MiB per-core L2\u2014since on Strix Halo CPU memory accesses aren&rsquo;t cached by the large L3 on the IOD\u2014then the relatively large amount of aggregate memory bandwidth can be a real boon.</p>\n<p>Framework pair the highest-end version with 128GiB of LPDDR5X-8000 which makes that variant very attractive for certain kinds of uses, but while mine has that top-spec memory configuration, I&rsquo;m not sure what to really use it for yet. I&rsquo;ve already built and use Rocket, and in my testing I don&rsquo;t make enough use of the extra memory bandwidth in my heavier workloads to make the CPU performance truly outshine the Ryzen 9 9950X3D in that system. My workloads don&rsquo;t tend to fall too far out of cache enough, and be bandwidth bound when they do, to make the bandwidth surplus overcome the clock deficit.</p>\n<p>And with PCIe gen4 running the NVMe I/O on Strix Halo, the peak storage performance can&rsquo;t outstrip the gen5 storage on Rocket either.</p>\n<p>One option would be to sell Rocket and move my workstation use entirely to the Framework, or move a single aspect of my use of Rocket to it. I&rsquo;ve been testing it out in that mode recently, running a reasonable facsimile of my desktop environment here on Rocket and using it for the primary heavier things I do on this machine while enjoying the overall package of performance it provides.</p>\n<p>It&rsquo;s truly excellent as a small, whisper-quiet, high-performance workstation system if you don&rsquo;t need gen5 NVMe or a discrete GPU to underpin the work that you do, especially if you install a Phanteks T30-120 fan which fits comfortably.</p>\n<figure class=\"archive\">\n                  <img src=\"/images/framework-desktop/framework-t30.jpg\" alt=\"Framework Desktop\">\n                  <figcaption><p>Framework Desktop with Phanteks T32-120 installed</p></figcaption>\n               </figure>\n\n<p>Installing the T30-120 is very simple, as per Framework&rsquo;s philosophy of making their computers very user serviceable. Pop the top and side panel off, remove four screws holding the stock fan to the heatsink assembly underneath the fan, take the fan out, and then pop the T30-120 in retaining it with the same screws you just removed.</p>\n<p>One attention to detail I really love is visible in the picture above: the chassic cutout near the mainboard to allow you to plug the fan header in without having to get your fingers or pliers or anything down into the small gap between the fan edge and the chassis side span.</p>\n<p>I&rsquo;ll revisit the Desktop here when I&rsquo;ve finally worked out what it should do as part of my setup.</p>\n<hr>\n<p>Framework Desktop component image taken from <a href=\"https://github.com/FrameworkComputer/Framework-Desktop?tab=readme-ov-file\">Framework Computer&rsquo;s GitHub</a> on Wednesday 11th February, 2026. Licensed under the <a href=\"https://creativecommons.org/licenses/by/4.0/\">CC BY 4.0 license</a>.</p>"}, {"id": "https://rys.sommefeldt.com/post/dec3862-fan-swap", "title": "Deciso DEC3862 fan swap", "date_published": "2026-02-11T00:00:00+00:00", "url": "https://rys.sommefeldt.com/post/dec3862-fan-swap", "content_html": "<p>My home router is a rack-mountable <a href=\"https://shop.opnsense.com/product/dec3862-opnsense-rack-security-appliance/\">Deciso DEC3862</a> and, as is common with rack mount hardware at 1U height, it&rsquo;s got a reliable yet noisy fan. The biggest issue isn&rsquo;t the noise of the airflow, but rather the sound the bearing makes. It&rsquo;s annoying enough when the fan is spinning at constant speed, but becomes very noticeable and irritating if the fan speed changes.</p>\n<p>There&rsquo;s not much heat for the whole cooling system to get rid because the main system-on-chip is a comparatively low-power embedded AMD EPYC Embedded 3000 SoC (the <a href=\"https://www.amd.com/en/products/embedded/epyc/epyc-3000-series.html\">8-core 3251</a> with a 55W TDP), so even though it&rsquo;s only 40x40x25mm the fan doesn&rsquo;t have to work too hard to keep the router cool here in my office.</p>\n<p>After some back and forth with the folks at Deciso about them exposing fan control to software so that I could get some more control of it that way, they came to the conclusion that they have no plans to do that, but did give me the specs of the OEM fan and the wiring diagram so I could think about replacing it with something else.</p>\n<p>The OEM fan is <a href=\"https://www.sunon.com/eu/MANAGE/Docs/WEBCONT/Files/1236/Sunon%20DC%20Brushless%20Fan%20&amp;%20Blower_(240-E).pdf\">a Sunon HA40201V4-1000U-A99</a> with 2-pin connector, meaning fan speed control happens via adjusting the voltage. Page 30 of the linked PDF gives us the key specs needed when thinking about a replacement: 5.5ft<sup>3</sup> per minute maximum airflow, and 0.10 inH<sub>2</sub>0 static pressure.</p>\n<p><span class=\"y2026\" style=\"color: #000;\">Quick aside:</span>\n please take a second to marvel at the amazing non-SI unit for the static pressure. Inches of water.</p>\n<p>Any replacement should ideally have very similar static pressure and airflow characteristics, with noise being the thing you want to adjust while keeping the rest of the fan&rsquo;s operating properties the same. That&rsquo;s because Deciso took care to design a custom fan shroud to control the cooling system&rsquo;s airflow and optimise its cooling performance, so I didn&rsquo;t want to compromise that with a poor choice of replacement fan.</p>\n<p>Thankfully Noctua have the <a href=\"https://www.noctua.at/en/products/nf-a4x20-flx/specifications\">NF-A4x20 FLX</a> which has a very comparable static pressure of 22.16Pa and a peak airflow of 9.4m<sup>3</sup> per hour, and a 3-pin power connector. The 3rd wire is for speed sensing, so not having it connected in this application is fine. I leave research into the <a href=\"https://en.wikipedia.org/wiki/Inch_of_water\">weird units</a> used in the Sunon spec sheet and how to convert to the SI units I quote for the Noctua as an exercise for you, dear reader.</p>\n<p>The stated noise level of the Noctua is quite similar to the Sunon (in fact the Sunon is supposedly quieter), so the gamble was that the overall acoustics of the Noctua&rsquo;s bearing are much better than the Sunon&rsquo;s, and that gamble paid off.</p>\n<p>Swapping the fan was simple. First you undo the screws keeping the black top cover to the rest of the chassis, then you slide the top cover away from the rear and then lift it up to take it off, taking care not to damage the ground wire connected to that top cover piece. That reveals the fan shroud at the back right, holding the Sunon in place:</p>\n<figure class=\"archive\">\n                  <img src=\"/images/dec3862-fan-swap/before.jpg\" alt=\"DEC3862 with top cover off\">\n                  <figcaption><p>DEC3862 with top cover off</p></figcaption>\n               </figure>\n\n<p>You can see the orange Deciso logo on top of the shroud, and the original Sunon fan is held into that with pressure from the shroud with no screws, which I really appreciate. That means removing it to fit a replacement is easy: gently pull the Sunon out and push the replacement in, making sure to get orientation for its airflow right. Air leaves out of the back of the unit, so make sure you push the new fan into the shroud in an orientation that respects that:</p>\n<figure class=\"archive\">\n                  <img src=\"/images/dec3862-fan-swap/shroud.jpg\" alt=\"DEC3862 fan shroud\">\n                  <figcaption><p>DEC3862 fan shroud with Noctua NF-A4x20 FLX in place</p></figcaption>\n               </figure>\n\n<p>Then it&rsquo;s a simple matter of placing the shroud back where it was, locating the small clips on the shroud that hold it to the back of the chassis into their small holes.</p>\n<figure class=\"archive\">\n                  <img src=\"/images/dec3862-fan-swap/installed.jpg\" alt=\"DEC3862 with new fan installed\">\n                  <figcaption><p>DEC3862 with new fan installed</p></figcaption>\n               </figure>\n\n<p>Put the top cover back into place and screw it down and you&rsquo;re done. There&rsquo;s a warranty void sticker over one of the screws but depending on where you live consumer protection laws might allow you to disregard that.</p>\n<p>The end result was exactly what I hoped for: the router works fine with the new fan in place and its bearing is near-silent, meaning I can&rsquo;t hear it at all now over the noise that some other things in the rack make. </p>\n<p>Temperatures are slightly higher given I&rsquo;ve also chosen to use the low-noise adapter that comes with the fan to quieten it down even further. It reduces peak airflow and static pressure, but because the EPYC 3251 gives off so little heat (Deciso offer a completely passively cooled model based on the same SoC, even) and the airflow from the fan isn&rsquo;t necessary for cooling any other components on the NetBoard-A30 mainboard the DEC3862 is built from, it doesn&rsquo;t cause any operational issues.</p>\n<p>Absolute temperature is roughly 3C higher than with the Sunon, which is totally fine for my operating environment and the router stays well within thermal limits.</p>\n<p>Hopefully this simple guide and recommendation for the Noctua NF-A4x20 FLX as a viable replacement helps someone else out.</p>"}, {"id": "https://rys.sommefeldt.com/post/hdmi-considered-harmful", "title": "HDMI considered harmful", "date_published": "2026-01-22T22:42:32+00:00", "url": "https://rys.sommefeldt.com/post/hdmi-considered-harmful", "content_html": "<p>One of my lifelong loves is great film and television, and one of my favourite hobbies in the last few years has been putting together the best environment I can for enjoying them at home at the highest quality. I have a setup that I love that includes a <a href=\"https://www.lg.com/uk/tvs-soundbars/oled-evo/oled83g45lw/\">very big MLA-toting</a> <a href=\"https://www.rtings.com/tv/learn/what-is-oled\">OLED</a> that can do 4K144 and supports all major HDR standards, along with a Panasonic <a href=\"https://www.panasonic.com/uk/consumer/home-entertainment/blu-ray-and-dvd/dp-ub820eb.html\">UB820</a> 4K Blu-Ray player for getting the highest quality moving pictures to the amazing TV.</p>\n<p>When it comes to the audio side of things I make use of the <a href=\"https://en.wikipedia.org/wiki/HDMI#ARC\">eARC</a> feature of modern HDMI, which routes audio from any device connected to the TV to a <a href=\"https://www.lg.com/uk/speakers/soundbars/us95tr/\">high-end soundbar</a> that gives me 9.1.5 Dolby Atmos. I&rsquo;m an avid console gamer and I&rsquo;ve found myself with a PlayStation 5 Pro and Switch 2 this generation, plus I love watching live sports which means yet another box to get that at the best possible quality. Like everyone else I also stream Netflix and a couple of other services, using a modern Apple TV 4K 3rd gen for that. And thus, especially if you&rsquo;ve been keeping count of the number of different devices in play, you&rsquo;ll maybe have a feel for where all of this is going:</p>\n<p>Two games consoles, one streaming box, one live TV satellite tuner box, one Blu-Ray player, plus a soundbar so I can hear it all, comes to six devices to connect to a TV with just four HDMI ports. Here begins the nightmare.</p>\n<p>Assuming every HDMI device you have is a well-implemented and well-behaved citizen when it comes to implementing support for <a href=\"https://en.wikipedia.org/wiki/Consumer_Electronics_Control\">HDMI CEC</a>, the mandatory (at least the wiring is) part of the HDMI standard which allows devices on either end of the HDMI connection to talk to and control each other, you can <em>maybe</em> have a good time with HDMI if the number of devices is less than or equal to the number of ports you have on your TV.</p>\n<p>In reality it&rsquo;s almost impossible to get a confluence of devices where that CEC support is robust and respectful to the point whereyou can take advantage of the promises in full-system usability that the standard likes to make. One remote to control all of your devices and automatic port switching based on activity are sadly a dream almost nobody gets to realise. That&rsquo;s especially true if you also don&rsquo;t have enough ports on your display to give everything you have an individual connection.</p>\n<p>My 6-into-4 problem used to be &ldquo;solved&rdquo; with a combination of the lone HDMI input on my sound bar plus a simple UGREEN 2-port HDMI 2.1 switch which didn&rsquo;t come with a remote. I had the Blu-Ray player and Switch 2 share that switch and the Sky Q satellite tuner fed into the extra HDMI port on the soundbar, with the PlayStation, Apple TV and soundbar getting their own front-line HDMI ports on the TV. There&rsquo;s no way to reliably control all of that from a single interface, be that a universal remote, voice control or similar, due to the number of different devices involved and because systems like that can&rsquo;t really query device power states reliably.</p>\n<p>It&rsquo;s that latter aspect that causes all of the problems in my experience, with HDMI CEC making it much worse. If you could get your entertainment gear into a starting state where everything was off, then something like a universal remote could keep track of that initial state and know with higher confidence that the commands it has sent to a device under its control are doing the right thing to the device. That&rsquo;s particularly important when moving between devices, where one needs to turn off and the other has to come on.</p>\n<p>HDMI CEC ruins that because it allows the display and connected devices to turn each other on and off. I can turn on my PlayStation, say, which then turns on the TV, but then the Apple TV will see the TV is on and wake up before asking the TV to switch to its input. If I&rsquo;m truly lucky the devices will then fight over which one should be displayed, the TV flicking back and forth in an endless war.</p>\n<p>Sorry, I just need a second to take a deep breath before I continue.</p>\n<p>There&rsquo;s nothing about the above that got better when I added a Philips Hue latest generation &ldquo;8K&rdquo; sync box to things. It&rsquo;s designed to sit between up to 4 modern HDMI devices and your TV, analysing the frames being sent by those devices to your TV in order to synchronise nearby lights to what&rsquo;s being shown on the screen. The first generation didn&rsquo;t, but the latest one supports the latest HDMI 2.1 features like auto low-latency mode, high refresh rates, and Dolby Vision, on all 4 of its inputs. It has one HDMI port on the output side.</p>\n<p>Oh, and no remote.</p>\n<p>I invite you to guess how it instead decides which of the four inputs to select to sync lights with and pass through to your TV. While you&rsquo;re congratulating yourself for guessing HDMI CEC, I&rsquo;ll just go for a little lie down and a cry.</p>\n<p>Operationally it was an unmitigated disaster. Even with HDMI CEC enabled on every device fed into its inputs, it would either pick the wrong input to switch to or not automatically switch to a newly activated one at all. Resolving that, because there&rsquo;s no physical remote, meant a trip into the Hue app every time to select the input. Oh, and any devices connected to the UGREEN switch didn&rsquo;t work through it at all.</p>\n<p>My options at that point were to either send it back, swap HDMI cables when needed and use the Hue app to get the right input working, or front the Hue box with a HDMI switch of some kind so it only has to process a single input. Scarred for life by cheap and cheerful HDMI switches that don&rsquo;t work as advertised, I did what any self-respecting technologist would do and threw even more money at the problem, dipping my first toe into the world of really high-class HDMI switches in a trench coat: AV receivers.</p>\n<p>The AV receiver (AVR) formula is simple: have many HDMI switchable and analogue audio inputs feed a high-performance processor, taking the decoded audio into a multi-channel amplifier while spitting out the HDMI video signal to a TV. They&rsquo;re primarily designed to take the multi-channel audio signals from all of those digital and analogue devices and get it out through a high-end surround speaker system. Most have at least 6 HDMI inputs and 7 powered output channels.</p>\n<p>That high-end feature set of the best AVRs means that the signal processing part of them is usually very well tested, incredibly reliable, and compatible with anything you might want to feed into it. The trick with some modern ones is that you can also completely bypass the active amplifier and audio decoding and processing parts and just pass through the full digital input to the output. Do that with HDMI devices and an AVR with that feature effectively becomes a really good HDMI switch.</p>\n<p>I chose a <a href=\"https://www.denon.com/en-gb/product/av-receivers/avr-x2800h/AVRX2800HGB.html\">Denon AVR-X2800H</a> because it can pull that party trick: it has a pass-through mode that works while it&rsquo;s in stand-by, and its HDMI input switcher still works while the rest of it is powered off. That input switcher connects to 6 modern HDMI inputs (HDCP 2.3, 4K120, all major HDR formats including Dolby Vision), so I get to connect everything at once (with a port spare!). It also means that when budget allows I can have a look at a setup to replace the soundbar and sub, and make use of the built in 7.2-channel amplifier so that it becomes more than just the very well-made switch that I use it for at the moment.</p>\n<p>If only the rest of the HDMI-toting hardware I had before getting it could live up to the standard that the X2800H currently sets. Especially those that want to use HDMI CEC.</p>\n<p>The topology of things that need to draw pictures on the TV is now much simpler than it was before: each device only connects to the AVR-X2800H, which then feeds a single switched input to the Hue Sync 8K, which then passes just that input to the TV. The Hue Sync 8K controls the lights, the TV feeds all audio via eARC to the soundbar, and everything is much happier.</p>\n<p>I have to manually select the input the AVR-X2800H will send to the TV via the Hue, but that&rsquo;s fine by me since it avoids display input fighting caused by HDMI CEC, and lets me avoid the Hue Sync&rsquo;s lack of physical remote. Plus, because all of the input switching happens in one place then maybe there&rsquo;s a universal remote solution that could work for me now, and at least that input switching is reliable again with no cable swapping or switch button pressing involved.</p>"}, {"id": "https://rys.sommefeldt.com/post/liara", "title": "Liara", "date_published": "2026-01-20T21:41:00+00:00", "url": "https://rys.sommefeldt.com/post/liara", "content_html": "<p>According to the git commit logs, I moved over to <a href=\"https://gohugo.io/\">Hugo</a> as the static site generator behind my blog here on December 29th 2016. At the blog&rsquo;s rebirth in 2011 I originally chose Jekyll, which is similar in philosophy to Hugo but is written in Ruby. It used to be a whole ordeal to get and maintain a functioning Ruby on a FreeBSD system, which is what I&rsquo;ve used as the server OS for my webservers since at least that 2011 epoch of my modern writing, so switching to Hugo, which is written in <a href=\"https://go.dev/\">Go</a>, brought me a single static binary and therefore a much easier deployment model.</p>\n<p>It also brought much faster performance, building my blog and its small handful of posts in about 50ms. It sometimes felt like it took an order of magnitude longer than that just for the Ruby interpreter to get itself ready to start executing code, never mind fully generate the entire blog.</p>\n<p>Hugo has a tendency to incessantly change its templating system however, which became a chore to keep pace with. I didn&rsquo;t have to do that and could have stuck to a version that just worked, especially since the output is a purely static site with no Javascript and minimal page weight, with simple markup and styling.</p>\n<p>Instead, I&rsquo;ve done what any endless tinkerer and enjoyer of technology would do: I&rsquo;ve switched to something else! What static site generator could possibly improve on Hugo&rsquo;s single static binary, executing native code without any external dependencies, and which does the entire job of generating my blog in less time than a human blink?</p>\n<p>Enter <a href=\"https://liara.sh13.net/\">Liara</a>, written by a great friend of mine: <a href=\"https://anteru.net\">Matth\u00e4us Chajdas</a>. That written by a great friend bit is one of the major benefits of heading in Liara&rsquo;s direction since, given all the talk of content generation performance with a single static binary to deploy anywhere that needs to create the site, it could be seen as a step backwards.</p>\n<p>Liara is written in Python, which brings with it a pain of system deployment that the Python ecosystem doesn&rsquo;t seem to ever want to truly solve, despite much-improved modern tooling for managing it on a system like <a href=\"https://docs.astral.sh/uv/\">uv</a>. It also comes with a performance hit, generating an equivalent site on the same hardware as Hugo in ~490ms (both from a cold cache).</p>\n<p>Having to change where Liara runs to create and deploy new builds from was relatively painless however, and I clean build the site a few times per new post at best, so the generation speed hit barely registers when accounted for alongside the glacial pace of me thinking about what words to type.</p>\n<p>Like Hugo, Liara has a mode where it watches for changes to the content on disk as you&rsquo;re writing, building a version of the site for you to easily reload in your browser and preview as you author. That helped immensely when authoring the changes to bring the content, markup and styling into a working form from their Hugo equivalents.</p>\n<p>Porting the content was the easiest part. Liara renders Markdown input to HTML output like Hugo does. In fact, they consume almost identical Markdown documents as input, so the main things to tackle there were making sure all of the Hugo templating logic I used was moved to equivalent functionality in Liara, or reworked so it wasn&rsquo;t needed any more. Liara also supports <a href=\"https://liara-web.readthedocs.io/en/latest/content/shortcodes.html\">shortcodes</a>, which let you write small bits of Python to do interesting things during HTML content generation that Markdown alone can&rsquo;t do, which is something I leaned on a bit with Hugo.</p>\n<p>After that I ported the CSS &ldquo;compilation&rdquo; phase I had in Hugo to Liara&rsquo;s SASS-based approach, in order to get the markup styling working. All I really did there before was ask Hugo to concatenate a few different CSS files together into a single stylesheet document. In SASS speak that&rsquo;s just <code>@use</code>-ing those separate files in a single SASS document, so the SASS compiler can turn those into one associated CSS output document.</p>\n<p>Lastly, I needed to find an equivalent code snippet highlighting system for the handful of posts I have with a bit of readable code in them. As luck would have it, Matth\u00e4us is a maintainer of <a href=\"https://pygments.org/\">pygments</a>, the Python syntax highlighter that Liara uses. It really helps when your site generation engine&rsquo;s syntax highlighter library are written and maintained by the same person, because I got stuck a little working out how to get pygments to do what I wanted from a CSS perspective.</p>\n<p>As you can see, I&rsquo;ve changed the blog&rsquo;s colour scheme to something very similar to Dracula, a <a href=\"https://draculatheme.com/\">favourite app theming system</a> of mine, as part of this rework for moving to Liara. That meant I had to rework the syntax highlighter style that Liara would pipe into the resulting CSS document. Thankfully, due to its popularity, <a href=\"https://pygments.org/styles/\">pygments already supports Dracula</a> as a built-in theme style, and my struggles and the resulting advice with how to use pygments properly turned into <a href=\"https://liara-web.readthedocs.io/en/latest/how-to/code.html\">new syntax highlighting documentation in Liara</a>.</p>\n<p>Hopefully that&rsquo;s useful for anyone else that wants to pick up Liara as the engine behind their own blog.</p>\n<p>That&rsquo;s something I encourage everyone to consider if they&rsquo;re looking for a static site generator to publish a typical multi-page structured website like this. Liara will feel familiar to anyone that&rsquo;s coming from or has looked at Hugo, Zola, Jekyll or something similar. In particular, the way you author, template and generate content with it is attractively conservative and doesn&rsquo;t change in big breaking ways every other release as Hugo seemed to do. Performance is good and <code>liara serve</code> for interactive previewing while authoring is excellent.</p>\n<p>Most importantly, the help you&rsquo;ll get if you get stuck or inspired to ask for tweaks or new features after using Liara, or reading <a href=\"https://liara-web.readthedocs.io/en/latest/index.html\">its first-class documentation</a> and <a href=\"https://github.com/Anteru/liara\">source code</a>, is first rate. There are hundreds of systems out there like Liara, so be sure to bubble it near the top of your list when you&rsquo;re trying to decide which one to pick next.</p>"}, {"id": "https://rys.sommefeldt.com/post/rocket", "title": "Rocket", "date_published": "2026-01-04T01:01:06+00:00", "url": "https://rys.sommefeldt.com/post/rocket", "content_html": "<p>My move away from the Mac after almost 20 years didn&rsquo;t happen by me installing Arch btw on the last Mac I was using at the time. I got going on a new PC instead, leaving the Mac behind completely.</p>\n<p>That new PC was initially a gaming system I built back in late 2022, but I wasn&rsquo;t using it for that\u2014or indeed using it at all\u2014at the time. So when I made the decision that I was <a href=\"/post/rotten-apples\">done with the Mac</a> as my daily driver because it was so riddled with bugs and so slow, yet with no way to fix those problems or influence Apple to fix them for me, I used that system rather than build something new yet again.</p>\n<p>I can&rsquo;t remember the exact base spec at the time, other than it had a Ryzen 9 7950X3D (Zen4-based) processor and a Radeon 7900 XTX (Navi31-based) GPU, plugged into a high-end X670E-based mainboard from ASUS. Both were the pinnacle of AMD&rsquo;s respective consumer CPU and GPU product lines at the time I started to use the system in earnest in very early 2025, and I had it all crammed into a <a href=\"https://formdworks.com/collections/t1-1\">FormD T1</a>, a tiny case about the size of a shoebox with less than 10 litres of internal volume.</p>\n<p>When AMD released new CPUs and GPUs in early March, I decided to treat the system to upgrades to re-baseline the system on the very best retail consumer hardware I could get my hands on. I try not to buy new PCs more often than every 5-6 years, so I figured why not. The 7950X3D and Radeon 7900 XTX would have been fine, but the new Zen5-based CPUs released in March implemented support for PCI Express 5.0 for both GPUs and NVMe storage, and AMD&rsquo;s new GPUs supported it too.</p>\n<p>The GPUs also brought with them better support for running very high refresh rate displays at low power, with better display controllers and manipulation of the GDDR6 VRAM used to feed those controllers with frames at high rates. I decided to bank that lower power operation given I still wanted to use the FormD T1 as the case.</p>\n<p>That meant the system got a new CPU, GPU and gen5 NVMe storage, along with some other smaller supporting upgrades to the existing case, cabling and cooling systems. The end result is a tiny, almost completely silent powerhouse that feels <em>incredibly</em> responsive to use. I called it <code>rocket</code>. Here&rsquo;s rocket&rsquo;s full spec:</p>\n<table>\n<thead>\n<tr>\n<th></th>\n<th></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>CPU</td>\n<td>AMD Ryzen 9 9950 X3D</td>\n</tr>\n<tr>\n<td>GPU</td>\n<td>ASUS Radeon RX 9070 PRIME OC</td>\n</tr>\n<tr>\n<td>Mainboard</td>\n<td>ASUS ROG Strix X670E-I mainboard</td>\n</tr>\n<tr>\n<td>Memory</td>\n<td>2 x 48GB DDR5-6000 CL30</td>\n</tr>\n<tr>\n<td>Storage</td>\n<td>2 x Crucial T705 2TB gen5 NVMe</td>\n</tr>\n<tr>\n<td>Case</td>\n<td>FormD T1 with expansion kit</td>\n</tr>\n<tr>\n<td>CPU Cooler</td>\n<td>NZXT Kraken Z53 AIO 240mm liquid cooler</td>\n</tr>\n<tr>\n<td>Fans</td>\n<td>2 x Phanteks T30-120 fans</td>\n</tr>\n<tr>\n<td>Cabling</td>\n<td>LINKUP AVA5 PCIe 5.0 19cm ITX v3</td>\n</tr>\n<tr>\n<td>PSU</td>\n<td>Corsair SF750 w/custom 17AWG silicone cables</td>\n</tr>\n</tbody>\n</table>\n<p>The LINKUP PCIe riser cable was the only option at the time that fit really snugly into the T1 and allowed for routing between the mainboard and GPU. The GPU lives directly behind the mainboard in a T1, and upside down, so any PCIe riser cable you use to connect the two needs to loop under the bottom of the mainboard after fitting into its PCIe x16 slot, run up the back, and then loop over again to meet the GPU. So you need a &ldquo;double reverse&rdquo; cable type that takes that layout into account.</p>\n<p>The <a href=\"https://formdt1.com/products/t1-expansionkit\">T1 expansion kit</a> adds 16mm of extra internal space at the top or bottom of the case depending on which side you use it, making it essential to allow for fitment of the 30mm thick <a href=\"https://phanteks.com/product/t30-120/\">Phanteks T30-120 fans</a> underneath the Z53&rsquo;s radiator.</p>\n<p>Lastly, the custom PSU cabling is essential when building into a tiny shoebox-sized case like the T1. The standard cabling for any PSU is always going to be far too inflexible, so if you want to be able to route those cables easily and get them exactly where they need to go with very little slack then you need to invest in custom cabling.</p>\n<p>Thankfully there&rsquo;s a thriving tiny PC building and modding scene with plenty of suppliers of things like custom PSU cabling to get everything in your little system to fit just so.</p>\n<p>To give you a sense of just how small it is, here&rsquo;s a picture of it sat on top of my main work system which is built into a <a href=\"https://www.fractal-design.com/products/cases/north/north/charcoal-black/\">Fractal Design North</a>.</p>\n<figure class=\"archive\">\n                  <img src=\"/images/rocket/rocket.jpg\" alt=\"A picture of a new small PC on top of a much larger one\">\n                  <figcaption><p>FormD T1 atop a Fractal Design North</p></figcaption>\n               </figure>\n\n<p>If you&rsquo;ve never taken a look at a case like the T1 then it might be impossible to understand how a full PC ever has a hope of fitting into a space that small. The sandwich design is the key, moving the GPU behind the mainboard on the riser. Here&rsquo;s the back side of the system where the GPU lives. Everything else in the system\u2014chiefly the mainboard and the PSU\u2014lives directly behind it on the other side.</p>\n<figure class=\"archive\">\n                  <img src=\"/images/rocket/rocket_inside.jpg\" alt=\"A picture of the inside of a small PC case\">\n                  <figcaption><p>GPU side showing the Radeon RX 9070 and Z53 radiator on top of the T30 fans</p></figcaption>\n               </figure>\n\n<p>The main property I wanted to carry over from the Mac Pro into any replacement was its silence in normal operation and the Z53 on the CPU and the low idle power (~25W) of the Navi48-based Radeon RX 9070 help achieve that. Right now, with almost nothing happening on the system other than me writing this post, the GPU fans turn off completely and the CPU temperature sits at a reasonably cool 50C, allowing the T30-120s that move air through the Z53&rsquo;s radiator to spin at ~750rpm.</p>\n<p>Unless I significantly push either CPU or GPU, the system doesn&rsquo;t make a sound. When it does have some thermal load to deal with then there&rsquo;s no way for it to cope with it as gracefully as the Mac did, which is a step backwards, but then it is much smaller and therefore has to compromise on the possibilities for cooling.</p>\n<p>If I had to go back and build the system again then I don&rsquo;t think I&rsquo;d choose something like the T1. It&rsquo;s simply too small, which makes it really fiddly to build into and means you have to make compromises when it comes to dealing with the heat your components make. I built into the T1 because it looks cool, not because I&rsquo;m struggling for space or need to take it anywhere.</p>\n<p>So that&rsquo;s the gist of the new system: an incredibly powerful consumer CPU with near-silent watercooling, lots of RAM, and a power-efficient air-cooled GPU that doesn&rsquo;t get too hot or too loud, backed by lots of incredibly fast storage. A modern Linux distribution is a dream on a system like rocket, with almost every interaction with the system happening instantly.</p>\n<p>The displays I use\u2014LG 32GS95s, which are 32&rdquo; 4K240 OLEDs\u2014have a lot to do with that. Running at 240Hz at the full 4K (which the Mac Pro can&rsquo;t do, topping out at 4K144), desktop interactivity feels <em>really</em> good, and the Radeon RX 9070 GPU can run the pair of them at ~25W without pushing the GPU core or the GDDR6 up significantly over their baseline idle clocks.</p>\n<p>I boot the Mac Pro once a week now to have a FaceTime call with a friend, and it has a drastic difference in performance in all areas, starting from how slow it is to boot to the desktop with it only getting worse from there. There are aspects of the overall use of a modern Mac that I miss a little, which I&rsquo;ll write about when I talk about the software side of the new system in the future, but mostly there&rsquo;s been very little looking back, even after that exciting honeymoon period of using a new system for daily work had worn off.</p>"}, {"id": "https://rys.sommefeldt.com/post/year-of-the-linux-desktop", "title": "Year of the Linux desktop", "date_published": "2026-01-03T23:37:43+00:00", "url": "https://rys.sommefeldt.com/post/year-of-the-linux-desktop", "content_html": "<p>While writing <a href=\"/post/rotten-apples\">about my move away from the Mac</a> in 2025, I wanted to stick to what was wrong with the Mac rather than write extensively about what is better for me about what I replaced it with. I&rsquo;ll do that, but to get started I wanted to talk about the momentum behind Linux to frame why I&rsquo;ve switched to it, to make it easier to talk about those details in future posts.</p>\n<p>In that article about leaving the Mac I mentioned that <a href=\"https://archlinux.org/\">I use Arch btw</a> and talked a little bit about the new PC that I built that I&rsquo;m running Arch on, but there&rsquo;s a lot more to it that I want to talk about, both to document it and get back into writing as a hobby, and also to encourage anyone reading to maybe try Linux out.</p>\n<p>There&rsquo;s a huge amount of momentum around switching away from Windows or macOS to Linux at the time of writing, as people get really fed up with them in droves in much the same way that I have. It&rsquo;s not just because those platforms are getting worse and Linux is the only viable other option; Linux distributions and software written for Linux, especially for desktop systems, have all come on leaps and bounds in the last few years and made big improvements in user experience, compatability and reliability.</p>\n<p>Then there&rsquo;s Valve and their investment in <a href=\"https://store.steampowered.com/steamos\">SteamOS</a> and the open source software that adds all of the value to their Linux distro. The software that makes SteamOS able to run Windows games often much better than Windows can natively is some of the most impressive software engineering I think I&rsquo;ve ever seen.</p>\n<p>That Linux, using the open source software layers that Valve have put their resources behind to create SteamOS for their growing range of games consoles, can routinely run games better than Windows can on the same hardware in terms of both performance and reliability, speaks volumes for the overall progress that Linux has made in the last few years.</p>\n<p>There&rsquo;s been a fresh explosion of <a href=\"https://bazzite.gg/\">new</a> Linux distributions that put together their own opinionated views of what modern Linux should be like, and established distributions like Arch and Fedora have evolved to not only provide their view of modern Linux on the desktop, but have also become the substrate for many of the new distributions. Indeed, SteamOS is now based on Arch.</p>\n<p>The year of the Linux desktop has been a running joke for at least the last 20 years that I&rsquo;ve been using non-Windows operating systems for my daily personal computing. And while it might still turn out to be a running joke come 2027, I don&rsquo;t think I&rsquo;ve ever felt more certain that it could actually grow market share to 10% or more and become a serious problem for Microsoft and Apple as it gets there.</p>\n<p>If nothing else, both of those platform owners <em>need</em> the Year of the Linux desktop to happen, where Linux usage statistics become such a serious problem that it takes big chunks of revenue away from their bottom line. Disruption to their growth and money is the only thing either company is likely to use as a signal to change course with where they&rsquo;re taking Windows and macOS for personal computers and start to focus on what it will take to regain those users that are now looking elsewhere, like me.</p>"}, {"id": "https://rys.sommefeldt.com/post/rotten-apples", "title": "Faustian bargains for rotten apples", "date_published": "2025-12-25T15:10:53+00:00", "url": "https://rys.sommefeldt.com/post/rotten-apples", "content_html": "<p>If I don&rsquo;t publish at least one thing here in 2025 then I&rsquo;ll break a tradition I started back in 2011 when I restarted writing. Every year since then I&rsquo;ve put fingers to keyboard for at least one post, and I don&rsquo;t quite feel like mothballing or putting it out to pasture just yet, despite the morass and chilling effect of putting decent written content online these days. That&rsquo;s a great topic for 2026.</p>\n<p>So when thinking about what else I could write about in 2025 to keep the streak going, given so much is off the table now for so many reasons, I realised that one topic for me this year is still fair game: the big changes in my personal computing setup outside of work.</p>\n<p>I&rsquo;ve been using Apple&rsquo;s Mac as my daily driver since 2006, starting with a white polycarbonate MacBook. They rebooted that product line as part of their transition from PowerPC to x86 as the underlying processor architecture for their Mac products, running Mac OS X as it was called back then.</p>\n<p>Between 2002 and 2006 I&rsquo;d been using Linux in my personal computing life across the desktop and laptop systems that I had, and I&rsquo;d come to see Mac OS X as a somewhat ideal embodiment of what I loved about Linux: it paired a <a href=\"/post/unix\">Unix</a>-like core and userland with a slick GUI environment that was way more in sync with the way I think and work than Windows. The transition to x86 processors increased performance significantly so the tech world obviously stopped and took notice.</p>\n<p>The Mac brought a serious level of polish to the kind of personal computing software I&rsquo;m drawn to, by taking advantage of it only running on top of hardware they shipped and could therefore tightly optimise for. That gave them something very compelling that they&rsquo;ve cashed in on ever since, dragging legions of folks like me\u2014folks that can&rsquo;t gel with Windows and don&rsquo;t want to daily-drive Linux, but who still want a powerful, stable and malleable personal computer to create things with\u2014to their platform as a result.</p>\n<p>There&rsquo;s a Faustian bargain at play when you use a Mac, though, since you need to trade the free soul of software for its diabolical favours of polish, performance and stability. Sadly for Macphistopheles, now indubitably given over to the power of the endless riches provided by the others he made the same bargain with, he&rsquo;s not holding up his end any more. Drop a hand into his barrel of fresh apples these days and you&rsquo;re highly likely to grab one that&rsquo;s rotten. Thus ends the ropey pun section of this year&rsquo;s streak-keeping technological lament.</p>\n<p>Between 2006 and 2019, though, the bargain held firm. I don&rsquo;t buy new personal computers very often, so I don&rsquo;t mind investing what I judge to be the right money into the next one when I do. 2006&rsquo;s polycarbonate MacBook was parlayed into the first of a trio of desktop systems in 2010: a 27-inch iMac. I can&rsquo;t remember exactly what I paid for it but it wasn&rsquo;t bought new. I loved the all-in-one design that put pretty good hardware behind a great-for-the-time screen, so when the 27-inch &ldquo;5K Retina Display&rdquo; iMac showed up in 2014, putting pretty good hardware behind a now best-in-class display that optimised heavily for desktop usage and reading text, it was an easy choice to upgrade to one of those in 2015.</p>\n<p>Then in late 2019, flush with the spoils of a good bonus at work, I decided to heavily increase my stake in the Mac. Apple had given me three <em>really</em> good computers in the last decade and a bit, each improving on the last in key ways that truly felt like upgrades. So even though at the time of buying I knew they were transitioning every Mac to Apple Silicon at some point in the future, I was still happy to invest in what would turn out to be the final swansong for Intel in an Apple product: the 2019 Mac Pro.</p>\n<p>I was thirsty for all of the claims from Apple <a href=\"https://daringfireball.net/2017/04/the_mac_pro_lives\">that started in 2017</a> around re-designing the then poorly-regarded Mac Pro, the model line that replaced the Power Mac during the PowerPC to Intel transition. They convinced the world (or at least me) that they were taking high-end workstation computing properly again as a product class, and that the new Mac Pro that they were working on would be a love letter to that kind of system.</p>\n<p>Following the promises throughout 2017 and 2018, in 2019 it looked for all the world like they&rsquo;d delivered, and with an Apple Silicon version some nebulous time in the future away (which turned out to be 2023) I felt that while they were already actively moving away from Intel in other product lines, that one last Intel model released in 2019 would be supported well enough to last the roughly 5 year cadence that I tend to buy new personal machines on.</p>\n<p>So I tipped an obscene amount of money into a 2019 Mac Pro plus big upgrades and accessories to go with it, and felt good about the continuing state of my deal with the Mac division at Apple. At the time I bought it I thought I&rsquo;d be over the moon with the system and get all the way to about 2025 before feeling like upgrading. That&rsquo;d take me to almost 20 years of Macs with a desire to get the direct Apple Silicon-based replacement.</p>\n<p>Instead, I type this to you from a modern x86-64 system running Linux, the Mac Pro hasn&rsquo;t been switched on for anything serious in at least half a year now, and I sold the <a href=\"https://www.apple.com/uk/studio-display/\">Apple Studio Displays</a> I bought to go with it. The 2nd hand market for the 2019 Mac Pro is so poor that I got more for the Studio Displays than I could ever get for the Mac, and that&rsquo;s despite loading it with upgrades.</p>\n<p>I really went all out. I upgraded to the 24-core Intel Xeon W-3265M and 192GB of ECC DDR4-2933 (which is probably currently worth more than the rest of the system at the time of writing, due to datacentre deployments of ML systems turning the commodity DRAM market into a shambles), and added a <a href=\"https://www.sonnettech.com/product/m2-4x4-pcie-card/overview.html\">Sonnet 4x4</a> which I brimmed with enough high-end gen3x4 NVMe M.2 storage to have it benchmark at 12GB/s read and 10GB/s write. I replaced the default Radeon Pro 580X MPX with the Radeon Pro W5700X MPX to get access to its 16GB of dedicated VRAM, and spent almost $500 on <a href=\"https://www.apple.com/uk/shop/product/mw5j3zm/a/thunderbolt-4-usb%E2%80%91c-pro-cable-18m\">Thunderbolt 4 Pro cables</a> for the two Studio Displays. I even bought <a href=\"https://www.apple.com/uk/shop/product/mx572zm/a/apple-mac-pro-wheels-kit\">the stupid wheels</a>. By most measures it remains a beast of a machine that I should still relish using today.</p>\n<p>So, what went so wrong in the five years that I used it that it had me run screaming away from the platform I&rsquo;d loved using for almost 20 years? There&rsquo;s no denying Apple Silicon is (very) good, but I&rsquo;d have to be out of my mind to blame it on the &ldquo;legacy&rdquo; Intel hardware I chose to invest in one last time.</p>\n<p>Instead, and especially given it&rsquo;s what brought me to the Mac in the first place, it&rsquo;s truly maddening to write that it was the terrible quality of the software that really got under my skin, across both macOS and the software stack running on the Apple Studio Displays. The real kicker is that the closed source proprietary nature of it all means that there&rsquo;s nothing I could do about it.</p>\n<p>I have the privilege of access to key people at Apple responsible for some of the software running at the beating heart of the bits of macOS that went wrong for me, but\u2014and I say this with the utmost respect for those very talented engineers that tried to help me get some of my bugs fixed\u2014even they weren&rsquo;t able to do anything about what I reported to them directly. And if you don&rsquo;t have a direct line to folks working there like I do then you&rsquo;re left filing &ldquo;Feedback&rdquo;, something which I wouldn&rsquo;t even bother wasting my time on if I was still using a Mac today. Getting a helpful response is so rare as to make it completely useless as a means to get bugs fixed in macOS.</p>\n<p>The functional lowlights were super low:</p>\n<ul>\n<li>The firmware on the Apple Studio Displays wouldn&rsquo;t tolerate them being used with a Display Port switch, going blank when switching from Mac to PC and back to a Mac. That happened regardless of the Mac used, be it the Mac Pro or an M1 Pro-based MacBook Pro that I also have. Given the Studio Displays only have a single input, I had to physically swap the cable to move the displays to different machines, and most days I did that several times a day.</li>\n<li>macOS broke compatibility with the Sonnet 4x4 in macOS 14 Sonoma and didn&rsquo;t fix it until macOS 15 Sequoia. The failure mode was the installed SSDs not showing up on boot, cold or warm. It&rsquo;s hard to use a computer when your main high-performance storage array isn&rsquo;t there, and that was broken for a full year.</li>\n</ul>\n<p>Then there&rsquo;s myriad smaller bugs and problems that compound on top of the functional ones that stopped me from actually using the system. The worst of those are:</p>\n<ul>\n<li>macOS is <em>incredibly</em> slow almost everywhere you look; cold boot speed to a functional desktop, general I/O performance due to its security posture, fetching and applying software updates (especially major version upgrades). It&rsquo;s hard to overstate this when you get to use comparable hardware with modern Linux. Windows is a similar unoptimised morass, but for different reasons.</li>\n<li>The incessant design changes and feature creep that often seems anti-user. Liquid Glass makes fundamentally bad usability mistakes, especially around legibility of text. ML-powered features are often inaccurate and misleading (especially the text summaries), or are plain creepy and weird (generative image things like Genmoji).</li>\n<li>FaceTime won&rsquo;t tolerate me taking off my Bluetooth headphones mid-call to go and use the bathroom. They become unusable as an audio output target as soon as I take them off my head, and I have to restart the call to fix that. Sometimes I need to completely restart the whole Mac. That&rsquo;s been broken for almost 2 years.</li>\n</ul>\n<p>I&rsquo;ve already mentioned the next point but I have to repeat it since it&rsquo;s so critical. Given the proprietary nature of almost everything about macOS, from the bottom layer where nobody bar Apple can construct and sign a macOS kernel and boot it on the hardware, all the way up through their key substrate software like CoreGraphics and Foundation that most application software sits on top of, and the support black hole that they provide when the software goes wrong, it&rsquo;s impossible for anyone bar Apple to fix anything bugs or modify the system to suit their needs.</p>\n<p>So the bargain you make to use something proprietary like a Mac only holds while the platform operator is a good steward of what they control. That means responding diligently and rapidly to feedback about problems, and listening to users to figure out what we want from their hardware and software. When you&rsquo;re in charge of everything like that yet don&rsquo;t allow any user malleability, or allow anyone outside to poke and prod and fix things, you need to be the steward of that platform to perfection. I used to feel like they put me first when it came to crafting the whole system, so that even though it was proprietary and I had no say in how the hardware and software intersection went, I&rsquo;d get a fast, powerful, thoughtful system that did what I needed and could be moulded to my style of using a computer, with no showstopping rough edges that cause serious friction.</p>\n<p>This time around I got something that now doesn&rsquo;t fit what I&rsquo;m looking for, especially around Liquid Glass and the ML feature creep, and serious bugs that caused a complete inability to use the computer as intended. If the software was more open source I&rsquo;d be able to help fix it, and I actually enjoy getting my hands dirty to do just that.</p>\n<p>The bugs that involved the hardware feel particularly inexcusable given the money spent. Despite the Mac being a proprietary platform, the Mac Pro and the Studio Displays use industry standards for connecting add-in cards and the displays, allowing for the use of something like the Sonnet 4x4 (which is a PCIe card usable on other platforms, but designed by Sonnet to be used specifically with the 2019 Mac Pro), and connecting the displays to a PC.</p>\n<p>In fact, Apple are often the pioneers of the high-speed modern interface standards in the computer industry, for peripheral device, display and add-in card connectivity. They&rsquo;ve had a big hand in PCI Express, DisplayPort, USB and Thunderbolt, all of which feature in modern Mac systems the same way they do in contemporary competing systems.</p>\n<p>Despite that use of industry standards that should confer some standard interoperability with non-Apple hardware, I know that its my own fault for handing over the money in the first place, especially for the displays. I should have known that any company that sees fit to outfit a $1,600 segment flagship display with just a single input wouldn&rsquo;t care about how it might be used with a DisplayPort switch, despite that being the interface standard the display uses. They pull the same single input bullshit with the $4,999 Pro Display XDR.</p>\n<p>My post-Mac refuge takes the form of a very high performance x86-64 system running Linux, and it&rsquo;s an enormous difference in terms of interactivity, responsiveness and my ability to mould it to the way I want to work, adding and removing capabilities and configuring it just so. I&rsquo;ve paired that new system with a duo of LG 4K OLEDs (32GS95s) that run at 240Hz. Its CPU (an AMD Ryzen 9 9950X3D) has 25% fewer CPU cores than the Xeon in the Mac Pro, but each is much higher in terms of its raw performance and has a much higher performance cache and overall memory system (although I only have half the RAM capacity in the new system). Each of the individual Crucial T705 gen5x4 NVMe drives in the new system is almost as fast as the complete aggregate storage array in the Mac Pro&rsquo;s Sonnet 4x4. NVMe bandwidth has quadrupled like-for-like in the time since the Mac Pro was released.</p>\n<p>So even with my new system&rsquo;s hardware in the same kind of performance ballpark as the heavily upgraded Mac Pro, it still feels at least an order of magnitude faster and more responsive in normal use, especially when it comes to anything bound by I/O. The Linux distribution I use is <a href=\"https://archlinux.org/\">Arch btw</a>, and Arch is a rolling distribution that gets constantly upgraded with new software. I have a multi-gigabit connection to the Internet, which allows that new Linux system to download, validate, extract, and apply very large updates, even those spread across thousands of files, usually in the low tens of seconds.</p>\n<p>macOS takes several times longer than that just to validate the data it downloads as part of a system update process, never mind get it all extracted. prepared and applied to disk, even on a system with high-performance CPUs and very fast raw disk I/O performance like my Mac Pro. I know the things each OS does during system updates aren&rsquo;t 100% equivalent, but it highlights how fast a computer can be if the philosophy over who owns and controls the computer is flipped in favour of both the user and technical simplicity.</p>\n<p>On my Linux system all applications, including binaries I use from my shell, launch almost instantly, whereas on macOS you need to <a href=\"https://eclecticlight.co/2025/04/22/why-some-apps-launch-very-slowly/\">wait for the system</a> to phone home to Cupertino to ask for permission to run pretty much any code. I know that macOS does that in the name of system safety, but it results in a system that makes you feel like it&rsquo;s constantly wearing lead boots to wade through treacle. It&rsquo;s gotten to the point where it&rsquo;s <a href=\"https://eclecticlight.co/2025/09/30/do-apps-launch-faster-in-macos-tahoe/\">even slow running code for notarised apps</a> Apple have already been given signatures for, and that have already cleared the first-run quarantine process that macOS puts new applications through.</p>\n<p>Technologically I think we all know deep down that macOS doesn&rsquo;t need to be that way, doing so much behind the scenes all the time that it&rsquo;s noticeably detrimental to overall system responsiveness. Open Console.app on macOS and ask it to show you the current streaming system logs, something it doesn&rsquo;t do by default any more because of the sheer volume of log spam, and you&rsquo;ll see so much log text from everything running that it makes you feel like the system is broken.</p>\n<p>Given how good modern Linux distributions like Arch are these days, Apple and Microsoft <em>have</em> to be worried at this point. Especially Microsoft, who are currently somehow doing even worse than Apple when it comes to stewardship of their flagship consumer operating system, brimming it with intrusive ads\u2014thankfully something Apple has stayed away from in macOS\u2014and ML capabilities nobody seems to have asked for or wants to use.</p>\n<p>Put it all together\u2014the big functional bugs that persisted for full major version runs, the smaller yet significant usability issues, the proprietary closed-source nature of the software, the really bad Liquid Glass UI redesign, the ML features that don&rsquo;t work well on behalf of the user\u2014and they&rsquo;ve lost me as a desktop workstation customer at least for the forseeable future.</p>\n<p>Realistically, I can&rsquo;t see a way back unless they open source a majority of the substrate frameworks, undo or make truly optional years of the excess feature creep, fix a majority of the smaller operational bugs, make it <em>much</em> faster and more responsive, all while repealing the recent poor user interface design and experience. They&rsquo;re one of the world&rsquo;s richest companies despite that horrible slide in overall platform quality, so I won&rsquo;t hold my breath.</p>"}, {"id": "https://rys.sommefeldt.com/post/resurrecting-an-hpe-microserver-gen10-plus", "title": "Resurrecting an HPE ProLiant Microserver Gen10 Plus", "date_published": "2024-12-29T23:14:06+00:00", "url": "https://rys.sommefeldt.com/post/resurrecting-an-hpe-microserver-gen10-plus", "content_html": "<html><body><p>While preparing my <a href=\"/post/athena\">HPE ProLiant MicroServer Gen10 Plus</a> for sale to its new owner, I thought I\u2019d be helpful and upgrade the various UEFI, remote management and platform firmwares to their latest versions, since I was in the remote management system anyway returning the system back to factory settings.</p>\n<p>For some reason which I haven\u2019t quite figured out, a set of platform firmwares for the Gen10 Plus <em><strong>v2</strong></em>, which HPE call the Server Platform Services (SPS) firmwares, were flashed to what HPE call the ME ROM and subsequently the system stopped booting completely. The iLO was available but the rest of the system wouldn\u2019t power on.</p>\n<p>You\u2019d think that because the iLO was able to flash the wrong SPS bundle to the ME ROM, it\u2019d be able to flash the right one, but it\u2019s not able to do that unless the system is up and running, again for reasons I haven\u2019t quite figured out.</p>\n<p>Despite being a known issue affecting many MicroServer Gen10 Plus owners, caused by HPE, the company\u2019s official response is for users to cough up money for complete replacement mainboards. Thankfully, an incredibly helpful user on HPE\u2019s Community forums <a href=\"https://community.hpe.com/t5/proliant-servers-ml-dl-sl/fw-flashing-fail-and-no-power/m-p/7230929/highlight/true#M190176\">posted a remedy</a> with a slightly lower cost.</p>\n<p>The ME ROM on my particular Gen10 Plus is a <a href=\"https://www.macronix.com/Lists/Datasheet/Attachments/8667/MX25L6473F,%203V,%2064Mb,%20v1.3.pdf\">Macronix MX25L6473F</a> 8MiB SPI flash chip, in 8-pin SOP form factor, so I bought a cheap CH341A USB programmer from Amazon, including an adapter for the included SOP8 clamp and cable, and set to work.</p>\n<p>The first thing to do is disconnect power from the system completely and open it up by taking the top case off. Everything you do from here on in to reflash the ME ROM doesn\u2019t need system power. Then you unscrew the two Torx T15 retaining bolts that let the mainboard tray slide out and pull that out slowly and almost all the way.</p>\n<p>There\u2019s some cabling that stops you taking it out completely which you can detach if you want to fully remove the mainboard, but it\u2019s not strictly necessary if you have enough room where you\u2019re working on your own Gen10 Plus system.</p>\n<p>Then you need to remove the CPU heatsink (4 more T15s) and then optionally remove the CPU fan (4 more T15s). I removed the fan just to give myself a bit more room to get the clamp seated well on the MX25L6473F, and repasted the CPU for the new owner while I was there since the original thermal material had dried out quite a bit.</p>\n<p>Then with the SOP8 clamp on the flash chip and correctly cabled to the CH341A programmer, and that connected to USB in your system, you can dump the current flash (if you want to check out exactly how far the broken flash got, which isn\u2019t far in my case), and then reprogram new flash contents to get the ME ROM going again and bring the system back to life.</p>\n<p>I\u2019m a macOS user so I used a small command line utility (also available on Linux and other UNIX-likes) called <code>flashrom</code>, after preparing the new 8MiB firmware. I used another command line tool to do that called <code>bvi</code> (binary Vi), which allowed me to remove the pre- and post-amble around the 8MiB region that I needed, as <a href=\"https://community.hpe.com/t5/proliant-servers-ml-dl-sl/fw-flashing-fail-and-no-power/m-p/7230929/highlight/true#M190176\">mentioned in the post on the HPE Community forum</a>. The resulting binary file, which I called <code>extracted_rom.fwpkg</code>, taken from <a href=\"https://downloads.hpe.com/pub/softlib2/software1/fwpkg-generic/p788616784/v233987/MicroserverGen10PlusSPS_05.01.04.913.fwpkg\"><code>MicroserverGen10PlusSPS_05.01.04.913.fwpkg</code></a>, has a SHA256 hash of <code>b92532af89a89689a9dc0c9c6a532788368f522f81d6a893d98fd2566e9c7862</code>.</p>\n<p>I then flashed it like this:</p>\n<p><code>sudo flashrom --programmer ch341a_spi --chip MX25L6473F --write extracted_rom.fwpkg</code></p>\n<p>And then dumped the ROM back to a file in order to verify it had flashed correctly, like this:</p>\n<p><code>sudo flashrom --programmer ch341a_spi --chip MX25L6473F --read rom_dump.bin</code></p>\n<p>I then made sure the newly dumped <code>rom_dump.bin</code> had the same SHA256 hash as mentioned above, to validate it had flashed correctly, and then powered the server back on from the iLO. It started cleanly and after a couple of reboots (normal after flashing a new UEFI firmware which I had done prior to flashing the bad SPS bundle) it was behaving normally again.</p>\n<p>If you\u2019re interested in getting the exact same CH341A programmer and cable bundle that I did, it\u2019s <a href=\"https://amzn.eu/d/5AyVQab\">this one</a>. Note that isn\u2019t the cheapest one available, but is cheap enough and worked fine for me.</p>\n<p>Here\u2019s a (lightly edited) terminal log so you can see the interaction with the command line tools in more detail. The most interesting thing is <code>flashrom</code> not being able to exactly identify which Macronix flash chip it was (which I just read off the top of the chip manually), and saying it failed to unlock a status register which you can safely ignore.</p>\n<div class=\"code\"><pre><span></span><code>rys@rocket:~$<span class=\"w\"> </span>sudo<span class=\"w\"> </span>flashrom<span class=\"w\"> </span>--programmer<span class=\"w\"> </span>ch341a_spi\nflashrom<span class=\"w\"> </span>v1.5.1<span class=\"w\"> </span>on<span class=\"w\"> </span>Darwin<span class=\"w\"> </span><span class=\"m\">24</span>.2.0<span class=\"w\"> </span><span class=\"o\">(</span>x86_64<span class=\"o\">)</span>\nflashrom<span class=\"w\"> </span>is<span class=\"w\"> </span>free<span class=\"w\"> </span>software,<span class=\"w\"> </span>get<span class=\"w\"> </span>the<span class=\"w\"> </span><span class=\"nb\">source</span><span class=\"w\"> </span>code<span class=\"w\"> </span>at<span class=\"w\"> </span>https://flashrom.org\n\nFound<span class=\"w\"> </span>Macronix<span class=\"w\"> </span>flash<span class=\"w\"> </span>chip<span class=\"w\"> </span><span class=\"s2\">\"MX25L6405\"</span><span class=\"w\"> </span><span class=\"o\">(</span><span class=\"m\">8192</span><span class=\"w\"> </span>kB,<span class=\"w\"> </span>SPI<span class=\"o\">)</span><span class=\"w\"> </span>on<span class=\"w\"> </span>ch341a_spi.\nFound<span class=\"w\"> </span>Macronix<span class=\"w\"> </span>flash<span class=\"w\"> </span>chip<span class=\"w\"> </span><span class=\"s2\">\"MX25L6405D\"</span><span class=\"w\"> </span><span class=\"o\">(</span><span class=\"m\">8192</span><span class=\"w\"> </span>kB,<span class=\"w\"> </span>SPI<span class=\"o\">)</span><span class=\"w\"> </span>on<span class=\"w\"> </span>ch341a_spi.\nFound<span class=\"w\"> </span>Macronix<span class=\"w\"> </span>flash<span class=\"w\"> </span>chip<span class=\"w\"> </span><span class=\"s2\">\"MX25L6406E/MX25L6408E\"</span><span class=\"w\"> </span><span class=\"o\">(</span><span class=\"m\">8192</span><span class=\"w\"> </span>kB,<span class=\"w\"> </span>SPI<span class=\"o\">)</span><span class=\"w\"> </span>on<span class=\"w\"> </span>ch341a_spi.\nFound<span class=\"w\"> </span>Macronix<span class=\"w\"> </span>flash<span class=\"w\"> </span>chip<span class=\"w\"> </span><span class=\"s2\">\"MX25L6436E/MX25L6445E/MX25L6465E\"</span><span class=\"w\"> </span><span class=\"o\">(</span><span class=\"m\">8192</span><span class=\"w\"> </span>kB,<span class=\"w\"> </span>SPI<span class=\"o\">)</span><span class=\"w\"> </span>on<span class=\"w\"> </span>ch341a_spi.\nFound<span class=\"w\"> </span>Macronix<span class=\"w\"> </span>flash<span class=\"w\"> </span>chip<span class=\"w\"> </span><span class=\"s2\">\"MX25L6473E\"</span><span class=\"w\"> </span><span class=\"o\">(</span><span class=\"m\">8192</span><span class=\"w\"> </span>kB,<span class=\"w\"> </span>SPI<span class=\"o\">)</span><span class=\"w\"> </span>on<span class=\"w\"> </span>ch341a_spi.\nFound<span class=\"w\"> </span>Macronix<span class=\"w\"> </span>flash<span class=\"w\"> </span>chip<span class=\"w\"> </span><span class=\"s2\">\"MX25L6473F\"</span><span class=\"w\"> </span><span class=\"o\">(</span><span class=\"m\">8192</span><span class=\"w\"> </span>kB,<span class=\"w\"> </span>SPI<span class=\"o\">)</span><span class=\"w\"> </span>on<span class=\"w\"> </span>ch341a_spi.\nMultiple<span class=\"w\"> </span>flash<span class=\"w\"> </span>chip<span class=\"w\"> </span>definitions<span class=\"w\"> </span>match<span class=\"w\"> </span>the<span class=\"w\"> </span>detected<span class=\"w\"> </span>chip<span class=\"o\">(</span>s<span class=\"o\">)</span>:<span class=\"w\"> </span><span class=\"s2\">\"MX25L6405\"</span>,<span class=\"w\"> </span><span class=\"s2\">\"MX25L6405D\"</span>,<span class=\"w\"> </span><span class=\"s2\">\"MX25L6406E/MX25L6408E\"</span>,<span class=\"w\"> </span><span class=\"s2\">\"MX25L6436E/MX25L6445E/MX25L6465E\"</span>,<span class=\"w\"> </span><span class=\"s2\">\"MX25L6473E\"</span>,<span class=\"w\"> </span><span class=\"s2\">\"MX25L6473F\"</span>\nPlease<span class=\"w\"> </span>specify<span class=\"w\"> </span>which<span class=\"w\"> </span>chip<span class=\"w\"> </span>definition<span class=\"w\"> </span>to<span class=\"w\"> </span>use<span class=\"w\"> </span>with<span class=\"w\"> </span>the<span class=\"w\"> </span>-c<span class=\"w\"> </span>&lt;chipname&gt;<span class=\"w\"> </span>option.\n\nrys@rocket:~$<span class=\"w\"> </span>sudo<span class=\"w\"> </span>flashrom<span class=\"w\"> </span>--programmer<span class=\"w\"> </span>ch341a_spi<span class=\"w\"> </span>--chip<span class=\"w\"> </span>MX25L6473F<span class=\"w\"> </span>--write<span class=\"w\"> </span>extracted_rom.fwpkg\nflashrom<span class=\"w\"> </span>v1.5.1<span class=\"w\"> </span>on<span class=\"w\"> </span>Darwin<span class=\"w\"> </span><span class=\"m\">24</span>.2.0<span class=\"w\"> </span><span class=\"o\">(</span>x86_64<span class=\"o\">)</span>\nflashrom<span class=\"w\"> </span>is<span class=\"w\"> </span>free<span class=\"w\"> </span>software,<span class=\"w\"> </span>get<span class=\"w\"> </span>the<span class=\"w\"> </span><span class=\"nb\">source</span><span class=\"w\"> </span>code<span class=\"w\"> </span>at<span class=\"w\"> </span>https://flashrom.org\n\n<span class=\"o\">===</span>\nThis<span class=\"w\"> </span>flash<span class=\"w\"> </span>part<span class=\"w\"> </span>has<span class=\"w\"> </span>status<span class=\"w\"> </span>UNTESTED<span class=\"w\"> </span><span class=\"k\">for</span><span class=\"w\"> </span>operations:<span class=\"w\"> </span>WP\nCannot<span class=\"w\"> </span><span class=\"nb\">read</span><span class=\"w\"> </span>CONFIG:<span class=\"w\"> </span>unsupported<span class=\"w\"> </span>by<span class=\"w\"> </span>chip\nFailed<span class=\"w\"> </span>to<span class=\"w\"> </span>unlock<span class=\"w\"> </span>flash<span class=\"w\"> </span>status<span class=\"w\"> </span>reg<span class=\"w\"> </span>with<span class=\"w\"> </span>wp<span class=\"w\"> </span>support.\nReading<span class=\"w\"> </span>old<span class=\"w\"> </span>flash<span class=\"w\"> </span>chip<span class=\"w\"> </span>contents...<span class=\"w\"> </span><span class=\"k\">done</span>.\nUpdating<span class=\"w\"> </span>flash<span class=\"w\"> </span>chip<span class=\"w\"> </span>contents...<span class=\"w\"> </span>Erase/write<span class=\"w\"> </span><span class=\"k\">done</span><span class=\"w\"> </span>from<span class=\"w\"> </span><span class=\"m\">0</span><span class=\"w\"> </span>to<span class=\"w\"> </span>7fffff\nVerifying<span class=\"w\"> </span>flash...<span class=\"w\"> </span>VERIFIED.\n\nrys@rocket:~$<span class=\"w\"> </span>sudo<span class=\"w\"> </span>flashrom<span class=\"w\"> </span>--programmer<span class=\"w\"> </span>ch341a_spi<span class=\"w\"> </span>--chip<span class=\"w\"> </span>MX25L6473F<span class=\"w\"> </span>--read<span class=\"w\"> </span>rom_dump.bin\nflashrom<span class=\"w\"> </span>v1.5.1<span class=\"w\"> </span>on<span class=\"w\"> </span>Darwin<span class=\"w\"> </span><span class=\"m\">24</span>.2.0<span class=\"w\"> </span><span class=\"o\">(</span>x86_64<span class=\"o\">)</span>\nflashrom<span class=\"w\"> </span>is<span class=\"w\"> </span>free<span class=\"w\"> </span>software,<span class=\"w\"> </span>get<span class=\"w\"> </span>the<span class=\"w\"> </span><span class=\"nb\">source</span><span class=\"w\"> </span>code<span class=\"w\"> </span>at<span class=\"w\"> </span>https://flashrom.org\n\nFound<span class=\"w\"> </span>Macronix<span class=\"w\"> </span>flash<span class=\"w\"> </span>chip<span class=\"w\"> </span><span class=\"s2\">\"MX25L6473F\"</span><span class=\"w\"> </span><span class=\"o\">(</span><span class=\"m\">8192</span><span class=\"w\"> </span>kB,<span class=\"w\"> </span>SPI<span class=\"o\">)</span><span class=\"w\"> </span>on<span class=\"w\"> </span>ch341a_spi.\nReading<span class=\"w\"> </span>flash...<span class=\"w\"> </span><span class=\"k\">done</span>.\n\nrys@rocket:~$<span class=\"w\"> </span>ls<span class=\"w\"> </span>-lsa\ntotal<span class=\"w\"> </span><span class=\"m\">81960</span>\n<span class=\"w\">    </span><span class=\"m\">0</span><span class=\"w\"> </span>drwxr-xr-x@<span class=\"w\">  </span><span class=\"m\">7</span><span class=\"w\"> </span>rys<span class=\"w\">   </span>staff<span class=\"w\">      </span><span class=\"m\">224</span><span class=\"w\"> </span><span class=\"m\">29</span><span class=\"w\"> </span>Dec<span class=\"w\"> </span><span class=\"m\">22</span>:33<span class=\"w\"> </span>.\n<span class=\"w\">    </span><span class=\"m\">0</span><span class=\"w\"> </span>drwx------@<span class=\"w\"> </span><span class=\"m\">80</span><span class=\"w\"> </span>rys<span class=\"w\">   </span>staff<span class=\"w\">     </span><span class=\"m\">2560</span><span class=\"w\"> </span><span class=\"m\">28</span><span class=\"w\"> </span>Dec<span class=\"w\"> </span><span class=\"m\">22</span>:59<span class=\"w\"> </span>..\n<span class=\"m\">16424</span><span class=\"w\"> </span>-rw-r--r--@<span class=\"w\">  </span><span class=\"m\">1</span><span class=\"w\"> </span>rys<span class=\"w\">   </span>staff<span class=\"w\">  </span><span class=\"m\">8409026</span><span class=\"w\"> </span><span class=\"m\">28</span><span class=\"w\"> </span>Dec<span class=\"w\"> </span><span class=\"m\">22</span>:59<span class=\"w\"> </span>MicroserverGen10PlusSPS_05.01.04.913.fwpkg\n<span class=\"m\">16384</span><span class=\"w\"> </span>-rw-r--r--@<span class=\"w\">  </span><span class=\"m\">1</span><span class=\"w\"> </span>rys<span class=\"w\">   </span>staff<span class=\"w\">  </span><span class=\"m\">8388608</span><span class=\"w\"> </span><span class=\"m\">28</span><span class=\"w\"> </span>Dec<span class=\"w\"> </span><span class=\"m\">23</span>:26<span class=\"w\"> </span>extracted_rom.fwpkg\n<span class=\"m\">16384</span><span class=\"w\"> </span>-rw-r--r--@<span class=\"w\">  </span><span class=\"m\">1</span><span class=\"w\"> </span>root<span class=\"w\">  </span>staff<span class=\"w\">  </span><span class=\"m\">8388608</span><span class=\"w\"> </span><span class=\"m\">29</span><span class=\"w\"> </span>Dec<span class=\"w\"> </span><span class=\"m\">22</span>:24<span class=\"w\"> </span>rom_dump.bin\nrys@rocket:~$<span class=\"w\"> </span>sha256sum<span class=\"w\"> </span>rom_dump.bin\nb92532af89a89689a9dc0c9c6a532788368f522f81d6a893d98fd2566e9c7862<span class=\"w\">  </span>rom_dump.bin\n</code></pre></div>\n<p>I didn\u2019t need to install any USB drivers for the CH341A to work, but you might have to do that if you\u2019re flashing from Windows.</p>\n<p>Lastly, here are a few images to show you how to orient the connector cable on the CH341A (pin 1 is important), and where the ME ROM SPI chip is on the mainboard, with clamp attached. Good luck if you need to do any of the above to your own MicroServer Gen10 Plus!</p>\n<figure class=\"archive\">\n<img alt=\"CH341A USB Programmer\" src=\"/images/gen10plus/ch341a.jpg\"/>\n<figcaption><p>CH341A USB Programmer</p></figcaption>\n</figure>\n<figure class=\"archive\">\n<img alt=\"HPE Gen10 Plus with SPI flasher attached\" src=\"/images/gen10plus/gen10plus-1.jpg\"/>\n<figcaption><p>Gen10 Plus with SPI flasher attached</p></figcaption>\n</figure>\n<figure class=\"archive\">\n<img alt=\"HPE Gen10 Plus SPI ROM location\" src=\"/images/gen10plus/gen10plus-2.jpg\"/>\n<figcaption><p>HPE Gen10 Plus SPI ROM location</p></figcaption>\n</figure></body></html>"}, {"id": "https://rys.sommefeldt.com/post/ddrm", "title": "DDRM", "date_published": "2023-12-25T19:27:37+00:00", "url": "https://rys.sommefeldt.com/post/ddrm", "content_html": "<p>Merry Christmas! In my part of the world it&rsquo;s a time of year that brings people together to reinvigorate the spirit of friendship and family, hopefully regardless of religious proclivities or beliefs. It&rsquo;s also traditional where I&rsquo;m from to celebrate it with the giving and receiving of gifts.</p>\n<p>My gift to you this year is DDRM, a DNS record monitoring application written in <a href=\"https://go.dev\">golang</a>. You provide it with DNS records that you&rsquo;d like it to observe, along with expected values, and then it periodically checks them and emails you if anything is different to the expected state.</p>\n<p>DDRM is designed to be easy to configure and easy to operate, using a simple JSON schema for both the core application config and the records you want it to monitor, and easy tuning of runtime state using command line flags.</p>\n<p>It has a built-in terminal UI to help make it easy to operate, and it optionally supports using a Redis database as a runtime cache, allowing it to retain state across restarts.</p>\n<p>It&rsquo;s designed to be run on a Unix-like of some sort but it could be made to work on Windows with a little effort. There&rsquo;s also a mini roadmap of sorts in the main <code>README.md</code> in the source tree, for things I&rsquo;d like it to be able to do in the future.</p>\n<p>It&rsquo;s open source and available on my <a href=\"https://git.sr.ht/~rys/ddrm\">Sourcehut</a>, with a mirror on <a href=\"https://github.com/rys/ddrm\">GitHub</a>. The GitHub release has binary packages if that&rsquo;s easier for you than building it from source.</p>"}, {"id": "https://rys.sommefeldt.com/post/age", "title": "Age", "date_published": "2023-10-07T00:14:00+00:00", "url": "https://rys.sommefeldt.com/post/age", "content_html": "<p><code>age18nw4y0wsyjr44yktks2jazhtdwnzjg3tuugjru33pv0un6kxaglqpjkmjq</code></p>"}]}