Repository navigation
Releases: finstats/finstats
Releases · finstats/finstats
Release list
finstats 2.2.0
Library health and FinUI
Added
- A menu of your own on a computer: Settings → Appearance offers eight: the sidebar as it was, grouped by what the pages are for, a rail of icons that opens into the sidebar under the pointer, a sidebar that leads with search, a dock, a command bar, pages you pin on top, and coloured tiles. The sidebars can sit on the right. The dock slides away while you scroll down and comes back when you scroll up or point at the bottom of the window; with it the status bar moves to the top.
- A menu of your own on a phone: a tab bar with More (the new default), a sheet that opens half way, the whole screen, the pages fanned around the thumb, or an address bar that grows into the menu. Each searches its pages and hands any other words to search.
- Both are kept by the browser they were chosen in, so a phone and a computer each keep their own; both are FinUI components,
desktop-navandmobile-nav. - A context menu: right-click a title, a person or a library anywhere in finstats (a poster on the dashboard, a row of a list, a name in a table, a film in Coming up that is not in the library yet), or hold a finger on it, or press the menu key, and a menu grows out of the point you pressed: open it, open it in a new tab, put a film or a show on your watchlist, open it in Jellyfin or on TMDB and TVDB, copy its link. Shift with a right-click is still the browser's own. FinUI's
context-menu. - Search without a dialog: search grows out of your menu (a sidebar widens into it, the dock rises into it, the command bar's name turns into it, a phone's menu holds it) or, chosen in Settings → Appearance, takes the page's place while the menu stays. Ctrl+Space opens it as before; the window over everything is gone. FinUI's
search. - Everything in a library: a library's Recently added card offers Everything in it, every film, show or album it holds as posters, by name, year, date added or size, narrowed as you type. More arrive as you scroll.
- Server → Library health: finstats compares every file with its neighbours and lists what stands out, each with the numbers behind it. It only reports; nothing is changed, deleted or rescanned in Jellyfin.
- Gaps: episodes missing between two files of a season ("Season 2: episodes 4 and 5 are missing between 3 and 6"). A file that holds two episodes counts as both; specials and the end of a season are left alone.
- Seasons that differ in resolution, HDR or codec from the rest of their show, and odd episodes: one file unlike its season, such as an SD episode in a 1080p season. Resolution goes by width or height, so a cropped 1920×800 film is 1080p.
- Copies and versions: the same film or episode twice, by the provider ids the watchlist and Pipeline already go by. Two copies in one resolution show the space kept twice; a 4K copy beside a 1080p one is listed as two versions and never counted as waste.
- Thin files: a bitrate far below what its resolution and codec usually take ("4K HEVC at 1.1 Mbps"); a season's thin episodes are one finding.
- Dubs that stop: an audio language some seasons have on every episode and others on none.
- Never identified: films and shows Jellyfin matched with no TMDB, TVDB or IMDb id.
- Dismiss a finding that is fine on purpose, with a note. It comes back by itself when its files change. Those who may manage finstats and see the server can dismiss; dismissals are in the audit log and part of a backup.
- A library's page says how many things there are to look at there, and leads to them.
- FinUI, the components finstats is built from, is a project of its own (
github.com/finstats/finui): every button, card and control in every state and both themes atfinstats.github.io/finui, and FinUI create to change its colours, radius, density and more as you watch and take it home with one command. Settings → System leads there. - Settings → Appearance: everyone chooses how finstats looks to them, by the code of a FinUI preset: base colour, accent, chart colours, contrast, radius, density, borders, cards, buttons, fields, tables, highlight, motion, icons, the menu, the page behind it all, the focus ring, how headings are set, and the fonts for text, headings and numbers. Your choice is yours alone; it shows what the code means and leads to FinUI create to change it.
- Styles: eleven whole looks to start from in one choice in FinUI create, whose code Settings → Appearance takes. They are Washi (finstats as it ships), Studio, Noir, Matinee, Console, Pastille, Ledger, Gazette, Arcade, Canopy and Harbour. finstats itself ships one look and offers no list of styles.
- Icons that move: every icon in a link, a button or a tab does its own move once when pointed at (refresh turns, download's arrow drops into its tray, the trash lifts its lid), and a refresh that was pressed keeps turning until its answer is in. Still with reduced motion, and with Motion: Off.
- Motion, with FinMotion: FinUI's components now move: a switch's knob is thrown across, a tab's underline inches to the next tab, a refused field shakes its head, a copy is ticked in one stroke, notices pile like a hand of cards and fan open when pointed at, a phone's sheet gives like a band when pulled, a sorted table's rows move to their places, a figure that changes rolls like an odometer and charts draw themselves the first time they are seen. All of it follows Settings → Appearance's Motion choice and stays still with reduced motion. FinMotion is its own project (
github.com/finstats/finmotion), put on top of FinUI. - More icons in FinUI: 239 now, up from 71, each with a move of its own (volume up and down, a headset and a deafened one, a pencil that writes, a bell that rings, a phone that buzzes), and every one can be downloaded from FinUI's gallery as an SVG, still or animated.
- Fonts: thirty-four open-licensed families to choose from (Geist, Roboto, Manrope, IBM Plex Sans, Montserrat, Lora, Playfair Display, Fira Code and more), bundled like Inter, never fetched from elsewhere, and loaded only when chosen.
- More bases and accents: Nord, Solarized, Gruvbox, Catppuccin, Rosé Pine, Tokyo Night, Dracula, Everforest and Ocean; sixteen more accents, ten of them one colour by day and another by night. Every base now has a paper of its own by day: the greys looked alike in the light theme.
- Deleting can be undone for 30 days: a deleted play or backup waits in the trash, and Undo on the notice that follows brings it back. Activity and Settings → Backups each list what was recently deleted, with when it goes for good, whenever there is any. A play in the trash is out of every total, chart, recap and profile, and an import or a restore does not bring it back as new; whoever watched it with somebody is counted as alone until it returns.
Changed
- Dark Reader and extensions like it leave finstats' pages alone (
darkreader-lock): finstats draws both themes itself, and a repainted page fought them. - On a phone the menu no longer slides in from the left: the tab bar sits at the bottom unless another is chosen.
- finstats reads your library once after this update, to learn where files that hold several episodes end.
- On a title's page, Add to watchlist is as tall as Open in Jellyfin beside it; it was a size smaller.
- The range and people filters stay at the top of the screen while a page scrolls, so 7d becomes All from the bottom of a long page; so do Pipeline's request and upcoming filters.
- The scroll-to-top button keeps clear of whichever menu holds the bottom of the window: low in the corner beside the dock, just above a phone's tab bar, thumb button or address bar, and above the status bar otherwise. It is FinUI's
to-top. - Deleting a play or a backup moves it to the trash instead of removing it at once (
PUTwith{"deleted": true};DELETEis gone from the API). Backups past the number kept are still removed for good. - Patch notes are one sheet instead of a stack of cards: every note is a line of its own with its kind (Added, Changed, Fixed and the rest) and that kind's icon in a column before it, under a heading for each series. The list of versions stays on the right.
Performance
- Opening finstats downloads only what changed: a stylesheet, script or font the browser already holds is confirmed in a few bytes instead of sent again. Every visit used to fetch all of finstats' stylesheets and modules in full, though each carried a tag to tell them apart.
Stability
- Restoring a backup reads the settings from the settings row alone: a file from a newer finstats that keeps more there had its settings dropped without a word.
- An open tab no longer grows with every page visited: every page that was left stayed in memory behind the one on screen (about 2,600 elements a visit), held by FinMotion's list of what it moves and by the filters bar's scroll listener, until the tab was closed.
- A mistyped command (
finstats bakcup), orrestorewithout its file, no longer creates or upgrades a database before saying it does not know what to do.
Fixed
- A tile's small chart no longer runs past the tile when the number beside it is wide ("56d 23h"), or when four tiles share a narrower row: the chart gives way and the number keeps its width.
- In the light theme a primary button turned violet under the pointer; it keeps the seal's colour now.
- In Settings a switch sits level with its setting's name and help; it hung at the top of the row.
- In a ranked list with nothing under a name, such as the dashboard's Top users, the name sat at the top of its row beside a centred picture; it is centred now.
- A row of stat tiles at a width between phone and desktop (four tiles three across) left the last one alone on a row of its own; four tiles now go four, two or one across, and three go three or one.
- The server read counted a device nobody signed in on, which it ...
finstats 2.1.2
Added
- Import from Tautulli: bring your Plex history over. Upload Tautulli's database backup — the
.db, or the.zipholding it — under Settings → Import; its plays have a place of their own in Activity's Recorded by filter. - A wiring board to say who is who: Plex users on one side, Jellyfin users on the other. Drag a wire from each Plex user to who they are now, or click one and then the other, or use the keyboard. Anybody left unwired is not imported, and two Plex accounts can go into one person.
- Films and episodes are matched to your library by name — a film by its title and year, an episode by its show and number — and one not on your server yet is kept and attached when it arrives. A resumed viewing is one play; music is not imported.
- The backup holds Plex's access tokens: finstats never reads them, and removes the file once you import or start over.
- Unlinked media under Settings → Data: every title from Tautulli, Jellystat or Streamystats that matches nothing in your library, with where it came from and where it most likely is already found. Locate links it from the best guesses or a search — a film can be located as a show's special — and finstats remembers the choice, so the same history imported again links itself. Choices are part of a backup.
Performance
- The recap opens three to five times faster: the year's most watched actors and directors were worked out by rescanning the year once for every person in it. Measured on a real history, a year went from 0.29 s to 0.09 s and the last 12 months from 0.53 s to 0.12 s.
Fixed
- Imported history finds titles that go by another name: a play matches a title's original-language name too, so a show Plex or Tautulli knew as 오징어 게임 attaches to Squid Game, and Im Westen nichts Neues to All Quiet on the Western Front. Your library's original titles are read at its next scan.
- Names are compared the way search compares them — case, accents, punctuation, a year written into the name, a leading "The" — and a release year may be one off, so "Star Wars: Episode I - The Phantom Menace" finds "… – The Phantom Menace" and a 2014 Kingsman finds the 2015 one. A title known by another name altogether is still never guessed at.
- A failed Streamystats import or restore was announced in notifications by its internal name.
- The recap's Share the year as cards button and the viewer rank beside it had no space between them.
docker pull ghcr.io/finstats/finstats:2.1.2finstats 2.1.1
Changed
- The watchlist is offered wherever a title is: on the dashboard's Coming up cards, as in Pipeline → Upcoming, and on an episode's or a season's page, which puts its show on the list.
- On a dashboard poster the watchlist button shows while you point at the card or reach it with the keyboard, instead of covering every poster's corner; on a touch screen it is always there.
Stability
- Saving a Sonarr, Radarr or Seerr connection while somebody had Settings → Outbound open could leave both waiting on each other for good.
- Settings that cannot be read stop finstats at start-up, naming the setting at fault, instead of quietly resetting every setting to its default.
- Two changes to the settings at once — the settings page and a task's schedule, say — no longer undo each other.
- A pause, seek or track change seen while the database was busy is written on the next pass instead of lost.
- A library read no longer fails on a watchlist holding several entries that turn out to be one title.
Fixed
- A replaced file is not "now on the server": upgrading the file of a film on somebody's watchlist no longer tells them it has just arrived.
- One failed read of Jellyfin's plugins, scheduled tasks or storage no longer empties that list on the Server page until the next read.
- A Streamystats play stops where it stopped on every page: a title's drop-off curve and an episode's "finished" went by its length instead, and counted it as estimated.
docker pull ghcr.io/finstats/finstats:2.1.1finstats 2.1.0
Watchlist
Added
- A watchlist of your own: put a film or a show on it from its page, from Upcoming, from Recently added or from search (Ctrl+Enter), and find it under Watchlist on your own profile.
- Every entry says where it stands now — on the server, "5 of 26 episodes", requested, "Coming up Friday", not on the server, left the library, or watched — worked out each time you look, with the same reading of "seen" as your show progress. Watched titles stay, in a group of their own, until you take them off.
- A title that is not on your server yet can go on the list straight from what Sonarr or Radarr is waiting for. It is attached to the title by itself when it arrives, and a renamed file takes its entry along.
- "On your watchlist: now available": a notification for your own destinations when something you were waiting for arrives. Off until you tick it.
- Nobody else sees your watchlist, an administrator included, and its notification goes to your destinations only. Nothing is written to Jellyfin, Seerr, Sonarr or Radarr.
- Watchlists are part of a backup, and a restore merges them without doubling anything.
Changed
/api/upcomingentries carry the TVDB and TMDB ids of their title, and/api/auth/mesays whether the server keeps watchlists.
docker pull ghcr.io/finstats/finstats:2.1.0finstats 2.0.4
Added
- Task scheduling, the way Jellyfin does it: every job finstats does by itself has triggers — daily at a time, weekly on a day, on an interval, at start-up, or after Jellyfin's library scan — each with an optional time limit. Click a task to see and change its schedule; Add trigger opens the same dialog Jellyfin has.
- Tasks is a section of its own in Settings, with each job's last run in words ("Last ran 38 minutes ago, taking 6 minutes") and a Run button; it used to sit at the top of System.
- Metadata changes: every hour finstats reads what Jellyfin saved since the last look — names, overviews, genres, ratings, cast and crew, file details and pictures — so an edit in Jellyfin shows up without waiting for a library scan.
- Backup and the geolocation database can be run from Tasks too; Esc steps back from a task's schedule to the list.
Changed
- The theme is a switch with three stops, Light · Device · Dark, where the button that cycled through them was: click a third of it, drag the knob or use the arrow keys. The knob carries the choice's icon, which moves in when it changes.
- Signing out is under Settings → Account, which says who is signed in here; the sidebar keeps the theme switch.
- The old schedule settings are now triggers: Follow Jellyfin's library scan with its fallback interval, Back up every N days and the GeoIP Keep the database up to date switch became the matching triggers on their tasks, with the values you had. Collection, Backups and Security link to the schedule instead.
- A start no longer runs every job again: when each one last finished is kept.
- A Jellyfin job without an estimate yet reads "about … left", the dots cycling where the time will go, instead of "ETA…".
Performance
- The Security map no longer lags: dragging and zooming move the map already drawn and draw it once when the gesture settles, and the playing-now pulse no longer makes the whole map repaint 120 times a second while nobody touches it. A drag went from 34 to 60 frames a second on a slow computer.
Fixed
- A poster or a portrait replaced in Jellyfin shows up in finstats: pictures were cached for a week on the server and another week in the browser, whatever Jellyfin had since. They are now cached under Jellyfin's image tag, so a new picture is a new file, and the browser checks that its copy is current each time it shows one. Replacing a portrait re-saves only the person, so Metadata changes reads the people too.
- Server → Jobs shows an estimate as soon as the page opens: the time left was measured only from readings the page itself made while open, so every visit started on "ETA…" until it had watched the percentage move. finstats now times a running Jellyfin job by itself, every 10 seconds while one runs, and the page is served the estimate. A job Jellyfin reports at 0% the whole time (a library scan's first phase) keeps its dots until it moves: nothing is guessed.
- Map tooltips appear on the dot: in Firefox the playing-now dot's tooltip could land far away, and where dots overlap (somebody playing at home) which tooltip showed depended on a pixel. One tooltip now names everything under the pointer.
- The status bar has one hover shape: every link — the streams, Repo, the version — lights up as the same small box, and the dots between the items sit centred in the gaps. Hovering the version used to light up the dot and the gap before it too.
- A file path takes the whole width of its card: on a title's File card, and for Jellyfin's folders on the Server page, a path was squeezed into one narrow cell and ran down nine lines beside empty space.
- A dialog fading out no longer swallows a click on the page under it.
docker pull ghcr.io/finstats/finstats:2.0.4finstats 2.0.3
Stability
- Only one import or restore at a time: two uploads posted together both passed the check, and a restore never looked at imports; the second waited out the database and failed after minutes of upload.
- An address with a broken
%-escape opens the not-found page, instead of leaving a spinner for good. - A large page number in a list is an empty page: it overflowed, and came back as the first page again.
Fixed
- Security: the Server page gave every device's id to anybody with see server details; ids need see network details as well, as everywhere else.
- Security: two permission switches flipped before the first had saved sent the same starting list twice, and the second undid the first — a permission taken away stayed granted, a public-profile section switched off stayed published, while both switches showed what was chosen.
- Tables sort numbers right in a German or Norwegian browser: "1,204" was read as 1.204, and anything past a million as text.
- A chart's Table view sorts dates, weekdays and positions by when, not by their letters.
- The download history names where imports came from: Sonarr and Radarr name the indexer and protocol only on the grab, so those breakdowns were always empty. A failed season pack is one failure, not one an episode.
- Deleting a play watched together finds that title's groups again, instead of leaving a "group" of one.
- Time together, for one person, is never more than they stayed: the Together page credited them with the whole evening's.
- An evening in company across midnight on New Year's Eve (or the edge of "last N days") belongs whole to the window it started in, instead of two evenings alone.
- Imported episode plays are called by the episode's name where Jellystat kept only the series'.
- Geolocation finds the city database beside the Country and ASN ones
geoipupdatewrites, instead of switching itself off. - The most-rewound hot spot follows the page's filters, like its counts.
- "Your year is ready" goes only to people whose recap has something in it.
- Resolving a muted alert again keeps its pair muted; only reopening undoes a mute.
- An expired API key no longer counts toward the twenty.
- The session limit lets the oldest session go even when many sign-ins land in the same second.
- A home address found by the lookup stays when the same one is taken off the typed list.
- Pictures in the audit log and the keys list, where there were only initials.
- An administrator's notification list says whose a personal destination is, instead of "Yours" on everybody's; Recently sent shows every destination of its last event.
- Esc on a title or a person never leaves finstats, and closes only the dialog on top.
- A page is drawn even when a save cancels the prefetch it was waiting on.
- Now playing shows a paused viewer who scrubs where they are now, not when they press play.
- Removing a connection updates which pages exist, as saving one does.
- The geolocation database's build date keeps its year in US English.
docker pull ghcr.io/finstats/finstats:2.0.3finstats 2.0.2
Stability
- A halt is never lost: when a library read was refused in the first moments after start-up, before the server was listening for it, the refusal was noted and finstats ran on instead of stopping.
- A Jellyfin that answers in a shape finstats cannot read is refused, not believed: every user, or every title of a library, arriving under keys it does not know (
idforId) passed the guard with a full count and was then marked removed. - A play's end is never dropped: when the database was busy past its wait (an import holding it), a play that ended in that moment stayed marked as playing until the next restart. It is written on the next pass now.
- Settings a restore cannot read are left alone: a backup whose settings no longer fitted this version reset every setting on restore — merge window, permissions, home addresses, schedule.
- A control character in a name or a title no longer breaks the cards: the profile card, every story card that showed that title and the ZIP of them answered with an error.
Fixed
- Security: behind a proxy, the sign-in limit counted the first
X-Forwarded-Foraddress, which is the one the client sends — a new made-up address per attempt, and the limit never applied. It is the last one now, the one the proxy wrote. - Security: Include IP addresses and places sent addresses to a personal destination whose owner lacks see network details, which no page would show them. Somebody else's failed sign-ins now need see server details too, as on the Security page.
- Notifications stop for somebody disabled or deleted in Jellyfin: their personal destinations went on being sent everything their old permissions allowed.
- A queued notification is asked again before it is sent: a destination switched off, or an owner who had lost a permission, was still sent what was waiting to be retried.
- A destination that always answers
Retry-Afteris given up on after five tries like any other, instead of being retried for thirty days. - Device ids on a person's page are shown only with see network details, as everywhere else.
- A published year waits a day for everything: its finished and dropped shows followed every play, so pressing play on a dropped show changed the public page within seconds.
- A requested show counts as watched when one of its episodes is: every requested show read as never watched, in the Requests chapter and on the Asked card.
- The recap's Together chapter leaves Live TV out, like the rest of the year: a channel left on together could become the top title, and the share could pass 100%.
- The Days card of "the last 12 months" ends on the newest day: the grid dropped the most recent three or four weeks.
- A show's new episodes are announced once per evening: episodes either side of midnight UTC were announced twice on a server east or west of it.
- Connecting Seerr does not announce old requests as ready to watch: a request already available when first read, with no other record of when, read as arriving that moment.
- The titles of a library deleted in Jellyfin go with it: they stayed in search, on the Recently added shelf and in the totals.
- A remux stays a direct stream when a reading loses its transcoding details for a moment (a seek), instead of becoming a transcode for the rest of the play.
- "Jellyfin is down" means reads failed in a row: stray timeouts days apart on a server idle on the socket added up to it.
- A Streamystats import shows its progress on its own card, not over the Jellystat import's last result.
- An address whose host starts with "web" (
http://web:8096) is read as a host, not cut short as Jellyfin's web client path. - A queue error blanks the whole login of an address even when the password holds a slash.
docker pull ghcr.io/finstats/finstats:2.0.2finstats 2.0.1
Changed
- A title's languages stay out of the way: the header names the first three audio and subtitle languages, one line each, and a new Languages card lists every one — the complete ones together, the partial ones with how many episodes have them. A long show's two dozen subtitle languages used to push the artwork down a screen.
Fixed
- A title's poster stays beside its name: when the text next to it ran longer than the poster — a long synopsis, many studios — the poster sank to the bottom of the header, under empty artwork.
- A version finstats cannot read is called that: an
app_versionedited by hand into something unreadable made finstats refuse to start as "the older finstats 2.0.1", which it was not. It still refuses, and now says which value it could not read and how to write it.
docker pull ghcr.io/finstats/finstats:2.0.1finstats 2.0.0
Recap 2026, public profiles and watching together
Added
- Who you watched with, in the recap: evenings in company, the time spent in it, the title that brought people together most, and up to three companions, named in the app and linked to their profiles.
- Shows seen to the end, in the recap: the last episode of each seen that year, by the same reading of "seen" as the profile's progress bars — and the ones begun and left for later, under half seen with nothing played for two months.
- What you asked for, in the recap: Seerr requests made in the year, how many arrived and how many you then watched. Only where requests exist.
- The year against the one before: hours, plays and days, and how much more or less.
- The year as a story: every chapter as a 1080×1920 card, the shape phone stories use — the year, the numbers, top shows, films and music, genres, the persona, hours and days, every day of the year, records, company, shows finished, requests and the year before. Save one, or all of them as a ZIP, from "Share the year as cards".
- A card never names anybody else: cards are drawn from a copy of the year with no field for another person, a rank or an app. In the app a card carries no name at all.
- The server's year, for Jellyfin administrators: every title and total and the persona of the house, with nobody ranked or named. A switch on the recap page,
scope=serverin the API. - "Your year in review is ready": a notification in December, once to each person who watched that year.
- Public profiles: a person can publish part of their profile at a link anyone can open without an account — totals and top titles, streaks and when they watch, the whole year as its story of cards, the last ten plays — each part off until its owner switches it on under Settings → Public profile. Devices, addresses, apps, play methods, file paths and other people are never published, whatever is switched on, and the name shown is one the owner types, never their Jellyfin login.
- Nothing on a published page is newer than a day, recent plays and every total alike, so a page someone keeps an eye on never says who is watching right now.
- Shareable cards: every published profile comes with a 1200×630 picture, of the profile and of the year, that Discord, Signal, Mastodon and the rest show when the link is pasted, and that can be downloaded to post. Drawn on the server from what the page shows and nothing more.
- A link you can take back: 22 random characters, reset with one click; the old link then answers exactly like one that never existed.
- Public profiles are off until an administrator allows them: one switch for the whole server, a list of who publishes what, and a way to take a profile down. Publishing, changes, resets and take-downs are in the audit log, and a key cannot make anything public.
- Together, a page of its own: who watches with whom, how much, and how that has changed. Time together, evenings and the share of watch time spent in company, each against the window before; hours in company against hours alone per day or week; every pair of people with their evenings, time together, when they last watched and what they watch most; the titles watched together most; the recent evenings; and, for anyone who may see everyone, each person's time alone against their time in company.
- Every pair counts: an evening of three counts for each of its three pairs, where the card used to count only the exact set of people. A pair's time together is the shorter of the two stays.
- The Watched together card on the dashboard and on a profile links to the page, and a profile's card says what share of that person's watch time was in company.
GET /api/stats/groupsgainspairs,series,people,previous,bucket, andwatch_sandsharein its totals; the keys it had are unchanged.- Where people stop, on every film and episode page: the share of plays still watching at each minute, from everyone at the start to whoever reached the end, with the rewinds and subtitle switch-ons of those plays marked on the same axis. The card says how many stops were measured (plays finstats recorded) and how many estimated (imported plays, from how long they ran), and needs three plays before it draws anything.
- Who keeps watching, on a show page: how many people started each episode, in order, and a Finished column per episode. "Everyone quits episode three" is people who never press play on episode four.
- Files that never play, on Playback: a film or episode started three times or more that never got past thirty seconds, with who tried and on which apps. Jellyfin's log carries no playback errors, so the plays are the witness; the minimum play length does not apply here, since it is exactly what those plays never reach.
- Most rewound and Subtitles switched on, on Playback: titles ranked by backwards skips per play with the minute they cluster in, and by the share of plays where subtitles went on within the first ten minutes. All three lists need see everyone's activity. Skips shorter than 20 seconds were never recorded, so a short replay of one line is invisible by design.
- A seek keeps where it came from as a number beside its label (
from_sin a play's timeline). Every seek already recorded gets its number from the label, and so does a restored backup from before this. GET /api/stats/filesfor the three lists;GET /api/items/{id}gainsinsights, and a show's episodes gainusersandfinished.- API keys: anyone signed in can make keys for themselves under Settings → API keys, for a script, a dashboard or a phone. A key is sent as
Authorization: Bearer fs_…, is shown once, stored hashed, can carry an expiry, and is revoked with a click — an administrator sees and can revoke everyone's. It resolves to the same person with the same permissions as a sign-in, read live on every request, so losing the right to sign in stops every key at once. A key can neither make nor revoke keys. - A calendar feed:
GET /api/calendar.ics?key=…is what Sonarr and Radarr have coming, as an iCalendar a phone can subscribe to. A key with the calendar scope opens the feed and nothing else; the feed reads the key from the address because a subscribed calendar can send no header, never the cookie, and names nobody. - An audit log under Server → Audit, for Jellyfin administrators: every sign-in and failed attempt with its address, every setting or permission changed and to what, every key made, used or revoked, every connection, destination, backup and import, every play deleted and alert resolved — who, from where, through which key, and whether it worked. Kept a year, part of backups.
GET /api/auditpages through it. - Import from Streamystats, its own section under Settings beside Jellystat. Take its Settings → Backup & Import → Download Backup file and drop it in: years of history arrive in a couple of seconds, and nothing you already have is counted again.
finstats import-streamystats <file>does it headless,POST /api/import/streamystatsthrough the API; one import runs at a time, either kind. - Ran both trackers? Import both files. A play is recognised as one finstats already has by the tracker's own id for it and, failing that, by the same person watching the same item with either end of the play close to one in the history — so a Jellystat export and a Streamystats export of the same evenings can both be imported, in either order, and an evening finstats watched itself is not imported over either. "Close" is the Merge window under Settings → Collection.
- Imported rows say what they cannot say. A play Streamystats watched itself keeps nothing about the file — no codec, resolution, bitrate or container — so those stay empty rather than being filled with a guess, and the cards that would show them hide themselves. A play it had taken from Jellystat carries the whole session, and that is read instead: dated by the moment it ended, the only moment either tracker kept, and described as a transcode only when the session really was one.
- Rows Streamystats wrote because Jellyfin reported an item watched, for a viewing it never saw, are counted and skipped: they are as long as the whole film and would be watch time on an evening nobody watched. The result says how many there were.
- How Streamystats data is interpreted, field by field, learned from a real export rather than from documentation:
docs/streamystats-import.md. - Which tracker each play came from, as a filter on Activity: what finstats recorded itself, what came from Jellystat, what came from Streamystats. Only the ones your history actually holds are offered, and it is scoped like every other list, so somebody who may only see their own plays is only told where their own history came from.
- The filters on Activity are dropdowns you tick, so you can ask for films and episodes without music, two play methods, or two people at once, rather than one of each or all of them. Media type gained Other now that it can be combined.
- Several people at once, anywhere the user filter appears — the dashboard, playback, libraries, security and the rest — with the map and every statistic following. A user filter still only ever narrows what somebody may see: without see everyone's activity a request is pinned to the caller, whoever the address names and however many.
- A light theme: washi paper, with ink text and a vermilion accent. finstats follows the device's light or dark setting until you pick one.
- A theme button beside Sign out cycles Device, Light and Dark. The choice is kept in this browser and applied before the page is drawn, so it never flashes the other theme.
- Open in Jellyfin: every film, show and episode page has a button that opens that title's page in Jellyfin, in a new tab.
- Jellyfin's address for people under Setting...
finstats 1.6.5
Added
- A full backup is taken automatically before every upgrade. The first time a newer finstats opens your database, it writes a complete copy of it — your whole history, settings and all — to
data/pre-update-backups/before it changes anything. If an upgrade ever breaks something, your data is safe: stop finstats, put the copy back in place offinstats.db, start the version you were on, and report the bug — nothing is lost. The newest few copies are kept; setFINSTATS_SKIP_PREUPDATE_BACKUP=1to turn it off if disk space is tight.
docker pull ghcr.io/finstats/finstats:1.6.5