Skip to main content
Use this page when you need the exact Flutter SDK behavior and option surface. For setup instructions, start with the Flutter SDK guide.

Support matrix

Replay envelope

Flutter replay is always sent as mobile screenshot replay:
The SDK captures a masked 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

Pass LucentConfig 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.
Flutter does not have browser-style CSS selectors. Review any LucentNoMask subtree carefully before shipping.

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. 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 to dart: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 in lucent_flutter 0.1.0:

Troubleshooting