github connorgallopo/Tracearr v1.3.8

latest releases: v1.3.9-beta.2, v1.3.9-beta.1
7 hours ago

Tracearr v1.3.8 Release Notes

New Features

Session History Page

  • Sortable columns for date, user, title, duration, and quality
  • Multi-select filters for users, platforms, countries, media types, and quality (Direct Play / Direct Stream / Transcode)
  • Date range picker with presets
  • Session detail sheet with full playback information, device details, location map, and quality indicators

Click-to-View Session Details

Now Playing cards on the dashboard and history page can be clicked to open the session detail sheet directly, providing quick access to full session information without leaving the dashboard.

Version Check and Update Notifications

Tracearr now checks GitHub for new releases every 6 hours and displays update availability in the sidebar footer. WebSocket push notifications alert you in real-time when updates are available.

Accent Color Picker

Customize the interface accent color in Settings > Appearance.

Geo-Restriction Allowlist Mode

Geo-restriction rules now support both blocklist and allowlist modes:

  • Blocklist: Block sessions from specified countries (existing behavior)
  • Allowlist: Only allow sessions from specified countries

ntfy Authentication Support

ntfy webhook destinations now support token authentication for private ntfy servers. Test buttons added for both Discord and ntfy webhooks to verify configuration before saving.

Server Selector Improvements

  • Show All Connections: Toggle to view filtered/unreachable Plex connections
  • Custom URL Input: Manually enter server addresses when auto-discovery fails
  • Warning Badges: Unreachable connections display "May not connect" indicator

Bug Fixes

Tautulli Import Fixes

  • Inflated concurrent stream counts: Tautulli's stopped timestamp represents wall-clock time, not actual viewing end. If a user paused and resumed days later, sessions appeared to span that entire period. Now calculates stoppedAt as started + duration. Migration 0020 fixes existing imported data.
  • BIGINT overflow: Duration columns now use BIGINT to support sessions over 48 hours (INTEGER max is ~596 hours in milliseconds, but edge cases existed). Migration 0022 handles TimescaleDB hypertables by decompressing chunks before altering column types.
  • Nullable field handling: Various fields from Tautulli's API can return null or empty strings unexpectedly. Schema validation now handles: friendly_name, user_thumb, platform, product, player, machine_id, location, transcode_decision, parent_title, grandparent_title, thumb, originally_available_at, guid, parent_rating_key, grandparent_rating_key, year, media_index, parent_media_index.

plex.direct URLs Missing from Server Selector

Added includeHttps=1 parameter to Plex resources API. Without this, Plex only returns raw IP connections. This fixes connection failures when Plex has "Secure connections: Required" enabled.

Local Streams Showing Wrong Location

Local streams (player.local=true) now use the player's local IP address instead of the server's public IP for geo-lookup. This correctly identifies local streams as "Local Network" instead of showing the server's geographic location.

Timezone Handling

Dashboard and stats charts now respect the client's timezone for date bucketing. Previously, some charts used server-side UTC extraction while others parsed dates client-side, causing inconsistent day boundaries across different charts.

Other Fixes

  • Email login is now case-insensitive
  • Geo-restriction country input accepts comma-separated values
  • Discord embed fields truncate at 1024 characters (Discord API limit)
  • Discord webhook username set to "Tracearr"
  • Calendar range picker styling and corner rounding
  • Session detail sheet X button no longer overlaps with badge

Performance & Infrastructure

Parallel SSE Connections

SSE connections for multiple Plex servers now establish in parallel instead of sequentially, reducing startup time when monitoring multiple servers.

Push Receipt Processing

Expo push receipts are now processed every 15 minutes. Previously, the pendingReceipts map grew unbounded because processPushReceipts() was never called, causing a memory leak.

Distributed Locking

Added Redis-based distributed lock to prevent race conditions between SSE real-time events and the poller when both process the same session simultaneously.

Database Connection Leak Fix

Database client connections are now released in finally blocks to prevent connection pool exhaustion when queries throw errors.

GeoIP Database Auto-Update

Docker builds now automatically fetch the latest GeoLite2-City database during image build.

Migration Notes

  • TimescaleDB users: Migration 0022 (BIGINT columns) temporarily decompresses all chunks and drops continuous aggregates. Aggregates are recreated automatically on next startup. Expect longer migration time for large datasets.
  • Existing Tautulli imports: Migration 0020 recalculates stoppedAt for all imported sessions using startedAt + durationMs. This is a data-modifying migration.

Don't miss a new Tracearr release

NewReleases is sending notifications on new releases.