Changelog

Week of April 27

  • Fixed grass poking through roadside cropland
  • Improved tunnel appearance, cleaned up terrain "hole punching"
  • Added smoothing to tiny streams
  • Fixed lag/freezing when loading buildings in dense urban areas
  • Fixed event time weirdness
  • Fixed rider angle when stopped and teleporting
  • Fixed pressure wave effect for lead riders
  • Fixed shadows at sections of singletrack / gravel roads
  • Improved bridges
  • Featured routes are now online-enabled

Week of April 20

  • GPU memory tuning + crash recovery improvements
  • Added memory usage stats to the Debug overlay (SHIFT + Z)
  • Improved memory usage of the wireframe mesh mode
  • Fixed trees not respawning properly when restoring a tile from cache
  • Cleaned up logging
  • Switched to better elevation data source
  • Tweaked water depths / widths
  • Experimental: added /routes/draw page for building new routes
  • Fixed duplicate BLE connection attempts for native apps
  • Standardized fetch() requests – to make log viewing easier

Week of April 13

  • Added automatic GPU crash recovery
  • Added more multiplayer latency handling
  • Roamer bot FTP is now 55% - 110% user FTP
  • Removed unnecessary dependencies, reduced load size
  • Modernized site-wide reactivity (Svelte 5)
  • Added automatic (and manual) debug log uploading

Week of April 6

  • Fixed TTT team assignment for late joiners (hopefully?)
  • Reduced Ego resolution to fix jersey distortion
  • Updated bot archetypes (they should be smarter now)
  • Improved multiplayer latency handling
  • Standardized cadence-based stand pedaling across all rider types
  • Clarified "Forgot password?" text
  • Major internal code cleanup
  • New website design (sorry, all the purple got to be too much)
  • Fixed end-of-route turnarounds
  • Fixed surface types at loop boundaries (props Dan C.)
  • Fixed route editor surface type annotations at loop boundaries
  • Better GPU frustum culling for grass/trees
  • Fixed rider shadows
  • Fixed dense urban area freezes — removed expensive building overlap detection, added frame-budget yields
  • Removed three.js animation dependencies
  • Cap stand-pedaling to 60rpm
  • Fixed rider speed issue w/ Maximum view distance – birds exceeded their buffer limit, causing a GPU breakdown
  • Added dark mode
  • Updated elevation chart colors (based on Jim's feedback)
  • Fixed Route Editor's dark mode styling

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