A self-hosted dashboard for Jellyfin and Emby: live sessions, watch history, statistics, requests, downloads and the apps around your media server, in one place.
Website · Live demo · Documentation · Discord
- What it is
- Screenshots
- Features
- Integrations
- Quick start
- Configuration
- Updating
- Documentation
- Community and support
- Contributing
- License and credits
JellyGlance connects to your Jellyfin or Emby server and keeps its own PostgreSQL history of what's played, by whom and on what. On top of that it gives you a home dashboard, statistics and recaps, and links to the request, download and *arr apps you already run, so you can see and manage your server without a pile of browser tabs.
It runs as a single Docker container next to PostgreSQL. It's free, with no ads, subscriptions or paid tiers. Try the read-only live demo first if you like (its source is in JellyGlance/Demo).
| Home | Activity |
|---|---|
![]() |
![]() |
| Statistics | Requests |
![]() |
![]() |
| Libraries | Recently added |
![]() |
![]() |
- Jellyfin and Emby. Pick the server type during setup or let JellyGlance detect it. Emby installs can import history from the Playback Reporting plugin, and Jellystat or Tautulli history can be imported too.
- Live sessions. User, device, client, codec, bitrate and progress for everything playing now.
- A home dashboard you arrange. Drag-and-drop sections, visibility toggles, presets, density, themes, kiosk mode and alert rules.
- Statistics and recaps. Top movies, series, libraries, clients and users, watch-time trends, activity heatmaps, and weekly, monthly and yearly recaps with shareable cards.
- Activity history and libraries. Full playback history, library views and recently added shelves grouped by library.
- Requests. Search and manage Jellyseerr and Overseerr requests, with availability checks.
- Calendar and downloads. Upcoming releases from the *arr apps and the queues from your download clients.
- Users. Dashboards with favourites, watchlists, Continue Watching and recently watched, and Wizarr invite management.
- Notifications. Webhooks, Discord and Gotify, with delivery history, plus email newsletters.
- Sign-in options. Local JellyGlance accounts, Jellyfin Quick Connect and OIDC, with roles and an admin audit trail.
- Backups. Export and restore from the Backup page, stored in a plain folder you can see.
- Translations. English (US and UK), Català, Čeština, Deutsch, Español, Français, Italiano, Polski and 中文.
Connect these under Settings > Integrations. See the integration directory for setup details.
|
Jellyfin |
Wizarr |
Tdarr |
Maintainerr |
SickChill |
|
Sonarr |
Radarr |
Lidarr |
Bazarr |
Prowlarr |
|
Jellyseerr |
Overseerr |
qBittorrent |
Transmission |
Deluge |
|
SABnzbd |
NZBGet |
Discord |
Gotify |
Create a docker-compose.yml (or start from the one in this repo):
services:
jellyglance-db:
image: postgres:16-alpine
container_name: jellyglance-db
restart: unless-stopped
shm_size: "1gb"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: change-me
POSTGRES_DB: jellyglance
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready --dbname=jellyglance --username=postgres"]
interval: 10s
timeout: 5s
retries: 5
jellyglance:
image: ghcr.io/jellyglance/server:latest
container_name: jellyglance
restart: unless-stopped
depends_on:
jellyglance-db:
condition: service_healthy
ports:
- "3000:3000"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: change-me
POSTGRES_IP: jellyglance-db
POSTGRES_PORT: 5432
POSTGRES_DB: jellyglance
JWT_SECRET: replace-me-with-a-long-random-secret
TZ: Europe/London
CONFIG_DIR: /app/config
BACKUP_DIR: /app/backups
volumes:
- ./config:/app/config
- ./backups:/app/backups
volumes:
postgres-data:Start it with Docker Compose v2 (docker compose, with a space):
docker compose up -dThen open http://localhost:3000 and follow the setup:
- Enter your Jellyfin or Emby server address, for example
http://192.168.1.10:8096. - Add an API key from your media server's dashboard.
- Choose how you sign in to JellyGlance and create the admin account.
- Let the first sync run.
Start PostgreSQL first, then:
docker run -d --name jellyglance --restart unless-stopped \
-p 3000:3000 \
-v ./config:/app/config \
-v ./backups:/app/backups \
-e POSTGRES_IP=jellyglance-db -e POSTGRES_PORT=5432 \
-e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=change-me -e POSTGRES_DB=jellyglance \
-e JWT_SECRET=replace-me-with-a-long-random-secret \
ghcr.io/jellyglance/server:latestThe container must be able to reach PostgreSQL by POSTGRES_IP, for example on the same Docker network.
Scripts in packaging/ set it up in an unprivileged Debian LXC on Proxmox VE, either by creating the container from the host (create-lxc.sh) or inside an existing one:
curl -fsSL https://raw.githubusercontent.com/JellyGlance/Server/main/packaging/proxmox/install-in-lxc.sh | bashUnraid Community Applications templates and a Compose file are in packaging/unraid.
| Host path | Container path | Used for |
|---|---|---|
./config |
/app/config |
Runtime config and local app files |
./backups |
/app/backups |
Backup exports and restore uploads |
postgres-data |
PostgreSQL data volume | The database |
To restore a backup, put the JSON file in ./backups or upload it from the Backup page.
These are the main environment variables. The full list is in the configuration reference.
| Variable | Default | What it does |
|---|---|---|
POSTGRES_IP |
PostgreSQL host | |
POSTGRES_PORT |
PostgreSQL port, usually 5432 |
|
POSTGRES_USER |
postgres |
PostgreSQL user |
POSTGRES_PASSWORD |
PostgreSQL password | |
POSTGRES_DB |
Database name | |
POSTGRES_SSL_ENABLED |
false |
Connect to PostgreSQL over TLS |
JWT_SECRET |
Required. Signs sign-in tokens and, unless INTEGRATION_SECRET_KEY is set, encrypts saved integration secrets. Keep it the same across updates. |
|
INTEGRATION_SECRET_KEY |
JWT_SECRET |
Separate key for encrypting integration secrets |
TZ |
Time zone, for example Europe/London |
|
JS_PORT |
3000 |
Port inside the container (PORT also works) |
JS_LISTEN_IP |
0.0.0.0 |
Address to listen on |
JS_BASE_URL |
Serve under a subpath, for example /jellyglance |
|
JS_PUBLIC_URL |
Public address of JellyGlance, used in notification links | |
JF_HOST |
Jellyfin or Emby address. With JF_API_KEY, it skips the server step of setup and overrides the saved address. A trailing / is ignored. |
|
JF_API_KEY |
API key for that server | |
JF_SERVER_TYPE |
detected | jellyfin or emby |
JS_USER, JS_PASSWORD |
Create the first local admin account without the setup screen | |
REJECT_SELF_SIGNED_CERTIFICATES |
true |
Set to false to allow self-signed HTTPS on your media server and apps |
JF_USE_WEBSOCKETS |
true |
Set to false to poll for sessions instead of using WebSockets |
JS_GEOLITE_ACCOUNT_ID, JS_GEOLITE_LICENSE_KEY |
Optional MaxMind GeoLite credentials to show where client IPs are | |
GITHUB_TOKEN |
Optional token for the update check and the About page, to avoid GitHub rate limits | |
CONFIG_DIR, BACKUP_DIR |
/app/config, /app/backups |
Where config and backups are stored |
docker compose pull
docker compose up -dSettings, history and your database are kept. What's New in the app shows the changes after each update, and Releases has the full notes.
Guides live in JellyGlance/Documentation:
- Installation and first setup
- Integration directory
- Reverse proxy: Nginx, Caddy, Nginx Proxy Manager and Traefik
- Configuration reference
- Backup and restore
- Troubleshooting
Spotted a docs problem? Open a docs issue.
- Discord: discord.gg/dMGhv8j2kx
- Questions and ideas: GitHub Discussions
- Bugs and feature requests: issues
- Security reports: see SECURITY.md
Contributions are welcome. Read CONTRIBUTING.md first, especially before changing widgets. To work on it locally:
npm ci
npm run dev # API and web app with live reload
npm test # API tests
npm run lint
npm run buildThe website's source is in JellyGlance/Website.
JellyGlance is released under the MIT License. Created by Nerdy-Technician, inspired by Jellystat. Thanks to everyone who has contributed. You're listed on the About page in the app.





