A Beat Saber custom counter that displays your heart rate in-game.
- Supports Pulsoid, HypeRate, OSC, and more (see Data Sources)
- Automatically pauses the game when your heart rate goes too high
- Configurable gradient colored heart rate text with customizable counter icon
- Counters+ custom counter support alongside a world-space standalone counter
- Records heart rate into BeatLeader replays and plays it back when watching
Install via mod installers like ModAssistant and BSManager
- BSIPA v4.3.6+
- BSML v1.12.0+
- SiraUtil v3.0.0+
- Counters+ v2.0.0+ (optional, recommended Required to use the Counters+ custom counter system)
- YUR Mod (optional Required for the YUR Mod data source)
- YUR Desktop App (optional Required for the YUR App data source)
Important
Make sure all required mods are working before installing HRCounter.
- Download the latest release.
- Extract into your
Beat Sabergame directory. - Launch the game.
- Open the HRCounter settings menu from the main menu's mods section.
- Pick a data source in the right panel and configure it. See Data Sources for details.
- Pulsoid users: click Authorize Pulsoid to sign in via OAuth, no manual token editing needed.
- HypeRate users: enter your session ID (the few characters at the end of your overlay link).
- (Optional) Toggle Auto Pause in the Safety tab to pause the game when your heart rate is too high.
- If you have Counters+ installed, enable the Heart Rate Counter in the Counters+ configuration page.
Note
Please open an issue if you run into a problem or find a bug.
Support matrix for common devices and services:
| Device Type | Pulsoid | HypeRate | YUR App |
|---|---|---|---|
| BLE HR Monitor | ✅ | ✅ | ✅ |
| Apple Watch | ✅ | ✅ | ❓ |
| WearOS Watch | ✅* | ✅** | ❓ |
| Fitbit | ✅* | ✅** | ❓ |
*Check whether your device is supported by Pulsoid.
**Check whether your device is supported by HypeRate.
Polls an http/https endpoint that returns HR data in either of these formats:
- A JSON object containing
bpm(int), with an optionalmeasured_at(string) - A plain integer body (regex
^\d+$)
Set FeedLink to your URL in the config file. See Manual Config Editing.
HRCounter runs a built-in HTTP server that by default listens on http://localhost:65302.
Select HttpServer as your data source. This data source expects POST requests with an integer body.
HRCounter runs a built-in OSC server that by default listens on UDP port 9000 on all interfaces.
Select OSC Protocol as your data source to see the accepted OSC addresses. Addresses can be edited
via Manual Config Editing.
Open an issue if there's a device or service you'd like supported.
Important
Due to a BSIPA bug, edits made to the config file while the game is running won't be detected. Exit the game before editing.
Most options can be changed in-game but if you want to edit the config directly, the config file is at Beat Saber/UserData/HRCounter.json. See the full field reference below
| Field | Type | Default | Description |
|---|---|---|---|
ModEnable |
bool | true |
Enables the mod (DUH). |
DataSource |
string | "OSC Protocol" |
Data source used to get heart rate. |
StreamerMode |
bool | true |
Hide tokens and ids in the data source menu. |
PulsoidToken |
string | "" |
Pulsoid OAuth access token. |
HypeRateSessionID |
string | "" |
HypeRate session ID (the few characters at the end of your overlay link) |
PulsoidWidgetID |
string | "" |
Widget ID for the experimental PulsoidWidget data source (the last part of your widget link) |
HRProxyID |
string | "" |
Custom reader ID for the HRProxy data source. |
FeedLink |
string | "" |
URL for the WebRequest data source. |
NoBloom |
bool | false |
Do you want no bloom on the text? |
Colorize |
bool | true |
Colorize the heart rate number. |
HRLow |
int | 120 |
Start of the color gradient. |
HRHigh |
int | 180 |
End of the color gradient. |
LowColor |
string | "#00FF00" (Green) |
Color for HR ≤ HRLow; gradient start. |
MidColor |
string | "#FFFF00" (Yellow) |
Middle color of the gradient. |
HighColor |
string | "#FF0000" (Red) |
Color for HR ≥ HRHigh; gradient end. |
AutoPause |
bool | false |
Automatically pause the game if your heart rate is too high. |
PauseHR |
int | 200 |
Pause heart rate threshold for auto-pause. |
IgnoreCountersPlus |
bool | false |
Always show the standalone counter regardless whether Counters+ is installed. |
IgnoreZeroValues |
bool | true |
Ignore zero heart rate values as if the data did not exist. |
CustomIcon |
string | "" |
Filename of a custom icon under UserData/HRCounter/Icons/. Empty string uses the default heart icon. |
StaticCounterPosition |
3D Vector | (0, 1.2, 7) |
World-space position of the standalone counter. No effect on the Counters+ counter. |
ReplayRecordHr |
bool | true |
Record heart rate into BeatLeader replays. |
ReplayPlaybackSelfHr |
bool | true |
Allow heart rate recorded in your own replays to be shown. |
ReplayPlaybackOthersHr |
bool | false |
Allow heart rate recorded in other players' replays to be shown. |
ReplayFallbackLiveHr |
bool | false |
Show your live heart rate when recorded replay data is not available or not used. |
EnableHttpServer |
bool | true |
Enable the built-in HTTP server (Required for the HTTPServer data source). |
HttpLocalOnly |
bool | true |
Restrict the built-in HTTP server to localhost only. |
HttpPort |
int | 65302 |
TCP port the built-in HTTP server listens on. |
EnableOscServer |
bool | true |
Enable the built-in OSC server (Required for the OSC Protocol data source). |
OscBindIP |
string | "0.0.0.0" |
IP address the OSC server binds to. 0.0.0.0 listens on all interfaces. |
OscPort |
int | 9000 |
UDP port the OSC server listens on. |
OscAddress |
list | [...] |
OSC address paths the server accepts heart rate messages on. Each message must carry a single int32. |
DebugSpam |
bool | false |
Toggle trace-level log spamming. Only effective in DEBUG builds. |
