A TV-friendly alternative Jellyfin UI for web, mobile and the living room.
9.0K
A cinematic, TV-friendly way to browse and watch your Jellyfin library.
Aurora UI is an open-source Jellyfin frontend. It keeps Jellyfin as the source of truth and adds a living-room-ready way to browse and watch: a featured home, richer detail views, embedded playback, favorites, genre browsing, and a translation-ready UI. Self-host it, or install Aurora for Jellyfin on Google Play.
Aurora is an independent project and is not affiliated with or endorsed by the Jellyfin project.
Jellyfin's web client is the server console: libraries, metadata, users, and playback in one place. Aurora is a separate frontend built for the people watching.
Keep Jellyfin's web client for administering the server. Open Aurora when you want to watch.
These are the English Google Play phone screenshots shipped in fastlane/metadata/android/en-US/images/phoneScreenshots. Dutch listings are in fastlane/metadata/android/nl-NL/images/phoneScreenshots.
Docker Compose, with the in-app Jellyfin setup:
services:
aurora:
image: getcoral/aurora:latest
ports:
- "3000:3000"
volumes:
- aurora-data:/data
restart: unless-stopped
volumes:
aurora-data:
docker compose up -d
Open http://localhost:3000 and complete the Jellyfin onboarding form once. Aurora persists the connection in /data/aurora.sqlite.
The Jellyfin URL is requested by the Aurora container, so localhost in that form is the container itself. Use a hostname the container can reach: another Compose service name, a LAN address, or host.docker.internal on Docker Desktop.
The same stack with onboarding skipped (the container image is also published as ghcr.io/get-coral/aurora):
services:
aurora:
image: getcoral/aurora:latest
ports:
- "3000:3000"
volumes:
- aurora-data:/data
environment:
JELLYFIN_URL: http://your-jellyfin:8096
JELLYFIN_API_KEY: your_api_key
JELLYFIN_USER_ID: your_user_id
JELLYFIN_USERNAME: your_username
JELLYFIN_PASSWORD: your_password
restart: unless-stopped
volumes:
aurora-data:
JELLYFIN_USER_ID is the Jellyfin user UUID. More on images, the local build, and docker run is in Docker.
My List / favorites workflow backed by Jellyfin favoritesInstall dependencies:
pnpm install
Create your local env file if you want to skip the in-app setup flow during development:
cp .env.example .env
Fill in the Jellyfin settings in .env:
JELLYFIN_URL=http://localhost:8096
JELLYFIN_API_KEY=your_api_key_here
JELLYFIN_USER_ID=your_user_id_here
JELLYFIN_USERNAME=your_username_here
JELLYFIN_PASSWORD=your_password_here
Start the app:
pnpm dev
Open http://localhost:3000.
If you do not provide Jellyfin env vars, Aurora will open a local onboarding screen at /setup and store the connection details in a local SQLite file under ./data/aurora.sqlite.
pnpm dev
pnpm build
pnpm start
pnpm preview
pnpm test
GitHub Actions workflows are included for:
main, version tags, or manual dispatchWorkflow files:
Aurora stores local app configuration in SQLite.
./data/aurora.sqliteAURORA_DATA_DIR=/path/to/dataThis keeps Aurora simple to deploy on a VM or home server because there is no external database requirement.
Aurora uses Jellyfin as the system of record.
JELLYFIN_USER_ID must be the actual Jellyfin user UUID, not the app nameAurora supports multiple profiles for shared households: everyone picks their own Jellyfin user on a profile screen when opening Aurora.
AURORA_MULTI_USER=true in the environment/adminBy default anyone who can reach your Aurora instance can browse and stream the connected library. If your instance is reachable from the internet (or any network you do not fully trust), enable Require sign-in in Settings → Security. Everyone then has to sign in with their own Jellyfin username and password before Aurora serves anything.
AURORA_REQUIRE_LOGIN=true in the environmentAdministration is gated separately and always requires signing in. Even on an open instance, the admin dashboard and the settings that change your Jellyfin connection, users, or security options are only available to a signed-in Jellyfin administrator — "Require sign-in" controls who can browse and stream, not who can administer. The one exception is a brand-new install that is not connected to Jellyfin yet, since there is no account to sign in with until setup completes.
The player has a "Play on TV" button that opens the browser's own device picker — AirPlay in Safari and on iOS, Cast in Chrome. It only appears once a receiver has been discovered, so give it a second or two on first load.
A TV doesn't play the video through your browser: it's handed the stream URL and fetches it itself. That has a few consequences worth knowing:
http://localhost:3000 cannot work — serve Aurora on a hostname or IP the receiver can also reach.With Require sign-in on, stream URLs are signed with a token so the TV can fetch them without your session cookie. Each token covers a single title, expires within six hours, and stops working the moment you sign out. Aurora generates the signing secret on first use; set AURORA_STREAM_TOKEN_SECRET only if you run several replicas behind a load balancer.
Translations live in dedicated locale files so contributors can add languages without touching the runtime logic.
Files:
To add a new language:
src/lib/i18n/messages/en.ts to a new file such as fr.tssrc/lib/i18n/messages/index.tsAurora ships with a production Dockerfile and can be deployed to a VM with Docker or Docker Compose. The copy-paste Compose files are in Quick start.
Build locally:
docker build -t aurora .
Run locally with the onboarding flow:
docker run --rm -p 3000:3000 \
-v aurora-data:/data \
getcoral/aurora:latest
Then open http://localhost:3000 and complete the Jellyfin onboarding form once. Aurora will persist the connection in /data/aurora.sqlite.
If you prefer skipping onboarding, you can still pass the Jellyfin env vars directly:
docker run --rm -p 3000:3000 \
-v aurora-data:/data \
-e JELLYFIN_URL=http://your-jellyfin:8096 \
-e JELLYFIN_API_KEY=your_api_key \
-e JELLYFIN_USER_ID=your_user_id \
-e JELLYFIN_USERNAME=your_username \
-e JELLYFIN_PASSWORD=your_password \
getcoral/aurora:latest
The container listens on port 3000 and stores local config in /data.
Aurora now supports a real local Capacitor build for Android and iOS.
How it works:
dist/client.dist/client/index.html, which Capacitor requires.pnpm cap:sync, pnpm cap:copy, and pnpm cap:run:* build Aurora first and then sync the native projects.The Capacitor config lives in capacitor.config.ts.
Sync the latest web assets into Android and iOS:
pnpm cap:sync
Open the native projects:
pnpm cap:open:android
pnpm cap:open:ios
Run directly to a connected device or emulator:
pnpm cap:run:android
pnpm cap:run:ios
Build the Android debug app without launching a device target:
pnpm android:assemble:debug
On first launch in the native app:
/setup flow.Aurora stores that configuration on the device.
AURORA_APP_URL before syncing.Example hosted override:
AURORA_APP_URL=https://your-aurora-domain.example pnpm cap:sync
The Play Store bundle is signed with an upload key that never goes in the repo. Copy android/keystore.properties.example to android/keystore.properties and point it at your keystore, or set the AURORA_UPLOAD_STORE_FILE, AURORA_UPLOAD_STORE_PASSWORD, AURORA_UPLOAD_KEY_ALIAS and AURORA_UPLOAD_KEY_PASSWORD environment variables. Then build the bundle:
pnpm android:bundle:release
The signed bundle is written to android/app/build/outputs/bundle/release/app-release.aab. Without a keystore the release build is left unsigned.
The version comes from package.json. The versionCode is major * 1000000 + minor * 10000 + patch * 100 + build, so 1.14.1 becomes 1140100. To upload the same version again, raise the build number with AURORA_BUILD_NUMBER (0–99), for example AURORA_BUILD_NUMBER=1 pnpm android:bundle:release.
Store listing texts, release notes, the icon, the feature graphic and phone screenshots live in fastlane/metadata/android. The privacy policy is in docs/privacy-policy.md and is published at https://getcoral.dev/apps/aurora/privacy.
The public Android app is Aurora for Jellyfin (dev.getcoral.aurora).
pnpm android:bundle:release (see above). Android Studio is still useful for running and debugging.pnpm cap:run:android resolves JAVA_HOME automatically on macOS and prefers the Homebrew JDK 21 path when present, then falls back to system JDK 21 or 17.pnpm cap:sync and pnpm android:assemble:debug.Published images go to:
getcoral/aurora on Docker Hubghcr.io/get-coral/aurora on GHCRIssues and pull requests are welcome.
If you want to contribute:
pnpm buildIf Aurora helps you or you want to support ongoing work, you can sponsor the project here:
Aurora UI is released under the MIT License.
Content type
Image
Digest
sha256:03324a5bb…
Size
121.2 MB
Last updated
11 days ago
docker pull getcoral/aurora