SDK Feature Catalog
Compare the current Ansight SDK runtime, enrollment, capture, tooling, framework, and build-safety features across .NET, Android, iOS, React Native, Flutter, and Cordova/Capacitor.
This catalog reflects the application-facing features implemented in Ansight SDK 1.3.0-preview.10. Use it to choose a platform and package, then follow the linked platform guide for setup and 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 metadata capture | Opt-in AnsightHttpMessageHandler | No V1 interceptor | No V1 interceptor | No V1 interceptor | No V1 interceptor | No V1 interceptor |
| 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 plus Flutter source | Native plus DOM source |
| Touch-triggered visual-tree capture | Yes | Yes | Yes | Native plus registered framework sources | Native plus Flutter source | 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 |
| 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 plus Flutter source | 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 performance-focused measurements unless visual evidence is required.
Remote Tools and Extensibility
All remote tools use the shared tool.query and tool.call protocol and are subject to the configured tool guard. Read-only, read/write, and full-access guards progressively expose Read, Write, and Delete scopes.
| 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 |
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 |
| 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.
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 |
| Annotated in-app feedback with screenshots, visual trees, hooks, artifacts, outbox, and live/offline delivery | .NET Android, iOS, and Mac Catalyst Debug app builds | Ansight.Annotations |
| Offline telemetry, events, touches, screenshots, annotation bundles, retention, ZIP/AES export, and team upload | .NET | Ansight.OfflineCapture |
| 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 the annotation and offline-capture packages, but neither workflow starts automatically. Annotated feedback must be explicitly enabled and is hard-disabled in Release application builds. Offline capture starts only after the app configures and initializes an OfflineCaptureController.
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 |
| 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 |
| 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 | — | — | — | — | — |
| Offline capture | Ansight.OfflineCapture | — | — | — | — | — |
| 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 |
| Crash capture | Enabled; Studio 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 |
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 | Not available | Not available | Not available | Not available | Not available |
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.
- Enrollment and the current local WebSocket transport do not encrypt or authenticate the network path. Use Ansight only on a trusted local network.