Deadfin

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.

Quick start Source on GitHub

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.

  1. 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.

  2. 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"
  3. Run Deadfin

    :alpha follows 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:ro
    docker compose up -d
    The same with docker run
    docker 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
  4. 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.

ClientSign-inBrowseDirect playTranscodeSubtitles
jellyfin-web 12.0UIUI———
Swiftfin (iOS)APIAPIAPIAPIAPI
Jellyfin for Android TV——APIAPIAPI
Infuse——APIdirect-playsAPI

— 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.