📖Fathom

MVP Builtv1.0.0

FathomModern reading room for Jellyfin libraries

Fathom is a free, open-source reading interface for books, manga, comics and PDFs that already live in Jellyfin. It runs as one Docker container, reads your Jellyfin reading libraries over the API, and presents them cover-first with featured shelves, collections and recent additions.

Features

What Fathom does

  • Featured shelves and recent additions for reading libraries

  • Collection and library browsing with title detail views

  • Support for books, manga, comics, PDFs, and audiobooks

  • Jellyfin onboarding that can live in environment variables or local SQLite

Audience

Who Fathom is for

  • Books and manga on a NAS
  • Cover-first browsing
  • Calm reading interfaces

Requirements

  • A running Jellyfin server with at least one reading library configured

  • A Jellyfin API key and the UUID of the user whose libraries you want to read

  • Docker, or Node.js 22.5+ to run from source

Install with Docker Compose

Fathom listens on port 3000, like every Coral module:

services:
  fathom:
    image: getcoral/fathom:latest
    restart: unless-stopped
    depends_on: [jellyfin]
    ports:
      - "3003:3000"
    environment:
      FATHOM_DATA_DIR: /data
      JELLYFIN_URL: http://jellyfin:8096
      JELLYFIN_API_KEY: ${JELLYFIN_API_KEY}
      JELLYFIN_USER_ID: ${JELLYFIN_USER_ID}
    volumes:
      - ./fathom-data:/data
    networks: [coral]

JELLYFIN_USER_ID is the user’s UUID, not their username — read it out of the URL when you open that user in the Jellyfin dashboard.

Every one of those environment variables is optional. Start the container bare and Fathom will ask for the Jellyfin connection on first run and store it in fathom.sqlite under FATHOM_DATA_DIR. Mount that directory if you want the setup to survive a container rebuild.

The published image is getcoral/fathom on Docker Hub. The module’s own documentation currently walks through running from source rather than the container, so the Compose service above is assembled from the image’s configuration.

Reading is a different browsing problem

A film library and a book library want different interfaces, which is the reason Fathom exists as a separate module rather than a tab inside Aurora.

Video browsing is driven by momentum — continue watching, what is next, what was just added. Reading is slower. You come back to a shelf you were partway through, or you browse covers looking for something to start, and the useful unit is the collection or the series rather than the individual episode.

So Fathom is cover-first and deliberately quiet. Featured shelves, recent additions, collection views, and title detail pages with the metadata Jellyfin holds. No autoplaying trailers, no rails competing for attention.

Everything it shows comes from Jellyfin at request time. Fathom keeps no copy of your library and no second metadata store — just its own connection details in SQLite.

Fathom vs Kavita and Komga

This is the comparison most people actually need, and the answer depends entirely on where your books already live.

Kavita and Komga are full reading servers. They scan your disks, maintain their own database and metadata, handle users and reading progress, and are considerably more mature at reading specifically — better readers, better series handling, better manga support.

Fathom is not a server. It is a client over Jellyfin, and that is the whole proposition: if your books, manga and comics already sit in Jellyfin alongside your films, Fathom gives them a proper interface without you running and maintaining a second server, a second user list and a second backup.

If your reading collection is large and reading is the main event, Kavita or Komga will serve you better. If it is a shelf sitting in the media server you already run, Fathom is the smaller answer.

The full breakdown is in Fathom vs Kavita and Komga.

Configuring Fathom

The full reference lives in the Fathom documentation.

VariablePurpose
JELLYFIN_URLYour Jellyfin server URL, for example http://jellyfin:8096.
JELLYFIN_API_KEYA Jellyfin API key from Dashboard → API Keys.
JELLYFIN_USER_IDThe UUID of the Jellyfin user — not their username.
JELLYFIN_USERNAMEOptional. With JELLYFIN_PASSWORD, opens a real playback session so progress syncs back.
JELLYFIN_PASSWORDOptional password for that session user.
FATHOM_DATA_DIRDirectory for the SQLite state file, fathom.sqlite.

Fathom — frequently asked questions

Does Fathom store my books separately from Jellyfin?

No. Fathom holds no copy of your library. It reads whatever Jellyfin has indexed over the API and keeps only its own connection details in a local SQLite file. Delete the container and your books, your metadata and your reading libraries are exactly where they were.

What formats does Fathom handle?

Whatever your Jellyfin reading libraries contain — books in EPUB and PDF, manga, comics and audiobooks. Fathom does not do its own format detection or conversion; it presents what Jellyfin has already catalogued, which means adding support for a format is a Jellyfin question rather than a Fathom one.

How is this different from Kavita or Komga?

Kavita and Komga are complete servers — they scan your disks, hold their own database and metadata, and manage users. Fathom is a client over Jellyfin. If your books already live in Jellyfin next to your films, Fathom avoids running a second server; if they do not, Kavita and Komga are more capable and more mature for reading specifically.

Do I need a separate Jellyfin library for books?

Yes — Fathom reads Jellyfin's reading libraries, so the content has to be catalogued as books, manga or comics rather than sitting in a video library. Set that up in Jellyfin first and Fathom will pick it up with no additional configuration on its side.

Can I configure Fathom without environment variables?

Yes. Start the container with no Jellyfin configuration and Fathom walks you through connecting on first run, storing the result in SQLite at fathom.sqlite under FATHOM_DATA_DIR. Mount that directory if you want the setup to survive a rebuild.