A Jellyfin-compatible media server written in Go.
Deadfin serves the Jellyfin 12.0 API. The Jellyfin apps you already use, such as jellyfin-web, Swiftfin, Jellyfin for Android TV and Infuse, connect to it unchanged.
- One Go process. No .NET runtime. Multi-arch image (amd64 and arm64) with Jellyfin's FFmpeg build.
- Hardware transcoding. Intel QSV and VAAPI, NVIDIA NVENC, with HDR10, HLG and Dolby Vision tone mapping.
- Moves in from Jellyfin. A one-way importer brings users, watch state, playlists, collections and libraries. It only reads Jellyfin's files.
- SQLite or PostgreSQL. SQLite by default, with no setup.
Quick start
Deadfin listens on TCP 8096 and answers client discovery on UDP 7359. All its state lives in /var/lib/deadfin in the container. The container runs as UID/GID 65532.
-
Get a TMDb API key
Movie and TV metadata and artwork come from TMDb. Each Deadfin server uses its own key. A free v3 key takes a few minutes at themoviedb.org/settings/api. Set it before the first library scan.
-
Get a web client
The image carries no web client. Copy jellyfin-web 12.0 out of the stock Jellyfin image once:
mkdir -p ./deadfin/data ./deadfin/web sudo chown 65532:65532 ./deadfin/data cid=$(docker create jellyfin/jellyfin@sha256:2d1a69be5aa2695d0c2df90ebeb76bbcc6efc0a798cb09bfa65906680e1d785a) docker cp "$cid":/jellyfin/jellyfin-web/. ./deadfin/web/ docker rm "$cid" -
Run Deadfin
:alphafollows the newest release or release candidate. To control upgrades, pin a tag from the tags page in its place.# compose.yaml services: deadfin: image: ghcr.io/deadfin-org/deadfin:alpha restart: unless-stopped ports: - "8096:8096" - "7359:7359/udp" environment: TMDB_API_KEY: "your-key" # from step 1: movie and TV metadata and art volumes: - ./deadfin/data:/var/lib/deadfin - ./deadfin/web:/var/lib/deadfin/web:ro - /srv/media:/media:rodocker compose up -dThe same with
docker rundocker run -d --name deadfin --restart unless-stopped \ -p 8096:8096 -p 7359:7359/udp \ -e TMDB_API_KEY=your-key \ -v "$PWD/deadfin/data:/var/lib/deadfin" \ -v "$PWD/deadfin/web:/var/lib/deadfin/web:ro" \ -v /srv/media:/media:ro \ ghcr.io/deadfin-org/deadfin:alpha -
Finish setup
Open
http://<host>:8096/web/from your local network and complete the startup wizard. Behind a reverse proxy, use the one-time setup link that Deadfin prints in its log.
The install guide covers volumes, PostgreSQL, reverse proxies, hardware transcoding, adding libraries and upgrades. To move from Jellyfin, read importing from Jellyfin.
Status: alpha
Deadfin is alpha software. Back up your data, expect defects, and keep your Jellyfin server around while you try it.
Works today
First-run setup, sign-in and QuickConnect, library scans with TMDb, TheAudioDB and AniList metadata, browsing and search, direct play, HLS transcoding, external and embedded subtitles (including burn-in), resume and played state, playlists and collections, music, trickplay previews, and the Jellyfin importer.
Live TV, DVR and SyncPlay are on the roadmap.
Clients
UI: tested with the real app. API: the app's own requests replayed against Deadfin.
| Client | Sign-in | Browse | Direct play | Transcode | Subtitles |
|---|---|---|---|---|---|
| jellyfin-web 12.0 | UI | UI | — | — | — |
| Swiftfin (iOS) | API | API | API | API | API |
| Jellyfin for Android TV | — | — | API | API | API |
| Infuse | — | — | API | direct-plays | API |
— means no result yet. Findroid, Streamyfin, Jellyfin Media Player, Swiftfin on tvOS and others have test steps in the full client matrix. Tested a client? Open a client compatibility report on GitHub.
Differences from Jellyfin
Each intentional difference has an entry in divergences. The plain-language version is known differences. First questions about artwork, HDR, the web client, GPUs and reverse proxies are in the FAQ.
Links
- GitHubSource, issues and pull requests
- ReleasesRelease notes and images
- DocumentationEvery guide, in one index
- DiscussionsQuestions and ideas
- Security advisoriesReport a vulnerability privately