π¬π§ English | π΅π± Polski
A real-time heart rate OBS overlay that reads live BPM from a Bluetooth smart ring and serves a browser widget directly to your stream. No subscriptions, no cloud β runs entirely on your machine.
Made for VTubers and streamers who want to show live heart rate on stream with nothing more than a cheap smart ring and OBS. Originally built for KitsuneTsuyu.
- Live BPM with color-coded zones (calm β alarm)
- Two overlay styles: heart or ECG
- Custom hex colors per zone
Tested on Smartring COLMI R12. Older COLMI models and other rings using the same BLE protocol should work too.
Note
Only Qring App rings are supported right now. Adding other brands isn't planned, but if there's enough interest I'm open to it.
Latest release: GitHub Releases
Download the latest release asset for your platform:
Linux:
- pulse-layer-x86_64-unknown-linux-gnu.tar.gz β Linux (Intel/AMD 64-bit)
macOS:
- pulse-layer-x86_64-apple-darwin.tar.gz β macOS on Intel
- pulse-layer-aarch64-apple-darwin.tar.gz β macOS on Apple Silicon (M1/M2/M3/M4)
Windows:
- pulse-layer-x86_64-pc-windows-msvc.zip β Windows 64-bit (x86_64)
- pulse-layer-aarch64-pc-windows-msvc.zip β Windows ARM64
- pulse-layer-i686-pc-windows-msvc.zip β Windows 32-bit (x86)
Extract the archive and you'll get PulseLayer.app. On first launch macOS will block it because the app isn't signed with a paid Apple certificate. To get past that:
Option A β right-click:
- Right-click
PulseLayer.appβ Open - Click Open in the dialog
Option B β terminal (one-time):
xattr -cr PulseLayer.app
open PulseLayer.appExtract the zip and run pulse-layer.exe. No installer needed.
tar -xzf pulse-layer-*.tar.gz
./pulse-layer- Make sure your ring is charged and nearby.
- Launch PulseLayer and click Scan.
- Your ring appears in the list β click Connect.
The ring can only talk to one device at a time. If it's connected to the Qring app on your phone, PulseLayer won't see it.
Fix: turn off Bluetooth on your phone before scanning. PulseLayer will pick it up normally.
The ring remembers the pairing. To re-pair with your phone you need to clear it from both sides:
- In PulseLayer β click Disconnect.
- On your computer β Bluetooth settings, find the ring, click Forget / Remove device.
- On your phone β forget the ring too.
- Re-pair from scratch via the Qring app.
Important
Skipping step 2 or 3 will cause the pairing to fail on the phone side. Both devices need to forget the ring first.
The overlay runs as a local browser page served by PulseLayer. No external hosting needed.
-
Start PulseLayer and connect to your ring β the server starts on port
9000. -
In OBS, click + in the Sources panel β Browser.
-
Set the URL to:
http://localhost:9000 -
Set Width to
400and Height to300(you can resize/crop freely in OBS). -
Check Refresh browser when scene becomes active if you want it to reconnect automatically.
-
Click OK and the widget shows up. Use Edit Transform to place it where you want.
Tip
The widget anchors to the bottom-left corner of the browser frame. Crop the browser source tightly and you can place it anywhere on the canvas.
The overlay reconnects on its own if PulseLayer restarts, so you don't need to touch the browser source again.
Switch between styles in the Settings panel inside PulseLayer.
Heart β a beating heart icon with a large BPM number. Simple and readable.
ECG β an animated ECG line that draws once per heartbeat, with a BPM readout below. Better for a more technical look.
Both change color based on BPM zone. All colors are customizable.
| Zone | Default BPM range | Default color |
|---|---|---|
| Calm | 0 β 64 | Green |
| Normal | 65 β 80 | Blue |
| High | 81 β 100 | Yellow |
| Fast | 101 β 130 | Orange |
| Alarm | 131+ | Red |
Requirements: Rust stable, Node.js 24+.
git clone https://github.com/wielorzeczownik/pulse-layer
cd pulse-layer
cargo build --releaseThe overlay frontend is compiled by Vite as part of cargo build and embedded into the binary β no separate build step.
macOS quick launch (debug build):
./run_macos.shBuilds a .app bundle under target/, signs it ad-hoc, and opens it.
# Ubuntu / Debian
sudo apt-get install libdbus-1-dev pkg-config libxkbcommon-dev \
libxcb-shape0-dev libxcb-xfixes0-dev libwayland-devUnofficial, unaffiliated with COLMI or any ring manufacturer. May break if the ring firmware changes the BLE protocol.