What's new in TrainerDay Desktop
Every update to the desktop app for Mac, Windows and Linux. The app updates itself; you'll see an Update button in the top bar when a new version is ready.
- Workouts keep everything the coach wrote: interval types, cadence targets, slope and HR segments, comments and repeats come through intact, and saved rides keep the structure as you actually rode it.
- Activities are grouped by the day you rode, where you rode, and renames, ratings and deletes from the website or your phone show up at the next sync.
- Rides land on the minute: within 2 seconds of a whole minute is saved as that minute.
- Offline notice when your computer loses its connection, and a disk full warning instead of failing silently.
- FIT and TCX downloads save straight to your computer; activities imported from other apps no longer offer them.
- Portuguese is now Brazilian Portuguese.
- Fixed: zone colors at the edges, Double Single-Side Power doubling a smart trainer, and merging a run into a ride.
- Fixed: Power Match with Double Single-Side Power. With both settings on and a left-only power meter, ERG drove you to about twice the workout's target. Power Match now uses the doubled meter reading, so it holds the target you see.
- Fixed: a device could sit at "connecting" forever. If your computer's Bluetooth never finished connecting to a trainer, heart-rate strap or Zwift Click (seen on Windows PCs with Bluetooth updates pending), the Devices popup showed "connecting" indefinitely and the device could not be retried. Connecting now gives up after 20 seconds, the device goes back to the list, and paired devices are retried automatically.
- Devices that aren't being used are flagged. In the Devices popup, a connected device with none of its features selected (for example a heart-rate strap whose HR chip is off) now shows an amber warning. Hover it to see why: select a feature or disconnect the device.
- The app speaks your language. TrainerDay Desktop is now available in 11 languages: English, Español, Русский, Deutsch, Italiano, Français, Português, Polski, 中文 (中国), 中文 (台灣) and 日本語. It follows your computer's language by default; pick another in Settings → User Profile → Language, or when you sign up. Your choice is saved to your TrainerDay profile, so the website uses it too. Dates and numbers follow the language as well.
- Connections are built into the app. Settings → Connections shows what's linked, and Manage Connections slides open a panel with your Strava, Zwift, TrainingPeaks, Garmin, Intervals.icu, COROS, Dropbox, Google Calendar and Wahoo links right in the app, with every option the website has: Workout of the Day for TrainingPeaks and Intervals.icu, Calendar Sync (and Intervals' 1.5 Way Sync), Garmin's outdoor power and mode options, Dropbox's TCX / FIT choice. Connecting opens the service's sign-in page in your browser and the app picks up the new link when you come back. The old "Manage Connections" web window is gone.
- Sync Activities for Strava and Dropbox. If a ride or run never showed up in Strava (or Dropbox), the connection card shows a Sync Activities button listing exactly what's missing; Sync Now resends them and shows each one succeed. Activities under 1 minute are skipped. Same feature as the website and the new Sync now button in the mobile app.
- Fixed: a white flash when the My Calendar and Subscribe windows open.
- Zwift Click v2 pairs in the Devices popup. The two Click pucks are recognised as a button controller: with one left and one right nearby they show as a single "Zwift Click" row, and Connect pairs both at once (Disconnect and Forget cover both too). If there's any other number of pucks around — one asleep, a second pair in the room — each shows on its own row as "Zwift Click – Left ·BF26" so you can tell them apart by the code. Once connected the row shows the last button you pressed and each puck's battery, so you can check the Click is talking to the app. On the Player the right puck drives the workout: + harder, B easier, A cycles ERG → Slope → HR+, Y play/pause, Z skips to the next interval; − on the left puck is easier too. The matching on-screen button flashes, just like the keyboard shortcuts.
- Training Party: plan a session for later. The Training Party tab's status card now has Now / Later: tap Later to say when you're hoping or going to train, indoor or outdoor, today or tomorrow, with an optional route, and share it with friends. A new Coming up list shows friends' plans above the live parties — "I can join" for indoor plans, "Interested" for outdoor ones.
- Fixed: Today listed the same run twice when it was on both the bike and run calendars, and could hide a second ride scheduled for the same day. Every scheduled workout now shows exactly once.
- Workout thumbnails match the chart. The small workout previews on library cards and in the workout info popup now draw each bar with a little gap and rounded top, like the main chart, the web app and the mobile app.
- No more Cycling / Running switch — the app follows your workouts. The sport selector is gone from the top bar. Today shows whatever is on your calendar or plan for today, whichever sport it is (both, if you have a ride and a run scheduled), with the other suggestions staying cycling. The Workouts tab lists your rides and runs together, in My Library and in Find Workouts, each card badged with its sport and offering Ride Now or Run Now. Starting a workout from Today or Workouts always uses that workout's own sport.
- The player asks "Ride or Run?" for unstructured sessions. When you open the Player without a workout loaded, you're asked which you're doing — with a "Remember my choice" checkbox if you don't want to be asked again. Your last pick is used as the default either way. With a session loaded, a Sport: Cycling / Running button sits in the player toolbar: click it to switch sports during the first 15 seconds, which discards what was recorded and starts over. After that the sport is pinned, and you're asked to save or discard first — the same as starting a workout of the other sport while one is in progress.
- Training Party cleans up fan noise. Echo cancellation and noise suppression are always on for your mic, with LiveKit's Krisp filter layered on top when available, so a trainer fan at full blast doesn't drown you out. Hover the mic button in the party strip to see which filter is active.
- Training Party audio runs on LiveKit. The party engine moved from an embedded Jitsi page to LiveKit, with TrainerDay's own controls: the strip shows real participants, who's talking from live audio levels, and mute / camera / leave act directly. One person is one participant whatever device they join from.
- Training Party tab (experiment, TrainerDay admins only for now). A new Training Party tab in the top bar shows a green dot whenever a friend has the app open, and pulses once when you launch. It's where you ride with company: go online, see which friends are around now or later today, ping one, start a hangout, or join a friends' hangout — a hangout is just the people in it, private to them, and you can join when you're friends with everyone already there. Add friends by username, or from the people your friends know. A hangout is voice-first: a strip under the top bar shows who's here and who's talking, with mute, camera, invite and leave in TrainerDay's own controls. You join with your mic on and camera off; turning a camera on brings the video view into the Player's media area. The hangout keeps running while you look at Today or Settings. Design notes in
docs/hangout.md. - The media button says "Media". The top-bar button that opens YouTube, My Media and the browser now shows a generic media icon and the word Media instead of the YouTube logo.
- Browser as a media source (experiment). The media list now has a Browser tab beside YouTube and My Media: type a web address or pick YouTube.com, and the site opens inside the app beside your workout, with Back / Reload / Open-in-browser / Close in a small toolbar. Sign-ins are remembered between sessions. Netflix and other DRM video services can't play inside the app (no DRM module in the desktop runtime), so the Netflix shortcut opens your system browser instead. Known limits while it's experimental: TrainerDay pop-ups that overlap the page area are hidden behind it (the device and sport pop-ups hide the page while open), and screen sharing always shares the main screen.
- Free sessions are saved as "Free Run" / "Free Ride". An unstructured session used to be saved under the generic name "Workout", which is what the mobile app showed (the website quietly replaced it with the sport). Now the name says what it was, in every app.
- Fixed: the small chart beside a video showed no workout targets. With YouTube, My Media, Browser or a Hangout open, the chart in the bottom bar drew only the power trace; the target segments were cut off at the recorded length. They now show in full, as in the big chart.
- The Pause label stays out of the way while the media list or the browser is open.
- Settings is shorter: HR+ and Step Sizes are collapsed. The HR+ and Step Sizes sections now start folded like the new Runner section — click the heading to open them.
- Your 5K race pace can be set in the desktop app. Settings has a collapsed Runner section holding your recent 5K pace (min/km or min/mi, following your units). It is saved to your TrainerDay profile, the same as editing it on the website, so the mobile app and the site pick it up too. It anchors run targets, the chart's pace line and run zones; an unstarted free run in the player picks the new pace up straight away.
- Track Me (No target pace) for free runs. Pick Run in that prompt and a "Track Me (No target pace)" checkbox appears. Tick it and the run is simply recorded: the TARGET tile reads TARGET OFF, nothing is drawn in the chart, the Sport button says "Running · Track Me", and the intensity ± buttons are hidden (incline ± stays). If you have Control turned on for your treadmill, the app sends it nothing in this mode — you drive the belt from the console. Your choice is kept as the default for the next free run and is covered by "Remember my choice". Runs only; a free ride is unchanged. (Without any speed sensor the app has nothing to record for a Track Me run, since the assumed pace it normally follows is the target.)
- Fixed cadence on Tacx trainers (Neo, Neo 2T, Flux and others that use FE-C over Bluetooth). Cadence could jump around (for example between 100 and 200 rpm) or freeze, because the app misread the trainer's cadence field. The desktop app now reads trainer data the same way the mobile app does — from the standard power / cadence services first — and uses the trainer's own cadence number as a fallback. Cadence also drops to 0 when you stop pedalling instead of holding the last value.
- My Calendar is one click away on the Today tab. A round calendar button next to refresh opens your TrainerDay calendar in a popup over the app (same as the mobile app's Today button). Today and your library refresh when you close it, so moved or added workouts show up straight away. Pro feature — free users are taken to the upgrade page.
- Today now points to your full training plan. A small "Full plan in Workouts" link appears when you have an active plan and jumps straight to that list on the Workouts tab.
- After upgrading, the app tells you where to set up your training plan. When you upgrade to Pro from inside the desktop app, a popup explains that training plans are created on the TrainerDay website (Coach Jack) and offers to open it. The Today tab also switches to your Pro workouts immediately instead of waiting for a refresh.
- Today always shows your planned workout, whatever its sport. The plan / calendar / TrainingPeaks / Intervals.icu workout of the day no longer disappears when it's a different sport from the Cycling / Running selector. The card carries a sport badge, and Ride Now / Run Now switches the app to that sport before loading it (if a workout is in progress, you're asked to save or discard first, as with the selector). Planned workouts the app can't play (swim, strength, …) are shown for reference without a button. Random suggestions still follow the selected sport.
- One running number: your 5K pace. The pace-system choice (threshold / race pace / VDOT) is gone — you enter just your recent 5K pace and everything derives from it (threshold internally = 5K ÷ 1.05). The dashed reference line on run charts now sits at your 5K pace, and run activity stats show "5K Pace" instead of threshold.
- Run activities are now scored by GAP (grade-adjusted pace). The activity chart, time-in-zones, and training stress for every run — Garmin, Strava, or TrainerDay treadmill — are computed from grade-adjusted pace against your threshold pace, on one consistent scale (Minetti gradient model, Strava-style downhill clamp, stops excluded). The chart's axis reads as pace, the reference line is your threshold pace, and hovering shows GAP. Device running power (which varies by vendor and running form) is kept as informational stats but no longer drives any metric — and device "FTP" numbers no longer appear; runs show your Threshold Pace instead.
- Running is here (beta). A new sport selector in the top bar (right side) switches the app between Cycling and Running. In Running mode:
- FTMS treadmills connect over Bluetooth — the app reads live speed and distance (read-only; it never controls your treadmill). The treadmill shows up in the device popup like any other sensor.
- Virtual running power is calculated every second from your treadmill speed, your body weight, and the incline you set — using the Minetti gradient-cost model, scaled to match Stryd-style running power. It's charted and recorded as watts.
- Incline
+ / − control in the player toolbar (left of the intensity control): tell the app what incline your treadmill is set to, in 0.5% steps (−3% to +15%). Shift+↑ / Shift+↓ adjust it from the keyboard. Your incline is remembered between workouts. - The Workouts page filters by sport — Running mode shows your run workouts (and community run workouts in Find Workouts). All three pace systems are supported: % of threshold pace, % of race pace (e.g. 5K-anchored plans, current or goal), and Daniels VDOT zones, using the paces from your TrainerDay run profile.
- The TARGET tile shows pace (min/km or min/mi per your units setting) — match it on the treadmill; intensity
+ / − still scales the whole workout. - Saved runs upload to TrainerDay as running activities and sync to Garmin Connect as
Running.
- Fixed: treadmill runs synced to Strava (and TrainingPeaks) showed 0 distance. The upload now includes a per-second distance stream, so Strava gets the full distance and pace.
- Treadmill elevation is recorded. Runs now carry an elevation stream integrated every second from belt speed and the incline you set. The player's distance tile shows distance to two decimals plus elevation gain (m or ft per your units), saved runs show elevation gain, and the stream goes to TrainerDay (feeding server-side GAP and run stress) and to Garmin Connect.
- Switching sport during a workout. The Cycling / Running selector stays enabled while a workout is in progress; picking the other sport shows a message asking you to save or discard the current workout first, and the selector stays on the current sport.
- Fixed: with imperial units, running power and pace math used your weight in pounds as if it were kilograms, inflating recorded run watts. Activity cards and details now show distance and speed in miles / mph when imperial is selected.
- Today's workout stands out on the Workouts page. The next plan day (or today's calendar entry) gets a blue border and a TODAY badge.
- Mark planned workouts as completed. When you start a workout from your plan (Today's plan pick or the plan list on the Workouts page), the save dialog now has a "Planned workout completed" checkbox, on by default, like the mobile app. Saving with it ticked links the activity to that plan day and advances your plan to the next workout.
- Treadmill control (opt-in). Treadmills whose Bluetooth FTMS profile accepts speed and incline targets (Matrix and others) can be steered by the app: turn on the Control chip for the treadmill in the device popup and, while a run is playing, the belt follows the workout's target pace (adjusted for incline) and the incline you set with the
+ / − control. The app never starts or stops the belt — you start it on the console, and the app only adjusts a moving belt. Off by default. When the app is not controlling it, the treadmill's own incline is mirrored into the app so virtual power and elevation match what you dialed on the console. - Running cadence from your HR strap. Straps and footpods that broadcast Running Speed & Cadence (Garmin HRM-Pro, HRM-Pro Plus, Stryd, etc.) now feed steps-per-minute to the player's SPM tile and the saved activity. The strap's accelerometer speed is offered too: in the device popup the Speed chip lets you pick the treadmill belt or the strap as the speed source (treadmill by default).
- Fixed: slow treadmill walks (under ~5 km/h) showed a running pace around 7:30/km in the activity view. The app guessed the speed unit from the numbers; each recording now stores its unit explicitly.
- Fixed: a paired sensor that dropped mid-workout (for example a Polar strap) wasn't reconnected while the Bluetooth icon was pulsing, unless you opened the device popup and tapped it. The auto-reconnect now catches a returning device even when a scan for another paired device is already running, and a failed reconnect attempt retries on the device's next advertisement.
- Adjust your target from the keyboard:
↑ / ↓ on the Player page raise or lower the current target — ERG power %, slope, resistance, or HR+ BPM, depending on the active mode. Same steps as the on-screen + / − buttons. - Tooltips on the player controls: hover any button in the player toolbar to instantly see what it does and its keyboard shortcut.
- Buttons light up on key presses: using a keyboard shortcut (or the mobile remote) now briefly highlights the matching on-screen button in blue, so you get clear feedback that the press registered.
- Keyboard shortcuts reference: Settings → More Information → Keyboard Shortcuts opens a full list of every shortcut in the app.
- Find Workouts — search the community library. The Workouts page now has two tabs: My Library (everything as before) and Find Workouts, which searches TrainerDay's full public workout catalog. Browse popular workouts, search by name, and narrow by Duration, Zone, and Stress. Any result can be ridden immediately or added to one of your lists with the new + Add button. Free accounts can browse and ride; text search and saving to your library are Pro features.
- New keyboard shortcuts on the Player page:
Space starts, pauses, and resumes the workout (previously it only paused/resumed); → skips to the next segment; M cycles the training mode (ERG → SLOPE/RESIST → HR+); Z cycles the chart zoom (Full → 5min → 20min). Existing G (app fullscreen) and F (video fullscreen) are unchanged. - Tab switching from the keyboard: Cmd/Ctrl +
1–6 jump straight to Today, Progress, Workouts, Player, Activities, and Settings — from anywhere in the app. - Fixed: pressing
G on the Player page no longer triggers the fullscreen toggle twice. - Fixed: mode switches from the mobile remote now persist across restarts and correctly initialize HR+ mode (target BPM and starting power), matching the on-screen mode buttons.
- Keyboard shortcuts: Cmd/Ctrl +
+ / - / 0 now reliably zoom the UI in, out, and back to default on every page. Previously these worked only on some screens and could be silently swallowed elsewhere.
- Linux only: fixed BLE devices not appearing in the .deb install. Caused by the
chrome-sandbox permissions being set up for an incompatible sandbox path on modern kernels (Ubuntu 24+); the app silently couldn't open Bluetooth sockets. Mac and Windows are unchanged from v1.7.18. - Linux only: the
curl … install.sh | bash one-liner now installs the .deb on Debian/Ubuntu-family distros (where BLE actually works) and clearly warns when falling back to the AppImage on other distros (where BLE doesn't).
- Local media: videos in formats the player couldn't show before (e.g. GoPro 4K/HEVC footage) now play automatically — the app converts them on the fly. Playback starts within a few seconds and is instant the next time you open the same file.
- HR+ averaging mode: the gentle in-zone power nudges are now ±2 W (was ±1 W) for slightly quicker correction toward your target heart rate.
- Linux only: fixed the auto-updater silently failing — the Linux build was checking for updates at the wrong location and never finding them. Linux users now get update notifications like everyone else.
- Mac (Intel only): fixed the Intel build crashing at launch (
Error: Invalid or incompatible cached data) and a Bluetooth failure on startup. Same class of build-pipeline issue as the v1.7.16 Linux fix — the Intel build now ships plain JS and the correct Bluetooth binary. Apple Silicon Macs and Windows are unchanged.
- Linux only: fixed startup crash on the v1.7.15 Linux build (
Error: Invalid or incompatible cached data). Caused by a build-pipeline issue cross-compiling V8 bytecode from Mac to Linux; this release ships plain JS for Linux. Mac and Windows are unchanged from v1.7.15.
- Today page: scheduled workouts from TrainingPeaks and Intervals.icu now show as the highlighted "Scheduled" workout for today, just like TrainerDay calendar/plan workouts. Previously these were silently dropped from the grid.
- Fixed a long-standing bug where the live watts display would freeze on a stale value (e.g. "stuck at 72") after a power device disconnected, finished a workout, or was never connected at all. Watts now read 0 when there's no power source — and brief 0W readings during freewheel coasts are smoothed over for 3 seconds before showing 0.
- Auto-start now works after restarting the app mid-workout. Previously a stale "paused" state silently blocked auto-start until you manually resumed.
- Devices: paired devices that disconnect (e.g. heart-rate strap goes out of range) now show in a new "Paired · Disconnected" section with a pulsing blue indicator and a "Forget" button. The app keeps searching continuously for them — no more long quiet windows where a returning device is missed.
- Auto-reconnect on app start: if you have a paired device that isn't currently connected, the app starts hunting for it immediately.
- Fixed connection failures with original-generation Wahoo KICKR trainers (e.g. WF104). Old KICKRs reject control commands that arrive too close together; the app now paces every Wahoo write through one shared 2s throttle so the trainer accepts the unlock cleanly.
- Fixed an app crash on Mac (and likely Windows) at startup when auto-connecting to a paired BLE device. Hotfix for a regression introduced by yesterday's Linux BLE work.
- Fixed the Workouts tab going blank when the library contained a malformed workout. Bad workouts are now filtered out automatically.
- BLE: a manual disconnect now sticks — the device stays disconnected even when background cleanup runs, instead of silently reconnecting.
- Linux support is now fully working. BLE devices scan, connect, and stream data on Ubuntu/Debian-based systems. The
.deb installs cleanly and grants the app the system permissions it needs. - Linux: when more than one Bluetooth adapter is present (e.g. a flaky built-in chip plus a USB dongle), the app automatically picks the better one.
- Improved BLE diagnostics: every connect/scan/discover step now logs clearly, making it easier to troubleshoot user reports on any platform.
- Fixed duplicate activities appearing in the activity list after saving a workout
- Fixed activity times displayed in the wrong timezone (all times now stored in UTC, displayed in your local time)
- Saved activities now show correct local time immediately — no delay before the display corrects
- Stale/soft-deleted activities removed from the local list automatically on sync
- Missing power zones, time-in-zones, and stress scores now backfill locally from stored watts data
- Fixed keyboard shortcuts (space, f, g) interfering with activity name input in save popup
- Fixed FTMS trainer control becoming permanently unresponsive after a transient rejection (e.g. JetBlack Victory)
- Fixed BLE orphaned connections: watchdog now properly disconnects at OS level instead of just clearing internal state
- Stale connection cleanup now covers Wahoo, FEC, and Echelon devices on startup
- Fixed BLE connection failure leaving device locked at OS level
- Added UAT dev mode (
npm run dev:uat)
- Fixed default warmup starting at 80% FTP instead of 40%
- Next segment block shows target BPM for HR+ segments and slope % for slope segments
- BLE device watchdog: detects silent disconnects and auto-reconnects (fixes stuck HR)
- Improved remote control reliability: auto re-login on reconnect, re-announce on member leave
- Workout save safety net: trash backup before save, verified before cleanup
- Workout backup now survives through the save screen (prevents data loss on crash)
- HR+ averaging mode: updated thresholds for smoother control
- Fixed "Permissions check failed" error from remote control fullscreen commands
- Fixed database crash when app data directory is missing
- Reduced BLE scan crashes on Windows (continuous scan, noble 2.4.0, uncaught exception handler)
- CSC sensors no longer auto-assign to power by default
- Sentry source maps for better error reporting
- Slope value display precision fix
- Fixed interval comments not showing after the first one
- Interval comments now persist until the next comment or segment boundary
- HR+ mode: WATTS label shows target watts being sent to trainer
- HR+ mode: chart keeps original workout shape (grey color), power adjust no longer rescales segments
- HR+ mode: WATTS label shows target watts being sent to trainer
- Comment indicator dots on workout charts showing where interval comments are
- Power smoothing changed from 30-second to 5-second rolling average
- Fixed rare settings file crash on Windows
- Improved zone charts with percent-of-total bars and larger fonts
- UI polish: refresh icon, spacing, duration formatting, zone indicators
- Fixed FTMS trainer ERG control on Windows (was silently failing to set target power)
- Fixed workout chart and target power consistency across player and activity views
- Fixed HR zones to use Coggan's zones based on % of threshold HR instead of estimated max HR
- Fixed activity chart segments: correct height scaling and duration alignment
- Fixed activity detail hover tooltip alignment with chart area
- Logout now clears activity history from local database
- Dev mode: quick-login buttons and automatic localhost API connections
- Connect Strava or Garmin banner on Progress page — prompts paid users to link their accounts for historical fitness data
- Subscribe popup now opens inside the app instead of an external browser
- Redesigned Activities page with sport icons, zone colors, power charts, and activity detail view
- Activities now sync from the server (Strava, Garmin, etc.) and merge with local rides
- Activity list scroll position is preserved when returning from detail view
- Fixed ANT+ power meters not reporting power data
- Fixed ANT+ cadence fallback calculation
- Upgrade banners no longer flash briefly on page load for paid users
- Added Garmin Connect integration — connect your account in Settings to automatically upload completed activities to Garmin Connect
- Added Progress tab with fitness metrics — aerobic, strength, consistency, and variety scores
- Added seed editing popup for workouts
- Added FTP history link
- Toggle states now persist between sessions
- Activities now sync to the server immediately after saving, with automatic retries
- Added "Saving activity…" indicator in the top bar during upload
- Fixed Imperial/Metric units not persisting when loading a workout after restart
- Distance label now shows "MILES" instead of "MIL" in Imperial mode
- Smart power smoothing — three modes: Off, Smart (adapts to power variability, resets at interval boundaries), and 30-second rolling average
- Fixed Echelon ERG mode — resistance commands now properly tracked so power estimates match targets
- Improved Echelon device detection
- Fixed auto-updater channel detection
- Fixed race condition in remote control client mode
- Fixed next-interval ramp calculations
- Added download progress indicator for updates
- Echelon bike support — connect Echelon stationary bikes via Bluetooth. Power is estimated from resistance and cadence, ERG mode adjusts resistance automatically to match target power.
- Improved Echelon device detection via advertising UUID
- HR+ averaging mode improvements — smoother heart-rate-based power adjustments with symmetric dead zone
- Improved BLE capability detection — shows actual device capabilities instead of generic defaults
- BLE stability improvements
- HR+ averaging mode — symmetric dead zone, smoother power nudges
- Echelon bike support (initial)
- Fixed BLE device flickering in connections popup
- ANT+ setup help added to connections popup
- Disable Auto Pause setting now also disables auto-start — you can start manually from the ready state
- Progress page connected to live API with toggle buttons
- Windows stability fix — invisible background process instead of visible command window
- Fixed power adjust +/- buttons not scaling chart segments after app restart
- Improved app shutdown stability
- ANT+ device support — connect heart rate monitors, power meters, and smart trainers via USB ANT+ stick
- ANT+ and Bluetooth icons both visible in top bar
- Improved ANT+ scanner architecture
- Fixed ERG power adjust — chart segments now rescale when using +/- buttons
- Fixed Power Match ERG routing
- Power Match improvements — rolling averages, 3-second throttle
- Power Match with rolling averages and improved accuracy
- Progress page — fitness dashboard with analytics tracking
- Feature flags system
- Rounded corner UI improvements
- Fixed Today page data loading
- Remote Control info added to settings page
- Remote control support via WebSocket — control the desktop app from the mobile app
- Auto-updater fixes
- Screen stays awake during workouts
- Dynamic provider/client mode switching
- WebSocket streaming — broadcast workout state to mobile app
- Dynamic HR scale on chart
- +/- step size buttons with styled units
- Remote command visual feedback
- Power Match — use your power meter instead of trainer-reported power for ERG mode
- Today tab PRO badge and free user gating
- Persist training mode values between sessions
- Fixed HR+ mode — algorithm was previously non-functional
- YouTube playlist fixes and video controls toolbar
- YouTube video player — watch YouTube during workouts via hosted embed
- Playlist support with video queue
- Fixed YouTube compatibility issues
- YouTube embed fixes for packaged app
- Auto-updater fix — app now properly restarts after installing updates
- App icon
- Power smoothing option (3-second rolling average)
- Double single-side power option
- Sound options aligned with mobile app
- Persistent YouTube player
- Ramp test support
- Auto-pause when you stop pedaling
- FEC cadence fix
- Workout timer improvements — no more drift or jitter
- BLE auto-reconnect for paired devices
- Multi-device support
- Progressive reconnect after disconnection
- Chart playhead lock at 25% position
- Save activity popup improvements
- Windows build support
- Initial release — TrainerDay Desktop training app
- Workout library with Today tab
- Live workout chart with zone colors and ramp splitting
- BLE device connections (FTMS, Wahoo, FE-C)
- ERG, Slope, and HR+ training modes
- Activity saving and history
- Settings synced with TrainerDay account