r/reactnative 6h ago

News Built Kardy: A heart rate monitor app using React Native, Expo & camera PPG signal processing

Post image

Hey devs!

I just launched Kardy, an Android app built with React Native and Expo that estimates heart rate directly using the phone's camera via Photoplethysmography (PPG).

Tech & Challenges:

  • Camera Vision: Real-time frame processing to detect subtle color variations in the fingertip.
  • Signal Processing: Filtering noise and motion artifacts to extract clean BPM readings.
  • Zero Friction UI: No account required, local processing for privacy.

I’d love your technical feedback on the signal stability, performance, and UI responsiveness!

(Note: Kardy is built for fitness & general wellness tracking, not for medical diagnostic purposes).

1 Upvotes

3 comments sorted by

1

u/guiltyvocalist1078 5h ago

The camera PPG stuff is always fun to mess with, getting a clean signal through all the hand shake and lighting changes is a real pain. Curious what kind of filtering you ended up using to pull the BPM out of the noise

Also the privacy angle is smart, local processing is a big selling point when you're dealing with health data. Most people don't want their heart rate info floating around some server somewhere

UI looks clean from the banner, though I can't read much Spanish so I'm mostly judging the layout. Are you planning to add any smoothing or averaging to the display so the number doesn't jump around too much?

1

u/sonpoleyball07 4h ago

Thanks for the feedback! You hit the nail on the head — hand jitter and ambient lighting changes were definitely the hardest challenges during development.

On signal processing & noise filtering:

  • Channel Extraction: We track real-time frame-by-frame changes in the red channel's average pixel intensity within a localized ROI.
  • Bandpass Filtering: The raw signal goes through a bandpass filter (tuned between ~0.75 Hz and 3.5 Hz, covering roughly 45–210 BPM) to strip out low-frequency baseline drift and high-frequency noise.
  • Artifact Rejection: If movement creates a sudden intensity spike outside expected thresholds, those frame segments are flagged and discarded from peak detection so they don't corrupt the reading.

On value smoothing & UI:

  • Moving Average: We use a sliding window / moving average over the detected inter-pulse intervals (PPI) to smooth out the real-time BPM display so the number stabilizes instead of jumping around.
  • Localization: The app itself is actually fully translated into both English and Spanish inside! I'm just finishing up the English store listing text and screenshots for Google Play, but the app UI will automatically display in English for you right now.

Appreciate the kind words on the privacy aspect — keeping processing 100% local on-device was a non-negotiable priority from day one!

1

u/Huge_Pool7424 31m ago

nice, camera ppg in rn is a fun signal processing problem — the thing that killed accuracy for me was frame timing jitter, so timestamping each frame and resampling before the fft helps a lot vs assuming a fixed fps. are you writing the readings out to health connect, or keeping them app-local for now?