v0.8.0
Session Vitals lands in this release across every platform: the SDKs now report video playback quality, memory and responsiveness continuously, and the dashboard gains a Sessions tab with per-session timelines and aggregate metrics. iOS, tvOS and Android reports can now carry a native video replay of the moments before the report was filed, replacing the older tree-based replay on those platforms. The dashboard splits the old Events feed into Reports and Errors with team-shared unseen state and a rebuilt error-triage page, and billing now computes and collects VAT on checkout. Session Vitals is off by default and enabled per app from the dashboard, so upgrading the SDK alone changes nothing you have not opted into.
SDKs
Session Vitals (all platforms). When enabled for an app, the SDKs collect a lightweight session record: video playback quality (startup time, buffering, bitrate and quality changes, player lifecycle events) alongside memory, CPU and responsiveness sampling. Sampling pauses while the app is backgrounded or the page is hidden, sessions rotate after 30 minutes idle, and the collector is byte-capped and never throws — if the transport fails, your app is unaffected. Reports and crashes now carry the session id and the last 60 seconds of vitals, so a filed report links straight to the session it came from.
Playback tracking is per player, so a page or screen with a main player, a picture-in-picture player and an ad player reads as three distinct timelines rather than one merged stream. Where a player library sits above the platform's media element, an optional integration supplies what the element cannot see: source URL and streaming protocol, DRM key system, the bitrate ladder, current quality, and a startup breakdown (manifest, licence, first fragment, first frame).
- Web and React — automatic tracking of plain media elements, plus opt-in integrations for hls.js and Shaka Player. Neither library is added as a dependency or peer dependency; you hand us your existing instance.
- React Native — a library-agnostic player bridge with adapters for react-native-video (v7) and THEOplayer. CPU and memory sampling and session ids were already inherited from the native SDKs; this adds playback.
- Android — a native collector with CPU and memory sampling, and playback tracking for Media3/ExoPlayer through a new companion artifact.
- iOS and tvOS — a native collector and AVPlayer playback tracking, shipped inside the existing framework: no new package, product or target to add.
Native video replay on iOS, tvOS and Android. Reports from these platforms can now include an MP4 replay of the seconds before the report, played back inline in the dashboard with seek-to-event markers. Capture is masked for sensitive views, runs at a dashboard-selected 5 or 10 fps, is bounded in size and duration, and is stored encrypted on device until upload succeeds — surviving process restart and retrying through network failures. Opening the reporter freezes the footage, so time spent writing or annotating a report does not eat into what gets submitted. On tvOS, replay is validated end to end through the companion reporting flow.
Web reporter captures the page before it takes focus. Previously the reporter dialog moved focus to its own title field before photographing the page, so focus rings were missing from screenshots, anything the host page closes on blur (comboboxes, autocomplete, menus, popovers) collapsed out of the shot, and the recorded focused element described the reporter's own input instead of the user's. Most visible when opening the reporter with the keyboard shortcut. The page is now captured with focus intact.
Service and dashboard
- Sessions. A new Sessions tab lists sessions with health columns (startup, rebuffer percentage, errors, peak memory) and filters for integration, time range and errors. Session detail shows a lane timeline with buffering regions, memory and CPU, per-player cards (source, DRM, startup breakdown, quality range, health), a bitrate line per player, custom entries, and the events linked to that session. A Metrics view charts session counts, rebuffer ratio, startup p50/p95 and error rate over time, optionally grouped by app version or platform.
- Reports and Errors are now separate. The project Events feed splits into Reports (user-filed) and Errors (automatically captured crashes and errors, grouped by fingerprint). Both carry a team-shared unseen flag — one per report, one per group, not per user — surfaced as badges on the project rail. Error groups have a resolve/reopen lifecycle, so a new occurrence on a resolved group reopens it and badges as a regression. Existing links to individual events keep resolving, and nothing badges on deploy: everything already in the database is marked seen.
- Rebuilt error-group page. Built around triage: a one-line headline taken from the message rather than the exception type, the full message and stack trace rendered as code, stack frames parsed into function/file/line with app frames highlighted and framework runs folded, breadcrumbs leading up to the error, contextual occurrence rows, an environment/app/reporter aside with a crash card for native crashes, and a 14-day occurrence sparkline.
- List pages share one anatomy. Errors, Reports, Sessions and People now use the same title row, filter toolbar with a
Clear filterscontrol, table styling and reading order. Tables get a distinct header band, visible row hover and focus, and right-aligned tabular numerals for numeric columns. - Numbered pagination. The four list pages replace opaque Previous/Next cursors with real numbered page links that state position in rows ("301–350 of 2,081"). Page number and size live in the URL, so pages are shareable and Back returns where you left. Very large lists show a capped total (for example "10,000+"). Reports and Sessions freeze the walk's base instant so rows arriving mid-walk cannot shift pages under you.
- AI-ready report envelope. Report detail gains an AI Envelope tab with copy-ready Markdown containing the title, description, AI overview, runtime variables, extra captured data and every breadcrumb, plus seven-day signed attachment and replay links that stay usable outside an authenticated dashboard session. A standalone, origin-restricted replay viewer accompanies it.
- Session Vitals controls. Each app's Overview gains a Session Vitals card (on/off, plus 100/50/10% sampling presets), and each project gains a vitals retention setting. An hourly sweeper removes vitals past the retention window.
- Billing. Both checkout flows — subscriptions and credit packs — now enable Stripe Tax, collect the customer's address and name, and collect VAT IDs so EU business customers can be reverse-charged instead of paying Lithuanian VAT they cannot reclaim. Subscription changes were reworked: upgrades prorate and charge immediately, downgrades take effect at the end of the current period, cancellation now distinguishes "will end on a date" from "ended", and cards needing reauthorization are handled.
- Mobile layout fixes across the dashboard.
For developers
Enabling Session Vitals. Vitals are off until switched on per app in the dashboard, and the dashboard is the source of truth: local SDK configuration can only opt out or lower the sample rate, never enable what the dashboard has off. Per-app settings are vitalsEnabled and vitalsSampleRate; per-project retention is configurable from 1 to 365 days, defaulting to 30. Data is ingested at POST /api/ingest/vitals under its own rate limits, and a disabled app is silently dropped rather than erroring. Configuration is only emitted to SDKs that advertise the vitals feature, so older SDKs are unaffected.
Web and React.
trackPlayer(opts)returns a handle and never throws; pass{ hls }or{ shaka }to attach the corresponding integration. Plain media elements are tracked automatically with no call at all.trackVitals(name, data)writes a custom entry onto the session timeline. Payloads are capped at 2 KB serialised and truncated rather than dropped.- React adds
useTrackPlayer(ref, opts). Declare it before the effect that callsloadSource()/load()so the integration's startup baseline is attached before the library emits its first event. - Neither hls.js nor Shaka is a dependency or peer dependency; any 1.x/4.x/5.x instance you already have works.
Modalgains adeferAutoFocusoption, used by the reporter to leave focus on the host page until after capture.
React Native.
trackPlayer(),trackVitals()anduseTrackPlayer()mirror the web surface, backed by a new player bridge.- A
vitalsconfig object acceptsenabled,sampleRateandcaptureSourceQuery. An out-of-rangesampleRateis dropped with a development warning rather than failing SDK start. - Adapters ship as separate entry points:
integrations/react-native-video(targets v7's headlessVideoPlayer; error capture is opt-in viacaptureErrors) andintegrations/theoplayer. Neither library is a dependency — the adapters use structural types only.
Android.
traceitx-coremoves to0.8.0and gainstrackPlayer/trackVitals.- Media3/ExoPlayer tracking lives in a new artifact,
com.traceitx:media3:0.8.0, used asTraceItX.trackPlayer(exoPlayer). It is built against Media3 1.8.0; 1.11 is not yet supported because it requirescompileSdk 36. - Native video replay requires Android 10 (API 29). Reporting works as before on older supported versions, without replay.
- The Android tree-replay producers are retired in favour of native video. Previously recorded tree replays remain readable in the dashboard.
iOS and tvOS.
TraceItX.shared.trackPlayer(_:name:)tracks anAVPlayer. Everything ships insideTraceItXKit— there is no new xcframework, subspec, SwiftPM product or Xcode target to add.VitalsConfigexposesenabled,sampleRateandcaptureSourceQuery.- The iOS tree replay implementation is removed and replaced by native video replay. Web rrweb replay is unchanged.
Admin API paging. The Errors, Reports, Sessions and People list endpoints accept a page parameter and return total plus totalIsLowerBound. Totals are capped at 10,000. The existing cursor parameter continues to work unchanged; sending both page and cursor in one request returns a 400.