Jellyfin

The Free Software Media System — stream your entire media library from your own server, with no subscriptions, no tracking, and no strings attached.

54Kstars
5.1Kforks
GNU GPLv2
C#

Jellyfin is a fully open-source, self-hosted media server that gives you complete ownership over your movie, TV show, music, photo, book, and live TV collections. Descended from Emby 3.5.2 and ported to .NET, it is a direct alternative to Plex and Emby without any premium tiers, proprietary restrictions, or data collection.

The server backend handles media scanning, metadata fetching from TheMovieDB, TheTVDB, and MusicBrainz, on-the-fly transcoding via FFmpeg, user authentication, and a full RESTful API documented with Swagger. Its architecture cleanly separates the server from clients — official apps exist for Android, iOS, Roku, Amazon Fire TV, Kodi, and desktop platforms, all connecting via the same documented API.

Jellyfin supports live TV and DVR through HDHomeRun and DVB tuners, SyncPlay for synchronized group viewing sessions, hardware-accelerated transcoding, and an extensible plugin system for adding metadata providers and additional functionality. It runs on Windows, Linux, and macOS, deploys easily via Docker, and has no dependency on any external cloud service.

What You Get

  • Media Library Management - Automatically scans and organizes movies, TV shows, music, books, photos, and live TV recordings with metadata fetched from TheMovieDB, TheTVDB, and MusicBrainz.
  • On-the-Fly Transcoding with FFmpeg - Dynamically transcodes media to match device capabilities using FFmpeg with support for H.264, H.265, AV1, VP9, Dolby Vision, and hardware acceleration on supported GPUs.
  • Live TV & DVR Support - Integrates with HDHomeRun and DVB tuners to watch live television, schedule recordings, and manage an electronic program guide directly within the interface.
  • SyncPlay for Group Viewing - Synchronizes media playback across multiple devices and users in real time, enabling remote watch parties with shared queue management and playback controls.
  • Multi-User Profiles with Parental Controls - Create individual user accounts with personalized libraries, custom viewing preferences, and configurable parental rating restrictions per user.
  • Extensible Plugin System - Load additional metadata providers, authentication backends, and integrations through a managed plugin ecosystem with isolated assembly load contexts.
  • Full REST API with Swagger Documentation - Programmatic access to all server functionality at /api-docs/swagger for custom integrations, automation, and third-party client development.
  • Zero Telemetry and No Vendor Lock-In - No data collection, no cloud dependency, no analytics, and no premium tier — your media and usage data stay entirely on your hardware.

Common Use Cases

  • Home media server for a family - A household centralizes Blu-ray rips, purchased digital content, and recorded TV shows on a NAS and streams to smart TVs, tablets, and phones without any monthly subscription.
  • Personal media archive with rich metadata - A collector organizes hundreds of films and TV series with artwork, ratings, and subtitles, accessible from any device with consistent playback history and resume points.
  • Privacy-first Plex replacement - A privacy-conscious user migrates away from Plex to eliminate telemetry and vendor dependency, running everything locally on a home server or VPS.
  • Community media hub with access controls - A small community or household deploys Jellyfin on a Linux server and creates per-user accounts with tailored library access and parental controls.
  • Live TV and DVR for cord-cutters - A user connects an HDHomeRun tuner to Jellyfin to receive over-the-air broadcasts, schedule recordings, and watch live TV through the same interface as their media library.

Under The Hood

Architecture Jellyfin follows a deeply layered, modular architecture organized around distinct project-level boundaries: the API layer, server host, and core implementations are kept strictly separated, with the MediaBrowser.Controller namespace defining abstract interfaces that Emby.Server.Implementations and specialized modules satisfy. ASP.NET Core’s dependency injection container is used throughout to wire services, enabling loose coupling and testable composition without service locator patterns. The media encoding pipeline, live TV engine, image processing, and networking layers each exist as independent projects with clean interfaces, meaning any one subsystem can be replaced or disabled without cascading changes. Entity Framework Core drives the database layer with explicit migration-driven schema evolution and concurrency conventions, while SyncPlay’s group state machine manages synchronized playback through a well-defined state context protocol.

Tech Stack The server is built on .NET 10 with C# using strict nullable reference types enabled across the entire solution and TreatWarningsAsErrors enforced at the project level. ASP.NET Core provides HTTP hosting, middleware pipeline, and the controller layer exposed to clients. SQLite and PostgreSQL are supported as data stores via Entity Framework Core, with Microsoft.Data.Sqlite as the default. FFmpeg (via jellyfin-ffmpeg) handles all media encoding, transcoding, and keyframe extraction, while SkiaSharp powers image collage generation and BlurHash placeholder creation. The build toolchain uses MSBuild with centralized package version management and custom Roslyn analyzers defined in the Jellyfin.CodeAnalysis project. Docker multi-stage builds provide the standard production deployment target.

Code Quality The test suite spans extensive unit and integration coverage across 18 dedicated test projects mirroring the production project structure, using xUnit v3, Moq, and AutoFixture with AutoMoq for fixture generation. Integration tests spin up a full in-process application host via WebApplicationFactory to validate real HTTP endpoints and middleware behavior. Nullable reference types, records, and data annotations enforce strong type contracts at compile time. All warnings are treated as errors, Roslyn analyzers enforce async disposal and banned API usage, EditorConfig and StyleCop ensure consistent naming, and CI pipelines on GitHub Actions run tests, OpenAPI generation, and format validation on every pull request.

What Makes It Unique Jellyfin’s most distinctive technical characteristic is its pluggable image processing layer: NullImageEncoder provides a no-dependency fallback that degrades gracefully on headless deployments, while the SkiaSharp encoder adds collage generation, BlurHash computation, and full image manipulation when available. The SyncPlay subsystem implements a true distributed state machine for real-time synchronized group playback across arbitrary network topologies — not just a shared queue but a full group session with state transitions, buffering coordination, and latency handling. The HLS keyframe extraction module in Jellyfin.MediaEncoding.Keyframes provides precise seek-point generation for smooth adaptive bitrate streaming. The plugin system uses isolated AssemblyLoadContexts to sandbox each plugin’s dependencies, enabling metadata providers from TMDB, MusicBrainz, AudioDB, OMDB, and Listenbrainz to coexist without version conflicts. Custom Roslyn analyzers in Jellyfin.CodeAnalysis enforce project-specific coding patterns at compile time, a level of investment in code quality tooling uncommon in open-source media server projects.

Self-Hosting

Jellyfin is licensed under the GNU General Public License v2.0. This is a strong copyleft license: you are free to use, modify, and distribute Jellyfin for any purpose, including commercial contexts, but any modifications you distribute must also be released under GPL-2.0. For most self-hosters running Jellyfin privately on their own infrastructure without distributing the software to others, the copyleft provisions do not impose practical restrictions — you can run a modified Jellyfin instance for yourself, your family, or your organization without publishing those changes. Plugin authors should be aware that plugins loading into the Jellyfin process may be considered derivative works under GPL-2.0.

Running Jellyfin yourself means you are responsible for the full operational stack: server provisioning, storage sizing, uptime, security patching, database backups, and network configuration. Transcoding workloads can be CPU- or GPU-intensive depending on your client devices and media formats; hardware acceleration requires additional driver setup on Linux (VAAPI, NVENC, Quick Sync) or Windows. The server has no built-in high-availability or clustering — for resilience you would need to manage that at the infrastructure level yourself. Updates are manual and require downtime, and while the community release cadence is healthy (roughly monthly patch releases), you control when and whether to upgrade.

There is no official paid or managed cloud tier for Jellyfin — this is by design. The project explicitly rejects the open-core model. What you give up compared to hosted alternatives like Emby Premiere or Plex Pass is primarily convenience: no automatic cloud backups, no managed upgrades, no formal SLA, no dedicated support channel beyond community forums and Matrix. Plex and Emby both offer mobile sync, HDR tone mapping, and hardware transcoding gated behind subscriptions; Jellyfin provides all of these for free in exchange for you managing the infrastructure yourself.

Join founders buildingwith open source

Opinionated takes, migration guides, cost-saving tips, and insights from the open source ecosystem.

Subscribe on Substack

No spam. Unsubscribe anytime.

Join 750+ subscribers
No spam. Unsubscribe anytime.

Search