Support matrix
Replay envelope
Flutter replay is always sent as mobile screenshot replay:RepaintBoundary image from LucentWidget, encodes
it as a mobile screenshot wireframe, and posts batches to /api/sdk/replay.
The backend classifies these sessions as mobile_flutter.
Persistence and retry
Replay batches are persisted on disk before upload on iOS and Android. Failed uploads remain queued for retry.
Android also persists current in-memory replay events between flushes, so
active events can survive a process restart before they become an upload batch.
flush() is best effort. If the network request fails, the persisted batch
stays queued and is retried later.
When LucentWidget sees the app pause or become inactive, it emits
Application Backgrounded and requests a flush. When the app resumes, it emits
Application Became Active.
Configuration
PassLucentConfig to Lucent().setup(...).
Core
When
remoteConfig is enabled, native replay waits for /api/sdk/init before
auto-starting. If the request fails, the SDK falls back to local config.
Remote config can disable recording, override session sample rate, update
batching limits, change minimumDuration, toggle log/network telemetry, and
replace eventTriggers.
Privacy
LucentMask forces masking for a subtree. LucentNoMask makes its subtree
visible, so keep sensitive widgets outside any LucentNoMask region.
Capture
Batching
Native code clamps flush interval, event count, and byte limits to bounded
ranges so misconfiguration does not create extremely small or huge batches.
Replay
snapshotMode is not configurable. It is always screenshot.
Metadata and properties
Use
Lucent().setSessionProperties(...) and Lucent().setUserProperties(...)
when values change during a session.
The native payload also includes common mobile context: userAgent, language,
snapshotSource, snapshotLibrary, snapshotMode, os, deviceType, and
environment.
Public API
getSessionInfo() returns sessionId, windowId, and recordingEnabled.
Use runZoned(..., onError: handler) if your app already has its own
top-level async error handler.
Navigation reference
LucentObserver accepts two optional callbacks:
For routers that do not expose named
PageRoutes, call Lucent().screen(...)
from your router listener instead.
Network privacy
Automatic network capture is limited todart:io HttpClient traffic created
inside Lucent().runZoned(...). Other HTTP clients need a wrapper or
interceptor that calls captureNetworkRequest or captureNetwork.
Lucent captures:
Because headers and bodies are not captured, there are no per-field masking
rules for them. Sanitize URLs before manual capture if a path segment contains
sensitive data.
Error and crash behavior
Native crash delivery is best effort. If the process cannot write the pending
crash payload before termination, there may be no next-launch crash event.
Parity checklist
Not in the Flutter MVP
These browser or React Native capabilities are not available inlucent_flutter 0.1.0: