<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Hardware on Sysadmin Tales</title>
    <link>https://blog.ssb-tech.net/tags/hardware/</link>
    <description>Recent content in Hardware on Sysadmin Tales</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 02 Oct 2026 21:39:10 -0400</lastBuildDate>
    <atom:link href="https://blog.ssb-tech.net/tags/hardware/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Linux on an Asus CR11 Chromebook</title>
      <link>https://blog.ssb-tech.net/posts/linux-on-a-chromebook/</link>
      <pubDate>Sat, 13 Dec 2025 15:52:08 -0500</pubDate>
      <guid>https://blog.ssb-tech.net/posts/linux-on-a-chromebook/</guid>
      <description>&lt;h2 id=&#34;in-which-i-have-zero-self-control&#34;&gt;In which I have zero self control&lt;/h2&gt;&#xA;&lt;p&gt;While browsing the Amazon Black Friday sales a few weeks ago, a particular deal caught my eye.&lt;/p&gt;&#xA;&lt;p&gt;An ASUS Chromebook CR11 ruggedized laptop for around $130.&lt;/p&gt;&#xA;&lt;p&gt;Now, I have enough laptops, but I&amp;rsquo;ve always wanted to try and hack Linux onto one, and this one was attractive due to its ruggedized nature as well as a full blown Intel N100 CPU.&lt;/p&gt;&#xA;&lt;p&gt;I purchased the laptop and once it arrived, I began poking around the internet to see how I could get regular Linux on this thing.&lt;/p&gt;&#xA;&lt;h2 id=&#34;installing-linux-part-1&#34;&gt;Installing Linux, Part 1&lt;/h2&gt;&#xA;&lt;p&gt;I have no desire to use Google&amp;rsquo;s spyware filled ChromeOS, so if I couldn&amp;rsquo;t find a way to get Linux on this machine, it was going back to Amazon.&lt;/p&gt;&#xA;&lt;p&gt;A few searches guided me to &lt;a href=&#34;https://docs.mrchromebox.tech/&#34;&gt;mrchromebox.tech&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This specific model I had was very similar to a few other builds that show full compatibility, so my hopes were raised.&lt;/p&gt;&#xA;&lt;p&gt;I went through their &lt;a href=&#34;https://docs.mrchromebox.tech/docs/getting-started.html&#34;&gt;Getting Started&lt;/a&gt; guide, which helped me get Developer Mode enabled, and I found my device ID.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;ANRAGGAR&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;This HWID showed full compatibility with the full UEFI replacement firmware, which is exactly what I wanted.&lt;/p&gt;&#xA;&lt;p&gt;However, on most ChromeOS devices, it&amp;rsquo;s a requirement to &lt;a href=&#34;https://docs.mrchromebox.tech/docs/firmware/wp/disabling.html&#34;&gt;disable hardware write protection&lt;/a&gt; in order to flash the replacement firmware.&lt;/p&gt;&#xA;&lt;p&gt;This particular model had a Ti50 security chip, so the only method of disabling write protection was to use Closed Case Debugging (CCD). This process requires a &amp;ldquo;SuzyQ&amp;rdquo; ChromeOS debug board.&lt;/p&gt;&#xA;&lt;p&gt;A little bit annoying, but not the end of the world.&lt;/p&gt;&#xA;&lt;p&gt;I went on eBay and found the debug board listed &lt;a href=&#34;https://www.ebay.com/itm/316024978790&#34;&gt;here.&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;It took around a week to get to my house, and with that in hand, I tried again.&lt;/p&gt;&#xA;&lt;h2 id=&#34;installing-linux-part-2&#34;&gt;Installing Linux, Part 2&lt;/h2&gt;&#xA;&lt;p&gt;I followed the steps listed &lt;a href=&#34;https://docs.mrchromebox.tech/docs/firmware/wp/disabling.html#using-closed-case-debugging-ccd-using-a-suzyqable&#34;&gt;here&lt;/a&gt; to disable hardware write protection.&lt;/p&gt;&#xA;&lt;div class=&#34;callout callout-note&#34; role=&#34;note&#34;&gt;&lt;div class=&#34;callout-title&#34;&gt;Note&lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A SuzyQ cable is not like a typical USB-C connected device, where it is reversible. If you look closely at the board, one will be labeled side A, the other is side B. On the board that I received, side A needed to be facing up.&lt;/li&gt;&#xA;&lt;li&gt;I had plugged it into the top left USB-C port on my laptop, I&amp;rsquo;m not sure if it will work when plugged into the other one. However, I did power the board by plugging it into the other available USB-C port.&lt;/li&gt;&#xA;&lt;li&gt;The MrChromebox documentation says that it takes 2-3 minutes of pressing the physical presence sensor to enable CCD. In reality, it was more like 5. It paused several times during the process, and it rebooted without ever showing me the &amp;ldquo;PP Done!&amp;rdquo; message that the docs suggest. However, the steps there did work fine.&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Once I had gone through the steps and verified that hardware write protection was indeed disabled, I proceeded to the next step, which was flashing the firmware.&lt;/p&gt;&#xA;&lt;p&gt;I used the provided &lt;a href=&#34;https://docs.mrchromebox.tech/docs/fwscript.html&#34;&gt;firmware utility script&lt;/a&gt; to flash the firmware.&lt;/p&gt;&#xA;&lt;p&gt;Generally I don&amp;rsquo;t recommend running scripts blindly from the internet, but it truly does make this process a ton easier, and if you wish, you can review the script yourself. (And I recommend doing so before you run it!)&lt;/p&gt;&#xA;&lt;p&gt;First, I backed up the existing ChromeOS firmware to a USB stick. Handy, in case I ended up needing to return this laptop.&lt;/p&gt;&#xA;&lt;p&gt;Then, I proceeded to flash the Coreboot UEFI firmware.&lt;/p&gt;&#xA;&lt;p&gt;It took a few minutes, but once done I was able to boot into the &lt;a href=&#34;https://fedoraproject.org/spins/sway/download&#34;&gt;Fedora 43 Sway Spin&lt;/a&gt; installer.&lt;/p&gt;&#xA;&lt;h2 id=&#34;some-problems&#34;&gt;Some problems&lt;/h2&gt;&#xA;&lt;p&gt;I noticed right away that the touchpad didn&amp;rsquo;t work in the installer, but I proceeded anyway. I could have grabbed a mouse, but being the lazy person I am, I just navigated the installation with the keyboard instead.&lt;/p&gt;&#xA;&lt;p&gt;Once installed, it took me a few minutes to figure out where all the needed buttons were.&lt;/p&gt;&#xA;&lt;p&gt;Linux maps the Chromebook Search key to Super_L, which I needed to open the default &lt;code&gt;drun&lt;/code&gt; menu. Can&amp;rsquo;t do much in &lt;a href=&#34;https://swaywm.org/&#34;&gt;Sway&lt;/a&gt; without being able to open &lt;code&gt;drun&lt;/code&gt; or a similar launcher!&lt;/p&gt;&#xA;&lt;p&gt;The touchpad still didn&amp;rsquo;t work, and neither did sound. However, everything else worked a treat.&lt;/p&gt;&#xA;&lt;p&gt;It was a bit strange, since the touchpad appeared normally in &lt;code&gt;libinput --list-devices&lt;/code&gt;, and the sound driver appeared normally in &lt;code&gt;pavucontrol&lt;/code&gt;, however, neither of them worked at all, and there were a TON of errors in &lt;code&gt;dmesg&lt;/code&gt; regarding the sound driver.&lt;/p&gt;&#xA;&lt;p&gt;I did some searching on the &lt;a href=&#34;https://forum.chrultrabook.com/&#34;&gt;chultrabook forums&lt;/a&gt;, and I was able to find solutions for both issues.&lt;/p&gt;&#xA;&lt;h3 id=&#34;fixing-the-audio-problem&#34;&gt;Fixing the audio problem&lt;/h3&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://docs.chultrabook.com&#34;&gt;chultrabook docs&lt;/a&gt; contained a &amp;ldquo;Post-Install&amp;rdquo; FAQ that was very helpful - I found their &lt;a href=&#34;https://github.com/WeirdTreeThing/chromebook-linux-audio&#34;&gt;audio script&lt;/a&gt; which was all I needed to get sound working.&lt;/p&gt;&#xA;&lt;h3 id=&#34;fixing-the-touchpad-problem&#34;&gt;Fixing the touchpad problem&lt;/h3&gt;&#xA;&lt;p&gt;The touchpad issue was a bit trickier to pin down.&lt;/p&gt;&#xA;&lt;p&gt;Eventually I found &lt;a href=&#34;https://forum.chrultrabook.com/t/no-touchpad-multitouch-on-asus-chromebook-cx9-drobit/3606&#34;&gt;this post&lt;/a&gt; that pointed me in the right direction.&lt;/p&gt;&#xA;&lt;p&gt;The answer was to configure a &lt;code&gt;libinput&lt;/code&gt; quirk:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo vim /etc/libinput/local-overrides.quirks&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enter the following content:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[PNP Touchpad]&#xA;MatchName=*PNP*Touchpad*&#xA;AttrResolutionHint=31x31&#xA;AttrPressureRange=10:8&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Replace &lt;code&gt;PNP&lt;/code&gt; with your touchpad model as it shows up in &lt;code&gt;libinput --list-devices&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Once you&amp;rsquo;ve done so, write and quit the file, then reboot your Chromebook.&lt;/p&gt;&#xA;&lt;p&gt;Success! The touchpad now works!&lt;/p&gt;&#xA;&lt;h2 id=&#34;final-thoughts&#34;&gt;Final Thoughts&lt;/h2&gt;&#xA;&lt;p&gt;The Chromebook performs very well under Fedora, but I&amp;rsquo;m also not running a full on desktop environment.&lt;/p&gt;&#xA;&lt;p&gt;If KDE is your preferred environment, you may run into more issues, especially since this device only has 4GB of onboard memory, and a relatively weak Intel CPU.&lt;/p&gt;&#xA;&lt;p&gt;I haven&amp;rsquo;t used Gnome in quite some time, but I expect it would run into similar limitations.&lt;/p&gt;&#xA;&lt;p&gt;The screen isn&amp;rsquo;t fantastic, but it&amp;rsquo;s good enough for what I&amp;rsquo;m planning on using this laptop for - effectively just tossing it in my bag when I need a super small and light laptop for travelling, or when I want to sit on the couch and chat on Discord while watching TV.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Do I recommend buying this specifically to run Linux?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;No, not really.&lt;/p&gt;&#xA;&lt;p&gt;It works great once you get it going, especially for the price, but you can likely find better laptops on eBay.&lt;/p&gt;&#xA;&lt;p&gt;Used ThinkPads are the way to go for cheap laptops.&lt;/p&gt;&#xA;&lt;p&gt;This was just a fun little &amp;ldquo;I wonder if I can do this&amp;rdquo; project.&lt;/p&gt;&#xA;&lt;p&gt;That said, if you already have one of these devices? I &lt;em&gt;highly&lt;/em&gt; recommend installing regular Linux on it.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Setting up brscan-skey with the Brother DS-940DW on Ubuntu</title>
      <link>https://blog.ssb-tech.net/posts/linux-scanning-ds940dw/</link>
      <pubDate>Fri, 13 Jun 2025 18:58:09 -0400</pubDate>
      <guid>https://blog.ssb-tech.net/posts/linux-scanning-ds940dw/</guid>
      <description>&lt;h1 id=&#34;setting-up-brscan-skey-with-the-brother-ds-940dw-on-ubuntu&#34;&gt;Setting up brscan-skey with the Brother DS-940DW on Ubuntu&lt;/h1&gt;&#xA;&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;&#xA;&lt;p&gt;The Brother DS-940DW is a little handheld mobile scanner. Getting it working on Linux in a way where you can actually use the Start/Stop button on the scanner to scan things was a bit of a bear, so I thought I&amp;rsquo;d document how I did it.&lt;/p&gt;&#xA;&lt;p&gt;Part of the issue is that brscan-skey depends on the old version of &lt;code&gt;libsane&lt;/code&gt;, and does not work with &lt;code&gt;libsane1&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;solving-the-dependency-problem&#34;&gt;Solving the dependency problem&lt;/h2&gt;&#xA;&lt;p&gt;First, install the provided driver from the &lt;a href=&#34;https://support.brother.com/g/b/downloadlist.aspx?c=us&amp;amp;lang=en&amp;amp;prod=ds940dw_us_eu_as&amp;amp;os=128&#34;&gt;support page for the DS-940DW&lt;/a&gt;&#xA;You can grab the scan-key-tool deb package from &lt;a href=&#34;https://download.brother.com/welcome/dlf006652/brscan-skey-0.3.4-0.amd64.deb&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Going by &lt;a href=&#34;https://support.brother.com/g/b/faqend.aspx?c=as_ot&amp;amp;lang=en&amp;amp;prod=dcpl2600d_eu_as&amp;amp;faqid=faq00100811_000&#34;&gt;this Brother support article&lt;/a&gt;, I was able to get brscan-skey installed.&lt;/p&gt;&#xA;&lt;h3 id=&#34;steps&#34;&gt;Steps&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo su&#xA;apt update&#xA;apt install sane libsane1 sane-utils imagemagick&#xA;wget -c http://jp.archive.ubuntu.com/ubuntu/pool/universe/s/sane-backends/libsane_1.1.1-5_amd64.deb&#xA;dpkg -i libsane_1.1.1-5_amd64.deb&#xA;apt install evince&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;configure-scanning&#34;&gt;Configure scanning&lt;/h2&gt;&#xA;&lt;p&gt;I had all sorts of fun figuring out how this all works, and honestly it&amp;rsquo;s pretty simple.&lt;/p&gt;&#xA;&lt;p&gt;Pressing the Start/Stop button on the scanner while brscan-skey is running calls this shell script:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;/opt/brother/scanner/brscan-skey/script/scantofile.sh&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;You can have it do whatever you want by editing the script.&lt;/p&gt;&#xA;&lt;p&gt;By default it uses psutils and pod2pdf, and a bunch of other utilities to scan first to PostScript, then convert it to PDF.&lt;/p&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t often have the need to scan complex documents, so I simplified this quite a bit, as I&amp;rsquo;ll show you here in second.&lt;/p&gt;&#xA;&lt;p&gt;But before we do anything, we need to add some udev rules.&lt;/p&gt;&#xA;&lt;p&gt;Create a file at &lt;code&gt;/etc/udev/rules.d/NN-brother-mfp-brscan5-1.0.2-2.rules&lt;/code&gt; with the following content:&lt;/p&gt;&#xA;&lt;h3 id=&#34;udev-rules&#34;&gt;udev rules&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ACTION!=&amp;#34;add&amp;#34;, GOTO=&amp;#34;brother_mfp_end&amp;#34;&#xA;SUBSYSTEM==&amp;#34;usb&amp;#34;, GOTO=&amp;#34;brother_mfp_udev_1&amp;#34;&#xA;SUBSYSTEM!=&amp;#34;usb_device&amp;#34;, GOTO=&amp;#34;brother_mfp_end&amp;#34;&#xA;LABEL=&amp;#34;brother_mfp_udev_1&amp;#34;&#xA;&#xA;ATTRS{idVendor}==&amp;#34;04f9&amp;#34;, GOTO=&amp;#34;brother_mfp_udev_2&amp;#34;&#xA;GOTO=&amp;#34;brother_mfp_end&amp;#34;&#xA;LABEL=&amp;#34;brother_mfp_udev_2&amp;#34;&#xA;&#xA;ATTRS{bInterfaceClass}!=&amp;#34;0ff&amp;#34;, GOTO=&amp;#34;brother_mfp_end&amp;#34;&#xA;ATTRS{bInterfaceSubClass}!=&amp;#34;0ff&amp;#34;, GOTO=&amp;#34;brother_mfp_end&amp;#34;&#xA;ATTRS{bInterfaceProtocol}!=&amp;#34;0ff&amp;#34;, GOTO=&amp;#34;brother_mfp_end&amp;#34;&#xA;&#xA;MODE=&amp;#34;0666&amp;#34;&#xA;GROUP=&amp;#34;scanner&amp;#34;&#xA;ENV{libsane_matched}=&amp;#34;yes&amp;#34;&#xA;LABEL=&amp;#34;brother_mfp_end&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Reload udev rules:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo udevadm control --reload &amp;amp;&amp;amp; sudo udevadm trigger&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;scanner-group&#34;&gt;Scanner group&lt;/h3&gt;&#xA;&lt;p&gt;You&amp;rsquo;ll also want to add the user you want doing the scanning to the scanner group.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo usermod -aG scanner &amp;lt;username&amp;gt;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;systemd-service&#34;&gt;Systemd service&lt;/h3&gt;&#xA;&lt;p&gt;I created a systemd service to run brscan-skey at boot.&lt;/p&gt;&#xA;&lt;p&gt;Create the following at &lt;code&gt;/etc/systemd/system/brscan-skey.service&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Unit]&#xA;Description=Brother scan-key-tool&#xA;&#xA;[Service]&#xA;User=scott&#xA;Type=forking&#xA;ExecStart=/opt/brother/scanner/brscan-skey/brscan-skey&#xA;ExecStop=/opt/brother/scanner/brscan-skey/brscan-skey --terminate&#xA;&#xA;[Install]&#xA;WantedBy=multi-user.target&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Run the following commands:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo systemctl daemon-reload&#xA;sudo systemctl enable --now brscan-skey.service&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You may need to reboot. I did.&lt;/p&gt;&#xA;&lt;h3 id=&#34;simple-scantofilesh-script&#34;&gt;Simple scantofile.sh script&lt;/h3&gt;&#xA;&lt;p&gt;First make a backup of the existing script, just in case.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo mv /opt/brother/scanner/brscan-skey/script/scantofile.sh /opt/brother/scanner/brscan-skey/script/scantofile.sh.bak&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Now we create our own version:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo vim /opt/brother/scanner/brscan-skey/script/scantofile.sh&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#! /bin/sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set +o noclobber&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BASE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;$HOME/brscan&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pdf_name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;date | sed s/&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;/&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;_&amp;#39;&lt;/span&gt;/g | sed s/&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\:&amp;#39;&lt;/span&gt;/&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;_&amp;#39;&lt;/span&gt;/g&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;output_full&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$BASE&lt;span style=&#34;color:#e6db74&#34;&gt;/&lt;/span&gt;$pdf_name&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# scan the image in using scanimage&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scanimage -x 215.9 -y 279.4 --format&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;png &amp;gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$output_full&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;.png&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Convert to PDF using imagemagick&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;convert &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$output_full&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;.png &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$output_full&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;.pdf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Created file &lt;/span&gt;$output_full&lt;span style=&#34;color:#e6db74&#34;&gt;.pdf&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Cleanup&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$output_full&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;.png&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;My script assumes a lot of things. It assumes that you&amp;rsquo;re using letter size paper, for one. This was a really quick and dirty hack - maybe I&amp;rsquo;ll refactor this in the future.&lt;/p&gt;&#xA;&lt;h2 id=&#34;future-goals&#34;&gt;Future goals&lt;/h2&gt;&#xA;&lt;p&gt;My goal for getting this working was to have a small, low power x86 PC that just runs this and nothing else. It&amp;rsquo;s connected via WiFi so I can put it anywhere, and hopefully make it so that I &lt;em&gt;actually use it&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I have it exposing an NFS share that I&amp;rsquo;m going to mount as an ingestion folder for &lt;a href=&#34;https://docs.paperless-ngx.com/&#34;&gt;Paperless-NGX&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Maybe I&amp;rsquo;ll create another blog post soon showing how I got that set up.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Thoughts on starting a media server in 2025</title>
      <link>https://blog.ssb-tech.net/posts/media-server-thoughts/</link>
      <pubDate>Fri, 03 Jan 2025 17:56:14 -0500</pubDate>
      <guid>https://blog.ssb-tech.net/posts/media-server-thoughts/</guid>
      <description>&lt;h1 id=&#34;thoughts-on-starting-a-media-server-in-2025&#34;&gt;Thoughts on starting a media server in 2025&lt;/h1&gt;&#xA;&lt;div class=&#34;callout callout-note&#34; role=&#34;note&#34;&gt;&lt;div class=&#34;callout-title&#34;&gt;Note&lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;Be warned that the text below is an opinion piece. My way is not the be-all-end-all, but this is how &lt;em&gt;I&lt;/em&gt; would choose to do it if I was starting over from scratch.&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Recently, someone on one of the less technical Discord servers that I frequent asked a question about setting up &lt;a href=&#34;https://plex.tv&#34;&gt;Plex&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;While Plex is still a perfectly capable media server - I still run it myself, simply because migrating the 20+ users I have using it to &lt;a href=&#34;https://jellyfin.org&#34;&gt;Jellyfin&lt;/a&gt; would be difficult - there are some &lt;a href=&#34;https://www.reddit.com/r/selfhosted/comments/180maoe/plex_crossed_a_line_with_your_week_in_review/&#34;&gt;privacy concerns&lt;/a&gt; over the changes that Plex has made in recent years.&lt;/p&gt;&#xA;&lt;p&gt;This got me thinking, how would &lt;em&gt;I&lt;/em&gt; suggest setting up a media server in 2025? What would that look like if someone was starting from nothing?&lt;/p&gt;&#xA;&lt;p&gt;This article is oriented at newer users who have little knowledge of networking, but want to break free from the tyranny that is their cable provider or the various streaming services.&lt;/p&gt;&#xA;&lt;p&gt;I used to recommend Alex Kretzschmar&amp;rsquo;s &lt;a href=&#34;https://perfectmediaserver.com&#34;&gt;PerfectMediaServer&lt;/a&gt; website to people who are getting started, but that&amp;rsquo;s gotten a bit too complicated, in my opinion. (Sorry Alex, but I don&amp;rsquo;t think I want to push Linux newbies towards NixOS.)&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-which-media-server-do-i-want-to-use&#34;&gt;1. Which media server do I want to use?&lt;/h2&gt;&#xA;&lt;p&gt;If you don&amp;rsquo;t have interest in sharing your media outside of your home, go with Jellyfin.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s a newer piece of software, but it is completely free and open source, and hardware transcoding is not locked behind a paywall like it is with Plex.&lt;/p&gt;&#xA;&lt;p&gt;Another potential option is &lt;a href=&#34;https://emby.media&#34;&gt;Emby&lt;/a&gt;, but while I&amp;rsquo;ve heard good things about it (Jellyfin happens to be a fork of it!) I have very little experience with it personally.&lt;/p&gt;&#xA;&lt;p&gt;Plex is still a viable option if you&amp;rsquo;re not super technical and want to be able to share your media library easily with friends and family. Just know that running Plex does now come with some privacy implications.&lt;/p&gt;&#xA;&lt;p&gt;If you do go with Plex, make sure you follow the steps in this &lt;a href=&#34;https://old.reddit.com/r/selfhosted/comments/180maoe/plex_crossed_a_line_with_your_week_in_review/ka7lzkv/&#34;&gt;Reddit comment&lt;/a&gt; to disable most of the problematic &amp;ldquo;features&amp;rdquo;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-what-hardware-do-i-need&#34;&gt;2. What hardware do I need?&lt;/h2&gt;&#xA;&lt;p&gt;The hardware requirements for running a basic, single person media server are more modest than you might expect. What I would recommend for someone getting started is a PC with a relatively recent Intel processor, 8GB of RAM, and an SSD boot drive. Something like an off-lease Dell Optiplex 3060 micro PC from eBay would work fine.&lt;/p&gt;&#xA;&lt;p&gt;What&amp;rsquo;s the reason for recommending an Intel CPU specifically?&lt;/p&gt;&#xA;&lt;p&gt;In short, &lt;strong&gt;QuickSync.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Intel QuickSync is a hardware transcoding technology integrated into the iGPU on modern Intel CPUs. This means that you don&amp;rsquo;t need a separate video card for handling transcoding tasks.&lt;/p&gt;&#xA;&lt;p&gt;Transcoding is important for media servers, as they often need to transcode one video format to another on the fly. Without hardware transcoding, you&amp;rsquo;ll be stuck with software transcoding, which will result in a ton of unnecessary CPU usage and power draw.&lt;/p&gt;&#xA;&lt;p&gt;QuickSync is by far the best in class when it comes to price to performance and performance per watt.&lt;/p&gt;&#xA;&lt;p&gt;That said, avoid the earlier iterations of QuickSync, as they were far less performant.&lt;/p&gt;&#xA;&lt;p&gt;Anything above 8th generation Intel should be sufficient for this task. Think i5-8500, i7-8700 - even the i3 variant would probably be enough for a low power machine with only a few users.&lt;/p&gt;&#xA;&lt;p&gt;You&amp;rsquo;ll also need some storage. This doesn&amp;rsquo;t have to be anything special - if your data needs are modest, you can probably get away with a single hard drive, or even a USB external hard drive, if that&amp;rsquo;s all you have on hand and you want to get started.&lt;/p&gt;&#xA;&lt;p&gt;If you need more space, though, look into getting a NAS to store the media. This will be a separate box that your media server will talk to over the network in order to get to the media files.&lt;/p&gt;&#xA;&lt;p&gt;There are pre-assembled solutions such as the &lt;a href=&#34;https://www.truenas.com/truenas-mini/&#34;&gt;TrueNAS Mini&lt;/a&gt;, or &lt;a href=&#34;https://www.synology.com/en-us&#34;&gt;Synology&lt;/a&gt;. However, these almost always come without hard drives that you will have provide yourself, and the units themselves are very expensive for the hardware that you&amp;rsquo;re getting.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;d prefer to go the DIY route - I recommend having a look at &lt;a href=&#34;https://blog.briancmoses.com/categories/diy-nas/&#34;&gt;Brian C. Moses&amp;rsquo; blog&lt;/a&gt;. He has some excellent guides for setting up affordable and power efficient systems that don&amp;rsquo;t compromise too much on performance.&lt;/p&gt;&#xA;&lt;p&gt;In case you were wondering - yes - you &lt;em&gt;can&lt;/em&gt; combine both of these devices into one, and run your media server on your NAS. Just make sure you adjust your hardware requirements accordingly.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;You will need a more powerful processor and more RAM to run both of these services in one box.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;I would recommend at &lt;em&gt;minimum&lt;/em&gt; an i5 processor, 8th gen or better, and 16GB of RAM. 32GB of RAM would be preferable.&lt;/p&gt;&#xA;&lt;h2 id=&#34;3-what-operating-system-should-i-run-this-on&#34;&gt;3. What operating system should I run this on?&lt;/h2&gt;&#xA;&lt;p&gt;I know it&amp;rsquo;s a difficult thing if all you&amp;rsquo;ve ever touched is Windows or Mac, but I don&amp;rsquo;t recommend running your media server on either of those platforms.&lt;/p&gt;&#xA;&lt;p&gt;You could run the media server on either Unraid or TrueNAS Scale - nothing wrong with either of those platforms, but I do recommend taking the time to learn how to install a Linux operating system like &lt;a href=&#34;https://ubuntu.com/download/desktop&#34;&gt;Ubuntu&lt;/a&gt; and a containerization stack like &lt;a href=&#34;https://www.docker.com&#34;&gt;Docker&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;callout callout-note&#34; role=&#34;note&#34;&gt;&lt;div class=&#34;callout-title&#34;&gt;Note&lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;I deliberately put the link for the Ubuntu Desktop installer there, as it will be less scary than the server operating systems I normally use, which are CLI only, without a graphical user interface.&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Docker will give you &lt;em&gt;far&lt;/em&gt; more flexibility when you&amp;rsquo;re running it on a general purpose Linux OS rather than a specialized one like TrueNAS or Unraid.&lt;/p&gt;&#xA;&lt;p&gt;But, it&amp;rsquo;s all about what you&amp;rsquo;re comfortable with. If you want to get started with your media server while running everything on Windows - go for it!&lt;/p&gt;&#xA;&lt;h2 id=&#34;4-is-there-any-other-software-that-i-should-use&#34;&gt;4. Is there any other software that I should use?&lt;/h2&gt;&#xA;&lt;p&gt;Oh boy. I&amp;rsquo;m so glad you asked.&lt;/p&gt;&#xA;&lt;p&gt;This is a rabbit hole beyond imagining - once you start, I dare you to stop until &lt;em&gt;everything&lt;/em&gt; with regards to your media collection is automated.&lt;/p&gt;&#xA;&lt;p&gt;I will not go into more detail here, because it will make this post a &lt;em&gt;mile&lt;/em&gt; long if I do. Maybe I&amp;rsquo;ll make another post at some point going into detail about how I, in particular, have my media stack configured.&lt;/p&gt;&#xA;&lt;p&gt;In no particular order:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sonarr.tv/&#34;&gt;Sonarr&lt;/a&gt; - TV show collection organizer / downloader&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://radarr.video/&#34;&gt;Radarr&lt;/a&gt; - Movies collection organizer / downloader&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lidarr.audio/&#34;&gt;Lidarr&lt;/a&gt; - Music collection manager / downloader&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://prowlarr.com&#34;&gt;Prowlarr&lt;/a&gt; - Indexer manager for the other *Arr apps.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.bazarr.media/&#34;&gt;Bazarr&lt;/a&gt; - Subtitles manager&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://overseerr.dev/&#34;&gt;Overseerr&lt;/a&gt; / &lt;a href=&#34;https://github.com/Fallenbagel/jellyseerr&#34;&gt;Jellyseerr&lt;/a&gt; - Manage requests for movies and TV shows.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sabnzbd.org/&#34;&gt;Sabnzbd&lt;/a&gt; - Usenet client&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://recyclarr.dev/wiki/getting-started/&#34;&gt;Recylarr&lt;/a&gt; - Automatically applies the &lt;a href=&#34;https://trash-guides.info&#34;&gt;TraSH Guides&lt;/a&gt; recommendations to your media. (I&amp;rsquo;ll admit this one is a bit niche, but I love it.)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;callout callout-note&#34; role=&#34;note&#34;&gt;&lt;div class=&#34;callout-title&#34;&gt;Note&lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;(Jellyseerr being a fork of Overseerr that works with Jellyfin. Supposedly, Jellyfin support is coming to Overseerr, but it hasn&amp;rsquo;t made it there yet.)&lt;/div&gt;&lt;/div&gt;&#xA;&lt;h2 id=&#34;5-final-thoughts&#34;&gt;5. Final Thoughts&lt;/h2&gt;&#xA;&lt;p&gt;Some final notes before I wrap this up.&lt;/p&gt;&#xA;&lt;p&gt;Please, if you care about your own sanity - organize your media in a way that makes sense.&lt;/p&gt;&#xA;&lt;p&gt;Make a central directory on whatever you&amp;rsquo;re using to store everything and call it whatever.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;/mnt/media&lt;/code&gt;, &lt;code&gt;D:\media&lt;/code&gt;, &lt;code&gt;/Volumes/Rick Astley Fan Page&lt;/code&gt;, I don&amp;rsquo;t care.&lt;/p&gt;&#xA;&lt;p&gt;I &lt;em&gt;highly&lt;/em&gt; recommend structuring it the way they suggest to in the aforementioned &lt;a href=&#34;https://trash-guides.info/File-and-Folder-Structure/&#34;&gt;TraSH Guides&lt;/a&gt; as it will save you a lot of headaches down the line.&lt;/p&gt;&#xA;&lt;p&gt;It all comes back to this - you have a &lt;em&gt;central&lt;/em&gt; folder, whatever it is called, and all of your media goes &lt;em&gt;inside it&lt;/em&gt;, and is broken down further from there.&lt;/p&gt;&#xA;&lt;p&gt;This allows you to have &lt;em&gt;one&lt;/em&gt; folder you need to share out rather than twenty, and in most cases will allow you to use &lt;a href=&#34;https://trash-guides.info/File-and-Folder-Structure/Hardlinks-and-Instant-Moves/#what-are-hardlinks&#34;&gt;hard links&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This also leads me into something else that is very important that will be made easier by having everything centralized into one root directory.&lt;/p&gt;&#xA;&lt;h1 id=&#34;backups&#34; style=&#34;color:red&#34;&gt;Backups.&lt;/h1&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t care if you have hardware RAID, or ZFS, btrfs, whatever. I don&amp;rsquo;t care what level of redundancy you have.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.raidisnotabackup.com/&#34;&gt;RAID is not a backup!&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you don&amp;rsquo;t care if you lose your media collection, that&amp;rsquo;s fine. But if you&amp;rsquo;re like me, you&amp;rsquo;ve been collecting and curating this stuff for &lt;em&gt;years&lt;/em&gt; and losing it would hurt. So, I have backups.&lt;/p&gt;&#xA;&lt;p&gt;Even if your backup is just copying one external hard drive to another periodically - that&amp;rsquo;s better than nothing.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m of the opinion that backups should be automated, and monitored at all times, but that&amp;rsquo;s beyond the scope of this particular post.&lt;/p&gt;&#xA;&lt;p&gt;But please, however you have to do it - make backups!&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
