ppg-js accuracy and limits
Review tested accuracy, timing behavior, validation gaps, and medical-device limitations for ppg-js.
Accuracy and limitations
Simulator results
| Case | Result |
|---|---|
| Heart rate from 60 to 90 bpm at 24, 30, and 60 fps | Within 1 bpm |
| RMSSD floor, zero variability with fractional ROI means | 9 to 13 ms, bound 15 ms |
| RMSSD floor with whole-count quantized means | 11 to 16 ms, bound 22 ms |
| 10% dropped frames | Raises RMSSD by less than 2 ms, bound 5 ms |
| Respiration at 6 breaths per minute | 6.0 plus or minus 1 |
Real-recording results
| Case | Result |
|---|---|
| Live versus replay, 3-minute session | 212 of 212 beats reproduced |
| First heart rate from a clean start | 10 seconds after MEASURING, 20 seconds after placement |
| First heart rate after a noisy onset | 15 seconds after MEASURING, 25 seconds after placement |
| Periodic 30 fps dips for 20 seconds | HR unchanged, RMSSD floor rises from 7 to 14 ms |
| Breathing at 6.7 per minute | First 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.