Skip to content

← Writing

engineering

Building Graveyard Analytics: Managing My Jellyfin Server's Afterlife

· Jerwin Arnado

Like most data hoarders, my Jellyfin library only ever grows. Movies and shows get added, a few get watched, and the rest just sit there — quietly eating terabytes on my NAS. I kept asking the same questions: what is anyone actually watching? And what has never been played, not even once?

Jellyfin couldn’t really answer that out of the box. So I built Graveyard Analytics — a real-time dashboard and server-management plugin for Jellyfin 10.11+ that identifies lifeless media, tracks active users, highlights server bottlenecks, and lets you permanently exorcise dead weight from your hard drives.

And yes, I leaned all the way into the theme.

The four pillars

The plugin lives in your Jellyfin Dashboard and is split into four sections:

🪦 The Morgue — unwatched media

The Morgue scans the entire library and isolates every movie and show with zero plays. It shows exactly how much storage is being wasted by stagnant media, sortable by size, type, or title. Found something hopeless? Click Condemn to send it to The Chapel for final review.

⛪ The Sanctuary — living media

The opposite view: only the media your users actually engage with. It sorts dynamically by Vitality (total plays) and Reach (unique users), and shows the total time users have spent watching each item. It’s surprisingly motivating to see what’s earning its disk space.

🕯️ The Chapel — condemned items

The waiting room for the afterlife. Condemned items get tagged [Chapel] and — my favorite feature — are automatically added to a public “Leaving Soon” collection visible to everyone on the server. Your users get one last chance to watch before it’s gone.

From here you have two options:

  • Pardon — forgive the media and send it back to the library.
  • Exorcise — last rites. This permanently deletes the files from disk and removes them from Jellyfin.

👻 The Guestbook — user analytics

A complete séance into your server’s traffic. Every playback session is logged, down to 1-second false starts, with timeframe filtering up to 12 weeks back. Three details I’m proud of:

  • Resource Vampires — any session that triggers a transcode gets highlighted in aggressive red, so you can spot server bottlenecks instantly.
  • The Binge List — a leaderboard of your top 3 most active users.
  • The Ghosts — users who haven’t watched a single second in the selected timeframe.

How it works

Graveyard Analytics doesn’t reinvent playback tracking. It reads directly from the SQLite database of the official Playback Reporting plugin — which is therefore a hard requirement — and builds its metrics on top of that data in real time. The plugin itself is C# on .NET 9, targeting Jellyfin 10.11.0+.

Building from source is a one-liner if you have the .NET 9 SDK:

dotnet publish -c Release

Drop the resulting .dll files into your Jellyfin plugins directory and restart.

On AI-assisted development

I’ll be transparent, because I think more open-source maintainers should be: I used AI assistance for parts of the C# backend — specifically code optimization, logic refinement, and resolving .NET 9 compatibility warnings. All architectural decisions, the thematic design, and final integrations are mine, and every line has been manually reviewed and tested against Jellyfin 10.11+. AI is a tool in my workflow, not the author.

Try it

Add the repository in your Jellyfin Dashboard under Plugins → Repositories:

https://raw.githubusercontent.com/jackwander/jellyfin-graveyard-analytics/master/manifest.json

Then install Graveyard Analytics from the Catalog (under Analytics) and restart your server. Make sure Playback Reporting is installed first.

The project is MIT-licensed and open to issues and PRs on GitHub. If it helps you reclaim a few terabytes, consider supporting my work on Ko-fi.

Stop guessing what your users are watching, and start reclaiming your storage space.