Urgent.News

One page, thousands of outlets. See who else covered it.

Editions

Tech

Tired of Subscriptions, So I Built My Own Server

Another month, another stack of bills for a music app, a movie app, cloud storage — all for things I could technically host myself. So I did. That question turned into a home server on a repurposed laptop, a full Docker stack, and a Python pipeline that's had four separate fights with YouTube's anti-bot systems in a single week. And once I had a server I actually controlled, the ideas didn't stop…

I found myself dissatisfied with the monthly fees for various apps, such as music and movie streaming services, as well as cloud storage. This led me to take matters into my own hands by building my own home server. Beginning with a repurposed laptop, I constructed a Debian 13 virtual machine (headless, utilizing VirtualBox) that could be accessed from any location through Tailscale.

A Docker stack was then installed on top of the VM, encompassing services like Jellyfin for a personalized Netflix experience, Navidrome as a Spotify alternative, Samba for network storage, Portainer for management and a dashboard, PostgreSQL as the shared database engine, and Pi-hole for network-wide ad blocking.

My biggest challenge, however, was amassing my music collection. Initially, I encountered difficulties with Spotify's API changes in February 2026, which hindered the clean OAuth approach. To overcome this, I exported my playlists as CSV files using Exportify and developed a pipeline named MusicVault. This pipeline meticulously parsed the CSV files, sourced each track from YouTube, downloaded it, and automatically generated corresponding playlists for Navidrome to serve.

As the music library grew to encompass 5,748 tracks across 97 playlists, I realized the need to optimize storage space. With FLAC files consuming close to 200GB of my disk, I transitioned to MP3 format. However, hidden errors within my own script threatened to overwhelm me. After diligently addressing these issues, I discovered YouTube's increasingly stringent anti-bot measures. By implementing browser cookies and tackling a JS runtime/solver, I managed to circumvent these obstacles.

Nonetheless, new challenges continued to arise. YouTube's requirement for solving a JavaScript challenge for specific streams tested my patience. To address this, I installed a JavaScript runtime along with a solver and fought a 403 error stemming from a live, constantly evolving yt-dlp issue that several users were facing. Finally, a silent bug related to tabs versus spaces within a command flag thwarted my efforts.

Despite these setbacks, I persevered and introduced an AI agent to manage my server in plain language. In the future, I envision expanding the server to include Nextcloud, Gitea for version control, and a self-hosted photo backup system. What began as a simple quest to cease paying for subscriptions has transformed into a rewarding home-lab venture, with my ongoing contributions proving to be the most gratifying aspect of the journey.

Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.

Read the original at dev.to →

More in Tech

Why "Humanize My Writing" Tools Don't Work

In December 2024, Florida State University linguists Tom Juzek and Zina Ward set out to answer a question that had turned into a running joke among people who read a lot of AI output: why does ChatGPT…

How to Push Back on an Unrealistic Deadline Without Damaging the Relationship

Every engineer eventually sits across from a stakeholder who says "we need this in three weeks" about something that genuinely needs six.

  • Explain why proposed deadline is unrealistic, break down tasks needed
  • Offer alternatives that meet business objectives while adjusting scope
  • Separate estimate from person, frame complexities, not personal availability

More from Tuesday 18 August →