Skip to content

Fathom

Fathom is a reading interface for books, manga, comics and PDFs that already live in Jellyfin. It runs as one Docker container, reads your reading libraries over the Jellyfin API, and presents them cover-first rather than as rows of filenames.

  • A running Jellyfin server with at least one book, comic or mixed library
  • A Jellyfin API key and the user’s UUID (not their username)
  • Node.js 24 LTS from source. Node 22.5 is the hard floor — Fathom uses the built-in node:sqlite module, which does not exist on Node 18 or 20.
Terminal window
docker run -d \
--name fathom \
-p 3000:3000 \
-v ./fathom-data:/data \
-e FATHOM_DATA_DIR=/data \
-e JELLYFIN_URL=http://your-server:8096 \
-e JELLYFIN_API_KEY=your-api-key \
-e JELLYFIN_USER_ID=your-user-uuid \
getcoral/fathom:latest

Fathom serves on port 3000 and exposes /healthz.

Every JELLYFIN_* variable is optional. With none set, Fathom sends you to /setup on first run and stores the connection in its own SQLite database. The environment variables exist so an operator who configures everything through compose never has to open the UI; /setup still lets you override them locally.

Verified against fathom/.env.example and fathom/src.

VariableRequiredDefaultPurpose
JELLYFIN_URLNo—Jellyfin base URL. Must resolve from inside the container
JELLYFIN_API_KEYNo—API key from Dashboard → API Keys
JELLYFIN_USER_IDNo—The user’s UUID, not their username
JELLYFIN_USERNAMENo—Optional. Opens a real playback session
JELLYFIN_PASSWORDNo—Optional, paired with JELLYFIN_USERNAME
FATHOM_DATA_DIRNo./dataWhere fathom.sqlite lives
HOSTNo0.0.0.0Interface the server binds to
PORTNo3000Port the server listens on

Fathom keeps its Jellyfin connection and local overrides in a SQLite database at ./data/fathom.sqlite, or under FATHOM_DATA_DIR if you set it. In the published image that is /data — mount it, or you will redo setup on every container replacement.

Fathom reads whatever Jellyfin already exposes as a book or mixed-content library. It does not scan the filesystem itself and does not write to your media, so how you organise files on disk is entirely Jellyfin’s business.

Terminal window
git clone https://github.com/Get-Coral/fathom.git
cd fathom
pnpm install
cp .env.example .env
pnpm dev
ScriptPurpose
pnpm devDev server on :3000
pnpm buildProduction build
pnpm startRun the production server (node server.mjs)
pnpm typecheckTypeScript check
pnpm checkBiome lint + format check
pnpm testVitest

pnpm start is the production entrypoint and is what the Docker image runs. pnpm preview serves the Vite build and is for local inspection only.