Tech Digest

Category

Media servers and libraries

The software choice here is smaller than people think. What decides whether your server works is the graphics silicon in the box and whether anyone else can use it.

11 tools profiledMedian idle memory 200 MBLast reviewed

Two things decide whether a self-hosted media server works, and neither is the software. The first is whether the box can transcode in hardware. The second is whether anyone other than you can use it without asking for help. Feature matrices are downstream of both.

Transcoding is the whole ballgame#

Serving a file the client can already play costs almost nothing. Re-encoding it in real time costs a whole CPU. Software transcoding of 4K HEVC saturates any consumer processor, so a box with Quick Sync manages several simultaneous 4K streams inside a 25 W envelope and the same box without it manages one, then buffers.

The corollary matters more than the hardware advice: the cheapest transcode is the one that does not happen. An H.264 file with AAC audio direct plays almost everywhere. A 4K HEVC remux with Dolby Vision profile 7 and lossless TrueHD transcodes on most televisions, and it is usually one or two files like that, not the library, that make people think their server is too slow.

The default: Jellyfin on a mini PC with Quick Sync#

Jellyfin gates nothing. Hardware transcoding, remote access, DVR and downloads are features rather than entitlements, it idles at 280 MB, scores 2 on ops load, and there is no account and no licence check. Put it on an N100-class mini PC and pass the iGPU through properly: --device /dev/dri:/dev/dri plus the host's render group ID in group_add, from getent group render. Without the group, ffmpeg cannot open the device and falls back to software with no error in the UI.

Two situations where Jellyfin is the wrong answer.

Your household watches on Roku or older Samsung and LG televisions, and you are the support desk. Plex Media Server has the best clients here and you pay for them: $6.99 a month, $69.99 a year or $249.99 lifetime, and remote playback of your own files has needed someone to hold a Pass since 29 April 2025. If relatives calling you is the failure you are optimizing against, that is a rational purchase. Otherwise you are renting permission to play your own files.

You want to pay once. Emby is roughly $119 lifetime and does not phone home for permission to play locally, which is where it beats Plex after 2025. It went closed source at 3.5.3 in 2018 and Jellyfin is the fork of 3.5.2 that kept going, so you cannot audit or patch it.

For music, none of the above: Navidrome is 70 MB, ops 1, and speaks the Subsonic API so the client apps already exist. For audiobooks, Audiobookshelf is the only one that tracks position per user per item and syncs it mid-chapter. For comics, Kavita.

The household test#

A media server passes when someone who does not know what a container is can sit down, find a show and press play without calling you. It fails for reasons that never appear in a spec table: the Roku app is rougher than the Plex one, the TV cannot decode the audio track, a library scan is running, or the only account is yours. A server nobody else will use has failed, whatever its transcoding numbers say.

The mistakes people actually make#

  • Splitting downloads and media into separate mounts. In Docker, /downloads and /tv as two volumes are two filesystems even on one disk, so Sonarr and Radarr copy instead of hardlinking. Disk use doubles and seeding stalls. Mount one parent like /data, and check Activity, History for the word hardlink.
  • Pulling Jellyfin 10.11 without a copy of /config. It moved the library onto EF Core and merged library.db into jellyfin.db, upgrades only from 10.10.7, has no downgrade, and past roughly 50,000 items can churn for hours with no progress shown. People who killed the container mid-migration lost history and metadata.
  • Making Prowlarr a single point of failure. Prowlarr syncs indexers as Torznab entries pointing back at itself, so it sits in the search path at query time. If it is down or its URL base changes, every indexer in every app fails at once. Radarr has a quieter version of the same problem: v6 changed the default wanted language on quality profiles to Original, so carried-forward profiles filter differently with no obvious cause.
  • Staying on a jellyseerr tag. Jellyseerr and Overseerr merged into Seerr on 10 February 2026 and both are deprecated. The old tags get no fixes, security ones included; the new image runs as UID 1000 and wants init: true.

GPUs, transcoding and local AI is the hardware page for this category, with Choosing home server hardware and What a home server costs to run for what the box costs to leave on. For the software calls: Jellyfin vs Plex, Jellyfin vs Emby, Navidrome vs Jellyfin for music and Kavita vs Calibre-Web. Leaving a subscription is Replace Plex, Replace Spotify and Replace Audible; Stack planner sizes the stack first.

Every media tool we profile#

Sorted by operational load, lightest commitment first. Every row links to a full profile with the resource numbers, the upgrade traps and the restore path.

ToolOps loadIdle RAMLicenceIdentityBackup shape
Navidrome1, Set and forget70 MBGPL-3.0Trusted proxy headerSQLite backup
Audiobookshelf2, Light200 MBGPL-3.0Native OIDCSQLite backup
Calibre-Web2, Light120 MBGPL-3.0LDAP onlySQLite backup
Emby2, Light350 MBProprietaryLDAP onlySQLite backup
Jellyfin2, Light280 MBGPL-2.0-onlyOIDC via pluginSQLite backup
Jellyseerr2, Light220 MBMITAuth proxy onlySQLite backup
Kavita2, Light250 MBGPL-3.0Native OIDCSQLite backup
Plex Media Server2, Light400 MBProprietaryLocal accounts onlySQLite backup
Prowlarr2, Light150 MBGPL-3.0Local accounts onlySQLite backup
Radarr3, Moderate200 MBGPL-3.0Local accounts onlySQLite backup
Sonarr3, Moderate200 MBGPL-3.0Local accounts onlySQLite backup

Profiles#

Head to head in this category#

Leaving a cloud service in this category#

Guides for this category#

Questions#

How much RAM do I need for a media server?

Less than you expect for the server, more than you expect for the stack around it. Jellyfin idles at about 280 MB and sits near 900 MB in ordinary use; Plex idles at 400 MB and reaches 1.2 GB. Concurrent transcodes and library scans are what move those numbers, not the number of users browsing. The real growth is the automation: Sonarr and Radarr are about 200 MB each, Prowlarr 150 MB, a request front end 220 MB. A full media stack lands around 2 GB, so 8 GB in the machine is comfortable and 4 GB is tight.

What hardware do I need for 4K transcoding?

An Intel CPU with Quick Sync or an NVIDIA card with NVENC. Software transcoding of 4K HEVC saturates any consumer CPU, so this is the difference between four simultaneous streams and one. A modern Intel iGPU handles several 4K HEVC transcodes inside a 10 to 25 W power budget, which is why N100 and N150 mini PCs dominate this use case. Passing --device /dev/dri:/dev/dri alone is not enough in Docker: the container also needs the host's render group ID via group_add, or ffmpeg silently falls back to software.

Is Plex still worth paying for?

Only for the clients. Since 29 April 2025 remote playback of your own files requires the server owner to hold a Plex Pass, or each remote viewer to hold a Pass or a Remote Watch Pass at $1.99 a month. Enforcement reached Fire TV, Apple TV, Samsung, LG, Vizio, PlayStation and Xbox on 29 April 2026. Hardware transcoding has always been Pass-only, so the free tier is now LAN-only and CPU-only. Plex Pass is $6.99 a month, $69.99 a year or $249.99 lifetime. Jellyfin gates none of it.

Why does my library scan hammer the server?

Because scanning is not serving. Jellyfin and Plex read metadata and extract artwork and trickplay images for every file; Kavita decompresses every archive to count pages; Navidrome reads tags on every track and has been reported pushing container memory past 10 GB on libraries of hundreds of thousands of tracks, which is why it grew an external scanner subprocess. Serving a direct-play stream is nearly free by comparison. Schedule full scans overnight, and give the container a memory limit high enough to survive one rather than fighting the schedule.

What is direct play and why does it matter?

Direct play means the client can decode the file as it is and the server just sends bytes. It costs almost no CPU and no quality. Transcoding means the server decodes and re-encodes in real time, which is where all the hardware requirements come from. The practical consequence: store files your clients can actually play. An H.264 8-bit file with AAC audio direct plays nearly everywhere; 4K HEVC with Dolby Vision profile 7 and TrueHD audio will transcode on most TVs, and that one file is why your server sounds like a hairdryer.

Do I need Sonarr and Radarr?

Only if you are managing a library that grows continuously. They are decision layers, not sources: Sonarr's real job is resolving which episode a release is, and Radarr's is scoring which copy of a film you keep. Both score 3 on ops load, and both cost you configuration time in specific places. Anime is where Sonarr fails most, because release groups number continuously while TheTVDB splits into seasons. If you add a few things a month by hand, skip the automation and save yourself 550 MB and the custom format learning curve.

Can I run a media server on a Raspberry Pi?

On a Pi 4 or 5 with a 64-bit OS, yes, for direct play to a couple of clients. Do not expect transcoding. Jellyfin dropped armhf builds entirely in 10.11.0, so a Pi 1, 2 or 3 running 32-bit Raspberry Pi OS is stuck on 10.10.x and the fix is a 64-bit reinstall, not a package. Emby publishes ARM64 as a separate Docker Hub repository (emby/embyserver_arm64v8) rather than a multi-arch tag, so pulling the wrong name gives you an exec format error.

Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.