Jellytics is a self-hosted Jellyfin web based application that shows statistics about Jellyfin.
4.9K
██╗███████╗██╗ ██╗ ██╗ ██╗████████╗██╗ ██████╗███████╗
██║██╔════╝██║ ██║ ╚██╗ ██╔╝╚══██╔══╝██║██╔════╝██╔════╝
██║█████╗ ██║ ██║ ╚████╔╝ ██║ ██║██║ ███████╗
██ ██║██╔══╝ ██║ ██║ ╚██╔╝ ██║ ██║██║ ╚════██║
╚█████╔╝███████╗███████╗███████╗██║ ██║ ██║╚██████╗███████║
╚════╝ ╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝
Jellytics connects to your Jellyfin server and gives you a beautiful dashboard for everything you watch. Track your habits. Rate what you love. Build watchlists. See what the whole household is watching, all in one place, all self-hosted, all yours.
Everything you wish Jellyfin tracked, but didn't.
🗓️ Watch Statistics: Daily snapshots of your viewing habits broken down by genre, time, and content type. See exactly how much of your life you've given to television.
📜 Full Watch History: Every single thing you've ever watched, timestamped and searchable. No more "wait, did I already watch that?"
⭐ Ratings & Reviews: Score anything out of 10 and write personal notes or a full review. Your opinions, stored forever.
🔖 Watchlist: Save what you want to watch next. Never lose a recommendation again.
🗂️ Custom Collections: Group your media however your brain works, by franchise, director, mood, genre, or anything else.
🏷️ Tags: Create your own colored labels and slap them on anything. Your library, your rules.
🤖 Recommendations: Personalized suggestions based on what you actually watch, not what an algorithm thinks you should.
📡 Live Sessions: See what's playing right now across every screen in your home, in real time.
👨👩👧👦 Multi-User: Every Jellyfin account in your household gets their own private profile, stats, watchlist, and preferences. Completely separate.
📦 Archive: Done with a series forever? Archive it to keep things tidy without losing any data.
🔔 Notifications: In-app alerts for sync events and household activity.
You need two things:
Drop this into a new file called docker-compose.yml:
services:
jellytics:
image: icmppp/jellytics:latest
container_name: jellytics
restart: unless-stopped
ports:
- "80:3000"
volumes:
- jellytics-data:/app/data
environment:
- JELLYTICS_DATABASE_PATH=/app/data/jellytics.db
# 👇 Keeps sessions alive across restarts. Generate with: openssl rand -base64 32
# - JWT_SECRET=your_secret_here
volumes:
jellytics-data:
docker compose up -d
Head to http://your-server-ip in your browser. A quick setup wizard will walk you through connecting your Jellyfin server. Just enter your Jellyfin URL, username, and password. Done. Your library starts syncing automatically. 🎉
Most people won't need to touch a thing. But here's what's worth knowing about:
Jellytics uses port 80 by default. Change the left number to whatever you want:
ports:
- "8096:3000" # → now at http://your-server:8096
Without this set, everyone gets logged out whenever the container restarts. Generate a secret once:
openssl rand -base64 32
Then add it to environment in your compose file:
- JWT_SECRET=paste_your_generated_secret_here
- JELLYTICS_SYNC_INTERVAL_SECONDS=300 # every 5 minutes (this is the default)
Running a reverse proxy in front? Lock Jellytics to local access only:
ports:
- "127.0.0.1:3000:3000"
Want to access Jellytics at jellytics.yourdomain.com? Point your reverse proxy at port 3000.
server {
listen 80;
server_name jellytics.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
jellytics.yourdomain.com {
reverse_proxy localhost:3000
}
labels:
- "traefik.http.routers.jellytics.rule=Host(`jellytics.yourdomain.com`)"
- "traefik.http.services.jellytics.loadbalancer.server.port=3000"
All of your stats, reviews, ratings, and watchlists live in a Docker volume called jellytics-data. Back it up. You'll thank yourself later.
Back up:
docker cp jellytics:/app/data ./jellytics-backup
Restore:
docker cp ./jellytics-backup jellytics:/app/data
docker compose restart
💡 The backup includes both your database and your cached artwork. Keep both together to avoid re-downloading all your posters on restore.
docker compose pull && docker compose up -d
Your data stays exactly where it is. Migrations run automatically. ✅
Make sure your Jellyfin URL is correct and reachable from the machine running Jellytics. Use the local IP address (e.g. http://192.168.1.10:8096) rather than localhost if they're on different machines.
Check the logs for clues:
docker compose logs -f
You need a permanent JWT_SECRET. See Keep sessions alive above.
Change the port mapping in your compose file. See Change the port above.
Try a restart first:
docker compose restart
Check the container status:
docker compose ps
⚠️ This deletes all your data permanently.
docker compose down -v
docker compose up -d
Prefer to build it yourself? No problem:
git clone https://github.com/icmpp/jellytics.git
cd jellytics
docker compose up -d --build
Got a bug to report or a feature idea? Open an issue on GitHub. Contributions are very welcome.
Made with ❤️ for Jellyfin users, by Jellyfin users.
⭐ Star the repo if Jellytics is useful to you, it helps more than you think!
Content type
Image
Digest
sha256:9bd62439d…
Size
91.7 MB
Last updated
6 months ago
docker pull icmppp/jellytics