<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>why punkify</title><description>punkify is my own private streaming platform running in my homelab. It is built with open source software and is designed to be a more privacy-focused alternative to mainstream streaming services.</description><link>https://why.punkify.cc</link><item><title>Where to Start: Building Your Own Music Streaming Setup</title><link>https://why.punkify.cc/posts/hardware</link><guid isPermaLink="true">https://why.punkify.cc/posts/hardware</guid><description>The three essential components you need to get started with your personal music streaming service.</description><pubDate>Thu, 03 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;So you want to build your own music streaming service? I get it - after years of being frustrated with Spotify and friends, you&apos;re ready to take control. The good news is, it&apos;s not as complicated as you might think.&lt;/p&gt;
&lt;p&gt;There are really three main things you need to figure out, and once you&apos;ve got these sorted, you&apos;re well on your way:&lt;/p&gt;
&lt;h2&gt;Server Hardware&lt;/h2&gt;
&lt;p&gt;Let&apos;s start with the foundation - you need something to run your music server on. Here&apos;s the thing: you don&apos;t need some massive, expensive setup. A &lt;strong&gt;Raspberry Pi 4&lt;/strong&gt; is perfect for getting started. Seriously, this little $50 computer can handle streaming music to multiple devices without breaking a sweat.&lt;/p&gt;
&lt;p&gt;I started with a Pi 4 with 4GB of RAM, threw a decent SD card in there, and it just worked. You can always upgrade later if you need more storage or processing power, but for testing the waters? The Pi is your friend.&lt;/p&gt;
&lt;h2&gt;Server Software&lt;/h2&gt;
&lt;p&gt;Now you need software that actually serves up your music. After trying a bunch of different options, &lt;strong&gt;Navidrome&lt;/strong&gt; is my choice, hands down. It&apos;s lightweight, has a clean web interface, works great on mobile, and supports all the streaming protocols you&apos;d want.&lt;/p&gt;
&lt;p&gt;The best part? It&apos;s dead simple to set up, even on that Raspberry Pi. No complicated databases to configure, no licensing fees - just install it, point it at your music folder, and you&apos;re streaming.&lt;/p&gt;
&lt;h2&gt;Music Tagging&lt;/h2&gt;
&lt;p&gt;Here&apos;s where most people get stuck, and honestly, it&apos;s the most important part. Your music collection is probably a mess of inconsistent tags, missing album art, and files with names like &quot;track01.mp3.&quot; &lt;strong&gt;Beets&lt;/strong&gt; is the software you want for this.&lt;/p&gt;
&lt;p&gt;Beets is like having a music librarian that never gets tired. It&apos;ll automatically tag your music, fetch album art, organize your files, and even help you find duplicates. Yeah, there&apos;s a learning curve, but trust me - once you&apos;ve got beets working, you&apos;ll wonder how you ever managed without it.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;That&apos;s it - three components, and you&apos;ve got your own personal Spotify. Each of these deserves a deeper dive (which I&apos;ll cover in future posts), but this gives you the roadmap. Start with the Pi, get Navidrome running, then let beets sort out your music library.&lt;/p&gt;
&lt;p&gt;Ready to dive deeper into any of these? Check out the posts tagged with &lt;a href=&quot;/tags/server-hardware&quot;&gt;Server Hardware&lt;/a&gt;, &lt;a href=&quot;/tags/server-software&quot;&gt;Server Software&lt;/a&gt;, or &lt;a href=&quot;/tags/tagging&quot;&gt;Tagging&lt;/a&gt; for the nitty-gritty details.&lt;/p&gt;
</content:encoded><author>Tobi</author></item><item><title>Setting Up Navidrome with Docker</title><link>https://why.punkify.cc/posts/navidrome-setup</link><guid isPermaLink="true">https://why.punkify.cc/posts/navidrome-setup</guid><description>Complete guide to installing Navidrome using Docker Compose, plus setting up your music library and getting your first streams running.</description><pubDate>Thu, 23 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Alright, you&apos;ve got Ubuntu installed and running smoothly. Now comes the exciting part - turning your server into an actual music streaming powerhouse. We&apos;re going to install Navidrome, and I&apos;m going to show you exactly how to do it the right way.&lt;/p&gt;
&lt;h2&gt;What is Navidrome?&lt;/h2&gt;
&lt;p&gt;Navidrome is lightweight, open-source music streaming server that actually understands music collectors. Unlike Spotify&apos;s algorithm-driven approach, Navidrome respects your music organization and gives you complete control over your listening experience.&lt;/p&gt;
&lt;p&gt;Here&apos;s what makes it awesome:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Subsonic-compatible&lt;/strong&gt; - Works with tons of mobile apps&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web interface&lt;/strong&gt; - Stream from any browser&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fast and lightweight&lt;/strong&gt; - Perfect for our setup&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Respects your organization&lt;/strong&gt; - Your folders become playlists&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No phone-home nonsense&lt;/strong&gt; - Your music stays on your server&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why Docker? (For the Newbies)&lt;/h2&gt;
&lt;p&gt;Before we dive in, let me explain why we&apos;re using Docker instead of just installing Navidrome directly.&lt;/p&gt;
&lt;p&gt;Think of Docker as a shipping container for software. Just like how shipping containers work the same way whether they&apos;re on a truck, train, or ship, Docker containers work the same way on any Linux system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why this matters for us:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Consistency&lt;/strong&gt; - Navidrome will work exactly the same way every time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy updates&lt;/strong&gt; - Pull new version, restart container, done&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clean uninstalls&lt;/strong&gt; - Don&apos;t like it? Delete the container, no traces left&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Isolation&lt;/strong&gt; - If something breaks, it won&apos;t mess up your whole system&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reproducible&lt;/strong&gt; - Share your config with others, they get identical setup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&apos;s like having a perfect installation recipe that works every single time.&lt;/p&gt;
&lt;h2&gt;Step 1: Prepare Your Music Library&lt;/h2&gt;
&lt;p&gt;Before we install anything, let&apos;s get your music organized. You need somewhere to put your music files where Navidrome can find them.&lt;/p&gt;
&lt;h3&gt;Create Your Music Directory&lt;/h3&gt;
&lt;p&gt;Let&apos;s keep this simple and put your music in your home directory - no need for system-wide &lt;code&gt;/mnt&lt;/code&gt; paths that require sudo permissions.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Create a directory for your music in your home folder
mkdir -p ~/music

# Create some basic structure
mkdir -p ~/music/Artists

# Check it was created
ls -la ~/music
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Get Some Music On There&lt;/h3&gt;
&lt;p&gt;You need to get your music files onto the server. Here are a few ways to do it:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option 1: Copy from another computer over SSH&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# From your local machine (replace paths, user and IP as needed)
scp -r &quot;/path/to/your/music/folder&quot; $USER@192.168.1.100:~/music/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Option 2: Use a USB drive&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Plug in USB drive, then mount it
sudo mkdir /mnt/usb
sudo mount /dev/sdb1 /mnt/usb

# Copy music files (using $USER variable so you can copy-paste)
sudo cp -r /mnt/usb/Music/* ~/music/
sudo chown -R $USER:$USER ~/music/

# Unmount when done
sudo umount /mnt/usb
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 2: Create Your Docker Compose Configuration&lt;/h2&gt;
&lt;p&gt;Docker Compose lets us define our entire setup in a simple text file. Create a directory for your Navidrome setup:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Create directory for Navidrome
mkdir -p ~/navidrome
cd ~/navidrome

# Create the docker-compose.yml file
nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now paste this configuration into the file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  navidrome:
    image: deluan/navidrome:latest
    container_name: navidrome
    ports:
      - &quot;4533:4533&quot;
    environment:
      - ND_ENABLESHARING=true
    restart: unless-stopped
    volumes:
      - &quot;./data:/data&quot;
      - &quot;${HOME}/music:/music:ro&quot;
      
  airsonic-refix:
    ports:
      - &quot;23880:80&quot;
    image: tamland/airsonic-refix:latest
    container_name: airsonic
    restart: unless-stopped
    environment:
      - SERVER_URL=http://localhost:4533
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This configuration uses &lt;code&gt;${HOME}&lt;/code&gt; and &lt;code&gt;$USER&lt;/code&gt; variables so you can copy-paste these commands without having to replace your username everywhere.&lt;/p&gt;
&lt;p&gt;Let me explain what this does:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Navidrome container:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;image: deluan/navidrome:latest&lt;/code&gt; - Uses the official Navidrome Docker image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ports: &quot;4533:4533&quot;&lt;/code&gt; - Makes Navidrome available on port 4533&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ND_ENABLESHARING=true&lt;/code&gt; - Lets you share music with others&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&quot;${HOME}/music:/music:ro&quot;&lt;/code&gt; - Maps your music folder (using $HOME variable so it works for any user)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;restart: unless-stopped&lt;/code&gt; - Automatically restarts if it crashes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Airsonic Refix container:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is an alternative web interface for Navidrome that looks way better&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ports: &quot;23880:80&quot;&lt;/code&gt; - Available on port 23880&lt;/li&gt;
&lt;li&gt;Uses the same Navidrome backend, just prettier frontend&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Save the file (Ctrl+X, then Y, then Enter).&lt;/p&gt;
&lt;h2&gt;Step 3: Start Everything Up&lt;/h2&gt;
&lt;p&gt;Time to fire up your music server:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Make sure you&apos;re in the navidrome directory
cd ~/navidrome

# Start the containers
docker compose up -d

# Check if everything is running
docker compose ps
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should see both containers running. If something&apos;s wrong, check the logs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Check Navidrome logs
docker compose logs navidrome

# Check Airsonic logs
docker compose logs airsonic-refix
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 4: Access Your Music Server&lt;/h2&gt;
&lt;p&gt;If everything worked, you now have two ways to access your music:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Navidrome (original interface):&lt;/strong&gt;
Open your browser and go to: &lt;code&gt;http://your-server-ip:4533&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Airsonic Refix (prettier interface):&lt;/strong&gt;
Open your browser and go to: &lt;code&gt;http://your-server-ip:23880&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;First Login&lt;/h3&gt;
&lt;p&gt;When you first access Navidrome, it will ask you to create your admin account. This is actually better than having default credentials - you set up your own secure login right from the start.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;navi-login.png&quot; alt=&quot;navidrom-create-account&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Create your admin account:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Choose a username (doesn&apos;t have to be &quot;admin&quot;)&lt;/li&gt;
&lt;li&gt;Set a strong password&lt;/li&gt;
&lt;li&gt;This becomes your main administrator account&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;airsoniclogin.png&quot; alt=&quot;airsonic-login&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;For Airsonic Refix:&lt;/strong&gt; Use the same Navidrome credentials you just created&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 5: Initial Setup&lt;/h2&gt;
&lt;h3&gt;Configure Your Music Library&lt;/h3&gt;
&lt;p&gt;Navidrome should automatically scan your &lt;code&gt;~/music&lt;/code&gt; folder. If it doesn&apos;t find your music:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to Settings → Library&lt;/li&gt;
&lt;li&gt;Check that the music folder path is correct&lt;/li&gt;
&lt;li&gt;Click &quot;Full Rescan&quot; if needed&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Test Your Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Browse your music collection&lt;/li&gt;
&lt;li&gt;Try playing a song&lt;/li&gt;
&lt;li&gt;Test both the Navidrome and Airsonic interfaces&lt;/li&gt;
&lt;li&gt;See which one you prefer (I personally love Airsonic Refix)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Step 6: Mobile Access&lt;/h2&gt;
&lt;p&gt;The beauty of Navidrome is that it works with tons of mobile apps:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Android:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Symfonium&lt;/strong&gt; (my favorite)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DSub&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tempo&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;iOS:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;play:Sub&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amperfy&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;flo&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More: &lt;a href=&quot;https://www.navidrome.org/docs/overview/#apps&quot;&gt;more Navidrom Apps&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Just point any Subsonic-compatible app to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Server:&lt;/strong&gt; &lt;code&gt;http://your-server-ip:4533&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Username/Password:&lt;/strong&gt; Your Navidrome credentials&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Troubleshooting Common Issues&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Can&apos;t access the web interface?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check if the containers are running: &lt;code&gt;docker compose ps&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Make sure the firewall allows the ports: &lt;code&gt;sudo ufw allow 4533&lt;/code&gt; and &lt;code&gt;sudo ufw allow 23880&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Verify your server&apos;s IP address: &lt;code&gt;ip addr show&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;No music showing up?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check file permissions: &lt;code&gt;ls -la ~/music&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Make sure your music files are in common formats (MP3, FLAC, M4A)&lt;/li&gt;
&lt;li&gt;Try a manual rescan in Settings → Library&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Managing Your Server&lt;/h2&gt;
&lt;h3&gt;Useful Docker Commands&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# View running containers
docker compose ps

# View logs
docker compose logs -f navidrome

# Restart everything
docker compose restart

# Stop everything
docker compose down

# Update to latest versions
docker compose pull &amp;amp;&amp;amp; docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Updating Navidrome&lt;/h3&gt;
&lt;p&gt;When new versions come out:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~/navidrome
docker compose pull
docker compose up -d --force-recreate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Docker will automatically download the new version and restart your containers.&lt;/p&gt;
&lt;h2&gt;Next Steps&lt;/h2&gt;
&lt;p&gt;You now have a fully functional music streaming server! But we&apos;re not done yet. In upcoming posts, I&apos;ll cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advanced Navidrome configuration&lt;/strong&gt; - Playlists, users, and sharing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Setting up external access&lt;/strong&gt; - Stream your music from anywhere&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backup strategies&lt;/strong&gt; - Protecting your setup and music&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Music library management&lt;/strong&gt; - Using Beets for perfect organization&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mobile app recommendations&lt;/strong&gt; - The best clients for your phone&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Congratulations - you&apos;re now streaming your own music, on your own terms, with your own server. No algorithms, no ads, no corporate oversight. Just your music, the way you want it.&lt;/p&gt;
&lt;p&gt;Welcome to the world of self-hosted music streaming!&lt;/p&gt;
</content:encoded><author>Tobi</author></item><item><title>Installing Ubuntu 24.04 LTS</title><link>https://why.punkify.cc/posts/ubuntu-install</link><guid isPermaLink="true">https://why.punkify.cc/posts/ubuntu-install</guid><description>Step-by-step guide to installing Ubuntu Server on your music streaming hardware, plus essential post-install setup.</description><pubDate>Thu, 23 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Alright, you&apos;ve got your hardware sorted - whether it&apos;s an old laptop, a Raspberry Pi, or whatever you managed to dig up. Now comes the fun part: turning that piece of hardware into a proper music server. We&apos;re going with Ubuntu Server 24.04 LTS, and I&apos;m going to walk you through every single step.&lt;/p&gt;
&lt;h2&gt;Why Ubuntu Server 24.04 LTS?&lt;/h2&gt;
&lt;p&gt;Before we dive in, let me remind you why we&apos;re doing this the boring way:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;5 years of support&lt;/strong&gt; out of the box (10 years with Ubuntu Pro)&lt;/li&gt;
&lt;li&gt;Everything just works - no hunting for drivers&lt;/li&gt;
&lt;li&gt;Massive community - when you Google error messages, you&apos;ll find answers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No desktop environment&lt;/strong&gt; - all your system resources go to streaming music, not drawing pretty windows&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What You&apos;ll Need&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Your chosen hardware (laptop, Pi, whatever)&lt;/li&gt;
&lt;li&gt;A USB stick (8GB minimum)&lt;/li&gt;
&lt;li&gt;Another computer to create the installation media&lt;/li&gt;
&lt;li&gt;An ethernet cable (seriously, use wired for the install)&lt;/li&gt;
&lt;li&gt;About 30 minutes of your time&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 1: Download Ubuntu Server&lt;/h2&gt;
&lt;p&gt;Head over to &lt;a href=&quot;https://ubuntu.com/download/server&quot;&gt;ubuntu.com/download/server&lt;/a&gt; and grab Ubuntu Server 24.04 LTS. Yes, the LTS version - we want the boring, stable, long-term support version.&lt;/p&gt;
&lt;p&gt;You&apos;ll get an ISO file that&apos;s about 2.5GB. While that&apos;s downloading, let&apos;s prepare your USB stick.&lt;/p&gt;
&lt;h2&gt;Step 2: Create Installation Media&lt;/h2&gt;
&lt;h3&gt;On Windows:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Download &lt;a href=&quot;https://rufus.ie/&quot;&gt;Rufus&lt;/a&gt; - it&apos;s free and just works&lt;/li&gt;
&lt;li&gt;Plug in your USB stick (warning: this will erase everything on it)&lt;/li&gt;
&lt;li&gt;Open Rufus, select your USB drive&lt;/li&gt;
&lt;li&gt;Click &quot;SELECT&quot; and choose your Ubuntu ISO&lt;/li&gt;
&lt;li&gt;Hit &quot;START&quot; and wait&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;On Linux/Mac:&lt;/h3&gt;
&lt;p&gt;Use the &lt;code&gt;dd&lt;/code&gt; command (be very careful with this - double-check your device names):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Find your USB device (probably /dev/sdb or similar)
lsblk

# Write the ISO (replace /dev/sdX with your actual USB device)
sudo dd if=ubuntu-24.04-live-server-amd64.iso of=/dev/sdX bs=4M status=progress
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 3: Boot from USB&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Plug the USB stick into your soon-to-be server&lt;/li&gt;
&lt;li&gt;Boot it up and get into the boot menu (usually F12, F2, or ESC during startup)&lt;/li&gt;
&lt;li&gt;Select your USB stick as the boot device&lt;/li&gt;
&lt;li&gt;You should see the Ubuntu installer screen&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you&apos;re using an old laptop, make sure it&apos;s plugged in - you don&apos;t want it dying mid-install.&lt;/p&gt;
&lt;h2&gt;Step 4: Ubuntu Installation Walkthrough&lt;/h2&gt;
&lt;p&gt;Here&apos;s where we actually install the thing. The Ubuntu installer is pretty straightforward, but there are a few spots where you don&apos;t just hit &quot;Next.&quot;&lt;/p&gt;
&lt;h3&gt;Language and Keyboard&lt;/h3&gt;
&lt;p&gt;Pick your language and keyboard layout. If you&apos;re reading this in English, you probably want English and a standard US/UK keyboard layout.&lt;/p&gt;
&lt;h3&gt;Network Setup&lt;/h3&gt;
&lt;p&gt;This is important - make sure Ubuntu detects your ethernet connection. If you&apos;re using WiFi (please don&apos;t), set it up here. You want a working internet connection for the install.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Don&apos;t just hit next here&lt;/strong&gt; - verify your network is actually working.&lt;/p&gt;
&lt;h3&gt;Storage Configuration&lt;/h3&gt;
&lt;p&gt;Here&apos;s where it gets interesting. You have a few options:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use entire disk (recommended for beginners):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select your main drive&lt;/li&gt;
&lt;li&gt;Choose &quot;Use entire disk&quot;&lt;/li&gt;
&lt;li&gt;Set up LVM if you want (I usually do - makes future changes easier)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Custom partitioning (for advanced users):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can set up custom partitions here&lt;/li&gt;
&lt;li&gt;For a music server, a simple setup works fine: one root partition and swap&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: If your laptop has an existing Windows installation you want to keep, make sure you understand what you&apos;re doing here. The installer will show you what it&apos;s going to do before it does it.&lt;/p&gt;
&lt;h3&gt;Profile Setup&lt;/h3&gt;
&lt;p&gt;This is where you create your user account:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Your name&lt;/strong&gt;: Whatever you want&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server name&lt;/strong&gt;: Pick something meaningful like &quot;musicserver&quot; or &quot;navidrome-box&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Username&lt;/strong&gt;: Keep it simple - you&apos;ll be typing this a lot&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password&lt;/strong&gt;: Make it secure, but not so complex you&apos;ll forget it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Write these down!&lt;/strong&gt; You&apos;ll need them to log in.&lt;/p&gt;
&lt;h3&gt;SSH Setup&lt;/h3&gt;
&lt;p&gt;Here&apos;s a crucial decision. The installer will ask if you want to install OpenSSH server. &lt;strong&gt;Say yes.&lt;/strong&gt; This lets you manage your server remotely, which is incredibly handy.&lt;/p&gt;
&lt;p&gt;You can also import SSH keys from GitHub/Launchpad here, but we&apos;ll cover setting up SSH keys properly in the next section.&lt;/p&gt;
&lt;h3&gt;Software Selection&lt;/h3&gt;
&lt;p&gt;The installer might offer to install Docker, but skip it for now. We&apos;ll install Docker properly later with all the configurations we need.&lt;/p&gt;
&lt;h2&gt;Step 5: First Boot and Initial Setup&lt;/h2&gt;
&lt;p&gt;After the installer finishes, remove the USB stick and reboot. You should see a login prompt. Log in with the username and password you created.&lt;/p&gt;
&lt;p&gt;Congratulations - you now have a working Ubuntu server! But we&apos;re not done yet.&lt;/p&gt;
&lt;h2&gt;Essential Post-Install Setup&lt;/h2&gt;
&lt;p&gt;Now comes the stuff that keeps your server secure and up-to-date without you having to babysit it.&lt;/p&gt;
&lt;h3&gt;Update Everything&lt;/h3&gt;
&lt;p&gt;First things first - update your system:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This might take a few minutes. Go make some coffee.&lt;/p&gt;
&lt;h3&gt;Enable Unattended Upgrades&lt;/h3&gt;
&lt;p&gt;This is crucial - you want security updates to install automatically:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgrades
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Select &quot;Yes&quot; when it asks about automatically downloading and installing stable updates.&lt;/p&gt;
&lt;h3&gt;Install Essential Tools&lt;/h3&gt;
&lt;p&gt;Let&apos;s install some tools we&apos;ll need:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install curl wget git htop nano ufw -y
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Configure the Firewall&lt;/h3&gt;
&lt;p&gt;Ubuntu comes with a firewall (ufw), but it&apos;s not enabled by default:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Allow SSH (important - don&apos;t lock yourself out!)
sudo ufw allow ssh

# Enable the firewall
sudo ufw enable
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Install Docker and Docker Compose&lt;/h3&gt;
&lt;p&gt;Docker makes managing your music server software much easier:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Add Docker&apos;s official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Add Docker repository
echo &quot;deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&quot; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null

# Update package list and install Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y

# Add your user to the docker group (so you don&apos;t need sudo for docker commands)
sudo usermod -aG docker $USER

# Log out and back in for the group change to take effect
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;SSH Setup (Optional but Highly Recommended)&lt;/h2&gt;
&lt;p&gt;SSH is what lets you manage your server from anywhere. Instead of sitting at your server typing commands, you can control it from your main computer, your phone, wherever.&lt;/p&gt;
&lt;h3&gt;Why SSH Keys?&lt;/h3&gt;
&lt;p&gt;Instead of typing your password every time, SSH keys are much more secure and convenient. Think of it like having a special key that only you have.&lt;/p&gt;
&lt;h3&gt;Step 1: Find Your Server&apos;s IP Address&lt;/h3&gt;
&lt;p&gt;First, you need to know how to reach your server. On your server, run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hostname -I | awk &apos;{print $1}&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Look for something like &lt;code&gt;192.168.1.100&lt;/code&gt; or similar - that&apos;s your server&apos;s IP address. Write it down.&lt;/p&gt;
&lt;h3&gt;Step 2: Creating SSH Keys&lt;/h3&gt;
&lt;h4&gt;On Windows (PowerShell):&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# Open PowerShell and run:
ssh-keygen -t ed25519 -C &quot;your_email@example.com&quot;

# Just press Enter for all the prompts (default location and no passphrase for simplicity)
# Your key will be saved in C:\Users\YourName\.ssh\
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;On Linux/Mac:&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# Run in terminal:
ssh-keygen -t ed25519 -C &quot;your_email@example.com&quot;

# Press Enter for all prompts
# Your key will be saved in ~/.ssh/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 3: How to Connect to Your Server (Password Method First)&lt;/h3&gt;
&lt;p&gt;Before we set up fancy SSH keys, let&apos;s make sure you can actually connect to your server. We&apos;ll start with password authentication - it&apos;s simpler and gets you connected right away.&lt;/p&gt;
&lt;h4&gt;From Windows:&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Option 1: PowerShell (built-in, easiest)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Open PowerShell and run:
ssh username@192.168.1.100

# Replace &apos;username&apos; with your actual username
# Replace &apos;192.168.1.100&apos; with your server&apos;s actual IP
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Option 2: PuTTY (if you prefer a GUI)&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download &lt;a href=&quot;https://www.putty.org/&quot;&gt;PuTTY&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Open PuTTY&lt;/li&gt;
&lt;li&gt;Enter your server&apos;s IP in &quot;Host Name&quot;&lt;/li&gt;
&lt;li&gt;Port should be 22&lt;/li&gt;
&lt;li&gt;Click &quot;Open&quot;&lt;/li&gt;
&lt;li&gt;Enter your username and password when prompted&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;From Mac:&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# Open Terminal and run:
ssh username@192.168.1.100

# Replace with your actual username and server IP
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;From Linux:&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# Open terminal and run:
ssh username@192.168.1.100

# Replace with your actual username and server IP
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Your First Connection&lt;/h4&gt;
&lt;p&gt;When you connect for the first time, you&apos;ll see something like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The authenticity of host &apos;192.168.1.100 (192.168.1.100)&apos; can&apos;t be established.
ED25519 key fingerprint is SHA256:some_long_string_here.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Type &lt;code&gt;yes&lt;/code&gt; and press Enter. This is normal - your computer is just making sure it&apos;s really your server.&lt;/p&gt;
&lt;p&gt;Then it&apos;ll ask for your password. Enter the password you created during Ubuntu installation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Success!&lt;/strong&gt; You should now see your server&apos;s command prompt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;username@musicserver:~$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Try typing &lt;code&gt;exit&lt;/code&gt; to disconnect and return to your local machine. Then try connecting again to make sure you&apos;ve got it down.&lt;/p&gt;
&lt;h3&gt;Step 4: Adding SSH Keys (Make Life Easier)&lt;/h3&gt;
&lt;p&gt;Now that you can connect, let&apos;s set up SSH keys so you don&apos;t have to type your password every time.&lt;/p&gt;
&lt;h4&gt;From Linux/Mac (The Easy Way):&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;# This command copies your key to the server automatically
ssh-copy-id username@your_server_ip
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&apos;s it! It will ask for your password one last time, then you&apos;re done.&lt;/p&gt;
&lt;h4&gt;From Windows (The Manual Way):&lt;/h4&gt;
&lt;p&gt;Since Windows doesn&apos;t have &lt;code&gt;ssh-copy-id&lt;/code&gt;, we need to do this manually:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Copy your public key:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Get-Content C:\Users\YourName\.ssh\id_ed25519.pub | Set-Clipboard
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SSH into your server&lt;/strong&gt; (using the method from Step 3)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;On your server, run these commands:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Paste your public key&lt;/strong&gt; into the nano editor (Ctrl+Shift+V), then save and exit (Ctrl+X, then Y, then Enter)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Set proper permissions:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Exit your server&lt;/strong&gt; and try connecting again - no password needed!&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Step 5: Test Your Connection&lt;/h3&gt;
&lt;p&gt;Try a few commands to make sure everything works:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Check where you are
pwd

# Check system info
uname -a

# Check available disk space
df -h

# Exit back to your local machine
exit
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Troubleshooting SSH&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Can&apos;t connect at all?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make sure your server is on and connected to the network&lt;/li&gt;
&lt;li&gt;Check the IP address again: &lt;code&gt;ip addr show&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Make sure SSH is running: &lt;code&gt;sudo systemctl status ssh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Connection refused?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSH might not be installed: &lt;code&gt;sudo apt install openssh-server&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Firewall might be blocking it: &lt;code&gt;sudo ufw allow ssh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Password not working?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Double-check your username and password&lt;/li&gt;
&lt;li&gt;Try connecting from the server itself first: &lt;code&gt;ssh localhost&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;GitHub Integration (Bonus)&lt;/h3&gt;
&lt;p&gt;If you have a GitHub account, you can add your SSH key there too. This way, you can pull code repositories directly to your server:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to GitHub Settings → SSH and GPG keys&lt;/li&gt;
&lt;li&gt;Click &quot;New SSH key&quot;&lt;/li&gt;
&lt;li&gt;Paste your public key content&lt;/li&gt;
&lt;li&gt;Now you can clone repositories with SSH URLs&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Pro Tips for SSH&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Create a shortcut (Linux/Mac):&lt;/strong&gt;
Edit &lt;code&gt;~/.ssh/config&lt;/code&gt; on your local machine:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host musicserver
    HostName 192.168.1.100
    User your_username
    Port 22
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now you can just run: &lt;code&gt;ssh musicserver&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keep connections alive:&lt;/strong&gt;
Add this to your SSH config to prevent timeouts:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Testing Your Setup&lt;/h2&gt;
&lt;p&gt;Let&apos;s make sure everything is working:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Check if Docker is running
docker --version
docker compose version

# Check system status
sudo systemctl status ssh
sudo systemctl status unattended-upgrades

# Check available disk space
df -h

# Check system resources
htop  # Press &apos;q&apos; to quit
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;What&apos;s Next?&lt;/h2&gt;
&lt;p&gt;You now have a solid, secure Ubuntu server ready to become your music streaming powerhouse. In the next posts, we&apos;ll:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install and configure Navidrome&lt;/li&gt;
&lt;li&gt;Set up proper storage for your music collection&lt;/li&gt;
&lt;li&gt;Configure automatic backups&lt;/li&gt;
&lt;li&gt;Add monitoring so you know when something goes wrong&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your server is now ready to rock. It&apos;ll keep itself updated, it&apos;s secure, and it has all the tools we need to build something awesome.&lt;/p&gt;
&lt;h2&gt;Quick Reference&lt;/h2&gt;
&lt;h3&gt;Key Commands You&apos;ll Use:&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# System updates
sudo apt update &amp;amp;&amp;amp; sudo apt upgrade

# Check running services
sudo systemctl status service_name

# View system logs
sudo journalctl -f

# Check disk space
df -h

# Monitor system resources
htop
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Important File Locations:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SSH config: &lt;code&gt;~/.ssh/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Docker configs: &lt;code&gt;/etc/docker/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;System logs: &lt;code&gt;/var/log/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Keep this post bookmarked - you&apos;ll probably reference these commands more than you think. Next stop: getting Navidrome up and running!&lt;/p&gt;
</content:encoded><author>Tobi</author></item><item><title>Music Tagging with Beets: Making Sense of Your Collection</title><link>https://why.punkify.cc/posts/beets-tagging</link><guid isPermaLink="true">https://why.punkify.cc/posts/beets-tagging</guid><description>How to set up Beets with Docker to automatically tag, organize, and clean up your music collection. No more &quot;Unknown Artist&quot; nightmares.</description><pubDate>Sun, 26 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Let&apos;s talk about the thing that separates serious music collectors from casual listeners: proper tagging. If you&apos;ve been collecting music for years, you know the pain. Files named &quot;track01.mp3,&quot; albums split across multiple artists because of inconsistent spelling, missing album art, wrong release years - it&apos;s a fucking nightmare.&lt;/p&gt;
&lt;p&gt;I&apos;ve been dealing with this chaos for 20+ years. Started with mix tapes where you didn&apos;t even know track names, went through the Napster era where files were tagged by drunk teenagers, survived the torrent years where album art was a luxury. Now I&apos;ve got this insane mix of formats and sources, and somehow it all needs to work together in my streaming setup.&lt;/p&gt;
&lt;p&gt;That&apos;s where &lt;strong&gt;Beets&lt;/strong&gt; comes in. Think of it as having a music librarian who never gets tired, never makes mistakes, and has access to the world&apos;s biggest music databases.&lt;/p&gt;
&lt;h2&gt;Why Beets Instead of Manual Tagging?&lt;/h2&gt;
&lt;p&gt;Look, I&apos;ve tried doing this manually. Spent weekends going through folders, fixing artist names one by one, hunting down album art. It&apos;s soul-crushing work, and you&apos;ll never finish if you&apos;ve got a serious collection.&lt;/p&gt;
&lt;p&gt;Beets connects to MusicBrainz and Discogs - massive databases with millions of releases. When it finds your files, it doesn&apos;t guess what album it is. It goes out and grabs the correct information: proper artist names, release years, track listings, album art. Even handles the weird edge cases that would drive you insane.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The difference is night and day:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Before: &quot;Various Artists - Unknown Album - track01.mp3&quot;&lt;/li&gt;
&lt;li&gt;After: &quot;Minor Threat - Complete Discography - 01 Filler&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And it does this automatically for thousands of files. No more typing artist names, no more hunting for album covers, no more inconsistent formatting.&lt;/p&gt;
&lt;h2&gt;My Docker Setup&lt;/h2&gt;
&lt;p&gt;I&apos;m running Beets in Docker because, like everything else in my setup, I want it contained and manageable. Here&apos;s my &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:
  beets:
    image: lscr.io/linuxserver/beets:latest
    container_name: beets
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - ./config:/config
      - /mnt/nfs_share/jellyfin/music:/music
      - /mnt/nfs_share/punkify:/punkify
    ports:
      - 8337:8337
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;What this does:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Runs the LinuxServer.io Beets image (they know what they&apos;re doing)&lt;/li&gt;
&lt;li&gt;Maps my music directories so Beets can access everything&lt;/li&gt;
&lt;li&gt;Exposes port 8337 for the web interface (yeah, Beets has a web UI)&lt;/li&gt;
&lt;li&gt;Runs with proper user permissions (PUID/PGID)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The volume mapping is key here. I&apos;ve got my raw music imports in one folder and my cleaned, organized collection in another. Beets takes the chaos and turns it into something beautiful.&lt;/p&gt;
&lt;h2&gt;The Configuration That Actually Works&lt;/h2&gt;
&lt;p&gt;Here&apos;s my &lt;code&gt;config.yaml&lt;/code&gt; - this is what makes Beets useful instead of just another tool that tries to be helpful but gets in your way:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;plugins: fetchart embedart convert scrub replaygain lastgenre chroma web discogs
directory: /punkify
library: /config/musiclibrary.blb
art_filename: albumart
threaded: yes
original_date: no
per_disc_numbering: no

convert:
    auto: no
    ffmpeg: /usr/bin/ffmpeg
    opts: -ab 320k -ac 2 -ar 48000
    max_bitrate: 320
    threads: 1
    
paths:
    default: $albumartist/$album%aunique{}/$track - $title
    singleton: Non-Album/$artist - $title
    comp: Compilations/$album%aunique{}/$track - $title
    albumtype_soundtrack: Soundtracks/$album/$track $title 
        
import:
    write: yes
    copy: yes
    move: no
    resume: ask
    incremental: yes
    quiet_fallback: skip
    timid: no
    log: /config/beet.log

lastgenre:
    auto: yes
    source: album

embedart:
    auto: yes

fetchart:
    auto: yes
    
replaygain:
    auto: no

scrub:
    auto: yes

replace:
    &apos;^\.&apos;: _
    &apos;[\x00-\x1f]&apos;: _
    &apos;[&amp;lt;&amp;gt;:&quot;\?\*\|]&apos;: _
    &apos;[\xE8-\xEB]&apos;: e
    &apos;[\xEC-\xEF]&apos;: i
    &apos;[\xE2-\xE6]&apos;: a
    &apos;[\xF2-\xF6]&apos;: o
    &apos;[\xF8]&apos;: o
    &apos;\.$&apos;: _
    &apos;\s+$&apos;: &apos;&apos;

web:
    host: 0.0.0.0
    port: 8337
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let me break down the important bits:&lt;/p&gt;
&lt;h3&gt;Plugins That Matter&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;fetchart &amp;amp; embedart&lt;/strong&gt; - Automatically downloads and embeds album art. No more staring at generic music note icons.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;scrub&lt;/strong&gt; - Removes junk metadata that accumulates over the years. Your files come out clean.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lastgenre&lt;/strong&gt; - Adds genre information from Last.fm. Useful for organization.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;chroma&lt;/strong&gt; - Audio fingerprinting for when metadata is completely wrong.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;discogs&lt;/strong&gt; - Connects to Discogs database for those rare pressings that MusicBrainz doesn&apos;t know about.&lt;/p&gt;
&lt;h3&gt;File Organization&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;paths&lt;/code&gt; section is where the magic happens. This tells Beets how to organize your files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;default&lt;/strong&gt;: &lt;code&gt;$albumartist/$album%aunique{}/$track - $title&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;singleton&lt;/strong&gt;: Handles single tracks that aren&apos;t part of albums&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;comp&lt;/strong&gt;: Special handling for compilations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;albumtype_soundtrack&lt;/strong&gt;: Keeps soundtracks separate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This creates a consistent structure like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Minor Threat/Complete Discography/01 - Filler.mp3
Crass/The Feeding of the 5000/01 - Asylum.mp3
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Character Replacement&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;replace&lt;/code&gt; section handles characters that break filesystems or look ugly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Converts special characters to safe alternatives&lt;/li&gt;
&lt;li&gt;Removes leading dots and trailing spaces&lt;/li&gt;
&lt;li&gt;Handles international characters properly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This prevents those annoying &quot;file not found&quot; errors when some tool can&apos;t handle weird Unicode characters.&lt;/p&gt;
&lt;h2&gt;How I Actually Use It&lt;/h2&gt;
&lt;h3&gt;Initial Import&lt;/h3&gt;
&lt;p&gt;When I get new music (vinyl rips, downloads, whatever), I dump it in my import folder and run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker exec -it beets beet import /music/new_stuff
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Beets scans the files, matches them against its databases, and asks for confirmation when it&apos;s not sure. I can review each match and tell it when it&apos;s wrong.&lt;/p&gt;
&lt;h3&gt;The Web Interface&lt;/h3&gt;
&lt;p&gt;The web interface at &lt;code&gt;http://your-server:8337&lt;/code&gt; is actually pretty useful. You can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Browse your tagged collection&lt;/li&gt;
&lt;li&gt;Search for specific tracks or albums&lt;/li&gt;
&lt;li&gt;Play music directly (if you want)&lt;/li&gt;
&lt;li&gt;Monitor import progress&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&apos;s not as pretty as Navidrome, but it&apos;s perfect for managing your tagging workflow.&lt;/p&gt;
&lt;h3&gt;Handling Problem Files&lt;/h3&gt;
&lt;p&gt;Some files are just fucked. Wrong metadata, corrupt tags, weird encodings. For these, I use:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Force a manual match
docker exec -it beets beet import -t /path/to/problem/album

# Check what Beets thinks about a file
docker exec -it beets beet info /path/to/file.mp3

# Re-tag existing files
docker exec -it beets beet update
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;The Reality of Music Tagging&lt;/h2&gt;
&lt;p&gt;Here&apos;s what nobody tells you: this isn&apos;t a one-afternoon project. If you&apos;ve got thousands of tracks collected over decades, it&apos;s going to take time. But here&apos;s the thing - once it&apos;s done, it&apos;s done.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What to expect:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Most mainstream stuff gets tagged automatically&lt;/li&gt;
&lt;li&gt;Obscure releases need manual help&lt;/li&gt;
&lt;li&gt;Live bootlegs and demos are always a pain&lt;/li&gt;
&lt;li&gt;You&apos;ll discover duplicates you forgot you had&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;But the payoff is huge:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your music server actually looks professional&lt;/li&gt;
&lt;li&gt;Searching actually works&lt;/li&gt;
&lt;li&gt;Album art everywhere&lt;/li&gt;
&lt;li&gt;Consistent naming across your entire collection&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Integration with Navidrome&lt;/h2&gt;
&lt;p&gt;Once Beets has done its thing, your music works perfectly with Navidrome. Clean metadata, proper album art, consistent artist names - everything just flows together.&lt;/p&gt;
&lt;p&gt;I point Navidrome at my &lt;code&gt;/punkify&lt;/code&gt; directory (where Beets puts the cleaned files), and it&apos;s like having a commercial music service, except it&apos;s all my music, organized exactly how I want it.&lt;/p&gt;
&lt;h2&gt;Tips for Success&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Start small&lt;/strong&gt; - Don&apos;t try to import your entire collection at once. Start with a few albums, get comfortable with the workflow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Review matches&lt;/strong&gt; - Beets is usually right, but when it&apos;s wrong, it&apos;s really wrong. Pay attention during imports.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Backup first&lt;/strong&gt; - Seriously. Beets can modify your files. Have backups.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use the logs&lt;/strong&gt; - When something goes wrong, check &lt;code&gt;/config/beet.log&lt;/code&gt;. It&apos;s usually obvious what happened.&lt;/p&gt;
&lt;h2&gt;The Bottom Line&lt;/h2&gt;
&lt;p&gt;Beets isn&apos;t sexy software. It doesn&apos;t have flashy interfaces or clever marketing. But it solves the fundamental problem that drives music collectors insane: making sense of chaos.&lt;/p&gt;
&lt;p&gt;After 20+ years of dealing with badly tagged music, Beets is the first tool that actually understands what I&apos;m trying to do. It respects the difference between a studio album and a live recording, between a first pressing and a remaster, between an EP and a single.&lt;/p&gt;
&lt;p&gt;Most importantly, it lets me focus on listening to music instead of organizing files. That&apos;s what this whole self-hosted streaming thing is about - taking back control so you can actually enjoy your collection.&lt;/p&gt;
&lt;p&gt;Your music deserves better than &quot;Unknown Artist.&quot; Beets makes sure it gets the respect it deserves.&lt;/p&gt;
</content:encoded><author>Tobi</author></item></channel></rss>