Note
Part of Flowfin. It works with any Jellyfin server, and with the Flowfin clients.
Status: In-Development, the first rung of the maturity ladder (In-Development, Alpha, Beta, Release Candidate, Full Release). It is installed by adding this project's own repository to Jellyfin, see Installing.
Playback statistics for a Jellyfin server, recorded by the server itself and kept private to the person they are about.
The server records one row per finished play into a SQLite file of its own: what was played, when, from which client and device, how much was watched, whether it reached the end, and whether the server had to transcode and why. Nothing leaves the server.
A signed-in person reads their own figures, their own year and their own consent, and deletes their own history. An administrator reads the server-wide reports, which name nobody. The one exception is the server's year in review, where an account is named only if that account itself recorded its agreement to be named. No route hands one account another account's rows, and an administrator is refused there like anybody else.
Today those answers are served over the server's API and no statistics page is drawn in the dashboard. The views are built and are not shown yet: the dashboard translates a plugin page before it inserts it, which breaks the code the views are written in, so the plugin declares its settings page and nothing else until it serves that code itself. That is release 0.2.0.0, issues #335 and #336, and the page a person opens about themselves is #337.
- Not a recap application that wants a key over the whole server.
- No custom query endpoint. Every request chooses from a closed set of shapes.
- No call to anything outside the server. No network address, no user agent and no library file path is stored.
- No elevated route to one person's history. An administrator cannot read, and cannot record, what an account said about being named.
Distribution is through Flowfin's own plugin manifest rather than the official catalogue. Add one address under Dashboard > Plugins > Repositories:
https://flowfin.dev/manifest.json
Then find Playback Statistics under Dashboard > Plugins > Catalog, install it, and restart Jellyfin. One manifest carries every Flowfin plugin, so a server that has the address for one of them already has it for this one.
Two server lines are served from that one address, and the server takes the
archive matching the line it is on: Jellyfin 10.11 on .NET 9, whose version
stream starts at 0.1.0.0, and Jellyfin 12.0 on .NET 10, whose stream
starts at 1.0.0.0. The leading number says which server line a release is
for and not how finished the plugin is. The 12.0 line has published nothing
yet.
Upgrading, uninstalling and what removing the plugin deletes are on the Installation wiki page.
The settings page is at Dashboard > Plugins > Playback Statistics: whether plays are recorded at all, which accounts and item types are left out, how long a raw play row and how long a daily aggregate are kept, the zone a day is counted in, and two caps on what a report may ask for. The two retention windows delete rather than hide, and one of the two deletions cannot be undone. The Configuration wiki page says what each setting accepts and what changing it does not do.
Full documentation is in the Wiki:
- Installation, Pages, Configuration, Troubleshooting.
- What is stored and who can read it, Privacy, consent and deletion, Transcode reasons.
- Support matrix and releases, Release process, Changelog.
The checked detail stays in this repository, because the test suite reads it: configuration, what is stored, the support matrix, transcode reasons, where the data lives, what the log contains.
Statistics respect each user's privacy: personal detail is readable only by the account it is about, server-wide answers name nobody, and an account appears by name in the server's year in review only where that account recorded its own agreement. The server log carries identifiers and never a user name or an item title, and the store deliberately holds no network address, no user agent and no file path.
Found a vulnerability? Please report it privately through GitHub's "Report a vulnerability", not the public issue tracker. SECURITY.md says what is in scope and what is not.
Issues and pull requests are welcome. Building needs the .NET SDK for the line you are building against, .NET 9 for Jellyfin 10.11 and .NET 10 for Jellyfin 12.0, and the test suite runs on both, so the .NET 10 SDK is what a full run takes. Node 24 runs the page module suite.
dotnet build
dotnet test
npm test
GPL-3.0-or-later, in LICENSE. Jellyfin's own libraries are GPLv3, so a plugin linked against them is GPLv3 once compiled. See NOTICE.md for the intended-use notice.
