For the complete documentation index, see llms.txt. This page is also available as Markdown.

Screen & Screenshot Masking

How masking works

Masking is applied on-device at screenshot-capture time, before the image is written to encrypted local storage or uploaded. Private regions are painted directly into the bitmap, so a raw, un-masked image is never stored or sent.

Two complementary controls are available and can be combined; manual marking stacks on top of the automatic type-based rules.

Control
When to use it
Scope

Automatic (type-based)

A blanket “mask every view of type X” safety net

All views of the declared type(s), app-wide

Manual (per-view)

Surgical — this specific view or subtree contains PII

The view and all of its descendants

Defaults & minimum versions

Item
Default
Min SDK

iOS auto type-based masking

Disabled (maskNothing)

iOS 11.12.0

WebView masking (iOS & Android)

On (WebViews masked)

19.3.0

Auto masking in Jetpack Compose (Android)

Enabled

13.4.0

Flutter auto masking

Disabled

Luciq SDK - 18.0.0 Instabug SDK - 16.0.0

Flutter private views (enablePrivateViews)

Enabled

Luciq SDK - 18.0.0 Instabug SDK - 16.0.0

Network key masking

Disabled

14.2.0

Repro Steps

Enabled Screenshots on for bug + session replay; off for crash (crash screenshots always disabled)

User Steps Privacy API

Disabled

19.7.0 on Android 19.7.0 on iOS


Automatic (type-based) masking

A single API call configures blanket rules applied to every screenshot the SDK captures. Available masking types:

Constant
What it masks

MASK_NOTHING

Disables all automatic masking

TEXT_INPUTS

Every text input field (EditText / Compose TextField, iOS UITextField / UITextView)

LABELS

Every text label / static text (TextView / Compose Text)

MEDIA

Every image or media view (ImageView / Compose Image)

WEB_VIEWS

Every WebView

Android

iOS

ReactNative

Flutter


Manual (per-view) masking

For specific views, mark the view itself rather than relying on type-based rules. Marking a ViewGroup or Compose parent automatically masks every descendant. The flag works on any view reference — including views inflated at runtime from server JSON — with no compile-time annotation, manifest entry, or XML attribute required.

Private-view behavior

  • Black overlay — the entire view area renders as a solid black rectangle.

  • Subtree masked — all child views are masked as well.

  • Real-time — masking applies to all screenshots captured during the session.

Precedence: on every platform the private-view API takes precedence over auto masking. Wrapping/marking a view as private is the way to guarantee it is always masked.

Android — classic views

Android — Jetpack Compose

iOS — SwiftUI & UIKit

React Native

Flutter


Masking and screen recording

Screen-recording behavior by platform

Screenshots (Repro Steps)
Screen recordings

Private views — iOS

Masked

Masked

Private views — Android

Masked

Not masked — use FLAG_SECURE

Auto type-based masking

Masked

Not applied

Last updated