> ## Documentation Index
> Fetch the complete documentation index at: https://developer.neurofit.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> Release notes for the NEUROFIT Vitals SDK.

## 1.0.0 (2026-09-30)

First release. Engine 1.3.0, the same engine and settings as the NEUROFIT app's Vitals feature. SDK build date
2026-09-30.

**Platforms**

* iOS 15+: Swift package `NeurofitVitals`, delivered as an xcframework (binary license; needs Xcode 27 or newer)
  or Swift package sources (source license; building the sources needs Xcode 16 or newer; products
  `NeurofitVitals`, dynamic, and `NeurofitVitalsStatic`). No third-party dependencies: the binary xcframework has
  the engine built in, and the source package also needs the bundled `PpgCore` engine package
  (`ppgcore/ports/swift`) next to it.
* Android 9+ (API 28): Kotlin AAR `com.neurofit:vitals-sdk:1.0.0`, CameraX 1.5.0, JVM 17, explicit API.
* No torch requirement: a device whose rear camera has no torch is supported and reads without one.
* Wrappers: `@neurofit/vitals-react-native`, `neurofit_vitals` (Flutter), `@neurofit/vitals-capacitor`
  (Capacitor 6).
* Sample apps: SwiftUI (`com.neurofit.vitals.sample`) and Android Views (`com.neurofit.vitals.sample`).

**API**

* A small API, the same shape on both platforms: `VitalsSDK` (`version`, `activate`, `deviceSupport`,
  `hasCameraPermission`, `requestCameraPermission`), `VitalsSession` (`start`, `stop`, `cancelReading`,
  `isAutoStartEnabled`, `events`; iOS also `previewLayer`), and exactly eight events: `guidance`, `started`,
  `preview`, `heartbeat`, `cancelled`, `measurementComplete`, `completed`, `failed`.
* Four cancel reasons (`contactLost`, `poorSignal`, `interrupted`, `cancelledByApp`) and seven errors
  (`notActivated`, `licenseInvalid`, `cameraPermissionDenied`, `cameraUnavailable`, `unsupportedDevice`,
  `noHeartRate`, `internalError`).
* No configuration: every session runs the validated 60-second reading with the production settings.

**Metrics**

* Heart rate, HRV (RMSSD), SDNN, Baevsky stress index, Poincaré SD2:SD1 and breathing rate, with a quality tier
  (`clean`, `usable`, `withheld`). `VitalsResult` has a public initializer and is `Codable` on iOS.
* Accelerometer-assisted breathing rate, with a confidence tier in `breathingRateConfidence` (`high`: measured
  from the phone's motion; `medium`: a strong camera estimate; `low`: a weaker camera estimate, shown as
  approximate).

**Reading**

* Guidance values `noContact`, `lowQuality`, `weakSignal`, `compliant`, `frameDrop`; the reading starts by itself
  once the fingertip is steady. A live preview about once per second with a provisional HRV (RMSSD) from about
  20 s and a ready-to-display signal level; heartbeat events.
* Automatic restart: a cancelled attempt returns to positioning and the next reading starts by itself.
* Interruptions recover by themselves: backgrounding or another app taking the camera (on iOS also a phone call,
  Split View or a media-services reset) cancels a reading in progress with `cancelled(interrupted)`, and the
  session resumes positioning when the cause clears. A capture that cannot be restored ends the session with
  `cameraUnavailable` after 10 seconds of failed recovery in the foreground, on both platforms.
* A low frame rate never ends a session: positioning shows `frameDrop` guidance and waits. Only a second camera
  stall, or a camera that cannot be restored, ends it with `cameraUnavailable`.
* A finished reading is never lost: once `measurementComplete` has arrived, the session delivers its result even
  after `stop()`, and on iOS even when the host releases the session.
* `isAutoStartEnabled` holds the start while the camera keeps positioning.

**Licensing**

* Offline license keys (`NFV1.` format, ECDSA P-256), verified against a public key compiled into the SDK.
  Perpetual license with `updatesUntil` maintenance semantics. The app-identifier check is relaxed for debuggable
  Android apps (runtime) and for Debug builds of the iOS SDK sources (compile time).

**Privacy**

* No network calls, no persistence, no telemetry. `PrivacyInfo.xcprivacy` declares no tracking and no collected
  data types. Camera frames are analysed in memory and discarded.

**Validation**

* 30 participants, 265 accepted readings against a Polar H10 chest strap: heart rate 0.46 bpm mean absolute error;
  HRV (RMSSD) 3.39 ms, r 0.979, 94.7% within 10 ms. See [Metrics](/metrics).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.