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
stoppedAtasstarted + 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
stoppedAtfor all imported sessions usingstartedAt + durationMs. This is a data-modifying migration.