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=webgl fallback 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 power2 not 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 ERG mode 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_wkg to 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

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 ftpOverride tag (.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 FreeRide intervals
  • 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 radius issue
  • 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 /approvals page - 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-ble connection 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