Releases: httpsterio/gotempo
Release list
v2.1.0
Compatibility
gotempo 2.1.0 pairs with gotempo-sl-module 2.1.0. The module's strap picker needs this release to tell a slow scan apart from gotempo not running; with gotempo 2.0.0 it reports gotempo not running. The 2.0.0 releases keep working with each other. Update both.
Changes
- The strap picker's scan request is acknowledged before scanning starts, so the module can wait for a slow scan instead of giving up.
- Logging controls stay in the tray menu when the ITGmania module is set. They are greyed out only while a player's profile drives that slot. Hiding them removed the OBS toggle and the CSV control for configured straps.
- Linux: at login gotempo waits up to 30 seconds for the desktop tray before registering. The "failed to register" error logged on every boot is gone. If no tray appears, the log says so once. On GNOME the tray needs the AppIndicator and KStatusNotifierItem Support extension.
- Documentation: scan acknowledgement,
players.txttiming, Linux install from a terminal.
v2.0.0
gotempo now supports two straps at once and works as a ITGmania arcade setup as well as a single-user desktop app.
ITGmania setup requires the gotempo-sl-module 2.0 or later.
Two players
Follow two heart-rate straps simultaneously, for a two-player cabinet or for
recording two people together. Off by default and free when unused. Each strap
gets its own outputs: gotempo-bpm-p2.txt for OBS, its own CSV, its own panel in
game. The first strap's filenames never change, so existing setups keep working.
Straps follow the player, not the machine
A player names their own strap in their ITGmania profile and gotempo follows it
while they play, on whichever side they join. Readings are gated on the strap
they named, so one person's heart rate can never be drawn as another's. Nothing
is written to config.json, so quitting hands every slot back to whatever the
tray is set to.
Two players may name the same strap. gotempo connects it once and feeds both
sides.
Connections outlive assignments
Straps are pooled and keyed by MAC rather than owned by a slot. Walking back to
the main menu, restarting ITGmania, or swapping from P1 to P2 no longer costs a
reconnect — previously each of those meant roughly 30 seconds with no readings.
A released strap keeps its connection so rejoining is instant, bounded by two
budgets: strap_hold_minutes (20) while it is still sending readings, and
strap_lost_minutes (5) once it has gone quiet. Pool caps at four.
In-game strap picker
Players pick their strap from a menu on the song wheel instead of finding a MAC
address at a terminal, and it is written into their own profile. Requires
gotempo-sl-module 2.0.
Cabinet behaviour
With itgmania_module set, the OBS and CSV controls are hidden — neither is what
that install is for. While a profile is driving a slot, no CSV is written, no
loss or reconnect notifications fire, and the tray controls the game has taken
over are greyed out with a line saying why.
New config keys
strap_hold_minutes, strap_lost_minutes, current_p2, two_player. All
optional, all defaulted; an existing config.json is upgraded in place.
Compatibility
Nothing breaks for an existing single-strap user. File names, the CLI and the
tray are unchanged.
Pair with module 2.0. An older module works with gotempo 2.0 minus the strap
picker. The new module with gotempo 1.2 shows "gotempo is not running" in the
picker, because 1.2 does not answer scan requests.
v1.2.0
v1.1.0
v1.0.7
Changes since v1.0.6.
This release completes the command-line / headless interface and fixes
two logging behaviors found in testing.
New
-
CLI is now feature-complete. On top of the existing
--no-tray/--print-bpm/--status/--list-devices, this adds:--autostart/--no-autostart: enable or disable launch-on-login
from the command line (the CLI twin of the tray's "Start on boot").--device <mac>: set the current device by MAC (case and:/-
normalized), then run.--select-device: interactive picker — known devices first, with an
on-demand scan. Needs a terminal.--auto-log/--no-auto-log: force session logging on or off for
this run, without editing the config.--log-level error|info|debugand--quiet: control how much
gotempo logs to stderr.
--deviceand--select-deviceset the device in config then start a
normal run; the rest behave as before. See the README for the full
table and exit codes.
Changed
- Headless runs log by default.
--no-traynow starts session
logging automatically, so a service actually records without extra
flags. Combine--no-tray --print-bpmto log and stream;
--no-auto-logopts out. A bare--print-bpmstill only streams.
Fixed
- Stop logging clears the BPM overlay file. gotempo-bpm.txt now goes
empty the moment you stop logging, instead of freezing on the last
value until the strap disconnected. OBS overlays clear as expected. - --status no longer reports a stale state at startup. A fresh launch
publishes its status before connecting, sogotempo --statusrun right
after start can't read the previous run's leftover reading.
No action needed to upgrade. Replace the binary (or re-run install.sh);
your config and data carry over.
v1.0.6
Changes since v1.0.5.
New
-
CLI / headless mode. gotempo can now run without the tray and answer
one-shot queries, for systems with no tray and for scripts and status bars.
With no flags it still runs in the tray as before.--no-tray: run headless (connect + log per config) untilSIGINT/SIGTERM.
Suitable as a systemd user service. Needs a device set inconfig.json.--print-bpm: stream each reading to stdout (implies--no-tray). Time is
hh:mm:ssby default,--epochfor unix seconds,--timestampfor RFC3339.--status: report the running app's state and exit — connection, a coarse
phase (idle / connecting / reconnecting / connected), logging on/off, current
BPM, and device. Reads the running instance's published state, so it never
touches the BLE connection and is safe to poll from a status bar. Plain output
is one line (connected, 61 bpm, Polar H10, logging off);--jsongives the
full state. Exits non-zero when not connected or not running.--list-devices: scan for HR monitors, print them, exit.--json: machine-readable output for--status,--print-bpm,
--list-devices.--config <path>: use a config file at a custom path.--version/-v, and a grouped--help.
-
Self-documenting config.
config.jsonis now created on first run with
every key at its default, and each value is validated on load: a missing,
malformed, or out-of-range entry is reset to its default and the file rewritten,
so it never silently holds a value the app ignores. The CSV keys
(session_gap_minutes,min_bpm_threshold) andauto_logare now always
present rather than hidden until set.
Changed
- CSV timestamps now have millisecond precision. Straps reporting at ~1 Hz
may not be aligned to whole seconds, so second-resolution timestamps made genuine
readings look like duplicate-or-missing rows. Each reading now gets a distinct,
honest timestamp. Existing files still parse; the change applies to new rows.
Other
- The project is now licensed under the GNU GPL v3 (
LICENSE.md). - README, CONTRIBUTING, and the plan docs updated for the CLI, the status file,
and config behavior.
No other action needed to upgrade. Replace the binary (or re-run install.sh); your
config and data carry over (the config gains its default keys on first launch).
v1.0.5
Changes since v1.0.4.
-
CSV session logging. While logging is on, gotempo now writes a per-session
CSV to~/.local/share/gotempo/sessions/, onetimestamp,bpmrow per
reading, alongside the existinggotempo-bpm.txtOBS file. A new file starts
after an idle gap; shorter breaks append to the current session. Readings below
a contact threshold are skipped, so dropouts appear as gaps in the timestamps
rather than junk rows. Files are crash-safe (readable mid-session) and named by
the session's first reading. -
Two new optional config keys:
session_gap_minutes(default 60): idle span that ends a session. A longer
gap starts a new file, a shorter one continues the current session.min_bpm_threshold(default 20): validity floor. Readings below it are
treated as no-contact noise and left out of the CSV.
Both are optional; existing configs keep working unchanged.
Fixed
- Toggle-off race. Stopping logging can no longer leave a stray one-row
session file behind if a reading lands at the same moment.
Improved
- Self-diagnosing reconnect logging. The persistent reconnection phase is no
longer silent: a "still scanning" / "back in range after N" heartbeat, session
length logged on a drop, and the previously-swallowed connect/discovery error
is now surfaced. Makes the rare "won't reconnect after a long idle" case
leave usable evidence.
Internal
- Restructured the code into an
internal/apppackage (the repo root is now a
smallmain.goshim), laying the groundwork for macOS and Windows support. - Repo tidy: docs moved under
docs/, installer scripts underscripts/, and
the desktop entry is generated at install time instead of stored in the tree. - README and CONTRIBUTING updated for the new layout and CSV logging.
No action needed to upgrade. Replace the binary (or re-run install.sh); your
config and data carry over.
v1.0.4
Reconnection and BPM-file handling fixes for when the strap drops.
Changes
- The app no longer needs a relaunch after a disconnect; it keeps retrying and
reconnects on its own. - After a longer dropout it scans continuously instead of every 30 seconds, so
it reconnects within a few seconds of the strap reappearing. - The BPM file keeps the last reading for ~10s across a brief dropout, then
clears if the disconnect lasts longer, so the file no longer holds a stale
number indefinitely. - Switching devices clears the BPM file immediately.
- Rescan and device-switching still work while the app is reconnecting.
Notes
- Continuous reconnect scanning uses a bit more radio time while the strap is
missing; it stops on reconnect. - No config changes. Existing
config.jsonfiles work unchanged.
Upgrade
Download the tarball and run ./install.sh, or make install from source.
Saved devices and preferences are kept.
v1.0.3
v1.0.3
- Fix a race condition where concurrent calls to StopScan from the timeout and a device-match callback could panic on a double close when both fired in the same instant.
- Reduce the reconnection poll interval after the initial retry from 60s to 30s so re-appearing devices are picked up faster.
Install
Unzip the tar.gz and run install.sh to create the shortcut and move the binary. You can also just run the gotempo binary directly.