Skip to main content
The behavior SDK’s privacy posture is the difference between “this thing is invasive” and “this thing is acceptable to ship”. This page lists what is collected, what is not, and the permissions involved.

What is collected

What is never captured

The following classes are not collected by any code path:
  • Text content (typed, displayed, or in clipboard).
  • Audio (mic).
  • Images (camera, screenshots).
  • Location (GPS, network location, geofencing).
  • Contacts.
  • Calendar entries.
  • Browser history.
  • Network requests originating from the app (the SDK does not call out to the network at all — see “Outbound traffic” below).

Outbound traffic

The SDK itself makes no outbound network calls. There is no HTTP client in the synheart-behavior source. Cloud delivery, when desired, happens through synheart-core → the Synheart runtime’s ingest connector, which:
  • Gates on Behavior and cloudUpload consent.
  • Hashes subject_id; the raw value never leaves the device.
  • Signs requests with the device’s hardware key (see Synheart Auth).
The SDK alone does not transmit any data anywhere.

Platform permissions

Since Flutter 0.4.1 and Kotlin 0.6.0 the libraries declare these permissions in their own Android manifests, so your app inherits them:
  • Flutter: BIND_NOTIFICATION_LISTENER_SERVICE, READ_PHONE_STATE and the notification listener service.
  • Kotlin: BIND_NOTIFICATION_LISTENER_SERVICE, ACCESS_NETWORK_STATE and the notification listener service (add READ_PHONE_STATE yourself for call events).
Remove any you don’t use with tools:node="remove" in your manifest. checkNotificationPermission() / requestNotificationPermission() and the call-permission equivalents exist on all three SDKs. On iOS, notification events come from the host forwarding its UNUserNotificationCenter delegate callbacks (or the SDK installed as the delegate).

Adversary model

Implementation invariants

The SDK holds to these invariants:
  1. No string captured from input fields. BehaviorEventType.typing events carry only timing fields in their metrics map.
  2. No clipboard contents. ClipboardAction and ClipboardContext enums encode the action/location, not the payload.
  3. No notification body or title. InterruptionAction enum is the only notification-derived field on events.
  4. No outbound HTTP from the SDK. No HTTP clients imported in any of the four SDK packages.
  5. No background data persistence by the SDK. Events flow through streams; aggregates are computed in-memory and surface as BehaviorSessionSummary. Hosts decide whether to persist.
If any of these change, this page is a release blocker until the threat model is updated.
All four gates must allow for behavioral data to leave the device. Any one closes the loop.

Logging policy

The SDK logs at info / warn levels in production. Logs include:
  • Session lifecycle (session_start, session_end, durations).
  • Permission state changes.
  • Inference latency (motion-lite).
The SDK does not log:
  • Event-level payloads (no event-by-event logs).
  • User identifiers (raw userId / deviceId are never written to logs unless the host injects them).
  • Motion sample bytes.
  • Inference inputs.