Skip to content

dhopcs/heartkick

Repository files navigation

heartkick

heartkick

CI Build Rust Tauri 2 Platforms License

Heart rate monitor app for desktop and Android. Connects to Bluetooth HR sensors and shows live BPM, HRV, and session stats. Pushes data out to OBS, OSC, webhooks, and Prometheus if you want it to. Built with Rust, Tauri, Preact, Tailwind and Ratatui.


Screenshots

heartkick screenshot 1 heartkick screenshot 2


Supported Platforms

  • Any Bluetooth LE heart rate monitor (e.g. COOSPO H6, Polar H10, Wahoo Tickr, Xiaomi Mi Band 5/6/7, etc.)
  • Android: any device running API 26+ (Android 8.0+), with Bluetooth LE support
  • Desktop: Windows 10+, macOS 10.14+, Linux with Bluetooth LE support (BlueZ)
  • OBS browser source overlay works on any platform OBS supports

Features

  • Tauri desktop app + Android app (API 26+)
  • Daemon mode with no UI for integrated use
  • OBS browser-source overlay (customisable HTML)
  • OSC output for VR / VTubing rigs etc.
  • Live BPM gauge with HRV (RMSSD) and session stats (min/max/avg, elapsed)
  • Bluetooth LE - connects to any standard HR monitor; auto-reconnect on drop
  • HTTP API on 127.0.0.1:7878 (optional Bearer token auth)
  • Webhooks with {bpm} / {rr} / {timestamp} substitutions
  • Prometheus metrics (/metrics server / remote-write push)
  • Configurable via ~/.config/heartkick/config.toml (or OS equivalent)

Install

Go to the releases page and grab the relevant installer for your platform. Install and run it, and you should be good to go.

Arch Linux users can find heartkick, heartkick-git, and heartkick-bin available on AUR.

Debian/Ubuntu users can install the .deb file with:

cd ~/Downloads
sudo dpkg -i heartkick-*.deb

Others can either build from source or use the AppImage.

For Android, grab the .apk from releases, enable "Install unknown apps" for your browser or file manager, and install it.

Dependencies: Rust (stable), Node.js, pnpm

git clone https://github.com/dhopcs/heartkick
cd heartkick
pnpm install
pnpm tauri build

The installer ends up in src-tauri/target/release/bundle/ - .deb and .AppImage on Linux, .dmg on macOS, .msi on Windows. For Android, follow the instructions in the Setup section below. (TODO: F-droid release)

Setup

Dependencies

rust
pnpm
node
bluez
just

Android builds additionally need the Android SDK (API 36), NDK 29, and a JDK. Set:

export ANDROID_HOME=$HOME/Android/Sdk
export NDK_HOME=$ANDROID_HOME/ndk/29.0.13846066

Build for Android

just make-keystore    # generate keystore for signing APK

# Option 1: build + sign, output at `src-tauri/gen/android/app/build/outputs/apk/universal/release/heartkick-signed.apk`
just build-android    # build APK (unsigned)
just sign-apk         # sign APK and install on connected device

# Option 2: build, sign, and install in one step (requires android device connected with USB debugging enabled)
just local-install    # build, sign, and install APK on connected device

Config

Config lives at the OS standard location (~/.config/heartkick/config.toml on Linux). It's created with defaults on first run. Integrations are all opt-in.

[bluetooth]
device_address = "AA:BB:CC:DD:EE:FF"
auto_reconnect = true

[api]
http_enabled = true
http_bind = "127.0.0.1:7878"

[integrations.osc]
enabled = true
target = "127.0.0.1:9000"
address = "/avatar/parameters/HR"

[[integrations.webhooks]]
name = "my-webhook"
enabled = true
method = "POST"
url = "https://example.com/hr"
body = '{"bpm":{bpm}}'

[integrations.prometheus]
enabled = true
bind = "127.0.0.1:9091"

About

Cross-platform and highly extensible Heart Rate Monitor + OBS overlay

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors