ppg-js docs

ppg-js accuracy and limits

Review tested accuracy, timing behavior, validation gaps, and medical-device limitations for ppg-js.

Accuracy and limitations

Simulator results

CaseResult
Heart rate from 60 to 90 bpm at 24, 30, and 60 fpsWithin 1 bpm
RMSSD floor, zero variability with fractional ROI means9 to 13 ms, bound 15 ms
RMSSD floor with whole-count quantized means11 to 16 ms, bound 22 ms
10% dropped framesRaises RMSSD by less than 2 ms, bound 5 ms
Respiration at 6 breaths per minute6.0 plus or minus 1

Real-recording results

CaseResult
Live versus replay, 3-minute session212 of 212 beats reproduced
First heart rate from a clean start10 seconds after MEASURING, 20 seconds after placement
First heart rate after a noisy onset15 seconds after MEASURING, 25 seconds after placement
Periodic 30 fps dips for 20 secondsHR unchanged, RMSSD floor rises from 7 to 14 ms
Breathing at 6.7 per minuteFirst estimate 40 seconds after MEASURING, then present in every window but one

Validation limits

There is no ECG or chest-strap comparison across a population. The library makes no claim across skin tones or ambient-light conditions beyond its included recordings.

The results above describe enforced simulator tests and six real iPhone recordings. They do not establish clinical accuracy on other people or devices.

Not a medical device

ppg-js is not a medical device. It is for research and personal curiosity, not diagnosis, treatment, or any decision that requires a validated instrument.