Jellystat
Statistics and analytics dashboard for Jellyfin
Jellystat is a self-hosted statistics application for Jellyfin servers, similar to Tautulli for Plex. It tracks watch history, popular content, and user activity in a clean dashboard.
Key features
- Watch history tracking
- Popular content stats
- User activity dashboard
- Library statistics
Pros & cons
Strengths
- Fills a Tautulli-style gap for Jellyfin
- Simple deployment
Trade-offs
- Requires PostgreSQL
- Jellyfin only
Jellystat replaces
Last reviewed Sep 13, 2026 · 876 words
Jellystat is the Tautulli that Jellyfin never shipped, and the price of admission is one PostgreSQL container. If you moved from Plex and miss knowing who watched what, which shows are dead weight on the disk, and whether anyone besides you actually uses the server, this is the answer. It is a 2023 project at 2,466 stars, MIT licensed, and easy to run. It is also Jellyfin-only, which is the whole point.
What you get that Jellyfin's own dashboard does not
Jellyfin's admin page shows you active sessions and a library count. Jellystat polls the Jellyfin API on a schedule, writes every playback event into its own database, and turns that into per-user watch history, most-played titles by day, week and month, library size trends, and a "who's watching right now" panel that survives a browser refresh. The library statistics view is the one I use most: sort a 4 TB TV library by last-played date and the shows nobody has touched in 2 years are your next 400 GB of free space.
The closest alternative is Jellyfin's official Playback Reporting plugin. It records the same events but presents them as a few charts inside the admin UI. Jellystat can import that plugin's history at first run, so the two are not either-or: leave Playback Reporting enabled, install Jellystat, and import the backlog so your graphs start with months of data rather than an empty screen.
The PostgreSQL requirement is the only real setup cost
Jellystat needs PostgreSQL. Not SQLite, not MySQL. If you are already running a Postgres instance for Immich or Nextcloud you can add a database there; otherwise it is a second container in the same compose file, which is what most people do:
services:
jellystat-db:
image: postgres:16-alpine
environment:
POSTGRES_USER: jellystat
POSTGRES_PASSWORD: change-me
volumes:
- ./pgdata:/var/lib/postgresql/data
restart: unless-stopped
jellystat:
image: cyfershepard/jellystat:latest
environment:
POSTGRES_USER: jellystat
POSTGRES_PASSWORD: change-me
POSTGRES_IP: jellystat-db
POSTGRES_PORT: 5432
JWT_SECRET: a-long-random-string
ports:
- "3000:3000"
volumes:
- ./backup-data:/app/backend/backup-data
restart: unless-stopped
Generate JWT_SECRET with openssl rand -hex 32 and never reuse it; it signs the Jellystat login sessions. The catalogue's 512 MB minimum is right for the pair: Jellystat itself idles at roughly 100 MB and Postgres takes the rest. On first visit at port 3000 you create an admin account, then paste your Jellyfin URL and an API key generated under Dashboard, API Keys in Jellyfin.
Polling, not webhooks, so expect a short lag
Jellystat asks Jellyfin for sessions every few seconds and syncs library metadata on a longer interval. In practice a play shows up within about 10 seconds and a new library item within the next scheduled sync. The sync interval is adjustable in Settings, and the default is fine for a household. Where it matters is metadata: if you rename or re-scrape a series in Jellyfin, Jellystat's copy updates on its next sync, so do not panic when a title looks stale for a few minutes.
One gotcha with multiple libraries: the sync task does a full library walk, and on a 50,000-item music library the first pass can take a while and push Postgres CPU for the duration. It is a one-time cost. After that the walks are incremental.
Back up the Jellystat database or lose the history
The entire value of this app is the accumulated history, and it lives in that Postgres volume. Jellystat has a built-in backup in Settings that writes a JSON dump into the backup-data path I mounted above, and it can run on a schedule. Keep that directory in your normal backup job. The Jellyfin server itself is not affected by anything Jellystat does; the API key is read-only in effect, so a bad Jellystat day cannot damage your media library.
If you are reading this as part of a fresh Jellyfin build, do the server first with the complete Jellyfin setup and add stats a week later, once there is something to graph.
When it's overkill
A single-user server with one library does not need this. Playback Reporting answers "what did I watch last month" adequately, and you save a Postgres container. Jellystat earns its place at 3 or more users, or when you are curating a library for space and want the last-played data to be reliable. Plex users should stay on Tautulli; it has years of maturity, notifications, and newsletter features that Jellystat is still growing into.
What I'd do
Run it if your Jellyfin server has other people on it. Put Jellystat and its own Postgres in one compose file, import Playback Reporting history on day one, schedule the built-in JSON backup weekly and include the folder in your restic job. Reverse-proxy it behind the same auth as the rest of your media server stack rather than exposing port 3000 directly, since the login form is the only thing between the internet and your household's viewing habits. Then check it monthly, prune what nobody watches, and enjoy the disk space.
Similar media servers apps
Jellyfin
Media ServersFree software media system for streaming your library
Replaces Plex, Emby
qBittorrent
Media ServersBittorrent client that aims to be a good alternative to all other
Replaces µTorrent
SRS
Media ServersA simple, high efficiency and real-time video server, supports RTMP,
Navidrome
Media ServersModern music streaming server for your collection
Replaces Spotify
Kodi
Media ServersOpen-source home theater and media center
Replaces Plex
Koel
Media ServersPersonal music streaming server with an elegant interface
Replaces Spotify