{"id":46258245,"url":"https://github.com/wielorzeczownik/pulse-layer","last_synced_at":"2026-05-25T02:08:52.012Z","repository":{"id":341664951,"uuid":"1170994167","full_name":"wielorzeczownik/pulse-layer","owner":"wielorzeczownik","description":"Real-time heart rate OBS overlay via Bluetooth smart ring","archived":false,"fork":false,"pushed_at":"2026-05-06T00:34:43.000Z","size":479,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-06T02:30:50.769Z","etag":null,"topics":["ble","bluetooth","btleplug","colmi","colmi-ring","desktop-app","ecg","heart-rate","http-service","iced","obs","overlay","qring","rust","smart-ring","stream","streaming","typescript","vtuber","websocket"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wielorzeczownik.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-02T18:56:15.000Z","updated_at":"2026-05-06T00:34:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/wielorzeczownik/pulse-layer","commit_stats":null,"previous_names":["wielorzeczownik/pulse-layer"],"tags_count":30,"template":false,"template_full_name":null,"purl":"pkg:github/wielorzeczownik/pulse-layer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wielorzeczownik%2Fpulse-layer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wielorzeczownik%2Fpulse-layer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wielorzeczownik%2Fpulse-layer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wielorzeczownik%2Fpulse-layer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wielorzeczownik","download_url":"https://codeload.github.com/wielorzeczownik/pulse-layer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wielorzeczownik%2Fpulse-layer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32795416,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-08T08:22:46.396Z","status":"ssl_error","status_checked_at":"2026-05-08T08:22:45.650Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ble","bluetooth","btleplug","colmi","colmi-ring","desktop-app","ecg","heart-rate","http-service","iced","obs","overlay","qring","rust","smart-ring","stream","streaming","typescript","vtuber","websocket"],"created_at":"2026-03-04T00:28:39.459Z","updated_at":"2026-05-08T20:02:07.339Z","avatar_url":"https://github.com/wielorzeczownik.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003ePulseLayer\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/wielorzeczownik/pulse-layer/actions/workflows/release.yml\"\u003e\u003cpicture\u003e\u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://img.shields.io/github/actions/workflow/status/wielorzeczownik/pulse-layer/release.yml?branch=main\u0026style=flat-square\u0026labelColor=2d333b\u0026color=3fb950\"/\u003e\u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://img.shields.io/github/actions/workflow/status/wielorzeczownik/pulse-layer/release.yml?branch=main\u0026style=flat-square\u0026color=2ea043\"/\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/wielorzeczownik/pulse-layer/release.yml?branch=main\u0026style=flat-square\u0026labelColor=2d333b\u0026color=3fb950\" alt=\"Build\"/\u003e\u003c/picture\u003e\u003c/a\u003e \u003ca href=\"https://github.com/wielorzeczownik/pulse-layer/releases/latest\"\u003e\u003cpicture\u003e\u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://img.shields.io/github/v/release/wielorzeczownik/pulse-layer?style=flat-square\u0026labelColor=2d333b\u0026color=3fb950\"/\u003e\u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://img.shields.io/github/v/release/wielorzeczownik/pulse-layer?style=flat-square\u0026color=2ea043\"/\u003e\u003cimg src=\"https://img.shields.io/github/v/release/wielorzeczownik/pulse-layer?style=flat-square\u0026labelColor=2d333b\u0026color=3fb950\" alt=\"Latest Release\"/\u003e\u003c/picture\u003e\u003c/a\u003e \u003ca href=\"https://github.com/wielorzeczownik/pulse-layer/blob/main/LICENSE\"\u003e\u003cpicture\u003e\u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://img.shields.io/badge/License-MIT-3fb950?style=flat-square\u0026labelColor=2d333b\"/\u003e\u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://img.shields.io/badge/License-MIT-2ea043?style=flat-square\"/\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-3fb950?style=flat-square\u0026labelColor=2d333b\" alt=\"License: MIT\"/\u003e\u003c/picture\u003e\u003c/a\u003e\n  \u003cbr/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Rust-B7410E?style=flat-square\u0026logo=rust\u0026logoColor=white\" alt=\"Rust\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Iced-4D9DE0?style=flat-square\u0026logo=iced\u0026logoColor=white\" alt=\"Iced\"/\u003e\n  \u003cimg src=\"https://img.shields.io/badge/TypeScript-3178C6?style=flat-square\u0026logo=typescript\u0026logoColor=white\" alt=\"TypeScript\"/\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e🇬🇧 English | 🇵🇱 \u003ca href=\"README.pl.md\"\u003ePolski\u003c/a\u003e\u003c/p\u003e\n\nA 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.\n\nMade 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](https://www.twitch.tv/kitsunetsuyu)**.\n\n## Features\n\n- Live BPM with color-coded zones (calm → alarm)\n- Two overlay styles: **heart** or **ECG**\n- Custom hex colors per zone\n\n## Compatibility\n\nTested on **Smartring COLMI R12**. Older COLMI models and other rings using the same BLE protocol should work too.\n\n\u003e [!NOTE]\n\u003e 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.\n\n## Download \u0026 Install\n\nLatest release: [GitHub Releases](https://github.com/wielorzeczownik/pulse-layer/releases/latest)\n\nDownload the latest release asset for your platform:\n\n**Linux:**\n\n- [pulse-layer-x86_64-unknown-linux-gnu.tar.gz](https://github.com/wielorzeczownik/pulse-layer/releases/latest/download/pulse-layer-x86_64-unknown-linux-gnu.tar.gz) – Linux (Intel/AMD 64-bit)\n\n**macOS:**\n\n- [pulse-layer-x86_64-apple-darwin.tar.gz](https://github.com/wielorzeczownik/pulse-layer/releases/latest/download/pulse-layer-x86_64-apple-darwin.tar.gz) – macOS on Intel\n- [pulse-layer-aarch64-apple-darwin.tar.gz](https://github.com/wielorzeczownik/pulse-layer/releases/latest/download/pulse-layer-aarch64-apple-darwin.tar.gz) – macOS on Apple Silicon (M1/M2/M3/M4)\n\n**Windows:**\n\n- [pulse-layer-x86_64-pc-windows-msvc.zip](https://github.com/wielorzeczownik/pulse-layer/releases/latest/download/pulse-layer-x86_64-pc-windows-msvc.zip) – Windows 64-bit (x86_64)\n- [pulse-layer-aarch64-pc-windows-msvc.zip](https://github.com/wielorzeczownik/pulse-layer/releases/latest/download/pulse-layer-aarch64-pc-windows-msvc.zip) – Windows ARM64\n- [pulse-layer-i686-pc-windows-msvc.zip](https://github.com/wielorzeczownik/pulse-layer/releases/latest/download/pulse-layer-i686-pc-windows-msvc.zip) – Windows 32-bit (x86)\n\n### macOS\n\nExtract 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:\n\n**Option A – right-click:**\n\n1. Right-click `PulseLayer.app` → **Open**\n2. Click **Open** in the dialog\n\n**Option B – terminal (one-time):**\n\n```bash\nxattr -cr PulseLayer.app\nopen PulseLayer.app\n```\n\n### Windows\n\nExtract the zip and run `pulse-layer.exe`. No installer needed.\n\n### Linux\n\n```bash\ntar -xzf pulse-layer-*.tar.gz\n./pulse-layer\n```\n\n## Connecting your ring\n\n### First-time pairing\n\n1. Make sure your ring is charged and nearby.\n2. Launch PulseLayer and click **Scan**.\n3. Your ring appears in the list – click **Connect**.\n\n### Ring is already paired with your phone\n\nThe 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.\n\nFix: **turn off Bluetooth on your phone** before scanning. PulseLayer will pick it up normally.\n\n### Going back to your phone after using PulseLayer\n\nThe ring remembers the pairing. To re-pair with your phone you need to clear it from both sides:\n\n1. In PulseLayer – click **Disconnect**.\n2. On your computer – Bluetooth settings, find the ring, click **Forget / Remove device**.\n3. On your phone – forget the ring too.\n4. Re-pair from scratch via the Qring app.\n\n\u003e [!IMPORTANT]\n\u003e Skipping step 2 or 3 will cause the pairing to fail on the phone side. Both devices need to forget the ring first.\n\n## OBS Setup\n\nThe overlay runs as a local browser page served by PulseLayer. No external hosting needed.\n\n1. **Start PulseLayer** and connect to your ring – the server starts on port `9000`.\n2. In OBS, click **+** in the Sources panel → **Browser**.\n3. Set the URL to:\n\n   ```text\n   http://localhost:9000\n   ```\n\n4. Set **Width** to `400` and **Height** to `300` (you can resize/crop freely in OBS).\n5. Check **Refresh browser when scene becomes active** if you want it to reconnect automatically.\n6. Click **OK** and the widget shows up. Use **Edit Transform** to place it where you want.\n\n\u003e [!TIP]\n\u003e 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.\n\nThe overlay reconnects on its own if PulseLayer restarts, so you don't need to touch the browser source again.\n\n## Overlay styles\n\nSwitch between styles in the **Settings** panel inside PulseLayer.\n\n**Heart** – a beating heart icon with a large BPM number. Simple and readable.\n\n**ECG** – an animated ECG line that draws once per heartbeat, with a BPM readout below. Better for a more technical look.\n\nBoth change color based on BPM zone. All colors are customizable.\n\n| Zone   | Default BPM range | Default color |\n| ------ | ----------------- | ------------- |\n| Calm   | 0 – 64            | Green         |\n| Normal | 65 – 80           | Blue          |\n| High   | 81 – 100          | Yellow        |\n| Fast   | 101 – 130         | Orange        |\n| Alarm  | 131+              | Red           |\n\n## Building from source\n\nRequirements: [Rust](https://rustup.rs) stable, [Node.js](https://nodejs.org) 24+.\n\n```bash\ngit clone https://github.com/wielorzeczownik/pulse-layer\ncd pulse-layer\ncargo build --release\n```\n\nThe overlay frontend is compiled by Vite as part of `cargo build` and embedded into the binary – no separate build step.\n\n**macOS quick launch (debug build):**\n\n```bash\n./run_macos.sh\n```\n\nBuilds a `.app` bundle under `target/`, signs it ad-hoc, and opens it.\n\n### Linux system dependencies\n\n```bash\n# Ubuntu / Debian\nsudo apt-get install libdbus-1-dev pkg-config libxkbcommon-dev \\\n  libxcb-shape0-dev libxcb-xfixes0-dev libwayland-dev\n```\n\n## Disclaimer\n\nUnofficial, unaffiliated with COLMI or any ring manufacturer. May break if the ring firmware changes the BLE protocol.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwielorzeczownik%2Fpulse-layer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwielorzeczownik%2Fpulse-layer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwielorzeczownik%2Fpulse-layer/lists"}