Aurora

In Progressv1.14.0

AuroraHigh-end cinematic Jellyfin frontend

Aurora is a free, open-source alternative web client for Jellyfin. It runs as a single Docker container alongside your existing server, reads your libraries over the Jellyfin API, and gives you a full-bleed, big-screen interface with rails, rich detail pages and playback that reports progress back to Jellyfin.

Features

What Aurora does

  • Featured, continue-watching, favorites, and recommendation rails

  • Embedded playback with progress sync back to Jellyfin

  • Rich movie and series detail views with cast and related titles

  • Genre browsing, pagination, and local-first onboarding with SQLite

  • Multi-user profiles with optional required sign-in, so playback and watch progress are attributed to each Jellyfin account

Audience

Who Aurora is for

  • Living room playback
  • Modern Jellyfin browsing
  • Shared household installs

Requirements

  • A running Jellyfin server and an API key from Dashboard → API Keys

  • Docker, or Node.js 22.5+ if you run it from source

  • Around 300 MB of disk for the image and its SQLite database

Install with Docker Compose

Aurora ships as a single container that listens on port 3000. This service definition assumes Jellyfin is on the same Compose network under the hostname jellyfin:

services:
  aurora:
    image: getcoral/aurora:latest
    restart: unless-stopped
    depends_on: [jellyfin]
    ports:
      - "3000:3000"
    environment:
      AURORA_DATA_DIR: /data
      JELLYFIN_URL: http://jellyfin:8096
      JELLYFIN_API_KEY: ${JELLYFIN_API_KEY}
      JELLYFIN_USER_ID: ${JELLYFIN_USER_ID}
      JELLYFIN_USERNAME: ${JELLYFIN_USERNAME}
      JELLYFIN_PASSWORD: ${JELLYFIN_PASSWORD}
    volumes:
      - ./aurora-data:/data
    networks: [coral]
    healthcheck:
      test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:3000/healthz').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 20s

JELLYFIN_USER_ID is the user’s UUID, not their username — you can read it out of the URL when you open that user in the Jellyfin dashboard. The API key alone is enough to browse the library; adding the username and password is what lets Aurora open a real playback session so watch progress syncs back.

If you would rather not put anything in a .env file, every one of those variables is optional. Start the container with no configuration at all and Aurora will walk you through connecting to Jellyfin on first run, storing the result in /data/aurora.sqlite:

docker run -d -p 3000:3000 -v aurora-data:/data getcoral/aurora:latest

For the full stack — Jellyfin, Aurora, Tide and Librarian in one file — see the Jellyfin Docker Compose stack guide.

How Aurora fits alongside Jellyfin

Aurora deliberately does not own any state that Jellyfin already owns. It has no user database, no separate watch history and no second metadata store. Everything it displays is fetched from the Jellyfin API at request time, and everything you do in it — marking a favorite, resuming an episode, finishing a film — is written straight back.

The practical consequence is that Aurora is safe to try and safe to delete. It sits beside the official web client rather than replacing it, so you can run both on different ports and let people in the house pick. If you decide Aurora is not for you, stopping the container leaves no trace on the server.

The one piece of state Aurora does keep is its own: the Jellyfin connection details, and any UI preferences, in a SQLite file under AURORA_DATA_DIR. Mount that directory if you want the setup to survive a container rebuild.

Aurora vs the default Jellyfin web client

The stock Jellyfin web interface is built to be a complete administrative surface. It exposes the dashboard, library management, user settings, plugin configuration and playback in one app, and the design reflects that breadth. Aurora makes the opposite trade: it is a consumption client only. There is no dashboard, no library editing and no server administration in it at all — for those you open Jellyfin.

What you get in exchange is a browsing experience built for a sofa and a large screen: full-bleed backdrops, rails for continue-watching and recommendations, detail pages with cast and related titles, and transitions that hold up on a TV browser. If what bothers you about Jellyfin is the interface rather than the server, that is precisely the part Aurora replaces.

The honest counterpoint: the official client is feature-complete, has years of bug reports behind it, and supports Live TV, SyncPlay and the full plugin surface. Aurora is marked In Progress for a reason, and it covers the browse-and-play path rather than every corner of Jellyfin. Running both costs one extra container.

A fuller breakdown lives in Aurora vs the Jellyfin web client.

Configuring Aurora

The full reference lives in the Aurora documentation.

VariablePurpose
JELLYFIN_URLYour Jellyfin server URL, for example http://jellyfin:8096 inside a Compose network.
JELLYFIN_API_KEYA Jellyfin API key. Generate one under Dashboard → API Keys.
JELLYFIN_USER_IDThe UUID of the primary Jellyfin user — not their username.
JELLYFIN_USERNAMEUsed together with JELLYFIN_PASSWORD to open a real playback session when sign-in is not required.
JELLYFIN_PASSWORDPassword for the playback session user.
AURORA_REQUIRE_LOGINSet to true to force required sign-in and lock the in-app toggle.
AURORA_MULTI_USERSet to true to force multi-user profiles and lock the in-app toggle.
AURORA_DATA_DIRWhere the local SQLite database lives. Defaults to ./data.

Aurora — frequently asked questions

Does Aurora replace Jellyfin?

No. Aurora is a client, not a server. Your Jellyfin server keeps doing the scanning, transcoding, user management and metadata work, and remains the source of truth. Aurora talks to it over the public Jellyfin HTTP API and stores nothing except its own connection details. Remove Aurora and your library is untouched.

Do I need to install a Jellyfin plugin to use Aurora?

No. Aurora needs nothing installed inside Jellyfin — no plugin, no server-side patch, no theme. It authenticates with a standard API key you generate from the Jellyfin dashboard, which means it also works against a Jellyfin instance you do not administer, as long as you have a key.

Does watch progress sync back to Jellyfin?

Yes. Aurora opens a real Jellyfin playback session rather than streaming files behind Jellyfin's back, so resume points, played state and watch history are written back to your server. Progress you make in Aurora shows up in the official apps, and vice versa.

Can several people in one household use Aurora?

Yes. Set AURORA_MULTI_USER to true for per-profile browsing, and AURORA_REQUIRE_LOGIN to true if you want everyone to sign in with their own Jellyfin account. With required sign-in on, playback and watch progress are attributed to the right person instead of a single shared session user.

Can I pin Aurora to a specific version?

Not yet. Docker Hub currently publishes only latest and main for getcoral/aurora, so :latest is the only usable tag even though tagged GitHub releases exist. If you want reproducible deploys today, pin by digest with getcoral/aurora@sha256:… rather than by tag.

Does Aurora work with Jellyfin 12?

Jellyfin 12 removed three authentication mechanisms that older versions of the shared @get-coral/jellyfin client relied on. Versions after 1.9.0 of that client handle both Jellyfin 10.x and 12.x. If you are on Jellyfin 12 and see 401 responses, pull a fresh Aurora image before anything else.