The Physics of a Finger Scan
Every heartbeat pumps a small surge of blood into the capillaries of the fingertip. When a bright LED flash shines directly into the skin, that rhythmic change in blood volume alters how much light is absorbed and reflected back to the camera sensor. The SDK reads these light-intensity changes frame by frame and reconstructs the full pulse waveform with sub-millisecond timing resolution.Why a Fingertip Beats a Face
Face-based camera HRV (rPPG) is an active research area, but it carries a fundamental physics disadvantage that no algorithm fully overcomes.Face Scan
The pulse signal comes from faint color shifts in reflected ambient or screen light across a large area of skin. Room light fluctuations and even small head movements can easily exceed the pulse signal itself, forcing heavy filtering that smears beat timing and inflates HRV error.
Finger Scan
The fingertip is pressed directly against a bright, steady flash LED — the brightest light source on the phone — with no air gap. The resulting pulse amplitude is approximately 6× larger than a face signal, representing over 30× the signal power. High-frequency noise that corrupts beat timing on a face scan is buried far below the pulse in a finger scan.
The face-scan and finger-scan figures come from different studies with different participants, cameras, and reference devices and are therefore not a direct head-to-head comparison. They illustrate the order-of-magnitude difference in the underlying signal quality.
The 60-Second Scan, Step by Step
The SDK is built around five public types:
VitalsScan (start/stop the session), ScanDelegate on iOS and ScanCallback on Android (live progress and completion events), VitalsResult (the completed metric values), QualityTier (accepted or withheld), and ScanDiagnostics (per-scan signal detail). The steps below map to these types.1
User Places Finger Over Camera
Your app prompts the user to cover the rear camera lens and flash completely with their fingertip, applying light, steady pressure. Call
VitalsScan.start() to begin the session. The SDK immediately begins receiving camera frames and evaluating signal quality.2
Real-Time Signal Quality Check
During the first few seconds, the SDK evaluates whether the finger is correctly positioned and whether the signal-to-noise ratio is sufficient to produce reliable results. If the finger is not covering the flash or the signal is too noisy, the SDK emits live guidance events through
ScanDelegate (iOS) or ScanCallback (Android) — for example, prompting the user to reposition or reduce movement.3
PPG Waveform Capture
Once a quality signal is established, the SDK captures the full 60-second photoplethysmography waveform. Each heartbeat appears as a distinct peak in the light-intensity trace. The SDK timestamps each peak with sub-millisecond precision to build the sequence of RR intervals (the gaps between beats) that all HRV metrics are derived from.
4
On-Device Signal Processing
At the end of the 60 seconds, the SDK runs its full deterministic signal-processing pipeline entirely on the device. No frames are saved. No data leaves the phone. The pipeline extracts beat-to-beat intervals, applies artifact rejection, and computes all six metrics from the cleaned RR interval series.
5
Quality Gating
Before returning a result, the SDK evaluates the overall reading quality. Readings that fall below the acceptance threshold are withheld rather than returned with a misleading value — your
ScanDelegate or ScanCallback receives a QualityTier of withheld in this case. In the validation study, 3.3% of readings were withheld for this reason.6
Result Delivered to Your App
Your
ScanDelegate or ScanCallback completion method receives a VitalsResult containing all six metric values, a QualityTier, and a ScanDiagnostics object with per-scan signal detail. Your app can display results immediately — no network round-trip required.On-Device Processing in Detail
The SDK’s signal-processing engine is written entirely in native Swift (iOS) and Kotlin (Android). It uses no machine learning models, no neural networks, and no cloud inference. Every computation is deterministic: the same input frames always produce the same output metrics, on every device, every time.Why deterministic processing matters for developers
Why deterministic processing matters for developers
Machine learning models introduce several challenges for SDK developers:
- Non-determinism. Model outputs can vary across hardware, OS versions, and runtime conditions even with identical inputs, making bugs difficult to reproduce.
- Model drift. Model updates can silently change metric values between SDK versions, making longitudinal user data inconsistent.
- Size and latency. On-device inference models add tens to hundreds of megabytes and introduce variable latency depending on device capability.
- Auditability. A deterministic algorithm can be validated mathematically; a model’s behavior must be characterized empirically across every target population.
What data the SDK does and does not store
What data the SDK does and does not store
The SDK does not store or transmit:
- Raw camera frames
- PPG waveform samples
- RR interval sequences
- Any personally identifiable information
- Computed metric values (heart rate, RMSSD, SDNN, Baevsky stress index, Poincaré SD2:SD1, breathing rate)
- A quality tier for the reading
- Diagnostic flags used to explain withheld or low-confidence readings
Live Guidance During the Scan
The SDK emits real-time status events throughout the 60 seconds that your UI can subscribe to. These events describe the current signal quality state in terms your app can display directly to the user, such as asking them to keep their finger still, apply more pressure, or ensure the flash is fully covered. This guidance loop is the primary mechanism by which the SDK achieves consistent results across the wide range of users and lighting conditions found in real-world use.Supported Hardware
The SDK runs on hardware available on virtually every modern smartphone, requiring only the rear camera and rear flash LED that ship on every flagship and mid-range device.
Coverage figures from Statcounter, August 2026.
