Tech Digest

Migration

Replace Plex

Jellyfin matches Plex on the server and loses on the clients. Get your watch history out first, then run the household test for a month.

Last reviewed

Should I switch from Plex to Jellyfin?

Switch if you object to paying for remote playback of files you already own, or you want hardware transcoding without a subscription. Jellyfin is the equal of Plex as a server and gives away everything Plex charges for. The biggest thing you lose is client polish: Roku, older Samsung and older LG apps are noticeably rougher, and there is no Plex-style relay to make remote access work without you configuring it. Your watch history does not migrate itself either.

What you are actually giving up#

Plex has the best client apps in self-hosted media and it is not particularly close. The Apple TV, Roku and Tizen apps are things a relative can operate without calling you, and that is the entire product. Jellyfin on a modern Android TV box or a browser is fine. On a five year old Samsung, it is a downgrade your household will notice within a week.

The rest of the list:

  • Remote access that configures itself. Plex's relay works through CGNAT with no port forwarding, no domain and no certificate. Jellyfin has nothing equivalent. You now own Remote access without port forwarding as a project.
  • Plexamp. Genuinely the best music client attached to any of these servers. There is no Jellyfin equivalent of the same quality.
  • Shipped intro and credit detection. On Jellyfin this is a plugin you install and maintain, not a feature that is simply there.
  • One account for everyone. Plex identity is a plex.tv account your friends already have. Jellyfin means creating local accounts and getting an app onto each of their devices.
  • Your watch history. It exists only in Plex's SQLite database. Nothing exports it for you, and nobody thinks about it until it is gone.

Get your data out first#

Do this while Plex is still healthy and still holds an active Pass, because a Pass-less server is LAN-only and you will be doing this over the LAN anyway.

1. Dump watch history and playlists. There is no export button, so use the API.

python
from plexapi.server import PlexServer
import csv

plex = PlexServer("http://plex.lan:32400", "YOUR_PLEX_TOKEN")

with open("plex-history.csv", "w", newline="") as fh:
    w = csv.writer(fh)
    w.writerow(["viewed_at", "type", "show", "title", "account_id"])
    for item in plex.history(maxresults=200000):
        w.writerow([item.viewedAt, item.type,
                    getattr(item, "grandparentTitle", ""), item.title,
                    item.accountID])

for pl in plex.playlists():
    with open("playlist-%s.m3u" % pl.title.replace("/", "_"), "w") as fh:
        for item in pl.items():
            for part in item.iterParts():
                fh.write(part.file + "\n")

That gives you a per-user history CSV you can read in ten years and .m3u files of real filesystem paths, which Jellyfin can pick up as a playlist library. Run it once per Plex Home user if you want everyone's history separately: history() takes an accountID.

2. Back up the database itself. Everything lives under /config/Library/Application Support/Plex Media Server/. The one that matters is Plug-in Support/Databases/com.plexapp.plugins.library.db, alongside blobs.db and their -wal and -shm companions. Stop the server before copying, or use the Plex SQLite binary bundled with the server and its .backup command. Do not use your distribution's sqlite3: it can be a different version with different WAL handling, and Plex ships its own for exactly that reason. Plex also writes dated copies into the same folder, and those are your fastest restore.

3. Fix your file naming now, not later. Plex is forgiving about messy names; Jellyfin is less so. Getting Show Name (2014)/Season 01/Show Name - S01E03.mkv right before the first scan saves you an evening of manual identification.

4. Then sync the watched state. With both servers running and libraries scanned, JellyPlex-Watched matches items by filename and provider IDs and copies watched status, in-progress positions and view dates from Plex into Jellyfin or Emby. Its own documentation says the matching is not perfect but works for most cases, which is an honest description. Check one series per user afterwards.

Which one to pick#

Jellyfin unless a specific client forces your hand. Nothing is gated: hardware transcoding, remote access, DVR and downloads are features, not entitlements. It idles around 280 MB, it is one container with one SQLite file, and backup is a directory copy.

Your situationPickWhy
You want it free and complete, and your clients are modernJellyfinNo paid tier, no account, no licence check
Intel iGPU, several simultaneous 4K HEVC transcodesJellyfinQuick Sync with no licence cost, once the render group is right
Household lives on Roku or an older Tizen or webOS TVEmby, or stay on Plex Media ServerClient quality is the deciding factor, not the server
You would pay once but not monthlyEmby$119 lifetime against $249.99 for a Plex Pass lifetime
You hold a pre-2025 lifetime Plex PassStayThe 2025 paywall does not apply to you

Emby is the option people land on rather than choose. It went closed source at 3.5.3 in 2018 and Jellyfin is the fork of 3.5.2 that kept going, so the two still feel like relatives. What Emby buys is a licence rather than a platform tax: nothing phones home for permission to play locally. What it costs is that hardware transcoding needs an active Premiere key, so passing /dev/dri into an unlicensed container achieves nothing at all.

What the migration actually costs#

For a library of 2,000 films and 25,000 episodes:

  • First scan and metadata fetch: several hours. Trickplay image generation is the expensive part and it will keep the CPU busy overnight.
  • Disk: the database stays small, but artwork, trickplay images and extracted subtitles under /config/metadata grow with the library, and the transcode cache can spike several GB per active session. Give /cache fast storage or a tmpfs.
  • Hardware transcoding: budget an evening. Passing --device /dev/dri:/dev/dri is not enough. The container user also needs the host's render group ID via group_add (getent group render gives you the number), or ffmpeg silently falls back to software and you only find out when the CPU pins. Emby uses a GIDLIST environment variable instead, so a compose fragment copied from a Jellyfin guide will not work. Check the playback info overlay: it says whether the transcode is hardware accelerated.
  • Ongoing: Jellyfin is 2 out of 5. Tag bumps, mostly. The exception was 10.11, which moved the library onto EF Core, merged library.db into jellyfin.db, is only supported from 10.10.7, has no downgrade path and can churn for hours on libraries past roughly 50,000 items. 10.11.11 is current stable and the next major skips 11 and goes to 12.0. Copy /config before any major, and let the first start finish overnight if it needs to.
  • Money: zero, against $69.99 a year for a Plex Pass.

What breaks and how to tell early#

Remote viewers. Everyone you share with needs a new account, a new app and a new URL, and some of them will not do it. Ask them, one by one, before you cancel anything.

Specific format edge cases. Dolby Vision profile 7 and lossless TrueHD passthrough still misbehave on some televisions. If your library is remuxed 4K discs, test those first, not a 720p sitcom.

32-bit ARM boards. 10.11 dropped armhf entirely, so a Pi 2 or 3 on a 32-bit OS cannot move past 10.10.x. The fix is reinstalling a 64-bit OS, not chasing a package.

The household test, which is the real one. Install Jellyfin on the main television and leave Plex installed next to it. For four weeks, count how often anyone opens Plex instead. If a partner or a teenager reverts more than once or twice, the migration will not stick, and knowing that in week two is much cheaper than knowing it after you cancel.

The point of no return#

Cancel the Plex Pass only when all of these hold. A lifetime Pass has nothing to cancel, so this section is for monthly and annual subscribers.

  1. Four weeks with nobody reverting to Plex on the main screen.
  2. Watch history imported and spot checked for every user, and the CSV archived somewhere that is not the media server.
  3. Remote access working from outside your network, on a phone with wifi turned off, for every person you share with.
  4. Hardware transcoding confirmed in the playback overlay, not assumed from a settings page.
  5. A tested restore of /config. Artwork comes back from a rescan; users, playlists and watch history do not exist anywhere except that database.

Keep Plex Media Server installed and stopped for another month after that. It costs disk and nothing else, and it is the only copy of anything you failed to export.

Next: sort out remote access properly with Remote access without port forwarding, size a transcoding GPU with GPUs, transcoding and local AI, and if you are automating acquisitions, Sonarr, Radarr and Jellyseerr are the usual companions. Music and audiobooks have their own migrations: Replace Spotify and Replace Audible.

Questions#

Can I export my Plex watch history?

Not from the UI. There is no export button. The supported route is the Plex API, most easily through python-plexapi: PlexServer.history() returns watched history and takes maxresults, mindate, ratingKey, accountID and librarySectionID, and PlexServer.playlists() returns every playlist. Dump both to CSV before you change anything. Separately, back up com.plexapp.plugins.library.db, which is the only place that history exists.

How do I move watched status from Plex to Jellyfin?

JellyPlex-Watched syncs watched state between Plex, Jellyfin and Emby, matching items by filename and provider IDs. It can also sync in-progress positions and view dates. Its own README says the matching is not perfect but works for most cases, so run it once with both servers online, then spot check a few series per user before you trust it.

Does Plex still work without a Plex Pass?

On your local network, yes. Since 29 April 2025 remote playback of personal media requires the server owner to hold a Plex Pass, or each remote viewer to hold a Plex Pass or the cheaper Remote Watch Pass. Enforcement started on Roku in late November 2025 and reached Fire TV, Apple TV, Samsung, LG, Vizio, PlayStation and Xbox on 29 April 2026. Hardware transcoding has always been Plex Pass only.

Is Jellyfin as good as Plex on a TV?

On the web and on Android, close enough that nobody will complain. On Roku and older Samsung Tizen and LG webOS sets, no. Dolby Vision profile 7 and lossless TrueHD passthrough also still misbehave on some televisions. Test on the actual television your household uses before you plan anything, because that device decides whether the migration survives.

Should I pay for Emby instead?

Consider it if you tried Jellyfin, hit a client problem you could not solve, and would rather pay once than keep debugging. Emby Premiere is roughly $4.99 a month, about $54 a year, or $119 for a lifetime licence, against $249.99 for a Plex Pass lifetime. Note that Emby gates hardware transcoding behind that licence too, so an unlicensed Emby server transcodes on CPU only.

What do I do about remote access after leaving Plex?

Solve it yourself, because Jellyfin has no relay service. The usual answers are a reverse proxy with a real certificate on a domain you own, or a mesh VPN such as Tailscale or Headscale so that only your own devices can reach the server. The second is safer and works through CGNAT; the first is what you need if you share with people outside your household.

Sources#

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