Changelog
[0.1.1-alpha.18] - 2026-10-05
Added
- Suggested thresholds and training zones. After a test with power data, the new Zones tab suggests VT1 and VT2 as a range, FatMax, and five training zones in watts and heart rate — copy them into your training platform with one click. Always a suggestion, never a verdict.
- Clearer session report. Results, Zones, 9-panel plot, Table and Details now sit in tabs. The 9-panel plot (Wasserman) is new on desktop; click a panel to enlarge it.
- Replay with music. Replaying a session plays its workout music again, in time with the stages. Jump anywhere and replay and music carry on from there; a note button switches the music off.
- Stage cues while recording. Each stage says what it is for, e.g. "Easy warm-up", "Brisk — you can still talk" or "Very hard — hang on".
- EDF export for sessions, readable in EDFbrowser and other EDF tools.
- Advanced view in the dashboard with more derived metrics and trends.
- End-tidal O₂/CO₂ from OSM-1 firmware 2.17 and later is stored with each breath.
- Credits and licences for all bundled software and the workout music under About.
Changed
- Fully localised in English and German, including decimal commas in German.
- The measurement method moved from the recording bar to the footer.
Security
- Updated rustls to 0.23.45 (RUSTSEC-2026-0285).
[0.1.1-alpha.17] - 2026-10-05
Added
- Workout music for guided tests. Like the music in a spinning class, it is there to motivate you and help you squeeze out the last watts when the ramp gets hard. Switch on Liquid DnB when starting a protocol — one style for now (off by default, the choice is remembered; never for RMR or free sessions). The music plays while recording and follows the stages: a calmer loop for rest, four intensity levels across the load stages, a one-bar countdown into every step up that lands exactly on the watt change, an easy loop for the cool-down and a short finish on Stop. A speaker button in the recording bar mutes it.
- The VO2 Master card now shows what the analyzer says about itself. Tank-calibration status, device state, firmware, the latest warning or error (e.g. "Mask leak detected", in English or German) and any setting the device did not take are shown right on the device card. Starting a recording with a VO2 Master that is not calibrated, reports a fatal error, runs different settings than the app sent or whose firmware could not be read now warns first — with a "Record anyway" option.
- VO2 Master sessions record their context. The venturi and mask a session was recorded with, a snapshot of the device's state at the start and every warning, error, state change and calibration record during the recording are saved with the session and included in the JSON export.
- Guided protocols match the iOS app. The protocol builder, defaults and start dialog (with a preview of the stages) now work the same on desktop and iOS. You can add a stage while a test is running, end it with "I can't go on", and under ERG the test stops automatically when your cadence stays below 60 rpm. While the trainer holds the watts, the power tile shows your cadence instead of the deviation arrow.
Fixed
- Smart trainers that ignored the app's watt targets now follow them. Stricter trainers (e.g. Tacx, Elite) rejected every command because the app wrote to the trainer before subscribing to its replies. The app now subscribes first, waits for the trainer to confirm each command, starts the trainer again after a protocol's Stop (a second session used to stay without load), takes control back when another app grabbed it, recognises trainers from their advertisement and skips modes the trainer says it doesn't support.
- The RPE rating is saved with the right stage. It is now asked 20 s before a stage ends and stored with the stage you rated — previously it ended up on the next one. The stage clock no longer drifts over long tests.
- Calibre Bio VO2 read too low and RER too high. OpenSpiro computed the Calibre on the same wet basis as the official Calibre app, which assumes the gas readings still contain water vapour. Real sessions show they don't — the readings are already dry — so the correction removed water that wasn't there: VO2 came out 25–35 % low and resting RER around 1.1–1.3. The Calibre is now computed on a dry basis like the OSM-1, giving a resting RER of about 0.8. (The official app seems to hide the same problem by capping and averaging RER.) Sessions recorded earlier keep the values they were saved with. Demo mode was retuned to match.
- VO2 Master venturi and mask settings now use the device's own sizes. The settings dialog offers what the official app offers for firmware 2.x — CPET or Resting (R), and the five mask sizes Petite to Large — and remembers your choice. Previously "Medium" mask was sent as X-Small, and the selection was lost on every restart.
- VO2 Master ventilation is now on the same basis as the other analyzers. VE uses the analyzer's own value and, like tidal volume, is converted from body conditions (BTPS) to STPD with the formula VO2 Master's own software uses. VE and tidal volume from a VO2 Master previously came out about 8 % too high.
- VO2 Master breaths are only built from complete, plausible data. Notifications with the wrong length or implausible values are dropped (and counted on the device card) instead of completing a breath with stale values. Analyzers with firmware older than 2.0 are refused with a clear message instead of producing meaningless CO₂ and RER.
- No more fake VO2 Master calibration. The calibrate button reported success without the device having calibrated; firmware 2.x is calibrated against a gas tank with the VO2 Master Manager app, so OpenSpiro now shows the device's calibration status instead. Stopping a recording also no longer puts the analyzer back to idle, which could cost a calibration before the next session.
Removed
- The Help page is gone. It explained each device's formulas a second time next to the code and the website, and had fallen out of date. The session badge still shows which calculation model produced a session's numbers.
[0.1.1-alpha.16] - 2026-09-15
Fixed
- Sessions open again. Since the SQLite migration to UUID ids, every session in the list failed to open with
invalid args \sessionId` for command `get_session`: invalid type: null, expected a string. The session detail page coerced the route id with Number(), which turns a UUID into NaN— serialized tonullby Tauri and rejected by the Rust commands. The same broken value reachedget_session_readings` as well as the JSON/CSV exports. Session ids are now passed through as strings end to end.
Thanks
- Thanks to Alexander (homeofinnovationx.com) for discovering this regression, tracing it to the
Number() cast in the bundled frontend and confirming the fix in a local build.
[0.1.1-alpha.15] - 2026-08-11
Fixed
- Smart trainers now report power in free sessions. A smart bike (e.g. MagneticDays JARVIS) freewheels at 0 W until the app puts it under load, so free rides showed no power even while pedalling. The trainer now enters simulation mode (flat road) on connect, so power reflects your real effort — just like a free ride in Zwift. Workouts with watt targets still use ERG as before.
[0.1.1-alpha.14] - 2026-08-11
Added
- Bluetooth debug mode (Settings → Developer). When enabled, connected power meters and smart trainers show a small diagnostic button that reports the device's Bluetooth services and live data flow — for troubleshooting trainers that connect but don't show power. Off by default.
[0.1.1-alpha.13] - 2026-08-11
Added
- Smart trainer support (FTMS). Bluetooth smart trainers now work as a full power source, not only for automatic resistance. Trainers that expose only the Fitness Machine Service — with no separate power-meter service — are now discovered and read correctly (e.g. MagneticDays Jarvis). Power and cadence come straight off the trainer.
- Automatic ERG watt targets. When a protocol stage sets a target power, the trainer is driven to that wattage automatically and released again when the session ends. A small "ERG" badge on the power tile shows when the trainer is under app control.
Fixed
- Trainers that don't advertise a power-meter service are no longer invisible. Device detection now recognises a trainer by its Fitness Machine Service as well, and checks for a power source before treating a device as a heart-rate strap.
- Rest stages now really drop the load. A 0 W target (rest / baseline stages) is sent to the trainer instead of being ignored, so it no longer holds the previous stage's resistance through your rest.
Notes
- Requires a Bluetooth smart trainer or power meter for the new features; everything else works as before.
[0.1.1-alpha.12] - 2026-05-09
Fixed
- Auto-update check no longer crashes with "Cannot read private member from an object whose class did not declare it." Two underlying issues addressed: the dependency graph was pulling in two versions of
@tauri-apps/api (a Resource class identity mismatch), and the Vue ref holding the pending update was deeply reactive, which broke private-field access on Tauri's Update class.
Notes
- If you're stuck on alpha.11, the auto-updater can't help — download alpha.12 manually from the website.
[0.1.1-alpha.11] - 2026-05-09
Added
- Per-device metabolic models. Calculation strategy adapts to the connected analyzer — Calibre Bio uses wet-basis Haldane bookkeeping matching the official app, VO2 Master uses its on-device values. Active model shown as a badge next to the session timer.
- Help page in the sidebar explaining how values are calculated, what affects readings, and the academic references.
- Metabolic model recorded with each saved session and tagged in CSV / JSON exports.
Changed
- VO2 / VCO2 for Calibre now matches the official Calibre app. The previous formula treated wet-basis sensor readings as if they were dry — the missing humidity correction inflated VO2 by 20–50 % and pushed RER below physiologically possible values.
- VO2 Master uses its on-device VO2 / VCO2 directly instead of being recomputed.
Fixed
- Session timer drift on long sessions. Elapsed time and the stored per-breath index now reflect real seconds (was incrementing per breath, so 30 minutes of wall-clock time was stored as ~6 minutes on the chart).
[0.1.1-alpha.10] - 2026-05-08
Added
- In-app changelog under About → "What's new" so you can see what changed in every release.
- Free tier expanded: you can now create up to 10 athlete profiles on the free plan (was: 1). Larger rosters remain a Pro feature.
- FatMax protocols are now free for both cycling and running. Find your peak fat-oxidation zone without a Pro subscription. (Resting Metabolic Rate was already free.)
Fixed
- "Add Person" in the header switcher now opens the new-person form directly instead of dropping you on the persons list.
Maintenance
- Security update and dependency maintenance.
[0.1.1-alpha.9] - 2026-05-06
Added
- Live data smoothing for breath-by-breath metabolic values. RER, fat %, calories and VO2 are now stable on the dashboard instead of jumping with every breath. Out-of-range breaths (RER below 0.5 or above 1.3) are rejected as sensor artefacts. Raw breath-by-breath values are still preserved in the CSV export for analysis.
Fixed
- Auto-updater now actually restarts the app after installing a new version. Previously the message "Installing… The app will restart." appeared but the app stayed on the old version until you manually quit and reopened it.
[0.1.1-alpha.8] - 2026-05-06
Known issue
- Auto-update download completes but the app does not restart automatically. Workaround: quit and reopen OpenSpiro after the install finishes. Fixed in alpha.9.
[0.1.1-alpha.7] - 2026-04-23
Changed
- Removed the macOS tray icon for a cleaner system bar; OpenSpiro now lives only in the dock during sessions.
[0.1.1-alpha.6] - 2026-04-22
Changed
- Auto-update flow polish: clearer status messages while checking, downloading, and installing.
[0.1.1-alpha.5 and earlier]
Initial alpha series — Calibre Bio and VO2 Master device support over BLE, ANT+ heart rate and power, breath-by-breath metabolic calculations (VO2, VCO2, RER, calories, fat/carb split), session recording, and JSON/CSV export.