Changelog (archive)
Last updated
Week of March 30
- Rebuilt 3D engine (migrated from WebGL to WebGPU)
- New 3D engine = improved performance, plenty of room to grow
- Roamer bots - new archetypes (Sprinter = red, Climber = teal, Rouleur = blue, Puncher = gold, Domestique = grey)
- Revamped "Time of Day" setting for options for Morning, Afternoon, Evening, and Night(!)
- Added night-time headlights and taillights
- Added night-time stars ⭐️
- Refactored rider logic to be more portable (hint: server bots)
- Removed the unnecessary "Drafting enabled" setting
- Fixed duplicate guardrails
- Improved tunnels
- Races - disabled auto braking near the finish line
- Added
&renderer=webglfallback just in case - Added GPU memory management to prevent device loss on memory-constrained hardware.
- Added "Maximum" View Quality setting (4x MSAA)
- Events: fixed rider weights
- Events: fixed rider lateral positions (props Lorenzo & Wouter)
- Mini-map: switched to (much more efficient) raster version
Week of March 9
- Rebuilt pack dynamics model (note: fine-tuning ongoing)
- Pushed bridge railings outwards to prevent road overlap
- Widened and forced tunnels to asphalt
- Improved tree placement (avoid water and buildings)
- Improved side roads with banking and concrete skirts
- Properly handle islands (i.e. geometry holes within water)
- Ignore intermittent water features
- Capped bot cadence to 100rpm
- Major performance improvements (up to 40% less CPU strain)
- Reduced tree processing time by up to 97%
- Rasterized ground types for quicker lookups
- Improved terrain generation logic
Week of March 2
- Fixed building roof / window flickering (for NVIDIA GPUs)
- Improved building ground depth placements
- Input mapping: prevent multiple gear shifts per click
- Settings: added ability to change email
- Settings: added ability to delete account (requires email verification)
- Fixed issue with wrong land types (i.e. too many trees)
- Fixed TTT results not include riders who leave signup after finishing
- Working on improvements to pack dynamics...
Week of February 23
- 3D: added side roads
- 3D: greatly improved water features (even creeks & streams are rendered)
- 3D: automatic bridges over water
- 3D: added railroad tracks 🚂
- 3D: better looking cobblestones
- 3D: switched to better source data for land features
- 3D: refactored environment loading (camera-focused)
- 3D: spectating is now a lot better; high-res assets around the camera
- 3D: numerous performance improvements
- 3D: better async loading
- 3D: cleaner debug panel (F4)
- Physics: fixed road-surface Crr
- TTT: fixed drafting for late-join team members
- Fixed guardrails at loop boundaries
- Fixed flickering roads near finish line (A->B routes)
- Fixed flickering building roofs (hopefully)
- Fixed building de-dupe logic
- Improved 2D trees
Week of February 16
- 3D: improved buildings (added roofs, windows, etc)
- 3D: procedural building and roof textures
- 3D: procedural road / snow textures
- 3D: added cloud movement, slight shape tweaks
- 3D: fixed shadow issues when moving fast (due to FOV)
- 3D: increase camera angles
- 3D: added mileposts
- 3D: added surface types (with different Crr)!
- New surface types: asphault, rough, cobblestone, dirt, gravel, singletrack
- Route Editor: added layers support
- Route Editor: added support for surface types
- Route Editor: cleaned up layout
- Fixed Companion page (props Josef)
- Fixed auto-switching to "Virtual gear" mode
- Exit fullscreen on quit
- Improved time format for events and challenges
- Improved file loading to support large activities (props Falk 😆)
Week of February 9
- Group workouts: complete overhaul
- Group workouts: anyone can host a workout (not just the event creator) as long as there's no active workout
- Group workouts: participants can join a workout via "Join" button
- Group workouts: participants can enable rubber-banding to stay with the host
- Group workouts: participants can request control of workout
- Group workouts: event creator can force control of the workout
- Group workouts: if the host leaves, another participant will be made the host
- Rider list: added button to cycle the displayed stat (W/kg, Watts, Speed)
- Event series: stages can now be sorted
- Event detail: added attendee search
- Event detail: added new "Attendance" and "W/kg" columns (sortable)
- Major website design cleanup
- Updated dashboard design + new stats
- Workouts: display repeating intervals as groups with the repeat count
- Added basic chat profanity filter
- Under-the-hood fog improvements (no more three.js patches)
- Added guards to prevent missing tiles from causing JS errors
- 3D performance improvements and tree fixes
Week of February 2
- Added UI for custom key mappings (in-ride "Help" tab)
- Added Context Menu (in-ride keyboard and controller-friendly actions)
- Added support for Zwift Ride
- Added support for Zwift Play
- Added support for Wahoo KICKR BIKE PRO
- Added support for Wahoo KICKR BIKE SHIFT
- Much better environment loading when using cinecam mode
- Improved routes map view (much better loading)
- Fixed some route editor "closest point on route" bugs
- Fixed ordering of series page (nearest upcoming events first)
- Fixed series edit page - update event titles when the series title changes
- Tons of code cleanup and restructuring
- Added athlete list page
- Added teams
- Added new roles: club owner, club admin, team leader
- Clubs - club owners + admins can manage the club, its teams & members
- Teams - team leaders can add/kick team members
- Revamped TTT signup - simply click "Signup" and BT handles the rest
- Improved the Help Center (better navigation)
- Fixed spectator mode bug
- Added 10-second rolling start to mass-start races
- Teleport distance supports both mi / km (depending on user settings)
- Only auto-switch to "Virtual Gear" if a button device is detected
- Improved tree / foliage performance and rendering
- Auto-scale and optimize uploaded jersey images
- Much faster website loading (moved servers)
- Migrated from mysql to postgres
- Rewrote the API to JS
- Fix: allow non-keyboard hotkey bindings when chat is focused
- TTT: any team member can now start / abort the countdown
- Added edit support for route collections
Week of January 26
- Major changes in progress (see next week)
Week of January 19
- Route editor: re-added altitude nudging tool
- Route editor: improved quality assessment scores
- Route editor: improved elevation smoothing tool output
- Route editor: improved trackpad interaction with elevation graph zooming
- Route editor: added rightclick + drag for region zooming, and a "reset zoom" button
- Route editor: added "Clear all brunnels" button (under "Advanced options")
- Route editor: minor button styling tweaks
- Route editor: fixed the "Altitude alignment" tool to ignore brunnels
- Route editor: prevent auto-annotated bridges for routes below sea level
- Route editor: fixed tunnel auto-annotator ignoring situations where the route legitimately passes below sea level
- Route editor: fixed rare occasions of points missing altitude lookup data
- Route editor: performance improvements
- Fixed route page elevation chart
- Added better modal when requesting route publication
- Added event series support
- Added series page
- Updated route elevation graph colors
- Fixed route collections page
- Fixed power2 readings when power meter disconnects
- Internal improvements
Week of January 12
- Rebuild the activity page charts (you can now click + drag to zoom in)
- Activity charts show "power2" if available, to compare trainer vs power meter readings
- Removed Chart.js (in favor of in-house charts)
- Refactored the FIT file encoder (skip unused fields to save space)
- Fix: don't load workouts during races (props Matjaz 😆)
- Fix: clear the workout when quitting a ride
- Drafting: smoothed out rapid changes for more stability
- Drafting: reduce when descending (proportional to grade)
- Added Zwift Play steering support (use < > arrows)
Week of January 5, 2026
- Fixed multiplayer reconnect issues
- Added latency stat below the rider list
- Fixed ITT bug where pausing/resuming would reset the start time
- Fixed TTT bug where a team's countdown timer would affect another team's start time
- Fixed "Join challenge" link not working
- Added custom branding for Tour du Monde
- Added a modal to let ITT riders know they can start manually
- Added Tundra biome
- Fixed "hugging" pacer bots when ego is stopped
- Fixed loading / LoD bugs
Week of December 29
- Added event "Companion" (to chat on mobile device while riding)
- Events - removed limit on number of reconnect attempts
- Consolidated some dashboard lookups (faster loading)
- Lots of internal code cleanup
Week of December 22
- Added Elite Sterzo support (steering device)
Week of December 15
- Fixed rider freeze issue (ironically caused by debug logging)
- Added lap counts to network packets - spectators can see proper laps
- Rider list - fixed ordering for crits and other multi-lap races
- Rider list - only use the group name "Stragglers" for the overflow group
- Greatly reduced multiplayer packet size, less bandwidth
- Working on club / team improvements...
Week of December 8
- Rider list - bump max groups from 6 to 8
- Rider list - when spectating in group view, allow riders to be selected
- Added confirm when disabling Calendar Sync
- Removed target="_blank" from most links for better app compatibility
- Better jersey image caching
- Applied fix for resistance lag when drafting (most apparent on Elite trainers)
- Added full start date (in user's local time) to event pages
- Added FESTIVE 2025 event
Week of December 1
- DB Migration for better event support
- TTs (both ITT and TTT) now support multiple retries
- Bluetooth - automatically use "Virtual Gear" control mode when available
- Race results - only auto-refresh while the menu is open
- Rider list - added toggle between "Individual" and "Group" views
- Rider list - added automatic groups based on rider proximity
- Rider list - added auto-scroll so the current rider name stays visible
- Rider list - when spectating, click a group name to spectate the lead rider
- Rider list - cleaned up styling
- Preparing for the holiday challenge...
Week of November 24
- Minimap - stripped some feature layers to improve performance
- Reduced camera mouse drag sensitivity proportional to zoom distance
- Fixed grass spawning inside tunnel entrances
- Fixed bridge pylons sometimes still spawning inside roads
- Editor - fixed map view crash when selecting points
- Editor - fixed issue of not being able to select individual points with CTRL
- Editor - fixed lag when adding new points to a route
Week of November 17
- Added pager next/back button support
- Fixed the pager (again)
- Fixed responsive issue w/ profile page activities table
- Fixed black pixels dancing in the fog
- Fixed roadside cliff edges poking into the road
- Added new "Foliage style" setting in the route editor
- Reduced tree density at distance to improve performance
- Improved shadow casting, fixed missing shadows
- Fixed disappearing trees in low detail settings
- Set a reasonable limit (100km) for free user route uploads
Week of November 10
- Improved visuals!
- Improved visual detail at range (trees, water, etc)
- Improved mountain, rock, and cliff detail
- Improved road textures
- Improved building appearance
- Added ground color variation that adjusts based on elevation
- Added new "Lighting style" Route setting (Morning, Evening, etc)
- Added groundwork for supporting urban surfaces
- Improved colors, increased detail and vibrance
- Fixed issue causing crinkled square artifacts on the ground
- Fixed sizing of roadside shrubbery
- Fixed crop spawning issue on desert biome
- Fixed bug that occasionally crashed spectate mode on pageload
- Fixed server crashing bug (whoops) 🙃
- W/S keys can now be used to contextually (a) change virtual gears, (b) adjust workout intensity, or (c) adjust ERG free-ride power
- Events styling tweaks
- Minor optimizations
- Fixed rare crash on pageload
- Improved shrubbery detail and performance
- Fixed issue with trees sometimes not spawning around the road
- Fixed hemisphere lighting issue casting improper shadows
- Tweaked lighting styles to reduce harshness and improve colours
- Enabled "Lighting style" setting in timed races
- Fixed road geometry jutting upwards after the first lap
- Fixed tunnel de-spawning issue
Week of November 3
- Added new "Draft feel" setting (reduces trainer resistance while drafting)
- Display the "Results" tab for spectators
- Physics code cleanup
- Removed the "Draft stickiness" setting for now
- Working on adding environmental details...
Week of October 27
- More accurate "has_ended" for event API endpoint
- Improved activity backups + admin backup restore
- Added "Signed up" filter on events page
- Fixed bots getting removed for casual events
- Adding environmental details...
Week of October 20
- BikeTERROR - final spellcasting & axe sharpening
- BikeTERROR launch! 🎃
- Added Fall theme for temperate routes
- Added some experimental road surface types
- Increased steering responsiveness
- Fixed conifer colors in the autumn biome
- Fixed floating gravestones (and other lifecycle bugs)
- Added a first-person look back during sprints
- Fixed dark pumpkins in spectator mode
- Added more BikeTERROR details
- Improved grass/crop placement
- Fixed infinite loop bug w/ event rider starting positions
- Auto-remove completed workout on the following ride
- Auto-start timed events (excluding TTTs)
- Added "Start pedaling to begin" for casual events
- Added modal (and sound) when approaching the next workout interval
- Fixed workout graph tooltip (it now stays within bounds)
- Fixed camera getting stuck when dragging over UI elements
- Fixed sudden spike in camera motion when clicking off chat box
- Fixed cursor hiding after a few seconds of inactivity
- Fixed first-person camera initialising in the wrong direction
- Fixed rider models being visible when spectating in first-person
- Fixed look-behind button showing the wrong camera view on first press
- Added extra logging for error handling
- Added more texture to autumn leaves
- Fixed disappearing roads
- Renamed "Rankings" to "Results" for clarity
- Added ITT (individual time trial) race type
- Fixed camera shaking bug
- Reduced aggressiveness of the "Low FPS" warning
- Added more descriptive error messages to route editor
- Added and updated BikeTERROR details
Week of October 13
- Updated logic for ERG-based virtual shifting
- Additional refinements for ERG-based virtual shifting
- Throttle trainer commands for power and gear changes
- Minimap performance tweaks
- Fixed resistance for older Wahoo smart trainers
- Added "Calendar sync" setting to send the events you're attending to your favorite calendar app
- Fixed houdini jersey textures when saving settings
- Show the "Spectate" button whenever an event has active riders
- Improved smoothness of in-ride drag and drop
- Working on BikeTERROR...
Week of October 6
- Added in-ride freecam (drag/pinch in any camera mode)
- Added freecam touch support
- Zooming all the way in transitions into first-person mode
- Added camera terrain detection and avoidance
- Tweaked rider models to better align jersey textures
- Tweaked animations for smoother mounts / dismounts
- Fixed
power2not saving correctly - Fixed balanced pacer bots riding too far ahead
- Fixed minimap wobbling when in "always up" mode
- Fixed roamer bots spawning in low-detail mode momentarily
- Added slight randomness to the hoods-to-drops animation
- Fixed a styling issue in the spectate mode wait screen
- Added raglan sleeve outline to the jersey template file
- Added support for Tymewear VitalPro (breathing + HR sensor strap)
- Fixed activity chart mis-alignment (props Steven E)
Week of September 29
- Added Zwift Play controller support (props matjaz & trco)
- Added "HR to Power" feature to ride with only a HRM (non-racing)
- Settings - added 3D avatar live preview
- Added support for custom jerseys
- Added jersey template (base for jersey designs)
- Fixed text color for TTT event signups
- Fixed jersey texture caching issue
Week of September 22
- Added a forward-leaning animation that increases with speed/grade
- Added a dropped posture at high speeds
- Animation performance optimizations
- Tweaked lean animation and rider meshes
- Sanitized rider colours to avoid super-saturation or full-black
- Fixed antsy rider animations when waiting in the start pen
- Fixed rare animation head angle glitches
- Fixed crazy-cadence bots
- Fixed crash involving very long bridges
- Fixed crash when trying to access non-indexed tiles
- Fixed scale labels in the route editor elevation graph
- Refactored bluetooth logic with a focus on simplicity
Week of September 15
- Added in-ride error icon
- Added initial support for the Zwift Click 2
- Zwift Click 1 requires firmware 1.1.0+ (update via the Zwift Companion app)
- Added firmware version check
- Improved error handling upon failed bluetooth connect
- Workouts - stay in ERG mode after the workout ends
- Display the grade in 0.1% increments
- Throttle grade commands (to prevent overloading some trainers)
- Added support for power meter L/R balance (props Jim & Wouter)
- Force a whole number for L/R balance
- Updated race results API to support TTT
- Added new rider models and animations
- Added a variety of rider LODs
- Added leaning, steering, leg openers on tight turns
- Added support for custom jerseys (UI coming soon)
- Optimized rider models for a ~40% size reduction
- Improved mount/dismount animations
Week of September 8
- Considerably faster processing for uploaded routes
- Fixed TICKR X improperly overriding cadence
- Improved elevation data
- Fixed stats drag-and-drop ordering (in-ride, Windows)
- Dynamic activity detail stats (Full activity vs Race vs Cooldown)
Week of September 1
- Fixed grass poking through bridge edges
- Fixed issue causing trees to grow through buildings
- Fixed world coordinate transformation issue (noticeable on longer routes)
- Fixed sudden speed drops for some users on lower-end machines
Week of August 25
- Tons of fixes to smooth out bad Vuelta livedata
- TTT - prevent drafting/flocking of non-team members
- Replaced minimap "path" view with a Near/Far toggle
Week of August 18
- Released 1st iteration of TTT events
- Allow riders to create a new TTT team
- Allow riders to join an existing TTT team (via an invite code)
- TTT assumes teams of 3-6 riders, with the 3rd rider counted
- TTT team leaders can start / abort a countdown timer
- TTT races start once the countdown timer hits 0
- Updated race results to account for TTTs
- Adding support for Vuelta LIVE events
- API - Include event ID with activity data
- Updated "Follower" area on athlete profile pages
Week of August 11
- Added heart rate data to spectate mode
- Preserve the mini-map rotation setting (i.e. clicking the compass)
- Improved page SEO
- Faster 3D route loading
- Added support for displaying Wattbike gear
- Refactored CORE temp sensor support
- Replaced range slider
- Planning TTT mode...
Week of August 4
- Added experimental "Draft stickiness" setting
- Added visual indicator of "ideal" draft placement to help modulate
- Slightly improve flocking to reduce collisions / ghosting
- Prevent rider list from showing for solo rides
- Fixed avatar steering issue at low cadence
- Prevent larger trees from intersecting bridges
- Route editor - fixed issue preventing re-uploading same filename
- Users can now delete their own events
- Routes listing - ability to sort by distance/climb ASC
- Tweaked the /events and /clubs pages
- Rebuilt in-ride minimap - including compass w/ auto-rotation toggle
Week of July 28
- Added TDF LIVE: Femmes series
- Added "View distance" setting to spectator mode
- Subscribers can now spectate with maximum view distance
- Improved camera rotation in medium/far chase views
- Improved tunnel entrances by caulking holes around the edges
- Improved the appearance of trees and forests
- Improved the appearance of water and croplands (smoother edges)
- Fixed camera glitch when transitioning in/out of tunnels
- Fixed flickering buildings
- Route editor: Added a strict mode for the editor warnings
- Route editor: improved spline view
- Route editor: persist state for advanced settings
- Route editors can now unpublish their own routes
Week of July 21
- TDF LIVE: fixed issue with desync / rider speeds getting stuck
- TDF LIVE: automatic rider teleporting if they deviate too far
- TDF LIVE: reset livedata if the page loses focus for 10+ seconds
- TDF LIVE: prevent spectate mode from switching to human riders when there are pros available
- TDF LIVE: numerous minor QoL (and behind the scenes) fixes
- TDF LIVE: spectate pros by default
- TDF LIVE: jersey holders now appear at the top of their group(s)
- TDF LIVE: fixed end-of-route teleport bug
- TDF LIVE: fixed skin color for some pro riders
- TDF LIVE: spectate Pogi by default on pageload
- Support virtual shifting for the Tacx Neo 2, 2T, 3M
- Fixed virtual shifting lag
Week of July 14
- TDF LIVE test run completed
- Added groupings to rider list
- Fixed occasionally crazy-high bot cadence
- Increased spectator view distance for subscribers
- Improved physics performance (pre-calculated lookups)
Week of July 7
- Added Tour de France Challenge 🚴 🇫🇷
- Investigating TDF LIVE events, stay tuned...
- Fixed issue with "fake" virtual shifting
Week of June 30
- We're taking a breather, back to full speed on July 7th!
Week of June 23
- Spectator mode - prevent mouse wheel zoom when hovering on the rider list or chat
- In-ride stats edit panel - touch support
- Added view distance setting
- Added detail quality setting
- Refactored the environment generation system
- Refactored the tileset system to reduce overhead and prevent visible seams in the environment
- More intelligent scene loading
- Fixed disappearing bridges, better pylon spacing and placement
- Prevent bridge pylons from intersecting the road below
- Fixed missing snow in the ice biome
- Fixed low-hanging clouds in spectator mode
- Fixed trees growing on bridges
- Display lap count (when relevant)
- Reduced braking aggressiveness for race events
- Added new "caution" logic to decrease a rider's maximum speed slightly when beside or behind others
- Fixed some rare 3D lifecycle issues
- Added extra handling to prevent impossibly high acceleration
- Improved Route Editor scoring to better reflect route quality
- Bots now use a spawn queue, instead of all at once (to greatly reduce stutters when loading new environment tiles)
- General improvements to the tile loading queue
- Cleaned up in-ride Menu
Week of June 16
- Revamped the Route Editor:
- Replaced the chart-js graph with a custom SVG implementation
- Added direct line manipulation to the elevation graph
- Added gradient colouring to the graph, and fill
- Allowed for region selection in the graph, and application of tools to regions (smooth, reconcile, delete, annotate)
- Added a "flatten region" tool which averages the gradient over a selected region
- Visualize brunnel annotations in the graph with editable regions
- Improved gradient smoothing with a smooth average window (props Dan C)
- Added distance-weighting to smoothing function to avoid skewed results
- Increased minimum altitude range of the elevation graph to better represent flat routes
- Fixed an issue with the elevation graph toggle styles
- Added automatic map zooming to the route editor
- Fixed a handful of route editor bugs
- Re-introduced warnings for sharp gradient changes
- Added sanity check to avoid trusting elevations below -200m
- Added sanity check when calculating elevation graph altitude bounds
- Prevented the map from moving to focus unnecessarily
- Re-added the de-kink button as an advanced option
- Improved the in-ride UI
- UI: Added a configurable stats panel
- UI: Various UI elements can now be toggled on/off
- UI: The rider list is now scrollable, and shows all riders
- UI: "Draft" and "Grade" have been redesigned
- UI: You can now view "Grade" during workouts
- UI: You can now change the virtual shifting "Gear" on-screen
- UI: The "Fullscreen" text in the Menu is now clickable
- UI: Added text size options
- UI: Re-added workout timer
- UI: Drag-and-drop stats ordering
- UI: Enabled spectator chat
Week of June 9
- Prevent three.js from loading unnecessarily
- Only auto-start within 10 seconds of event start time
- Moved in-ride errors to the "Help" menu tab
- Better SEO detection of static pages
- Support auto-start for casual (not timed) events
Week of June 2
- Minor tweaks to event tiles
- Increased size of the drafting stat
- Clarified the "Quit without saving" confirmation labels
Week of May 26
- Making progress on View Distance, Quality settings
- Prevent caching of the /ride page
- Slightly faster terrain data lookups
- Event edit - set a default title
- Event edit - prevent saving without a route selected
- Fixed issue preventing spectator mode stats (and map) updates
- Fixed riderController issue (causing occasional freezing)
- Fixed workout chart performance issue
- Fullscreen exits automatically when a ride ends
- Fixed avatar circling when a road path ends suddenly
Week of May 19
- Rider list - show full proximity distance if < 1km
- Improved website & multiplayer servers
- Fixed minor issues related to the Svelte 5 upgrade
- Released Windows app, again 🎉
- Updated Bluetooth UI for better native app support
- Native apps - show loading animation while devices connect
- Windows app (0.2.2) - Better bluetooth write() support
- Fixed chat auto-scrolling
- Fixed activity timer drift
Week of May 12
- Improved water!
- Switched to a better data source for water
- Added shorelines, waves, smoothed rough edges
- Added DNF riders to race results
- Simplified the in-ride menu
- Upgraded to Svelte 5, updated all dependencies
- Added country flags to athlete detail pages
Week of May 5
- Added spectator mode
- Made Dashboard popular links easier to access
- Added social call-outs to Dashboard
- Fixed numerous minor issues with spectator mode
- Fixed issue preventing draft percent from going negative
- Made filtering more prominent on listing pages
Week of April 28
- Released early access Windows app
- Disabled debug panel
- Settings - prevent browsers from autofilling the wrong fields
- Show lap count for online rides (e.g. Lap 1/3)
- Added API endpoint:
athlete/search - Activity pages now include drafting stats (for rides from now onward)
- Route listing - Map view now shows route paths
- Route listing - Map view styling updates
Week of April 21
- Finishing up Windows app...
- Working on spectator mode...
- Fixed issue with the Wahoo TICKR X
- Added "Birth year" profile setting for race categorization
- Added "age_category" field to race results API
- Replaced some homepage assets
- Event listing - fixed incorrect distance / climb when multiple laps
Week of April 14
- Fixed crazy power swings when using "fake" virtual shifting
- Workout names are appended to activity titles, even for cleared workouts
- Route editor - added new toggle to visualize the route splines
- Route editor - fixed (lack of) error messages
- Multiplayer - rider list now shows riders heading in opposite direction
- 3D - much better sensation of speed (dynamic camera FoV and pitch)
- 3D - the "look-behind" button (B) is now a button-hold
- 3D - the first-person camera will raise slightly when the rider stands
- 3D - fixed camera jitter when leaning in first-person
- 3D - disabled micro-steer wobbles in first-person
- 3D - fixed floating bridge pylons
- 3D - mouse cursor now auto-hides after a few seconds
- 3D - fixed issue with some lazy-ass bots refusing to pedal
- 3D - changed road center line to dashed
- Route editor - fixed spline calculation
- Route editor - increased spline point density for better curvature
- Route editor - fixed error upon cancelled file upload
- Multiplayer - disable power simulation (dev tool) for timed events
- Fixed Android bluetooth issue
- Fixed issue preventing rider movement during races 😬
Week of April 7
- New start/finish lines
- Improved cloud visibility
- Fixed rider jitteriness on long routes
- Buildings are now subtly two-toned
- Riders now have micro-steering to avoid having them be perfectly static; a small sway in sync with their cadence. The intensity will reduce at higher speeds, and increase when standing to pedal
- Rider cadence is reduced (visually) when auto-braking. Bot cadence will increase when in a breakaway
- When leaning for corners, riders will spin their outside pedal to the bottom and hold there until upright
- Updated camera logic to avoid wobbling due to micro-steering
- Bots will no longer try to brake or overtake while standing
- Press the down arrow to gently brake (no more emergency braking)
- Added logic to support upcoming native apps
- Fixed issue preventing bluetooth writing
- Added confirmation to prevent accidentally closing active ride
- Workout chart now adheres to "ftpOverride" if present
- Revamped iOS app - now supports device saving (auto-connect), better dropout support, and more
Week of March 31
- Continuing on native apps (will take a few weeks)...
- Speed metric turns red when auto-braking
Week of March 24
- Working on native apps (ongoing, will take a few weeks)...
Week of March 17
- Fixed issue with virtual shifting when in the starting pen
- Fixed dashboard dropdown CSS issue on Windows
- Increased chat box font size
- Cleaned up in-ride Menu / Chat / Camera buttons
- Chat - when minimized, show an alert icon when there's new messages
- Zwift Click can now be used to adjust intensity (workouts) or target resistance (ERG free-ride)
- Experimenting with "wind reduction" icon
- Adjusted minimap placement, other minor styling tweaks
Week of March 10
- New: Group Workouts!
- Fixed issue where a certain hotkey enabled supersonic speeds
- New: choose between black and tan tire sidewall
- Fixed brunnel positioning issues
- Improved brunnel overlaps (e.g. avoids ground intersecting the road beneath a bridge)
- Route editor - exclude brunnels from the "elevation alignment" score
- Improved the appearance of brunnels
- Reduced the likelihood of grass poking through tunnel walls
- Reduced ground poking through the road on tight, steep sections
- Smoother rider movements when on steep gradients
- Improved road curvature
- Rebuilt the Dashboard page
- Fixed grade calculation for non-firmware virtual shifting
Week of March 3
- Fixed many cases of buildings overlapping the road
- Fixed latlng projection issue causing minimap and activity mis-alignment
- Improved minimap heading
- Improved pacer "Balanced" mode to better accompany the rider
- Added conifers!
- Refactored tree generation system
- Improved styling of shrubbery (Ni!)
- Improved cropland density
- Minor color adjustments to the "Temperate" biome
- Fixed arch & finish line coloring
Week of February 24
- New: added brake lights (auto-brake indicators)
- Anonymous users can now view the /events listing
- Camera button (C) now cycles, even when lookbehind (B) is active
- Visuals V2 - improved aesthetics
- Fixed braking issues
- Fixed bug causing crashes when spawning roamer bots
- Adjusted desert grass density
- Working on Visuals V2...
Week of February 17
- New: added real map to the in-ride minimap
- New: Motion Planning V2!
- New: auto-braking!
- New: intelligent draft-seeking! Riders will now automatically steer towards optimal slipstream positioning
- Improved: revamped rider "flow" (pack dynamics)
- Improved: smoother rider motions, less jitteriness
- Fixed some route coarseness issues
- Fixed issue with Zwift Hub virtual shifting
- Fixed issue preventing the avatar from stopping on ride pause
- Fixed timer issue when the browser window is inactive
- Adjusted 1st person camera view
- Tweaked auto-braking parameters (it was a bit too cautious)
- Added Route Collections
Week of February 10
- Getting close to finishing Motion Planning V2...
- Added support for
ERGmode free rides - Cleaned up Debug Mode styling
- Workouts - increase bias range to +/- 25%
- Workouts - charts are color-coded based on zone
- Race - fix users not auto-starting if joining late
Week of February 3
- Fixed speed issue for users on low-end machines
- Added FPS counter (appears when FPS drops below 20)
- Website design tweaks
- Fixed desync / teleport bug (likely caused recent crashes)
- Added a handful of preloaded workouts
- Tweaked the workout menu UI
- Workouts - support .ZWO cadenceLow and cadenceHigh
- Races - ability to export Race or Cooldown separately
Week of January 27
- Roamer bots have more sensible power ranges (props Aku)
- Improved route processor, much better handling of subtle terrain changes
- Fixed bug preventing ability to re-upload certain routes
- Added rider
threshold_wkgto event (race) API results - Added CORE temp data to the FIT file
Week of January 20
- Added better debug logging
- Added a "Download log" button in the /ride menu ("Riders" tab)
- Added "Race results" sidebar to the event listing page
Week of January 13
- New drafting model
- Added "Teleport to distance" UI setting
- Added "Teleport to rider" UI setting (for online casual events)
- Instant U-turns (no page reloads)
- Route Editor - fixed loop routes not being connected correctly
- Route Editor - fixed "NaN%" gradient for finish line point
- Minor drafting model tweaks (i.e. support negative drag)
- Fixed some Bluetooth issues w/ Zwift Click and virtual shifting
- Workouts - interval cadence will display if available
- Added support for Core Body Temp sensors (will display readings)
- Fixed Core Body Temp data reading issue
- Logged-out users can now view (public) route and event detail pages
- Fixed minimap progress disappearing when toggling the ride UI
Week of January 6 (2025)
- Routes listing - "Keywords" filter accepts a route ID
- Added support for route collections (more details soon)
- Added "Add to calendar" button to event pages
- Fixed Zwift Click support (set Control Mode to "GEAR" after pairing)
- First pass at supporting CORE Body Temperature Sensors (awaiting test device to finish implementation)
Week of December 30
- Rebuilt FIT encoding / decoding (95% less code than before!)
- Added dual-power recording to FIT files (power2)
Week of December 23
- Added support for native (hardware) virtual shifting for devices that support it
Week of December 16
- Rolled out Festive 2024 challenge
- Added Power Match feature
- Added Virtual Shifting V2
- Winterized the website design 🥶
Week of December 9
- Added Route editor V2!
- Route editor - better elevation handling
- Route editor - shift+click to select point ranges
- Route editor - fixed brunnel creation issue
- Route editor - various smoothing fixes
- Smoothing tweaks to reduce slaloming
- Performance tweaks to reduce stuttering on slower devices
- Locked down the "free ride" hotkey
- Prevent bots for race events
- Renamed "World bots" to "Roamers"
- Fixed performance issue when saving huge (24+ hour) activities
Week of December 2
- Finishing up the Route Editor
- Added annual pricing option
- Fixed finish line freezing bug for timed events
- Added error handling (retry and direct activity download) in case activities fail to upload
Week of November 25
- Multiplayer - added rider list stats toggle (Watts, W/kg, and Speed)
- Multiplayer - fixed the race results list height
- Profile - display the rider's routes count (clickable)
- Profile - styled the follows page
- Routes - added ability to filter routes by author
- Activity detail - prevent error when activity data is missing
- Multiplayer - fixed rider list ordering (again) 😅
- Fix - exclude heart rate "0" values from the average
- Fix - allow for text selection
- Workouts - added support for
ftpOverridetag (.ZWO files) - Routes listing - show only public routes by default
Week of November 18
- Multiplayer - refactored code for much better performance
- Multiplayer - fixed latency detection & correction
- Multiplayer - smoother rider movements
- Multiplayer - removed gradient to improve chat readability
- Workout - improved in-ride workout graph
- Workout - clicking the interval list toggles between Watts and %FTP
- Events - show event type (and # laps) on detail pages
- Fixed blank activity page when activity file is missing
- Multiplayer - fixed rider list ordering
Week of November 11
- Added rider locations to the minimap
- Added a "Low FPS" check when first loading the app
- Fixed the "turnback" error on the BikeTERROR challenge
- Prevent camera cycling when in "look-behind" mode
- Miscellaneous motion planning / jostling fixes
- Multiplayer fixes
- Updated homepage text and images
Week of November 4
- Added facets to the Challenges page
- Added ability to filter events by ones you've created
- Added ability to approve/reject follow requests (in the Dashboard)
- Added "Hotkeys" tab to the in-ride menu
- Added "U" hotkey to toggle the UI
- Multiplayer - fixed activity resuming
- Multiplayer - fixed issue with improper disconnects
- Multiplayer - prevent duplicate riders
- Multiplayer - adjust socket reconnect attempts
- Improved activity resuming to support tracking multiple rides
- Dynamic activity title based on route, event, and workout
- Multiplayer - fixed slaloming issue
- Multiplayer - fixed issue where a user who teleports (due to desync) leaves behind a "ghost" affecting other riders
- Multiplayer - reduced jostling
Week of October 28
- Added timed events! (i.e. "not-race races")
- Added in-ride event results
- Added event detail page results
- Added "Description" and "Event type" fields
- Revamped the events listing page, added facets
- Better handling of events w/ private routes
- Switch a route from "private" to "unlisted" when submitted for publication
- Fixed issue when connecting to TrainerDay oauth
- Fixed ERG issue when first starting a workout
October 2024
- 2-directional travel!
- Refactored in-ride UI
- New gradient graph, can be toggled between full and zoomed-in view
- Laid the groundwork for arbitrary u-turns
- Laid the groundwork for routes with multiple paths
- Added roundabouts to the ends of point-to-point routes
- Added ability to toggle between portals & u-turns
- Automatically use the correct country-based lane side
- Numerous minor fixes and improvements
- Multiplayer UI revamp (chat, rider list, etc)
- Improved camera pitch to better indicate gradients
- Fixed disappearing grass
- Fixed rider avatars showing the wrong gender
- Fixed tank slapping issue
- Improved water coloring
- Added BikeTERROR challenge (with custom environment)
- Online events - prevent rider movement until event starts
- Added "Advanced settings" to route editor
- Added Intervals.icu activity uploads
September 2024
- Added Route Finder!
- Added custom multiplayer!
- Refactored the events feature
- Factored grade into rollingResistance (props GCUser99)
- Added support for login redirects
- Fixed camera modes
- Fixed event rider list ordering
- Fixed event crash for users missing design data
- Fixed workout issues: rate limiting, and SIM->ERG switching
- Tweaked the ride UI
- Added multiplayer chat
- Added intervals.icu integration
- Fixed browser Wake Lock
- Fixed issue preventing terrain from loading
- Implemented free tier quotas (early birds excluded)
- In-ride event countdown now uses server time
- Fixed Bluetooth HR bridging
August 2024
- Added Tunnels!
- Added Events (for scheduling online group rides)
- Improved environment blending for bridges and tunnels
- Fixed issue with buildings disappearing on loop routes
- More performant route editing
- Sorted online rider list by distance ahead/behind
- Added "Power Bias" UI setting for adjusting workout power
- Activities now include device names (for debugging)
- Events - send reminder emails to participants 15m before start
- Fixed scaling issue with Activity detail page chart
- Fixed in-ride elevation chart (scaling issue)
- Added progress arrow to in-ride elevation chart
- Switched skin tone to 12-option color palette
- Switched to using dynamic CdA (improved physics)
- Updated "Subscription" page comparison table
- Added birds and guardrails
- Added support for workout
FreeRideintervals - Added support for "gear" control mode (W: up, S: down)
July 2024
- Improved route processing (much less bandwidth needed for users)
- Reduced page size for route detail pages
- Fixed elevation profile progress (in-ride)
- Route editor - automatic route loop detection
- Route editing
- Multiplayer v1 (!)
- Display multiplayer-enabled route at top of /routes listing
- Bridges are now appearing again
- Fixed buildings overlapping the road and trees
- Added building textures
- Improved 3D scene lighting
- Revamped pacer bots, their power is now automatic and you can choose between "Balanced" and "Aggressive" pacer modes
- Added "Duration" (estimated time to completion) to all routes
- Added "FTP" user setting
- Fixed Bluetooth FE-C issues (props Wouter and wizbit)
June 2024
- This month, we'll be focusing mostly on under-the-hood updates, as well as the first pass at multiplayer.
- Fixed screen timeout (Wake Lock)
- Club leaderboards now reset on Monday (UTC +0)
- Re-built the ground cover dataset
- Lots of website design tweaks
- Added page titles (to better distinguish browser tabs)
- Ride page - open Devices menu on pageload
- Added challenge leaderboards
- Added tooltips / helptext
- Added new "Energy" metric to replace "Difficulty"
- Added author name to activity + route detail pages
- Fixed the dreaded
NaN radiusissue - Fixed duplicated pacer bots
- Fixed stopped worldbots
- Fixed activity reporting bug (for routes w/ portals) that was improperly adding the difference between the Start & Finish lines to the total elevation
- The app runs better now, even with many worldbots
- Fixed graphics issue when users navigate away + return to the ride screen
- Added in-ride elevation profile graph
- Improved virtual shifting logic
May 2024
- Added buildings v1!
- Added 2nd biome (desert)
- Replaced activity detail charts
- Increased smoothing to 3s (power, cadence) and 5s (HR)
- Refactored codebase to make adding new biomes easier
- Switched filters to a mobile-friendly flyout
- Added permalink support for filters
- Support multiple daily TrainerDay workouts
- Fixed resistance on older Wahoo trainers
- Fixed bug where old tilesets weren't being recycled
- Fixed issue with Bluetooth FE-C (Neo 2T, etc)
- SEO optimizations
March 2024
- New logo
- New homepage design
- Added "Connect to Strava" button to /settings
- Revamped challenges UI
- Fixed uint24 issue in FTMS protocol
- Much better dropout auto-reconnect support
- Fixes for older Wahoo trainers
- Better route preprocessing to smooth out kinks
- Improvements to virtual shifting (more to come)
- Added TrainerDay integration
- Re-styled the routes listing page
- Colorized the /routes elevation graphs
- Revamped web-bluetooth (new UI)
- Refactored workout functionality
- Improved stage-based challenges, fixed errors
- Fixed date issues with saved FIT files
- Added website feedback form + live chat
- Homepage text edits
February 2024
- Added clouds
- Fixed timing issue preventing rider models from loading
- Fixed blank screen on activity detail page
- Fixed color picker alignment issue
- Fixed issue with ocean water seams
- Added Discord link to dashboard
- Added support for Athletica FTP detection (waiting on an API endpoint)
- Fixed issue preventing the FTP input box from being editable
- The topnav is now mobile-friendly
- Added Cinecam
- Fixed issue of world bots remaining as ghosts when de-spawned
- Adds slight lateral variation to world bots for more natural distribution across the road
- Adds dynamic rho to the physics calculation (based on a route's average elevation)
- Removes now-deprecated brunnel code and elevation handling from the client-side
- Fixes issue where foliage isn't rendered below sea level, even if there is no sea
- Fixes issue in bridge annotation where bridges should be ignored when the route itself is below sea level
- Fixes issue in bridge annotation where the route crop offset was ignored, putting bridges in completely incorrect places
- Fixes an infinite while loop bug in the rider loading code, which would often trigger after hotloading the dev server
- Adds a top-level error page to prevent unstyled 404
- Adds key to the route tile listing so that "clicked" state does not persist through page changes
January 2024
- Site optimizations
- First pass at Zwift Click integration
- Fixed bot spawning issues
- The system remembers the last active in-ride Menu tab
- Workouts - added persistance across browser refreshes
- Workouts - added viz chart with tooltips
- Improved - more consistent time formatting
- Improved - better route validation
- Fixed ERG mode for iOS
- Improvements to Athletica.ai integration
- Portals! Point-to-point routes now automatically loop!
- Fixed accuracy issue with "Climb remaining" stat
- Refactored to use native crypto
- Set Featured routes to appear ahead of normal routes
- Added onboarding text for new users
- Drafting setting - apply only to Ego and Pacer bots (worldbots always have drafting enabled)
- Added a pacer "Power Mode" setting to toggle between realistic vs constant power
- Simplified the ride menu
- Fix: use default rider design for new users
- Fix: force cadence reading as an integer
- Switched to monospace font for /ride stats
- Improved the FIT parser
- Minor topnav and layout adjustments
- Added ZWO parser
- Added workouts v1
- Added ability to start a workout using any ZWO file
- Added Athletica.ai integration for workouts
- Added workout ERG mode support
- Added ability to toggle between SIM / ERG for workouts
December 2023
- Added privacy features
- Added route publication requests
- Added
/approvalspage - users can review "follow" and "club join" requests - Split privacy settings into "Profile" and "Activity Details"
- Added "total_calories" into activity FIT files
- Changed from 10w to 5w power increments
- Fixed low cadence pedaling animation
- More realistic physics & momentum (props Mike)
- Clear power / cadence / HR data on iOS device dropout
- Added route moderation (submit routes for publication)
- Route processing - improved elevation accuracy
- Route processing - improved bridge auto-detection
- Route processing - adding basic smoothing
- Route processing - added warnings when uploaded route contains issues
- Display route "version" on listing and detail pages
- Fixed route thumbnail edge-case issue
- Renamed "Trainer Difficulty" to "Gradient Feel"
- Avatar cadence now matches sensor input, if present
- Fixed issue of a map crashing close to the end of the route
- Handled issues of steep cliffs in the route
- Slightly improved "save settings" button visibility
- Rider colours corrected
- Fixes/improvements to ground and foliage shaders
- Fixes/improvements to tree rendering
- Water body experiments with seams yet to be resolved
- Initial work for supporting different biomes
- Reworking road map layout
- Added
web-bleconnection dropout handling - Added self-hosted ground cover tiles
- Added two-tone fog
- Set correct sun angle based on latitude
- Improved sky shader
- Use route title as the default activity title
- Use activity title as the "Download FIT File" filename
- Fixed activity timer issue when saving before the avatar fully stops
November 2023
- More accurate ground cover
- Allow all users to upload routes (during the beta period)
- Work-in-progress: lakes, rivers, other non-ocean water bodies
- Released the iOS connector app on the App Store 🎉
- Fixed Wahoo (WCPS) protocol issues
- Improved route parsing and distance calculation
- Added the ocean
- Added beach/sand texture
- Improved bridges over water
- Improved grass textures
- Moved hosting to Cloudflare
- Fixed reactivity when navigating between pages
- Fixed various FE-C over BLE issues
- Improved route editor's "Closed loop" detection
- Improved error handling for FTMS timeouts
- Support HR readings from controllable devices
- Refactored trees, will be easy to add future variants
- Improved support for WCPS protocol
- Added proper login and signup functionality
- Added password reset
- Added minimap to route page
- Added 1-click route reprocessing
- Automatically trim out minor flaws in uploaded routes
- Improved rider / peloton motion planning
- Fixed route editor bugs, added "undo" feature
- Added basic homepage text and styling