Skip to content

Marquee

Marquee turns a spare TV, tablet or wall panel into an always-on display for a Jellyfin server. It runs as one Docker container, polls Jellyfin over its HTTP API, and shows what is playing right now, who is watching, and what was recently added. There are no controls — it is a screen, not an app.

  • A running Jellyfin server reachable from the container
  • A Jellyfin API key and the user’s UUID (not their username)
  • Node.js 24 LTS if you are running from source. Node 22.5 is the hard floor — Marquee uses the built-in node:sqlite module, which does not exist on Node 18 or 20.
Terminal window
docker run -d \
--name marquee \
-p 3000:3000 \
-v ./marquee-data:/data \
-e MARQUEE_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/marquee:latest

Then point the display’s browser at http://<host>:3000 and leave it there.

You can skip every JELLYFIN_* variable and configure Marquee at /setup instead — it 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.

Marquee exposes /healthz, which returns non-200 until the server is ready.

Verified against marquee/.env.example and marquee/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
MARQUEE_DATA_DIRNo./dataWhere the SQLite database lives
HOSTNo0.0.0.0Interface the server binds to
PORTNo3000Port the server listens on

Nothing is strictly required: with no Jellyfin variables set, Marquee redirects to /setup on first run.

Marquee keeps its Jellyfin connection and settings in a SQLite database under MARQUEE_DATA_DIR (/data in the image, ./data from source). Mount it if you do not want to redo setup on every container replacement.

Terminal window
git clone https://github.com/Get-Coral/marquee.git
cd marquee
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