{"slug": "tired-of-subscriptions-so-i-built-my-own-server", "title": "Tired of Subscriptions, So I Built My Own Server", "summary": "A developer built a home server on a repurposed laptop to replace subscription services, using Docker with Jellyfin, Navidrome, and other tools. They created a Python pipeline called MusicVault to migrate playlists from Spotify, overcoming four distinct YouTube anti-bot challenges. The project is expanding to include a personal webpage, automations, and an AI agent layer.", "body_md": "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.\n\nThat 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 — a personal webpage, automations, my own music/movie player, an AI agent to manage it all. Here's how it came together.\n\nThe setup\n\nA 16GB/i5 laptop I wasn't using became a Debian 13 VM (headless, VirtualBox), reachable from anywhere via Tailscale. One Docker stack runs on top:\n\nJellyfin — my own Netflix\n\nNavidrome — my own Spotify\n\nSamba — a network drive from any device\n\nPortainer / Homepage — management + dashboard\n\nPostgreSQL — shared DB engine\n\nPi-hole — network-wide ad block (in progress)\n\nNo more monthly bills for things a spare laptop can do for free.\n\nThe hard part: filling it with music\n\nHosting a Spotify clone is easy. Filling it with your actual library isn't. Spotify's Feb 2026 API change blocked the clean OAuth route, so I improvised: export playlists as CSVs (via Exportify), then built MusicVault — a pipeline that parses them, finds each track on YouTube, downloads it, and auto-generates playlists Navidrome can serve.\n\n5,748 tracks. 97 playlists. Starting from zero.\n\nFour fights with YouTube\n\nStorage — FLAC files were about to blow past my 200GB disk. Switched everything to MP3.\n\nSilent failures — my own script was hiding the real error. Fixed the logging first, which revealed YouTube's bot-check. Fixed with browser cookies.\n\n\"Format not available\" — YouTube now requires solving a JS challenge for some streams. Installed a JS runtime + solver, and caught a sneaky bug where ~ silently failed inside a command flag.\n\nMass 403 errors — a live, actively-evolving yt-dlp issue other users were hitting that same week. Fixed by forcing a different YouTube client. Even the fix had a gotcha: a tabs-vs-spaces mismatch silently blocked my first patch attempt.\n\nFour unrelated failure modes, back to back — each one real debugging, not copy-paste.\n\nWhat's next\n\nA personal webpage, hosted off the server\n\nAutomations — disk monitoring, auto-cleanup, alerts when things break\n\nA custom-built music/movie player instead of default UIs\n\nAn AI agent layer to manage the server in plain language\n\nEventually: Nextcloud, Gitea, self-hosted photo backup\n\nWhat started as \"stop paying for four apps\" turned into a home-lab I'm still adding to every week — and that's the part I like most.", "url": "https://wpnews.pro/news/tired-of-subscriptions-so-i-built-my-own-server", "canonical_source": "https://dev.to/ashusosuke/tired-of-subscriptions-so-i-built-my-own-server-14m", "published_at": "2026-08-18 07:09:56+00:00", "updated_at": "2026-08-18 07:43:12.476436+00:00", "lang": "en", "topics": ["developer-tools", "ai-agents"], "entities": ["Jellyfin", "Navidrome", "Tailscale", "Docker", "YouTube", "Spotify", "MusicVault", "Exportify"], "alternates": {"html": "https://wpnews.pro/news/tired-of-subscriptions-so-i-built-my-own-server", "markdown": "https://wpnews.pro/news/tired-of-subscriptions-so-i-built-my-own-server.md", "text": "https://wpnews.pro/news/tired-of-subscriptions-so-i-built-my-own-server.txt", "jsonld": "https://wpnews.pro/news/tired-of-subscriptions-so-i-built-my-own-server.jsonld"}}