github fredrikburmester/streamystats v2.15.0

7 hours ago

2.15.0 (2025-12-29)

Welcome to a bunch of new features! I've also made improvements to the session/history recording, since some people have been having issues with it.

Watchlists

You can now create custom watchlists in Streamystats! These can be made public or kept private. There is also a flag on a watchlist called promoted. This feature is designed specifically for globally showcasing playlists to all users in Jellyfin clients (fetched via the API). The beta of Streamyfin already supports these promoted watchlists displayed as sections on the homepage. Fetch any watchlist via the API (as an authenticated request).

Global Search

Search for items, actors, etc. in the global search bar. The search is powered directly by Postgres; no additional service is needed. You can also connect this search to external clients if you want, using Streamystats as a search engine. The client Streamyfin already supports this in the latest beta. One great reason for using Streamystats search is that we have fuzzy search, resulting in much better hits when the query is misspelled.

Screenshot 2025-12-28 at 20 43 18

Almost Done Watching

On a user page, you can now see almost-done heatmaps for series, allowing you to find that old series that you didn't quite finish or missed an episode of.

Screenshot 2025-12-28 at 20 42 23

Infer watched items

Jellyfin provides information on what items a user has watched via the UserData field on an item. With this data we can infer session watchtime and date (but not client and transcoding status). You can now run a job to create these inferred sessions (easily deleted also, no danger in running the job), adding much more data to your Streamystats stats, and resulting in a more accurate representation of what you've watched. This can be done by an admin of by each individual user.

Features

  • add backfill endpoint for Jellyfin server IDs and update server data structure in job-server module (61ae969)
  • add jellyfinId to servers and isPromoted to watchlists (892906f)
  • add new API endpoints for recommendations and watchlists, including server identification and query parameters (7cbfbce)
  • add OCI source label to Docker images for Renovatebot support (73dd6ef), closes #276
  • add promoted watchlists and external API improvements (a61ec2c)
  • Add session poller resilience and monitoring (2a2dcdc)
  • add typechecking scripts and CI workflow (c49cb69)
  • add vaul dependency and implement Drawer component for improved UI in ChatDialog (74c3c9c)
  • almost done watching heatmap for user page (and me page) (227998b)
  • bun test job in pr builds (9013145)
  • enhance ActivityLogTable with user and activity type filters (c60786a)
  • enhance error handling and logging in embedding jobs (b63894f)
  • export new backfill job and constants from server-jobs module (d38c43d)
  • global search (31a4f21)
  • global search (d06c631)
  • implement backfill job for Jellyfin IDs and enhance server data handling in job-server module (36feea9)
  • implement Jellyfin ID backfill trigger in SyncScheduler for servers without IDs (f6a8638)
  • implement WatchlistsGrid component for displaying and managing user watchlists (dccd851)
  • infer sessions based on items marked as played (4f67f28)
  • infer sessions based on items marked as played (fbb5f9e)
  • recommendations: add series recommendations support (32c660a)
  • register backfill job for Jellyfin IDs in job queue (3d6a787)
  • show people sync in settings (9327a5c)
  • show people sync progress in settings (c762e04)
  • watchlists (7df353d)
  • watchlists: add MediaBrowser auth support and sanitize searchVector from responses (a0962df)

Bug Fixes

  • actors breadcrumbs (55cb29e)
  • add authentication to people-sync-progress endpoint (14650da)
  • connection issues (12a0ba6)
  • date filter (57e9df3)
  • design (1359c02)
  • don't require API key for openai api compatible models (2a94328)
  • don't show recommended sections if no embeddings (4e96669)
  • ensure error handling only sends error messages when they are instances of Error (5542eb6)
  • error (e638b2c)
  • failing test (6978476)
  • improve loading (bfe544a)
  • improve session poller reliability with retries and better error logging (0912f63)
  • improve type safety for image field comparisons in hasImageFieldsChanged function (255b313)
  • improved api key saving (51638a2)
  • instructions (c31652a)
  • less agressive activities sync (0746292)
  • less data pulled from jellyfin (533113f)
  • lint (af6856e)
  • logs (61bc665)
  • move params await inside Suspense to avoid blocking route (0ef9cef)
  • only include items actually watched (37b89d7)
  • prevent duplicate sessions and detect item/position changes in session poller (fe26095)
  • reduce sync frequency and fix repeated item updates (eb7b9bb)
  • scope people sync queries to server ID (e7fabc4)
  • settings menu in sidebar collapsed mode (12a85a2)
  • stale job status improvement (51eae7e)
  • use chat for queries (28c8556)
  • wrong db queries $1 (200c1ed)

Don't miss a new streamystats release

NewReleases is sending notifications on new releases.