SDK Feature Catalog
Compare Ansight SDK runtime, enrollment, capture, tooling, framework, and build-safety features across .NET, Android, iOS, React Native, Flutter.
This catalog covers the application-facing features in the latest Ansight SDK release. Use it to choose a platform and package, then follow the linked platform guide to install the latest release and find exact API names.
Legend:
- Yes: first-class implementation in that SDK.
- Native: the cross-platform adapter exposes the feature through its Android or iOS bridge.
- Framework: supplied by the named framework integration.
- Conditional: available only when the app opts in or the host/device supports it.
- No: not implemented for that SDK.
Runtime and Enrollment
| Capability | .NET / MAUI | Android | iOS | React Native / Expo | Flutter | Cordova / Capacitor |
|---|---|---|---|---|---|---|
| Initialize, activate, deactivate, and clear the runtime | Yes | Yes | Yes | Native | Native | Native |
| Custom metric channels and metric/event capture | Yes | Yes | Yes | Native | Native | Native |
| Periodically sampled app metric streams | Runtime.Metric(...) | AnsightMetricStream | AnsightMetricStream | No JavaScript sampler API | No Dart sampler API | No JavaScript sampler API |
| FPS, memory, and battery sampling | Yes | Yes | Yes | Native, plus React Native JS heap channels | Native, plus Flutter frame channels | Native |
| Open-file-handle sampling, opt-in | Yes where supported | Yes | Yes | Native | Native | Native |
| JNI-reference-count sampling, opt-in | Android target | Yes | No | Android native | Android native | Android native |
| Screen-view and app-lifecycle events | Yes; automatic in Ansight.Maui | Yes | Yes; automatic UIKit capture | Native plus AppState and React Navigation helpers | Flutter observer and Navigator helper | Document visibility and History API helper |
| Retained metric/event readback and debug snapshots | Yes | Yes | Yes | Native | Native | Native |
| Device and app profile reporting | Yes | Yes | Yes | Native | Native | Native |
| Live telemetry, event, touch, screenshot, and control streaming | Yes | Yes | Yes | Native | Native | Native |
| App-provided live-session logs | Yes | Yes | Yes | Native | Native | Native |
| HTTP request and response capture | HttpClient diagnostics, Apple native interception, explicit handler, and manual API | Typed manual API | Native URL Loading System interceptor and manual API | Opt-in fetch / XHR plus manual API | AnsightHttpClient plus manual API | Opt-in fetch / XHR plus manual API |
| App-configurable network sanitization | Yes | Mandatory native sanitizer | Mandatory native sanitizer | JavaScript hook, then native policy | Dart hook, then native policy | JavaScript hook, then native policy |
| Durable native crash capture and next-launch delivery | Yes | Yes | Yes | Native | Native | Native |
| Framework crash candidates | .NET exceptions | Native candidates | Native candidates | JavaScript errors and manual candidates | Dart errors and manual candidates | JavaScript errors and manual candidates |
| Grouped session properties and live mutations | Yes | Yes | Yes | Native | Native | Native |
| One-use CLI host QR enrollment | Yes | Yes | Yes | Native | Native | Native |
| Stable app-installation ID | Yes | Yes | Yes | Native | Native | Native |
Local UDP ENROLLMENT_CONNECT handshake | Yes | Yes | Yes | Native | Native | Native |
| Ephemeral WebSocket endpoint and session token | Yes | Yes | Yes | Native | Native | Native |
| Automatic enrolled reconnect | Yes | Yes | Yes | Native | Native | Native |
| Remembered-host retry / host auto-probe | Yes | Yes | Yes | Native | Native | Native |
| Explicit enrollment-payload connection | Yes | Yes | Yes | Yes | Yes | Yes |
| Cellular host connections, explicit opt-in | Yes | Yes | Yes | Yes | Yes | Yes |
| Unattended launch provisioning, explicit opt-in | Android/iOS native bridge | Yes | Yes | No wrapper API | No wrapper API | No wrapper API |
| SDK enrollment UI or QR entry point | Android/iOS UI through Ansight.Pairing | QR scanner and enrollment sheet | UIKit file import and QR scanner | JavaScript API backed by the native bridge | Dart API backed by the native bridge | JavaScript API backed by the native bridge |
| Connection status, capabilities, and change listeners | Yes | Yes | Yes | Native | Dart stream | JavaScript listener |
| SDK diagnostic log callbacks | Yes | Yes | Yes | Native listener | Dart stream | JavaScript listener |
Shared enrollment model
- The resident CLI host displays a short-lived, one-use QR invite from
ansight pairing issue --qr. - The SDK scans it and sends
ENROLLMENT_CONNECTover local UDP. - The host binds the invite to the SDK’s reported App ID and random app-installation ID. No prior app registration is required.
- The host returns an ephemeral
ws://endpoint and session token. - The enrolled installation saves the returned state and reconnects on later launches.
Simulator, emulator, Mac Catalyst, and desktop targets use automatic loopback registration and skip the QR flow entirely.
Clearing app data or reinstalling creates a new installation ID and requires a fresh scan. Enrollment does not authorize remote tools: the app’s tool guard remains a separate policy boundary.
Capture and Diagnostics
| Capability | .NET / MAUI | Android | iOS | React Native / Expo | Flutter | Cordova / Capacitor |
|---|---|---|---|---|---|---|
| Periodic live JPEG capture | Yes | Yes | Yes | Native | Native | Native |
| Screenshot-aligned visual-tree capture | Yes | Yes | Yes | Native plus registered framework sources | Native mobile; Flutter boundary on macOS | Native plus DOM source |
| Touch-triggered visual-tree capture | Yes | Yes | Yes | Native plus registered framework sources | Native mobile; Flutter boundary on macOS | Native plus DOM source |
| Keyboard-presence replay metadata, opt-in | Yes | Yes | Yes | Native | Native | Native |
On-demand screenshot through ui.get_screenshot | Yes | Yes | Yes | Native | Native | Native |
| GPU-backed surface capture option | Accepted for parity | Accepted for parity | Yes | Native; meaningful on iOS | Native; meaningful on iOS | Native; meaningful on iOS |
| Host-owned simulator or emulator screenshots | Yes | Yes | Yes | Native | Native | Native |
| Touch capture and runtime enable/disable | Yes | Yes | Yes | Native | Native | Native |
| Opt-in app-fed shake and accelerometer events | Yes | Yes | Yes | Native | Native | Native |
| Opt-in OS connectivity state and supported quality estimates | Native mobile; availability only on portable desktop | Yes | Yes | Native | Native | Native |
| Apple Pencil and Android stylus/eraser contact and hover details | Native | Yes | Yes | Native | Native on mobile | Native |
| Touch-capture app guard | Yes | Yes | Yes | Native toggle; JavaScript policy is app-owned | Native toggle; Dart policy is app-owned | Native toggle; JavaScript policy is app-owned |
| Native visual-tree provider | Yes | Yes | Yes | Native | Native on mobile; Flutter source on macOS | Native |
| Framework visual-tree source | MAUI | — | — | Separate react.* tools | Flutter source plus flutter.* tools | Separate dom.* tools |
Current runtimes advertise screenshot-control version 1 in device.profile. The CLI host can select host capture mode for a simulator or emulator; the SDK then suspends its periodic in-app JPEG loop while the host uses a platform source such as simctl or adb. Without a host-capture response, the configured SDK JPEG capture continues.
Screen capture adds rendering, encoding, and transport work. Disable periodic capture for trend-focused measurements unless visual evidence is required.
Remote Tools and Extensibility
All remote tools use the shared tool.query, tool.call, and tool.batch
protocol. Catalog schema v2 supports deterministic revisions, conditional
refresh, capability manifests, runtime availability, and compressed large JSON
responses. See Remote Tool Protocol for the exact
wire contract. Read-only, read/write, and full-access guards set one ordered
maximum: Read, Write, or Critical.
| Suite or extension | .NET / MAUI | Android | iOS | React Native / Expo | Flutter | Cordova / Capacitor |
|---|---|---|---|---|---|---|
| Custom tool registration and schemas | Yes | Yes | Yes | JavaScript and native | Dart | JavaScript |
| Dynamic tool availability and remediation | Yes | Yes | Yes | Native; JavaScript tools are available while registered | Native; Dart tools are available while registered | Native; JavaScript tools are available while registered |
| Runtime feature package initialization | IRuntimeFeature | No | No | No | No | No |
| App artifact providers and binary export | Yes | Yes | Yes | JavaScript provider with native binary transport | Dart provider with native binary transport | JavaScript provider with native binary transport |
Visual tree, screenshot, inspection, and overlays (ui.*) | Yes | Yes | Yes | Native | Native plus Flutter source | Native |
Compact visual-tree v2 contract (types / typeId, semantics, presentation) | Yes | Yes | Yes | Native plus React sources | Native plus Flutter source | Native plus DOM source |
Sandboxed files and binary download (files.*) | Yes | Yes | Yes | Native | Native | Native |
File-descriptor diagnostics (file_descriptors.*) | No | Yes | Yes | Native aggregate defaults | Native aggregate defaults | Native aggregate defaults |
JNI reference graph (jni_references.capture_graph) | Android target | Yes | No | Android native aggregate defaults | Android native aggregate defaults | Android native aggregate defaults |
Preferences (prefs.*) | Yes | Yes | Yes | Native | Native | Native |
Secure storage (secure.*) | Yes | Yes | Yes | Native | Native | Native |
SQLite discovery, schema, and read query (data.*) | Yes | Yes | Yes | Native | Native | Native |
Device clipboard (clipboard.*) | Yes | Yes | Yes | Native | Native | Native |
Purchase observations and validation (purchases.*, opt-in) | Core plus Apple/Play adapters | Core plus optional Play adapter | Core plus StoreKit 2 | Native core facade | Native core facade | Native core facade |
Registered-root reflection (reflect.*) | Yes | Yes | Yes | Native | Native | Native |
.NET MAUI inspection and mutation (maui.*) | Framework | No | No | No | No | No |
React component/shadow tree and actions (react.*) | No | No | No | Framework | No | No |
Flutter widget tree, search, and navigation (flutter.*) | No | No | No | No | Framework | No |
WebView DOM tree, query, and guarded actions (dom.*) | No | No | No | No | No | Framework |
App artifact providers advertise dynamically available exports through artifacts.query and create a requested snapshot through artifacts.request. Requested bytes use the live binary file-transfer channel, so artifact creation requires an active host session.
Shared tool IDs
| Suite | Tool IDs |
|---|---|
| App artifacts | artifacts.query, artifacts.request |
| Visual tree | ui.get_visual_tree, ui.get_screenshot, ui.inspect_node, ui.show_overlay, ui.get_overlay, ui.query_overlays, ui.update_overlay, ui.remove_overlay, ui.clear_overlays |
| Files | files.list_directory, files.read_file, files.get_file_checksum, files.download_file, files.begin_binary_download, files.push_file, files.copy_file, files.move_file, files.delete_file |
| File descriptors | file_descriptors.list_open, file_descriptors.count_open, file_descriptors.inspect, file_descriptors.get_usage |
| JNI reference diagnostics | jni_references.capture_graph |
| Preferences | prefs.list_keys, prefs.get_value, prefs.set_value, prefs.remove_key |
| Secure storage | secure.get_value, secure.set_value, secure.remove_key |
| Database | data.list_databases, data.describe_schema, data.query |
| Clipboard | clipboard.get_text, clipboard.has_text, clipboard.set_text, clipboard.clear |
| Purchases | purchases.get_state, purchases.query_products, purchases.query_transactions, purchases.get_entitlements, purchases.get_events, purchases.validate |
| Reflection | reflect.list_roots, reflect.inspect_object, reflect.describe_type, reflect.set_member_value, reflect.invoke_method |
| .NET MAUI | maui.get_current_page, maui.get_visual_tree, maui.find_elements, maui.get_element, maui.get_bindable_property, maui.set_bindable_property, maui.clear_bindable_property, maui.inflate_xaml, maui.add_element, maui.remove_element, maui.set_app_theme, maui.get_binding_context, maui.get_bindings, maui.get_resource_state, maui.get_navigation_state, maui.invoke_element_action, maui.wait_for_ui, maui.get_layout_diagnostics, maui.get_handler_diagnostics, maui.invoke_binding_context_command, maui.set_binding_context_property |
| React Native | react.get_component_tree, react.get_shadow_tree, react.find_components, react.get_component, react.get_navigation_state, react.invoke_component_action |
| Flutter | flutter.get_widget_tree, flutter.inspect_widget, flutter.find_widgets, flutter.get_navigation_state |
| Cordova / Capacitor DOM | dom.get_document, dom.inspect_node, dom.query_selector, optional dom.invoke_action |
The file-descriptor suite is native-only. There is no Ansight.Tools.FileDescriptorDiagnostics NuGet package. Cross-platform bridges receive the suite through native aggregate defaults but do not expose suite-specific framework options.
JNI reference diagnostics is Android-only. Native Android can configure the graph maxima; .NET Android registers it through Ansight.Core. React Native, Flutter, and Cordova/Capacitor inherit it from Android all-in-one defaults without suite-specific JavaScript or Dart configuration. HPROF capture briefly pauses the app and is intended for explicit development investigations.
Flutter macOS capture is framework-owned. Wrap the app in
AnsightFlutterCaptureBoundary to retain Flutter-compositor screenshots,
timestamp-correlated Flutter visual trees, Flutter-derived FPS, and pointer
evidence. The boundary follows the configured JPEG cadence and deduplicates
unchanged frames. Native AppKit screenshots, visual-tree inspection/actions,
and input outside the boundary are not currently captured.
Framework and Workflow Features
| Feature | Availability | Package or entry point |
|---|---|---|
| .NET all-in-one developer defaults and native tools | .NET | Ansight / WithAnsightSdk(...) |
| MAUI bootstrap, automatic lifecycle, and page-view telemetry | .NET MAUI | Ansight.Maui / UseAnsight<App>() |
| MAUI inspection, XAML inflation, mutation, resources, bindings, navigation, layout, and handler diagnostics | .NET MAUI | Ansight.Tools.Maui |
| App-fed shake and accelerometer capture | All mobile SDKs; app-owned motion handlers | Motion Capture |
| Native in-app annotations with screenshots, visual trees, a retry outbox, and live delivery | Android and iOS Debug app builds through native, .NET, React Native, Flutter, and Capacitor packages | Annotated Feedback |
| Managed annotation capture with hooks, artifacts, and optional offline sink | .NET Android, iOS, and Mac Catalyst Debug app builds | Ansight.Annotations |
| Passive connection state, transport changes, and supported quality estimates | All mobile SDKs; availability only on portable .NET desktop | Connectivity Capture |
| Native offline recording, configurable retention, recovery, and automatic/manual host transfer | All mobile SDKs on Apple/Android; implemented after 1.8.0, matching host required | Offline Capture |
| Managed offline telemetry, events, touches, network requests, connectivity, screenshots, annotation bundles, retention, and ZIP/AES export | .NET; team upload requires the separate Ansight.Cloud.OfflineCapture integration | Ansight.OfflineCapture |
| Startup, CPU, GC, JIT, exception, thread, and call-tree profiling | Beta; .NET Android and iOS application artifacts | Ansight.Profiling.DotNet |
| Purchase evidence and entitlement validation | Every SDK on Apple simulators and recognized Android emulators | Purchase Diagnostics |
| Objective-C facade | iOS | AnsightObjC |
| React component and shadow-tree inspection | React Native | installReactTools(...) |
| React Navigation route tracking | React Native | createReactNavigationTracker(...) |
| Unhandled JavaScript error and rejection capture | React Native | installErrorHandlers(...) |
| Flutter widget/render-object inspection and navigation state | Flutter | AnsightFlutterInstrumentation.install() |
| Flutter frame build, raster, total, and count channels | Flutter | AnsightFlutterInstrumentation.install() |
| WebView DOM inspection and optional guarded actions | Cordova / Capacitor | .withDomTools(...) |
| History API route tracking and JavaScript error capture | Cordova / Capacitor | createRouteTracker(...) and .withErrorCapture() |
Ansight and Ansight.Maui reference annotation and offline-capture packages. Annotated feedback is registered by default in Debug application builds and hard-disabled in Release builds; WithAnnotatedFeedback(...) customizes it. The managed recorder uses an OfflineCaptureController. Native offline capture opts in through WithOfflineCapture(...) / withOfflineCapture(...) and must not run alongside a parallel managed recorder.
Package Map
| Capability | .NET | Android | iOS | React Native / Expo | Flutter | Cordova / Capacitor |
|---|---|---|---|---|---|---|
| Core runtime | Ansight.Core | ai.ansight:ansight-core-android | AnsightCore | Native dependency | Native dependency | Native dependency |
| Motion capture | Ansight.Motion | ai.ansight:ansight-motion-android | AnsightMotion | Package facade over native core | Package facade over native core | Package facade over native core |
| Connectivity capture | Ansight.Connectivity | ai.ansight:ansight-connectivity-android | AnsightConnectivity | Package facade over native core | Package facade over native core | Package facade over native core |
| All-in-one runtime | Ansight | ai.ansight:ansight-android | Ansight | @ansight/react-native | ansight_flutter | @ansight/capacitor |
| Enrollment UI | Ansight.Pairing | ai.ansight:ansight-pairing-android | AnsightPairingQR | Native enrollment bridge | Native enrollment bridge | Native enrollment bridge |
| Visual tree tools | Ansight.Tools.VisualTree | ai.ansight:ansight-tools-visualtree-android | AnsightToolsVisualTree | Native plus React tools | Native plus Flutter tools | Native plus DOM tools |
| File tools | Ansight.Tools.FileSystem | ai.ansight:ansight-tools-filesystem-android | AnsightToolsFileSystem | Native bridge | Native bridge | Native bridge |
| File-descriptor diagnostics | — | ai.ansight:ansight-tools-filedescriptordiagnostics-android | AnsightToolsFileDescriptorDiagnostics | Native aggregate defaults | Native aggregate defaults | Native aggregate defaults |
| JNI reference diagnostics | Ansight.Core on Android | ai.ansight:ansight-tools-jnireferencediagnostics-android | — | Android native aggregate defaults | Android native aggregate defaults | Android native aggregate defaults |
| Preferences tools | Ansight.Tools.Preferences | ai.ansight:ansight-tools-preferences-android | AnsightToolsPreferences | Native bridge | Native bridge | Native bridge |
| Secure-storage tools | Ansight.Tools.SecureStorage | ai.ansight:ansight-tools-securestorage-android | AnsightToolsSecureStorage | Native bridge | Native bridge | Native bridge |
| Database tools | Ansight.Tools.Database | ai.ansight:ansight-tools-database-android | AnsightToolsDatabase | Native bridge | Native bridge | Native bridge |
| Clipboard tools | Ansight.Tools.Clipboard | ai.ansight:ansight-tools-clipboard-android | AnsightToolsClipboard | Native bridge | Native bridge | Native bridge |
| Purchase diagnostics | Ansight.Core | ansight-core-android; optional ai.ansight:ansight-purchases-googleplay-android | AnsightCore | Package facade over native core | Package facade over native core | Package facade over native core |
| Reflection tools | Ansight.Tools.Reflection | ai.ansight:ansight-tools-reflection-android | AnsightToolsReflection | Native bridge | Native bridge | Native bridge |
| MAUI integration and tools | Ansight.Maui, Ansight.Tools.Maui | — | — | — | — | — |
| Annotated feedback | Ansight.Annotations | ai.ansight:ansight-annotations-android | AnsightAnnotations | Native bridge | Native bridge | Native bridge |
| Native offline capture (after 1.8.0) | Ansight.Core on Apple/Android | ansight-core-android | AnsightCore | Native bridge | Native bridge | Native bridge |
| Managed offline capture | Ansight.OfflineCapture | — | — | — | — | — |
| .NET startup profiling (Beta) | Ansight.Profiling.DotNet | — | — | — | — | — |
| Objective-C facade | — | — | AnsightObjC | Used by the iOS bridge | Used by the iOS bridge | Used by the iOS bridge |
| Framework inspection | — | — | — | react.* | flutter.* | dom.* |
All-In-One Defaults
The all-in-one developer preset is aligned across .NET, Android, and iOS:
| Setting | Value |
|---|---|
| Sampling | 400ms |
| Retention | 120s |
| FPS | Enabled |
| Battery | Disabled |
| JPEG capture | Enabled, 2000ms, quality 60, max width 480, screenshot-only mode, keyboard presence disabled; iOS GPU-backed capture defaults to enabled |
| Touch capture | Enabled |
| Connectivity capture | Disabled; enable explicitly with WithConnectivityCapture() / withConnectivityCapture() |
| Crash capture | Enabled; host handoff and offline attachment enabled, 8 reports, 7-day retention, 64 breadcrumbs, 1 MiB trace limit |
| Open-file-handle sampling | Disabled |
| JNI-reference-count sampling | Disabled |
| Host auto-probe | Enabled |
| Cellular host connections | Disabled |
| Unattended launch provisioning | Disabled |
| Tool guard | Full access in native all-in-one developer presets |
| Standard tools | Added by aggregate/all-in-one packages, including Clipboard |
React Native defaults to core mode unless useNativeAllInOneDefaults: true is passed or withAnsightDefaults() / withAnsightSdk(...) is used. Flutter AnsightOptions.developer() and Cordova/Capacitor .withAnsightDefaults() select aligned developer presets. Crash capture is a core default rather than an all-in-one-only feature. None of these APIs detects build type; the app must apply its own development guard and choose tool, capture, crash-retention, and enrollment policy.
Build-Time Safeguards
| Capability | .NET / MAUI | Android | iOS | React Native / Expo | Flutter | Cordova / Capacitor |
|---|---|---|---|---|---|---|
| App-controlled development guard for enrollment and broad tools | Yes | Yes | Yes | Native rules plus JavaScript app policy | Native rules plus Dart app policy | Native rules plus JavaScript app policy |
| Detect bundled remote-tool implementations | AnsightRemoteToolsPolicy | No SDK build scanner | Build tool; requires ANSIGHT_ALLOW_REMOTE_TOOLS=true | Native build rules apply | Native build rules apply | Native build rules apply |
| Hard-disable annotated feedback in Release builds | Yes | Yes | Yes | Native bridge | Native bridge | Native bridge |
Developer enrollment UI and broad remote-tool access are development features. Do not auto-launch enrollment or ship unrestricted tool policies in CI, store, TestFlight, Play Store, or other distributable builds.
Platform Privacy
- Android merges required network settings automatically; Google Code Scanner avoids a host-app camera permission.
- iOS requires Camera and Local Network usage descriptions when those features are invoked.
- No SDK needs Bluetooth, location, contacts, or photo-library access for enrollment.
- Clipboard reads can expose sensitive user content and may invoke the operating system’s paste-permission flow. Tool diagnostics redact clipboard values.
- Purchase diagnostics are simulator/emulator-only and retain bounded, app-reported evidence without exporting raw receipts, tokens, or transaction identifiers.
- Enrollment and the current local WebSocket transport do not encrypt or authenticate the network path. Use Ansight only on a trusted local network.