Changelog

Week of March 16

  • Upgrading 3D engine...

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...