Tracearr vs Streamystats
Streamystats charts what played on Jellyfin and leaves anomalies in a list for an admin to read. Tracearr monitors Plex, Jellyfin, and Emby together, merges the same person across them, and acts on account sharing on its own.
Media server support
One Tracearr instance connects to any number of Plex, Jellyfin, and Emby servers. Streamystats connects to Jellyfin. It can register more than one Jellyfin server, but each is a separate sign-in and a separate dashboard.
Streamystats notices. It cannot do anything about it.
Give Streamystats credit: it does real anomaly detection. It measures the distance and the elapsed time between a user's last two sign-ins and flags anything above 900 km/h as impossible travel, and it keeps a per-user profile of known devices, cities, and countries to flag what is new.
Then it stops. The anomaly becomes a row in an admin list with a badge on it. No notification is sent, because Streamystats has no notification code at all. No stream is stopped, because the only two calls it ever makes back to Jellyfin are signing a user in and marking an item watched. An admin finds it later and marks it resolved.
Detection that ends in a list is a report. Tracearr treats the same signal as a trigger.
- 1
The condition matches
Two streams in different countries, a device moving faster than a plane, a fourth concurrent stream, or any of 31 fields you can combine with AND and OR.
- 2
The rule decides
An if action branches into a then and an else arm, so a first offence and a fifth can take different paths. A kill can wait up to 300 seconds and re-check before it fires.
- 3
Tracearr acts
Stop the stream on Plex, Jellyfin, or Emby, put a message on the screen, drop the trust score, and send it to Discord, email, or your phone.
| Capability | Tracearr | Streamystats |
|---|---|---|
| SERVER COVERAGE Tracearr monitors Plex, Jellyfin, and Emby from a single instance and receives sessions as they start. Streamystats connects to Jellyfin, and polls it on a fixed five-second timer. | ||
| Media servers | TracearrPlex, Jellyfin, and Emby | StreamystatsJellyfin only. There is no Plex or Emby client in the project; the two places either name appears are comments describing a playback-method value. |
| Servers per instance | TracearrAny number, any mix of the three, on one dashboard | StreamystatsSeveral Jellyfin servers can be registered and polled, but every page is scoped to one of them and switching servers signs you in again against that server. There is no combined view. |
| How sessions arrive | TracearrJellyfin and Emby push events the moment they happen, through the Tracearr SSE plugin we build and ship. Polling stays as a fallback on an interval you set between 5 and 300 seconds. | StreamystatsPolling only, hardcoded at five seconds. The source comments it as having no per-server customisation, and the settings dialog shows the interval as fixed. The compose file offers a SESSION_POLL_INTERVAL_MS variable that no code reads. |
| One person across servers | TracearrPlex, Jellyfin, and Emby accounts merge into a single identity carrying one trust score | StreamystatsUsers belong to the server they were synced from and are counted separately. |
| ACCOUNT SHARING Streamystats flags anomalies and leaves them in a list for an admin to clear by hand. Tracearr evaluates conditions against the stream itself and acts on the match. | ||
| Detection | TracearrImpossible travel, simultaneous locations, device velocity, concurrent streams, and geo restrictions, from 31 condition fields across 18 triggers | StreamystatsFour anomaly types read out of the Jellyfin activity log: impossible travel, a new country, a new city, and a new device. Severity is a fixed constant per type and no threshold is adjustable. Concurrent streams appear as a label in the UI with no code that ever raises one. |
| What happens next | TracearrThe automation acts: stop the stream, message the client, adjust trust. A policy rule records the violation itself. | StreamystatsA row appears in the admin anomaly list and an admin marks it resolved with a note. Nothing is sent anywhere and nothing is enforced. |
| Trust scoring | TracearrEvery account starts at 100. Automations raise, lower, or reset it, and an admin can set it by hand. An identity scores the lowest of its active accounts. | StreamystatsStreamystats has no trust or risk scoring. |
| Stopping a stream | TracearrOn Plex, Jellyfin, and Emby, from the web UI, the mobile app, an automation, or the public API. Stopping a Plex stream needs Plex Pass, which is Plex gating its own endpoint. | StreamystatsNot possible. Streamystats writes back to Jellyfin twice in the whole codebase: to sign a user in, and to mark an item watched or unwatched. It never sends a playstate or general command. |
| AUTOMATIONS Tracearr runs conditional rules that act on a stream. Streamystats has no rule engine of any kind. | ||
| Rule logic | TracearrConditions grouped with AND and OR, and an if action that branches into then and else arms. 31 fields, ten operators, windows up to seven days. | StreamystatsNone. There is no rule, condition, trigger, or threshold to configure. |
| What a rule can do | TracearrStop the stream, message the client, adjust trust, send a notification, or branch with if. A kill can wait up to 300 seconds and re-check the condition before it fires. | StreamystatsNot applicable |
| Testing and sharing rules | TracearrA live check runs a rule against currently playing sessions and shows pass or fail for each without recording anything. Any rule exports as a share code another instance pastes in, and 22 templates ship built in. | StreamystatsNot applicable |
| WHERE STREAMS COME FROM Both ship a map and both bundle their geolocation data, so neither asks you for a MaxMind key. What gets plotted differs: Tracearr maps the streams, Streamystats maps sign-in events scraped out of the activity log. | ||
| What the map plots | TracearrSessions, resolved from the stream's own IP to a city and an ASN. The vector basemap ships inside the container, so there are no tile keys and no third-party requests. | StreamystatsActivity-log entries whose text contains an IP address, which are sign-in and connect events. The IP recorded on a playback session is stored and never geolocated, so nothing shows where a stream is playing from. |
| Geolocation data | TracearrGeoLite2 City and ASN databases bundled in the image. No account, no key. | StreamystatsThe geoip-lite database bundled in the image. No account, no key. Country names come from a 60-entry lookup, and anything outside it shows as a raw ISO code. |
| ALERTS AND EMAIL Tracearr delivers to nine destination types including email and mobile push. Streamystats sends nothing anywhere. | ||
| Where alerts go | TracearrDiscord, JSON webhook, ntfy, Gotify, Apprise, Pushover, SMTP email, mobile push, and an in-app toast | StreamystatsNowhere. The project carries no mail transport and no Discord, Telegram, ntfy, Gotify, Pushover, Apprise, Slack, or outbound webhook code. The one outbound channel is job progress to an open browser tab. |
| Newsletters | TracearrRecently-added mail per server on a daily, weekly, monthly, or cron schedule, with unsubscribe, view in browser, and per-recipient status | StreamystatsStreamystats has no newsletters and no SMTP or email code of any kind. |
| Mobile app | TracearriOS and Android, with push notifications and stream termination | StreamystatsA web app installable as a progressive web app. No native app and no push. |
| LIBRARY AND MEDIA Tracearr matches one catalog across every connected server and reports on duplicates, storage, and bandwidth. Streamystats reports on the library of the server you are signed into. | ||
| Cross-server catalog | TracearrOne record per title matched on IMDb, TMDB, or TVDB id, with every server's copies attached | StreamystatsItems belong to the server they were synced from. Nothing is matched across servers. |
| Duplicate detection | TracearrAcross servers, with recoverable space and match type | StreamystatsItem merging exists to repair watch history after a Jellyfin rescan changes item ids. It does not report duplicate media. |
| Storage analytics | TracearrGrowth trends with predictions, stale content, and ROI measured as watch hours per GB | StreamystatsA total of the file sizes Jellyfin reports for each library. No free space, no growth over time, no host disk metrics. |
| Bandwidth | TracearrAverage and peak bitrate per day, served from a continuous aggregate rather than recomputed on request | StreamystatsPer-session bitrates are stored and charted as a distribution. There is no aggregate bandwidth figure. |
| Overseerr and Jellyseerr | TracearrLinked per server. Requested-to-watched funnel, landed-and-never-played, requester follow-through. | StreamystatsNo request integration of any kind, including Jellyseerr. |
| BRINGING HISTORY WITH YOU Tracearr reads your Plex history out of Tautulli, so a library that started on Plex keeps its timeline. Streamystats has no Plex source at all. | ||
| Bringing Plex history in | TracearrTautulli over its HTTP API, read with a URL and an API key. No export file to produce first. | StreamystatsThere is no Tautulli import and no Plex source of any kind, so a Plex history has no way in. |
| History across platforms | TracearrImport both sides, merge the accounts, and one person keeps one timeline across servers | StreamystatsNo Plex source exists, so Plex history cannot come in. |
| Getting the data back out | TracearrGET /history on the public API returns plays with a keyset cursor, filtered by user, server, media type, IMDb, TMDB, or TVDB id, and a date range | StreamystatsA JSON backup of the whole database, admin only. History is not part of the documented API, so there is no filtered read. |
| HOLDING UP AS HISTORY GROWS Tracearr pages history with a keyset cursor against a TimescaleDB hypertable and serves dashboard figures from continuous aggregates. Streamystats recomputes both on demand. | ||
| History pages | TracearrA keyset cursor and a SQL LIMIT, so page ten costs what page one costs | StreamystatsLIMIT and OFFSET, plus an uncapped COUNT(*) over the same two-join query on every page request. A deeper page costs more than a shallow one. |
| Playback history storage | TracearrA TimescaleDB hypertable on 30-day chunks with indexes on the columns history is filtered and sorted by | StreamystatsA plain Postgres table, indexed with six composite indexes. |
| Precomputed figures | TracearrContinuous aggregates refreshed on a schedule, every 15 minutes or hourly | StreamystatsNo rollups. Dashboard figures are SUM and GROUP BY over the whole sessions table, cached at the application layer for hours, so a cache miss runs the full scan. |
| ACCESS AND PLATFORM Tracearr signs in through any OIDC provider, ships in 30 languages, and publishes a versioned API with a generated spec. | ||
| Single sign-on | TracearrAny OIDC provider, through discovery | StreamystatsA Jellyfin username and password, proxied to the server. No OIDC, SAML, or SSO of any kind. |
| Languages | Tracearr30, managed through Crowdin | StreamystatsEnglish only. There is no i18n library in the project and no translation files to add one to. |
| Public API | TracearrVersioned v1 and v2, 24 documented paths, bearer API keys, a generated OpenAPI 3.0 spec, and a rate limit you set | StreamystatsA hand-written Markdown reference covering search, recommendations, and watchlists. Playback history, watch time, transcoding, and anomalies are not exposed. No OpenAPI spec, and the docs state no rate limiting is enforced. |
| Price | TracearrFree, AGPL-3.0, self-hosted | StreamystatsFree, MIT, self-hosted |
Common questions
Does Streamystats support Plex?
- No. Streamystats talks to Jellyfin and nothing else. There is no Plex client in the project and no Emby client either, so a mixed library needs a second tool. Tracearr monitors Plex, Jellyfin, and Emby from one instance.
Does Streamystats work with Emby?
- No. The only media server client in the codebase speaks the Jellyfin API. Emby is mentioned twice, both times in a comment describing a playback-method value rather than in code that connects to a server. Tracearr monitors Emby directly, and reads its sessions in real time through the Tracearr SSE plugin.
Can Streamystats stop a stream or block account sharing?
- It can detect, but it cannot act. Streamystats flags impossible travel, a new country, a new city, and a new device from the Jellyfin activity log, then puts a row in an admin list for someone to mark resolved. It never sends a command back to Jellyfin apart from signing in and marking an item watched. There are no stream limits and no enforcement. Tracearr evaluates the same kind of condition against the stream itself and can stop it, message the client, or drop the account trust score when a rule matches.
Does Streamystats send notifications?
- No. There is no email, Discord, ntfy, Gotify, Pushover, Apprise, Telegram, or webhook support anywhere in the project, and no notification settings page. An anomaly or a server going down produces something to look at next time you open the dashboard. Tracearr delivers to nine destination types, including SMTP email and push to its mobile app.
Can I move my Streamystats history to Tracearr?
- Tracearr does not read a Streamystats backup file, but you do not need one. Both tools build their history from the same source, so point Tracearr at your Jellyfin server and let it import the Playback Reporting plugin directly. If you also run Plex, Tracearr reads that history out of Tautulli over its API, and merging the two accounts puts one person on one timeline across both servers.
Also looking at Jellystat or, on the Plex side, Tautulli?
Comparison checked against Streamystats 2.20.0 on 2026-09-21. Something out of date? Tell us.