Mint 22.1 + Kodi 21.2 + Beelink Mini S12

March 8, 2025 6:46 pm

The latest in my series on the subject, this follows the last upgrade in 2023: Mint 21 + Kodi 19 + Intel NUC i3.

I’ve replaced my aging Intel NUC with a Beelink Mini S12. The fan seemed to have a bearing beginning to fail. I figured I better get on replacing it while it was giving me forewarning rather than waiting for it to catastrophically fail (and before more tariffs increased prices further). I had looked into just replacing the fan, but couldn’t find a part I could guarantee would work. And it was 11 years old. And the Beelink Mini S12 was only $160 and offered a significant leap in processing power, storage, and RAM while lowering electrical usage.

I bought this one. The Beelink Mini S12 with Intel N100 processor, 16 GB RAM, and 500 GB SSD.

My first challenge was getting the Beelink to boot off a USB drive. For whatever reason it didn’t like the drive I was using and after futzing around for a while I tried another one, it booted fine, and I got Mint 22.1 installed without issue.

Install Kodi

The Kodi PPA is no longer maintained and the recommended solution is the Flatpak.

$ flatpak install flathub tv.kodi.Kodi
# To fix pipewire access (maybe not necessary?):
$ sudo flatpak override tv.kodi.Kodi --filesystem=xdg-run/pipewire-0

How to get audio passthrough working correctly changed again in this release. Theoretically the most recent versions of Pipewire handle it correctly with Kodi “out of the box,” but the version of Pipewire installed in Mint 22.1 was not doing it.

This goes hand in hand with configuring the machine to auto-boot into Kodi directly and skip loading a Cinnamon user session.

Create a script to launch Kodi with ALSA:

$ mkdir ~/Scripts
$ touch ~/Scripts/kodi_custom_session_launcher
$ chmod +x ~/Scripts/kodi_custom_session_launcher
$ nano ~/Scripts/kodi_custom_session_launcher

File Contents:

#!/bin/bash
flatpak run tv.kodi.Kodi --audio-backend=alsa

Create a custom XSession entry which we can select from the login screen:

$ sudo nano /usr/share/xsessions/Kodi_ALSA.desktop

And the file contents:

[Desktop Entry]
Name=Kodi with ALSA
Comment=This session will start KODI Media Center
Exec=/home/kyle/Scripts/kodi_custom_session_launcher
TryExec=/home/kyle/Scripts/kodi_custom_session_launcher
Type=Application

Now if you log out you should be able to select “Kodi with ALSA” as a session option from your login manager.  In Mint, this is accomplished by clicking the circle to the right of the user name.

As in the past, after a little fussing and some restarts I eventually saw the correct audio targets in the Kodi settings and everything seems to be happy with the audio passthrough support.

When running as a flatpak, the Kodi configuration is in a new location:
/home/kyle/.var/app/tv.kodi.Kodi/data

I set up some stuff in Kodi’s advanced settings file to disable the splash screen and hide the ext4 file system’s “lost+found” directories.

$ nano ~/.var/app/tv.kodi.Kodi/data/userdata/advancedsettings.xml

File contents:

<?xml version="1.0" encoding="UTF-8"?>
<advancedsettings>
  <splash>false</splash>
  <video>
    <excludefromlisting>
      <regexp>lost\+found</regexp>
    </excludefromlisting>
    <excludefromscan>
      <regexp>lost\+found</regexp>
    </excludefromscan>
    <excludetvshowsfromscan>
      <regexp>lost\+found</regexp>
    </excludetvshowsfromscan>
  </video>
</advancedsettings>

IR Remote Control

The Beelink Mini S12 doesn’t have a built-in IR receiver like the NUC did. So I bought a FLIRC USB IR Receiver. The system sees it as a keyboard, so you don’t do any configuration with Linux’s built-in IR receiver support. Instead run the FLIRC configuration tool. It helpfully has a Kodi configuration mode which shows you all the keyboard commands that Kodi understands and trivially lets you map buttons on your remote to those commands.

Here’s my configuration which maps the buttons to the same ones I’ve been using on my Onkyo RC-764m remote using remote code 33003:

Lyrion Music Server

Logitech Media Server is dead, but Logitech rather graciously handed the project over to the community (presumably with the requirement that they not use Logitech’s name). The community rebranded it the Lyrion Music Server.

I downloaded the package for version 9.0.1 from
https://downloads.lms-community.org/LyrionMusicServer_v9.0.1/lyrionmusicserver_9.0.1_amd64.deb

And to install:

$ sudo apt install ./lyrionmusicserver_9.0.1_amd64.deb

Preferences are stored at /var/lib/squeezeboxserver/prefs

External Hard Drives

I’m still having issues with the external hard drives disappearing and needing to be remounted. I’ve slightly updated my script from the last post as I discovered there were 2 possible failure modes to check when deciding if a disk needed to be remounted:

#!/usr/bin/bash
needed_to_remount=false
if ! mountpoint -q /mnt/TV || ! ls /mnt/TV > /dev/null; then
  needed_to_remount=true
  mount /mnt/TV
fi

if ! mountpoint -q /mnt/General || ! ls /mnt/General > /dev/null; then
  needed_to_remount=true
  mount /mnt/General
fi

if ! mountpoint -q /mnt/Movies || ! ls /mnt/Movies > /dev/null; then
  needed_to_remount=true
  mount /mnt/Movies
fi

if ! mountpoint -q /mnt/4TB_Storage || ! ls /mnt/4TB_Storage > /dev/null; then
  needed_to_remount=true
  mount /mnt/4TB_Storage
fi

if [ "$needed_to_remount" == "true" ]; then
  echo "$(date) Needed to remount disks"
fi

And the cronjob in /etc/crontab that runs this scripts every minute:

# Work around external drives being unmounted randomly
* * * * * root /home/kyle/Scripts/remount_disks.sh >> /var/log/remount_disks.log

Games February 2025

February 28, 2025 8:21 pm

Played The Vale of Eternity at the board game meetup. Overall gameplay is pretty simple, but with many opportunities for emergent complexity and dramatically different strategies and play styles. Definitely a game that requires playing a few times in order to learn what kind of cards exist in the deck and how you might plan around them. Otherwise can be challenging to make much headway since most progress is made by gaining cards that play off each other. I enjoyed it. Would happily play again.

After The Vale of Eternity we played Marvel Dice Throne: X-Men which just came out this year. Select a character and fight each other to the death by rolling dice to determine which action you take each turn. Tons of variety across characters making it nearly impossible to know what other players can do (or if they’re playing accurately unless you’ve played a ton). Dice-rolling games aren’t generally my jam, but the way the mechanics are designed significantly limits the pain of having a bad roll. So that helped. Still not really my jam though. Wouldn’t seek it out myself, but if others wanted to play, I’d still play.

Had friends over and played Ex Libris with the Expanded Archives expansion (which I gave Jess for our anniversary last year). This games is always a challenge to play after time has passed and difficult to learn fresh. While the mechanic of your turn is simple (place a worker on one spot and complete that action) what spots exist each round changes and there are a lot of options. So first just understanding what all your options are is tiring, then figuring out how to utilize those options effectively is an additional challenge. Jess has won Ex Libris every time we’ve played–until now! My only win of the month.

Played Mistborn cooperatively again at the board game meetup. Had mostly players who had played at least once before this time and we did significantly better, but still ended up being defeated in the end. In a crushing blow all 4 of us were brought to 0 health at the same time. I enjoyed it more the second time–now having a slightly better grasp of the general strategy and progression arc.

After being defeated in Mistborn we played a quick game of 7 Wonders. A tableau-building game played across 3 rounds (“ages”) in which you build your civilization and attempt to complete your world wonder. Play is simultaneous and moves fast regardless of player count. This was one of my earliest purchases after starting to attend the board game meetups. I still enjoy it, though it doesn’t get much play. I lost this time.

Appeasement still doesn’t work

2:21 pm

If you, like me, have been hearing a very consistent new wave of rhetoric amounting to “compromise for peace–the dying has to stop” regarding Ukraine then you should understand that this is direct Russian propaganda. The entire purpose of the message is to use feigned humanitarian concern to get you thinking past the sale. The sale is, “Russia takes more Ukrainian territory.” And the feigned humanitarian concern is a cudgel to beat anyone who disagrees via responses like, “How many more people are you going to make die?! And for what, some scrap of land?!”

This can be difficult to respond to because, OF COURSE, decent people don’t want more death, destruction, and suffering. It takes an awareness of history to understand that appeasement of expansionist dictators has never led to lasting peace. The only chance for sustained peace and stability is to ensure that this war ends with Russia unconditionally leaving Ukrainian territory–which Russia can do unilaterally. And international pressure should be entirely on Russia to do so without compromise.

Otherwise we’ll be right back here when Russia takes yet another territory in a few years. Like they took Georgia in 2008 and Crimea in 2014. Appeasement didn’t work in 1938, it didn’t work in 2008, it didn’t work in 2014. It won’t work in 2025. But Russian propaganda is blasting out, “Peace for our time” and millions of Americans are parroting it.

Books February 2025

February 27, 2025 8:09 pm

Words of Radiance (The Stormlight Archive #2) by Brandon Sanderson

A hefty tome which spanned over 3000 pages as rendered by my eReader (an “average” book is typically ~400 pages). Took up most of January and February.

High fantasy set in the land of Roshar.

Kaladin continues his journey discovering how to harness the power of stormlight. And we learn more about the history that shaped this world via Shallan’s studies.

Red Mars by Kim Stanley Robinson

A book that plays out a possible early colonization of Mars. Unfortunately for me, I was hoping it would be a harder sci-fi focusing on technical challenges. It rather focuses on people and political challenges over decades of colonization and terraforming efforts.

A bit too much political drama in real life to really enjoy artificial political drama.

Also fairly hefty, 1500 pages on my eReader. Took up the rest of February.

The Internet is Breaking Humanity

February 14, 2025 5:10 pm

The internet is an amazing feat of engineering. A resilient, reliable, fast, and cheap method to move data around the world. I’m a software developer specializing in web application development so the internet has given me a livelihood which I enjoy and which provides well for my family. And I’m an introvert so the internet has given me myriad ways to accomplish daily tasks without needing to leave the house or interact with people. This is great. But something went wrong along the way.

The internet started as a very human thing. People–actual human people!–engineered systems that could connect computers in real time across vast distances. And they used these machines to communicate with each other. These people were mainly academic types interested in the science and engineering behind these feats. The challenges they faced were awe inspiring. As were the solutions.

And throughout these early days the Constant held: Actual human people used the internet to communicate with other actual human people–much, perhaps most, of the time actual human people they already knew in real life or would soon meet in real life. The internet was an extension of, and augmentation to, the social systems already in existence.

For some time one’s first access to the internet was as a college student. And each September a new cohort of freshmen would be unleashed on the internet and the extant user base would indoctrinate them into the etiquette and culture. And this was an important process as it preserved the expectations of behavior in what was still largely an academic, campus-like environment. These were actual human people and the familiar concepts of human interaction carried on from real life to the virtual world. Namely, if you behaved poorly you would be excluded or removed from the group.

Around 1993-1994 the internet experienced what is called the “Eternal September” when the general public started gaining access and it became impossible to indoctrinate the endless flow of new users into the existing etiquette and culture. Things started changing rapidly at this point leading through the massive Dot Com bubble and crash. But there was still the underlying Constant: these were actual human people and the internet was still an extension of, and augmentation to, the social systems already in existence.

When Facebook came on the scene in 2004–focused exclusively on creating an online addendum to college-student socializing–the Constant still held. You created an account, you affiliated with a school, you could find and connect with other students at your school. Everyone was still a real human person.

Then around 2008 something changed. The Algorithm. Suddenly, when logging into Facebook, you no longer saw only what your friends were up to. You saw what the Algorithm wanted you to see. It started innocuously enough. You liked your friend’s post about a soccer game, here’s a post about another soccer game–but made by someone you’ve never heard of and never met and probably don’t care about. And you also suddenly began to discover you didn’t see something that an actual friend posted. The Algorithm decided not to show it to you.

While this was happening the Constant was weakening. Fewer and fewer posts were from people you actually knew. Slowly, instead of communicating with an extension of your real world social system, you were being shouted at based on the whims of the Algorithm. And the Algorithm served only one god: Engagement. Engagement being how long users stayed around looking at things, clicking on things, and typing comments. But why did companies care about engagement? Advertising.

Obviously, advertising existed before the internet and showed up on the internet pretty early on. Eventually websites were being overrun with ads. Banner ads across the top, sidebar ads along the left and right, interstitial ads, footer ads. Ads everywhere. It was terrible.

The spatial dimensions were saturated with advertising. But the Algorithm unlocked the temporal dimension for even more advertising. The longer you stick around the more ads you can be shown. Now the Algorithm’s purpose becomes clear and the addition of the Algorithm turns advertising into something else entirely.

If you log in to Facebook and read the two posts written by your friends and then log out you maybe saw two ads. But if you log in to Facebook and are blasted with a firehose of carefully-selected tripe which contains the two posts from your friends then the algorithm can learn exactly which psychological tricks work on you to keep you around for as long as possible. Videos of cats falling off chairs? Check! Men or women dressed provocatively? Check! Rage-inducing articles about what “they” are doing now? Check! Examples of early-gothic architecture across Europe? Check! No matter what it is, the Algorithm will find it and exploit it.

The Constant was destroyed. The internet was no longer actual human people communicating with other actual human people. It became dump-truck loads of crap being broadcast at you in order to engage you for as long as possible so that advertising can be shoved in your face. The Algorithm decides what you see and the algorithm doesn’t care who it hurts in the process.

Here, finally, we reach the present day. The Algorithm is making money hand over fist for every company that turns it on. It cares not for reality, legality, or morality. And so a final new addition seals our fate: Manipulators.

Once a company turns on the Algorithm it becomes impossible to resist the siren’s song of tweaking the algorithm. Internal Manipulators can trivially make the Algorithm suppress content critical of the controller’s own actions or the actions of people they support. It’s just as trivial to promote content that benefits themselves or pushes a certain worldview.

External Manipulators usurp the Algorithm for their own ends. The Algorithm demands engagement. And from the outside one need only convince the Algorithm that a seeded piece of content is good for engagement and it will take care of the rest for you.

It turns out that some of the most engaging content is anything that gets people mad. So the Algorithm foments discord and encourages arguing and attacking. But this is not the Constant: actual human people interacting with actual human people. These participants have become blinded by the Algorithm and no longer see each other as “actual human people.” It’s road rage writ large and unending. You eventually get out of your car and cool off, but the internet is always right there in the palm of your hand. People you’ve never met making you mad every time you look. And then it gets worse. Those people you’ve never met making you mad may not even exist.

In order to convince the Algorithm that content is good for engagement the External Manipulator uses fake accounts that will interact with the seeded content, argue with each other, and then argue with any actual human who engages them. The more arguing you do the more engagement the Algorithm measures. Then the Algorithm and anger do the rest. Want to turn a community against a group of immigrants? Make up and post stories about people eating pets and the Algorithm takes it from there.

Since the Algorithm provides a custom view to every user it becomes impossible to tell from the outside if this is happening. One defense is to prefer services which don’t do per-user modification. If you can use the service without creating an account it’s probably not doing per-user modification. If you don’t have to log in then you can check for per-user modifications by comparing what you see on different devices. For services which you must log in to you can compare what you see to what a friend sees.

So here were are. The Algorithm has encouraged us to dehumanize the actual human people that surround us because it makes someone rich. I think the only chance for humanity to correct from this feedback loop of destruction is to disconnect from these systems. We need to see each other as actual human people again. As much as I hate to say it as an introvert, we all need to get away from our phones and keyboards and go outside and meet our neighbors.