Tracearr v1.4.23 - Pause Detection, Public Activity API, and Session Reliability
Pause Detection Rules
New rule conditions for paused sessions:
- Current Pause Duration - Trigger rules when a session has been continuously paused beyond a threshold (e.g., paused for 15+ minutes)
- Total Pause Duration - Trigger rules based on total accumulated pause time across all pause/resume cycles in a session
Rules re-evaluate on every poll while a session is paused, so actions fire as soon as the threshold is crossed. Works across both SSE (Plex) and poller paths.
Public Activity API
New /api/v1/public/activity endpoint. Six datasets in a single call:
- Plays over time (bucketed by 6h for week, 1d for month/year)
- Peak concurrent streams broken down by direct play / direct stream / transcode
- Day-of-week and hour-of-day distributions
- Platform usage
- Playback quality breakdown
Supports period (week/month/year), serverId filter, and timezone for proper date bucketing. Full OpenAPI spec in Swagger.
Also added: version field in /health response, and the stats queries behind the internal dashboard now share the same SQL with the public API.
Jellyfin / Emby Session Identity
Rewrote how Jellyfin and Emby sessions are tracked internally. Sessions now use compound keys (user + device + media) instead of the external session ID, matching how Plex already worked. Fixes several issues where JF/Emby sessions would ghost, duplicate, or fail to stop properly — especially when the media server recycles session IDs across different users or devices.
Termination cooldowns also use the new composite keys so kills actually stick on JF/Emby.
Adaptive Polling
The poller now runs at 3s when sessions are active and drops to 10s when idle. Previously it was a flat 7s regardless. Reduces unnecessary load when nothing is streaming.
Mobile
- Multi-server dashboard - Dashboard now supports viewing all servers at once with color-coded Now Playing cards and map markers
- Server selector - Updated behavior across all screens, not just the dashboard
- VPN/Tailscale fix - New Expo config plugin that configures NSURLSession to wait for VPN tunnel readiness on iOS instead of failing immediately. Fixes connections over Tailscale and similar VPN setups
- Session revocation - Revoking a mobile session now blacklists the device token and force-disconnects the socket immediately. Previously the JWT stayed valid until expiry
- Token handling - Access token expiry shortened from 7d to 24h. Refresh token rotation is now atomic in Redis
Trust Score Editing
Trust scores can now be edited directly from the User Detail page. Dialog with live badge preview showing where the new score falls.
User Detail Sessions Table
Replaced the custom sessions table on the User Detail page with the shared HistoryTable component. Clicking a session row opens the full detail sheet with stream info, geo data, and playback quality — same view as the History page.
Now Playing Cards
- Quality badges (Direct Play / Direct Stream / Transcode) are now icon-only with tooltips to save space
- HW transcode gets its own label distinct from software transcode
- Server color accent changed from overlay div to inset box-shadow
- Better truncation on long usernames
Play Count Accuracy
Session counts throughout the app (dashboard, public API, user stats) now deduplicate pause/resume chains. A session that pauses and resumes multiple times counts as one play instead of inflating the number.
Server Reachability
Health check now tracks consecutive failures and only marks a server as down after 3 in a row. Reduces false alarms from transient network blips.
Library Sync
- Incremental syncs now rebuild snapshots from the database after upserting items, so Media Statistics charts stay current without waiting for the next full scan
- Snapshot rebuild failures are caught independently — won't roll back an otherwise successful sync
Fixes
- Plex SSE processor not tracking pause state or re-evaluating pause rules during SSE updates
- Jellyfin message endpoint returning 415 — switched from query params to JSON body
- Paused sessions not counted in buffer/concurrent stream totals
- Pending session Redis TTL too short — sessions that paused during the confirmation window would expire before confirming
- Transcode re-eval actions only firing on initial violation, not on subsequent re-evaluations where dedup returned null
- Mobile connection revoke not actually disconnecting the client
- Public user stats endpoint errors
- Library sync edge cases
Thanks for your continued feedback and support!