hindsight_flutter 0.9.8 copy "hindsight_flutter: ^0.9.8" to clipboard
hindsight_flutter: ^0.9.8 copied to clipboard

Session replay for Flutter tree/state-delta capture with compact scene-graph encoding.

Changelog #

0.9.8 #

  • Performance (heavy first capture): the per-capture privacy pre-walk resolved masking rules with an O(elements x rules) widget is T scan — with a typical blocklist of ~30 mask<T>() rules this dominated capture time (measured ~90% of a heavy screen's capture). Rule resolution is now memoized per widget runtimeType (a type rule's match depends only on runtimeType, subtype matches included), turning it into O(distinct runtimeTypes x rules) + O(1) lookups. On a ~30-rule heavy list this cut total capture time ~3.8x (privacy walk ~5.6x). Callback rules stay per-instance; the cache invalidates on any rule change.

0.9.7 #

  • Performance: a keyboard/overlay inset animation fires didChangeMetrics every frame (up to 120/s). Each one previously emitted a viewport_metrics event and scheduled an anchored capture, flooding the buffer and janking the UI thread during transition-heavy moments (e.g. opening the organize/summary overlay). It is now throttled (leading + trailing, 250ms window) so a burst coalesces to ~2 events with the settled metrics, instead of hundreds.

0.9.6 #

  • Battery: focus changes that keep the keyboard up (moving from one field to another) no longer emit a redundant focus event or schedule an anchored tree capture + snapshot. Only a real has_focus transition (keyboard shown/hidden) does. Eliminates a storm of O(tree) walks during form navigation.

0.9.5 #

  • Captures one CLEAN keyframe per route/overlay transition instead of sampling a mid-animation pose. A new HindsightTransitionGate tracks the in-flight route animation (via its status, endpoint-agnostic so a cancelled back-swipe cannot leak) and a transient-callback quiet window for routeless overlays; while a transition is in flight all route/pointer/focus/metrics-driven content captures are deferred, and exactly one settled capture runs when the animation completes. This removes the dropped-first-frame jank and the mid-animation tree state that made replays drift and freeze. The navigator observer no longer fires a mid-slide layer-activity notify.
  • Adds HindsightVisualSource.currentColor so vector adapters can record the resolved SVG currentColor separately from a srcIn color tint; the collector emits it as current_color on vector nodes.

0.9.4 #

  • Stops route/dialog/overlay transitions from running full tree captures on the animation's frames. A focus or viewport-metrics change no longer triggers an immediate plus two follow-up forced captures (previously at 0ms/80ms/280ms); it now schedules a single capture after the transition settles. The route and focus events still mark the user flow and the player interpolates the animation, so transition fidelity is preserved while the host app keeps its first animation frame. Fixes the dropped-first-frame jank when opening or closing dialogs and pushing/popping routes.
  • Stops the settle-verify capture from forcing a tree walk onto a follow-up scroll's frames. After an emitting capture the verify pass is deferred to the scroll-settle path whenever a new scroll has begun, so repeated swipes no longer trigger a self-sustaining ~400ms forced-walk loop that stuttered mid-scroll. The final settled state is still captured once the scroll ends.
  • Player: scroll traces now expand each per-sample observed time onto the inactivity-detection axis instead of collapsing the whole span to a single frame time. A genuine (long or isolated) scroll span is no longer mislabeled as an idle gap and fast-forwarded ("skip x16").

0.9.3 #

  • Changes the default active-scroll content policy to defer expensive Flutter tree captures until scroll settle. scrollContentCaptureMinInterval now defaults to Duration.zero, so scroll gestures keep recording offset traces without doing periodic full tree walks on the UI isolate.
  • Keeps mid-scroll content keyframes available as an explicit opt-in: set a positive scrollContentCaptureMinInterval when the extra replay fidelity is worth the host app performance cost.
  • Replaces active-scroll viewport observation's per-frame render-tree scan with tracked scroll targets discovered from pointer hit-tests and scroll notifications. Apps that consume ScrollNotifications still get scroll offset sampling without the recorder walking unrelated render subtrees every frame.

0.9.2 #

  • Stops generic Flutter animation/ticker frames from being treated as replay layer activity. This removes the periodic full-tree capture loop that could make host apps stutter and heat up when replay was enabled.
  • Keeps explicit capture triggers intact: initial snapshots, pointer/tap-driven updates, scroll content cadence, route transitions, focus/viewport changes, and deferred shader-mask captures still schedule replay layer captures.

0.9.1 #

  • Stops replay asset readiness from forcing another full layer capture. Raster, image, painter, leaf-raster, and platform-view nodes now emit stable image_ref values during the first collection and publish bytes asynchronously under the same ref.
  • Keeps shader-mask deferred capture behavior, where a follow-up tree capture is still needed because the mask JSON itself is attached to captured nodes.

0.9.0 #

  • Initial public release of the Hindsight Flutter session replay SDK.
  • Captures Flutter UI as structured scene-graph layers, text, visual layers, scroll context, route changes, breadcrumbs, and errors.
  • Keeps static UI text visible by default so replays remain legible.
  • Masks user input by default through maskAllInputs: true; obscured fields are always masked with no opt-out.
  • Adds targeted privacy controls through HindsightRedact, Hindsight.mask<T>(), Hindsight.unmask<T>(), Hindsight.maskCallback<T>(), gesture privacy, image privacy, and debug masking overlays.
  • Adds visual source boundaries so optional adapters can capture declared UI vectors as structured vector metadata instead of PNG readbacks.
  • Reuses unchanged unknown canvas leaf rasters from frame signals instead of waking or re-encoding from wall-clock age alone.
  • Adds opt-in error hooks, HTTP/Dio breadcrumbs, console breadcrumbs, device breadcrumbs, session lifecycle controls, durable pending uploads, and remote SDK config polling.
  • Adds Android/iOS native plugin support for platform-view capture.
0
likes
130
points
79
downloads

Documentation

API reference

Publisher

verified publisherunlimit.ing

Weekly Downloads

Session replay for Flutter tree/state-delta capture with compact scene-graph encoding.

License

Apache-2.0 (license)

Dependencies

archive, flutter, http

More

Packages that depend on hindsight_flutter

Packages that implement hindsight_flutter